NodeJs 模仿SIP话机注册的方法


Posted in NodeJs onJune 21, 2019

本项目需要对应的后端接口、信令环境才能正常运行,本文章只涉及前端内容。

项目依赖模块:

  • NodeJs
  • readline:命令行输入
  • ws:与服务端建立websocket连接
  • superagent:与服务端建立请求连接,效果类似ajax请求
  • tsk_md5:项目登录密码使用MD5加密

项目需求

模拟SIP话机频繁向服务器发起注册请求,以得到服务器最大SIP注册数

项目实现概述

  1. 终端输入连续注册分机的开始分机号和结束分机号
  2. 终端输入统一的SIP注册密码
  3. 终端输入服务器地址
  4. 先进行用户登录鉴权,用户登录鉴权通过后再发起SIP注册

代码分析

1. 引入项目所需模块

var WebSocket = require('ws'),
 superagent = require('superagent'),
 tskMD5 = require('./tsk_md5')
 const readline = require('readline');

2. 创建readline 接口实例

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: 'OHAI> '
 });

3. 定义所需变量

var obj = {}, httpHeader = {}, baseUrl ='', pass = '', ip = '', websocketUrl = ''
var keepWsAlive, readyState

4. 读取readline 输入信息函数

function getReadline() {
 const lines = []; // 用于保存所有输入信息。
 console.log('Please input the range of extensions(eg: 1001,1010):\n')
 rl.on("line", function(line) {
  if (line ==='') {
   console.log('The input is empty, please input again:\n')
  } else {
   lines.push(line);
   if (lines.length === 1) {
    obj.extensionsArr = line.split(',');
    console.log('Please input the password(eg:1234aa):\n')
   } else if (lines.length === 2) {
    obj.password = line;
    pass = line;
    console.log('Please input the ip(eg:192.168.124.125):\n')
   } else if (lines.length === 3) {
    websocketUrl = 'ws://' + line + ':8089/ws';
    obj.websocketUrl = websocketUrl;
    obj.ip = line;
    ip = line;
    console.log('Starting register...\n');
    // 开始注册事件
    loopRegister(obj) 
   }
  }
 });
 
 // close事件监听
 rl.on("close", function(){
  // 结束程序
  process.exit(0);
 });
 }

终端运行截图

NodeJs 模仿SIP话机注册的方法 

5.注册事件中包含几个动作

1)设置httpHeader:浏览器与服务器ajax请求有固定的请求头信息,此处模拟浏览器的请求头信息。

用于后续发送请求进行用户登录鉴权。

function setHttpHeader(username) {
  httpHeader = {
   Accept:'application/json, text/javascript, */*; q=0.01',
   'Accept-Encoding': 'gzip, deflate',
   'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,pt;q=0.7',
   'Cache-Control': 'no-cache',
   Connection: 'keep-alive',
   'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
   Cookie: 'TRACKID='+trackid+'; session-identify=sid121076289-1520217430; username=admin; user_id=0',
   Host: ip +':8089',
   Origin: 'http://'+ip+':8089',
   Pragma: 'no-cache',
   Referer: 'http://'+ip+':8089/gswave/',
   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0',
   'X-Requested-With':'XMLHttpRequest'
  }
  var accountData = {
   action:'challenge',
   user:username
  }
  baseUrl = 'http://'+ip+':8089/webrtccgi?';
  getChanllenge(accountData, username) // 用户鉴权函数
 }

2)用户登录鉴权(本项目中与服务器交互需要使用,具体使用看服务器端设置)

<!--账号密码 鉴权-->
function getChanllenge(accountData, username) {
  console.log('start getChangllenge')
  var challenge = ''
  //获取challenge
   superagent
    .post(baseUrl)
    .set(httpHeader)
    .type('form')
    .send(accountData)
    .redirects(0)
    .end(function(err, result) {
     if (typeof(result) == 'undefined') {
      console.error("get challenge is error, result is undefined");
     } else {
      var responce = result.body
      if(responce && responce.status === 0) {
       challenge = responce.response.challenge
       getCookie(challenge, username)
      } else {
       console.error('get challenge is error, result.body.status is not 0')
      }
     }
    });
 }

 <!--cookie 鉴权-->
 
 function getCookie(challenge, username) {
  var md5key = tskMD5.MD5.hexdigest(challenge + pass) // MD5加密用户登录密码
  var subData={
   token: md5key,
   action: 'login',
   user: username
  }
  // 开始请求进行用户登录密码鉴权,类似ajax请求
  superagent
   .post(baseUrl)
   .set(httpHeader)
   .type('form')
   .send(subData)
   .redirects(0)
   .end(function(err, res) {
    if (typeof(res) == 'undefined') {
     console.log("get cookie is error, result is undefined");
    } else {
     var responce = res.body
     if(responce && responce.status === 0) {
     // 登录鉴权通过,开始执行SIP注册
      var cookie = responce.response.cookie
      // 注册函数
      startSocket(username)
     } else {
      console.log('get cookie is error, result.body.status is not 0')
     }
    }
   })
 }

与服务器建立websocket连接

项目中信令交互信息均通过websocket发送

var ws = new WebSocket(websocketUrl, "sip"); # 注意建立的是sip类型的websocket

 ws.on('open', function open() {
  console.log('ws open message1' + message1)
  readyState = WebSocket.OPEN
  // 发送相关信息
  ws.send(message); 
 });
 
 ws.on('message', function incoming(data) {
  a++;
  var dataArr = data.split('\r\n')
  if (dataArr[0].indexOf('401') > -1 && a === 1) {
   // 发送注册信令函数(其中发送信令信息,均参考浏览器的发送头进行拼接)
   startRegister(ws, dataArr, username)
  } else if (dataArr[0].indexOf('200')) {
   // ws.close()
   // console.log('register sucess...')
  } else {
  }
 });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
nodejs基础应用
Feb 03 NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 #NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 #NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 #NodeJs
Nodejs异步流程框架async的方法
Jun 07 #NodeJs
nodejs log4js 使用详解
May 31 #NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 #NodeJs
nodejs中实现修改用户路由功能
May 24 #NodeJs
You might like
PHP分页显示制作详细讲解
2008/11/19 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
python中引用与复制用法实例分析
2015/06/04 Python
Python 登录网站详解及实例
2017/04/11 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
django缓存配置的几种方法详解
2018/07/16 Python
在Python中使用Neo4j的方法
2019/03/14 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
如何使用PHP session
2015/04/21 面试题
Internet体系结构
2014/12/21 面试题
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
党员群众路线自我剖析材料
2014/10/06 职场文书
Web应用开发TypeScript使用详解
2022/05/25 Javascript