热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GB28181学习笔记3实现REGISTER设备注册(基于nodejssip库SERVER端)

一、注册过程说明这里使用一台海康的摄像头做实际测试。GB28281注册过程有鉴权、不鉴权两种,本文实现的带鉴权的方式,基于GB281812016版。本
一、注册过程说明

这里使用一台海康的摄像头做实际测试。
GB28281注册过程有鉴权、不鉴权两种,本文实现的带鉴权的方式,基于GB281812016版。
本文原本想用C++库实现,但我这只有QT,配置基于第三方sip包的环境太不熟练,为节省时间暂且用nodejs先代用。

不带鉴权:
在这里插入图片描述

带鉴权:
在这里插入图片描述

1. 设备设置

在这里插入图片描述

2. 注册过程


1. 设备发送register注册消息

在这里插入图片描述

2. 服务器返回401 未登陆

在这里插入图片描述

3. 设备发送登陆认证

在这里插入图片描述
主要是要计算当中的response值,认证计算过程:
下面使用kd函数,表示对字符串使用 冒号 拼接后,计算md5,即:
如: kd(a,b)=md5(a+":"+b)kd(a,b) = md5(a + ":" + b)kd(a,b)=md5(a+":"+b)
HA1=kd(username,realm,passwd)HA2=kd(Method,Uri)HA1=kd(username,realm,passwd) HA2=kd(Method,Uri) HA1=kd(username,realm,passwd)HA2=kd(Method,Uri)
response有两种情况,一种带nonce,一种不带。

不带nonce:

response=kd(ha1,nonce,ha2)response = kd(ha1,nonce,ha2) response=kd(ha1,nonce,ha2)

带nonce

response=kd(ha1,nonce,nc,cnonce,qop,ha2)response = kd(ha1,nonce,nc,cnonce,qop,ha2) response=kd(ha1,nonce,nc,cnonce,qop,ha2)

4. 服务端校验正确,返回200ok

在这里插入图片描述

接下来服务端可以请求设备目录。
整体描述:
在这里插入图片描述
本文主要实现REGISTER的部分。

3. 签名校验


二、实现过程

依赖:
https://github.com/kirm/sip.js

1. 启动 sip

sip.start({logger: { send: function(message, address) { // logger.info("==send==:" , message,address); },recv: function(message, address) {// logger.info("==recv==:" , message,address); }}
},function(rq) {
});

返回值解析:

if(rq.method ==='REGISTER') { logger.info('call register');var username = sip.parseUri(rq.headers.to.uri).user;logger.info('register username',username);var userinfo = registry[username];//logger.info('userinfo', userinfo);if(!userinfo) {// 没有登记的用户,这里直接禁止授权logger.error('没有登记的用户,这里直接禁止授权:' , username);var session = {realm: realm};sip.send(digest.challenge(session, sip.makeResponse(rq, 401, 'Unauthorized')));return;}else {userinfo.session = userinfo.session || {realm: realm};if(!digest.authenticateRequest(userinfo.session, rq, {user: username, password: userinfo.password})) {sip.send(digest.challenge(userinfo.session, sip.makeResponse(rq, 401, 'Unauthorized')));}else {// 完成授权userinfo.contact = rq.headers.contact;var rs = sip.makeResponse(rq, 200, 'Ok');rs.headers.contact = rq.headers.contact;sip.send(rs);}}}

三、完整代码


var log4js = require('log4js');log4js.configure({appenders: {out: { type: 'stdout' },app: { type: 'file', filename: 'application.log' }},categories: {// getLogger 参数为空时,默认使用该分类default: { appenders: [ 'out', 'app' ], level: 'debug' }}
});var logger = log4js.getLogger();
const log4js_extend = require("log4js-extend");
log4js_extend(log4js, {path: __dirname + "/a.log",format: "at @name (@file:@line:@column)"
});var parseString = require('xml2js').parseString;
var sip = require('sip');
var digest = require('sip/digest');
var os = require('os');var server_account = '34020000002000000001';var registry = {'34020000001110000001': {password: '你的设备密码'}
};debugger;
var realm ='3402000000'; logger.info('localhost name='+realm);
sip.start({logger: { send: function(message, address) { // logger.info("==send==:" , message,address); },recv: function(message, address) {// logger.info("==recv==:" , message,address); }}
},
function(rq) {try {logger.info('----------------------',rq);if(rq.method ==='REGISTER') { logger.info('call register');var username = sip.parseUri(rq.headers.to.uri).user;logger.info('register username',username);var userinfo = registry[username];//logger.info('userinfo', userinfo);if(!userinfo) {// 没有登记的用户,这里直接禁止授权logger.error('没有登记的用户,这里直接禁止授权:' , username);var session = {realm: realm};sip.send(digest.challenge(session, sip.makeResponse(rq, 401, 'Unauthorized')));return;}else {// 这里应该对server_account再校验一下。但有的网上测试IPC程序server_account没用到uri里。这里先简单实现下原理。userinfo.session = userinfo.session || {realm: realm};if(!digest.authenticateRequest(userinfo.session, rq, {user: username, password: userinfo.password})) {sip.send(digest.challenge(userinfo.session, sip.makeResponse(rq, 401, 'Unauthorized')));}else {// 完成授权userinfo.contact = rq.headers.contact;var rs = sip.makeResponse(rq, 200, 'Ok');rs.headers.contact = rq.headers.contact;sip.send(rs);}}}} catch(e) {logger.error(e);sip.send(sip.makeResponse(rq, 500, "Server Internal Error"));}
});

正常运行后,可以看到海康摄像头处于在线状态。
在这里插入图片描述


推荐阅读
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 本文深入探讨了 Vue.js 中异步组件的应用与优化策略。首先,文章介绍了异步组件的基本概念及其在现代前端开发中的重要性。为了确保最佳实践,建议使用 Webpack 作为模块打包工具,因为 Browserify 默认不支持异步组件的加载。接着,详细解释了异步组件的使用方法,并提供了官方文档的相关链接以供参考。此外,文章还讨论了多种优化技巧,包括代码分割、懒加载和性能调优,以提升应用的整体性能和用户体验。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • 如何高效地压缩JavaScript代码以提升网页性能
    本篇内容介绍了“javascript如何压缩”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • JavaScript最初并非设计为纯粹的面向对象编程(OOP)语言,因为直到ES5标准中仍未引入类的概念。然而,随着ES6的发布,JavaScript正式引入了类的语法,使得开发者能够更加直观地实现继承机制。本文将深入探讨JavaScript中多样的继承实现方法,包括原型链、寄生组合式继承等技术,并分析它们的优缺点及适用场景。 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • 在Laravel中实现PHP对JSON数据的发布与处理 ... [详细]
  • Mongoose E11000 错误:集合中出现重复键问题分析与解决 ... [详细]
  • 为了深入了解某些测试框架的工作原理,并在培训中构建一个简单的测试框架,我系统地研究了 should.js 的源代码。本文将分享我的学习过程和分析结果,帮助读者更好地掌握 should.js 的核心机制。 ... [详细]
  • HTML5大文件传输技术深度解析与实践分享
    本文深入探讨了HTML5在Web前端开发中实现大文件上传的技术细节与实践方法。通过实例分析,详细讲解了如何利用HTML5的相关特性高效、稳定地处理大文件传输问题,并提供了可供参考的代码示例和解决方案。此外,文章还讨论了常见的技术挑战及优化策略,旨在帮助开发者更好地理解和应用HTML5大文件上传技术。 ... [详细]
  • 这篇文章将揭示 Vue 和 React 组件库中五个鲜为人知的强大工具。这些工具均以纯 JavaScript 实现,功能卓越。其中,async-validator 是一个数据验证插件,不仅预置了 URL 和电子邮件的验证规则,还支持异步验证功能。 ... [详细]
  • Optimizing Profile URLs to Function Exclusively with Usernames, Eliminating the Need for User IDs ... [详细]
  • 内网渗透技术详解:PTH、PTT与PTK在域控环境中的应用及猫盘内网穿透配置
    本文深入探讨了内网渗透技术,特别是PTH、PTT与PTK在域控环境中的应用,并详细介绍了猫盘内网穿透的配置方法。通过这些技术,安全研究人员可以更有效地进行内网渗透测试,解决常见的渗透测试难题。此外,文章还提供了实用的配置示例和操作步骤,帮助读者更好地理解和应用这些技术。 ... [详细]
author-avatar
YYANNILl_242
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有