首页 文章 精选 留言 我的

精选列表

搜索[SIP信令],共10000篇文章
优秀的个人博客,低调大师

在SIP对讲机中RTP/RTCP的实现

RTP/RTCP的定义及用途,还是请大家自己google。对于wifi手机来说呢,RTP协议用来传送编码后的语音,RTCP协议用来传送控制信息,公司的RTCP附带了一些语音统计信息和jitter buffer的统计信息用来防止语音抖动。由于是公司的东西,我就不细说了。下面是这两个协议的具体实现代码:RTP和RTCP的头部信息如下,一会给出详细的字节图和编码过程。RTP的头部信息: 复制代码 typedef struct _RTP_HEAD { unsigned charVersion: 2; unsigned charPadding: 1; unsigned charExtension: 1; unsigned charCcount: 4; unsigned charMarker: 1; unsigned charPtype: 7; WORDSnumber;//16bits DWORDTimestamp;//32 DWORDSsrc;//32 DWORDCsrc;//32 }RTP_HEAD,*pRTP_HEAD; RTCP的头部信息: 复制代码 typedef struct _RTCP_HEAD { unsigned charVersion: 2; unsigned charPadding: 1; unsigned charPCount: 5; unsigned charPtype;//8bits WORDLength;//16bits }RTCP_HEAD,*pRTCP_HEAD; 里面各个bit位表示的意思老规矩,不懂google之。具体实现呢,不能给出公司的代码,只能给出尽量通用一些的代码,程序员对比bit图和程序源代码应该很容易就能理解:RTP的bit图和代码实现: 复制代码 // 0 1 2 3 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //0 |V=2|P|X|CC |M| PT| sequence number | //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //4 | timestamp | //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //8 | synchronization source (SSRC) identifier| //+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // 12 |payload header | //| ....| //+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ //| payload | //| ....| //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ void RTPCompose( string& buffer, int payloadType, int sequenceNum, int timestamp, int ssrc, const char* payloadHeader, int payloadHeaderLength, const char* payload, int payloadLength ) { ASSERT( payload && payloadLength >= 0 ); buffer.resize( 12 + payloadHeaderLength + payloadLength ); buffer[0]= (char)(2<<6);//v=2, p=x=cc=0 buffer[1]= (char)(payloadType & 0x127); // 7-bits for payload type *((unsigned short*)&buffer[2]) = (unsigned short)sequenceNum; *((unsigned int*)&buffer[4]) = (unsigned int)timestamp; *((unsigned int*)&buffer[8]) = (unsigned int)ssrc; memcpy( &buffer[12], payloadHeader, payloadHeaderLength ); memcpy( &buffer[12+payloadHeaderLength], payload, payloadLength ); } 解码是编码的逆过程俺就不罗嗦了。RTCP的bit图和代码实现: 复制代码 //0 1 2 3 //0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //byte=0 |V=2|P|RC | PT=SR=200 | length| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 4 | SSRC of sender| // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // 8 |NTP timestamp, most significant word | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //12 | NTP timestamp, least significant word | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //16 | RTP timestamp | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //20 | sender's packet count | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //24 |sender's octet count | // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ //28 |V=2|P|SC |PT=SDES=202| length| // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ //32 |SSRC/CSRC_1| // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ //36 |CNAME=1| length| user and domain name... // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ void RTCPSRCompose( string& buffer, int receptionCount, int ssrc, int64 ntpTimestamp, int rtpTimestamp, int sentPackets, int sentBytes, const wstring& cname ) { const string& cnameUTF8 = ConvertToUTF8( cname ); int length = 8 + 20 + 4 + 6 + cnameUTF8.size( ); // 注意此处可能存在bug。 buffer.resize( length ); buffer[0]= (char)(2<<6);//V=2,P=RC=0 buffer[1]= (char)200; // PT=SR=200 *(unsigned short*)&buffer[2]= 6; // length (7 32-bit words, minus one) *(unsigned int*)&buffer[4]= (unsigned int)ssrc; *(unsigned int*)&buffer[8]= (unsigned int)(ntpTimestamp >> 32);// High 32-bits *(unsigned int*)&buffer[12] = (unsigned int)(ntpTimestamp & 0xFFFFFFFF); // Low 32-bits *(unsigned int*)&buffer[16] = (unsigned int)rtpTimestamp; *(unsigned int*)&buffer[20] = (unsigned int)sentPackets; *(unsigned int*)&buffer[24] = (unsigned int)sentBytes; buffer[28] = (char)(2<<6 & 1);//V=2, P=0, SC=1 *(unsigned short*)&buffer[30] = 0xFFFF;// 注意这里应该填写长度,由于我们并没有数据因此无法填写。请程序员按自己的 包长自己填写。 *(unsigned int*)&buffer[32] = (unsigned int)ssrc; buffer[36] = 1; // CNAME=1 buffer[37] = (char)cnameUTF8.size( ); memcpy( &buffer[38], cnameUTF8.c_str( ), cnameUTF8.size( ) );// 同理此处请程序员自己填写 } 以上是较为简单的实现。实际应用中必然需要填写自己附加的信息。实际上这个项目的代码均为在linux下用纯c写的代码,而我上传得代码为windows 下的c++代码。由于c++中Cstring类的存在,使RTP/RTCP的代码简化了不少。如果是在linux下编程的朋友稍加修改后,即可使用。此处仅仅只是给出RTP/RTCP的一个最简单和相对比较通用的实现而已。最后当然要唠叨一下TBCP突发通话消息如何通过RTCP包传送,很简单,将上面RTCP包中的RC项由subtype代替。其它按上一篇讲解的携带 TBCP消息的RTCP包的标准编写就可以了。注意,这个标准是别人定的,如果觉得不好,自己定一个也是可以的。这样就要编写自己的服务器端了。下次再讨论一下关于PTT的在线服务,创建群组列表等对PTT来说至关重要的问题的实现。 本文转自einyboy博客园博客,原文链接:http://www.cnblogs.com/einyboy/archive/2012/10/18/2729687.html,如需转载请自行联系原作者。

优秀的个人博客,低调大师

令企业受益的物联网10招

每家公司都希望利用物联网(IoT)在大数据策略下获益——但究竟用什么方式最佳呢?以下是启用物联网计划用得到的10步。 1.教育 公司的决策者听说过“物联网”这个热词,但很多人不了解物联网在实际业务中有什么用。首先要花一些时间让这些人知道一些实际的物联网应用个案——在个案里别人是如何赚钱的。这样做对采取物联网预算大有好处。 2.制定策略 由于每个公司都有自己独特的需求,适用一个部门的物联网项目不一定适用于另一个部门。在进行物联网试点或提交项目建议书时,要与公司的关键决策者一 起制定策略,这样他们就会成为你的物联网项目的支持者,亦有助于确保用户支持项目。如此也有助于企业领导人选定他们觉得能为公司提供最高的价值物联网项 目。 3.选择立见成效的物联网项目 新引进的技术务必能产生快速、显而易见的成就。如果您的企业物联网策略选用的物联网项目已经在别的公司取得了好成绩并且比较容易实现及能达到好效 果,先把重点放在这样的物联网项目上。还有,有些物联网可以表现出公司某方面在使用“之前和之后”的好处对比,这种项目从长远来看有助于物联网基础工作的 发展。 4.清理数据 机器产生或网上传输的的物联网数据含有负面的东西,其中之一是这些数据里包含大量没有用的垃圾,会消耗系统资源和堵塞网络。物联网项目应确定你想要 的物联网数据,还应该确定你想丢弃的物联网数据。这一步就是分离物联网数据,是一个数据清理过程。你可以自己做数据清理,或是外包给供应商。 5.为客户着想 大凡优秀的物联网项目都强调客户想看到的东西。大城市的电车公交系统是一个很好的例子,这些系统里物联网传感器可以用于预测系统设备和跟踪故障,以 便维修人员可以在问题出现前解决它们。这些物联网系统甚至还可以在系统出现小故障时将消息发送给客户的手机,并为客户提供另一条前往目的地的参考路线。 6.永远不要忘记备用措施 对于依赖于物联网数据流的系统来说,一台机器或网络出故障而导致数据流停止的威胁总是存在的。如果用到的自动化工作流是由物联网数据驱动的,就需要设计出现故障时的备用系统,备用系统在物联网中断时将工作流的控制改为手动模式。这一点很重要。 7.加强安全防范 如果你用的物联网数据是是来自互联网的原始数据,随之而来的可能是更大的安全威胁,比如恶意软件、病毒和其他有害的安全隐患等等。公司在考虑使用由互联网驱动的物联网数据时,需要重新审查制定本地和广域网安全性的措施。 8.将物联网和内部记录系统相结合 最大限度地利用物联网信息的最佳方式是将其与内部记录系统相结合。举例来说,如果你在收集有关客户网站行为的物联网数据,你可以将这些数据与记录系 统的客户数据结合起来,你的系统里已经存在这些客户数据,如客户住处和其他关键人口统计资料。这样就可以获得更完整的有关客户购买习惯和偏好的概况。 9.设置基线和指标展示结果 重点物联网项目要大力去做那些可以量化的、能与过去公司业绩基准比较的项目。通过这种方式,你可以很容易地展示物联网的结果,可以在提高收入、更好的客户服务、更快完成时间、节约成本及其他方面展示结果。 10.定义下一代物联网应用 成功完成了一些物联网项目后,就应该开始考虑如何在这些物联网项目的基础上建立更多的物联网应用。可以将那些参与了制定物联网策略的关键决策者组织起来,这个方法不错,可以确保你的物联网计划不断向前发展。 作者:佚名 来源:51CTO

优秀的个人博客,低调大师

云翼计划校园大使召集令

Hi 童鞋! 阿里云学生扶持项目『云翼计划』 上线20个月啦,已经有2776所高校的20多万认证学生加入云翼计划 ! 现在,云翼计划校园大使开始招募啦,校园大使负责协助我们在学校里推广云翼计划,让更多的同学接触到云计算。 所以,你: 想邀请技术大咖去你的学校吗? 想体验人工智能的最新技术吗? 想现场学习如何玩转云产品吗? 想增加一些实践经验吗? 想获得校招内推的机会吗? 如果是,那欢迎报名校园云大使,与我们一起将云计算带入你的学校! 立刻点击这里,开始报名吧!

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册