pjsip与QT进行适配
pjsip是纯C语言写的一个sip协议库,整个代码写得还是比较模块化的,得益于此的设计,只要理解了pjsip的设计,就可以对其网络层进行扩展。
我们项目是QT作为主要开发工具,而PJSIP的库默认是利用select或者io queue的,只能开启一个线程去接受和发送,无法直接在QT的界面线程里面进行接受和发送。导致编程模型比较复杂,经常要在两个线程进行通讯,并且要注意内存数据竞争的问题。
我们项目里面并没有效率要求,不需要独立一个IO的线程,反而稳定性更重要。为了简化编程模型,方便新人维护,所以还是硬着头皮适配了一下PJSIP的网络层。
主要是要看完PJSIP的开发手册,加上阅读sip_transport_udp的源码,就能仿造出一套QT UDP的适配模型了
需要注意的是,PJSIP是使用纯C语言开发的,并且内部直接使用了很多内存的强转,为了不破坏内部的代码结构,所以我使用的qt_sip_udp_transport用的也是pod的结构,并且使用std::is_pod和std::static_assert进行编译器检查,防止后续的人维护破坏了
内存结构。具体代码如下
static void AutoCheck()
{
static_assert( std::is_pod<qt_sip_udp_transport>::value, "not pod of qt_sip_transport");
}
github地址:
https://github.com/linyilong3/qt_pjsip.git
还没有在实际环境中使用,基本测试已经OK了,后续使用后再看看有什么问题。
pjsip与QT进行适配的更多相关文章
- 快速全面了解QT软件界面开发技术
快速全面了解QT软件界面开发技术 目录 前言 一. 学习QT可能的目的是什么? 只想体验一下QT? 当前的项目选择了用QT. 为将来做QT技术储备. 二. QT的核心技术优势是什么? QT在软 ...
- Linux下移植pjsip,使用QT开发
1.移植pjsip env:fedora14 arm-linuc-gcc:gcc version 4.5.1 (ctng-1.8.1-FA) #./configure \ CC=arm-linux-g ...
- QT开发pjsip的VOIP,A8平台运行
QT开发pjsip的VOIP 开发环境 平台:A8 环境:Linux-3.0.8 实现功能:使用QT开发VOIP进行初始化.拨号.挂起 测试工具:minisipserver服务器 效果 界面: min ...
- Qt移动应用开发(一):适配不同的屏幕
Qt移动应用开发(一):适配不同的屏幕 到眼下为止.Qt5.3已经出现非常长一段时间了.而且已经有一些应用使用Qt进行构建了.我自己也完毕了第一款使用Qt构建的手机游戏<吃药了>.那么接下 ...
- Qt之高DPI显示器(二) - 自适配解决方案分析
目录 一.回顾 二.框架说明 1.ICallDPIChanged 2.IDPIHelper 3.悬浮窗体管理器 三.方案分析 1.窗口大小 2.字体大小 3.间距 4.图标 四.相关文章 原文链接:Q ...
- 3.QT屏幕分辨率适配
需求:qt的窗口.组件.字体需要适配屏幕分辨率. 思路:qt是根据显示器的物理长度或者宽度于分辨率的关系来计算dpi 实现: #if(QT_VERSION >= QT_VERSION_CHECK ...
- QML 从无到有 2 (移动适配)
随着项目深入,需要移植到安卓上,问题来了,QML安卓适配! 幸好PC端程序和手机屏幕长宽比例相似.虽然单位像素,尺寸不同,通过比例缩放,可以实现组件PC和安卓通用代码. 第一步:定义全局的转换函数(3 ...
- Qt on Android:创建可伸缩界面
使用 Qt 来开发 Android 应用,也需要适配不同移动设备,适配多种多样的屏幕和分辨率.这次我们大概来讲一下如何使用 Qt 提供的机制来创建可伸缩的界面. DPI 必须要解释一下 DPI . D ...
- qt做触摸屏演示程序
界面效果图: 参考资料: http://blog.csdn.net/orz415678659/article/details/9136575 这个最重要.. https://www.oschi ...
随机推荐
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(4):JDK动态代理+拦截器
一.拦截器的理解 学习拦截器之前需要对动态代理和反射有一定的基础. 官方说法: java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个actio ...
- Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。
上次课回顾: l Hibernate的一对多 n 表与表之间关系 u 一对多关系 u 多对多关系 u 一对一关系 n Hibernate的一对多配置 u 搭建Hibernate基本环境 ...
- AppIcon应用图标 and Launchimage启动图标的制作
1.制作软件 需要在AppStore里搜索:Appicons and Launchimages Lite 2.操作步骤 看图示意(三步) 1)选择资源源文件 2)选择需要应用的平台 3)选择生成的目标 ...
- HttpClient 基于连接池的使用
场景:调用外部系统接口的http请求 要求: 1:可能是http请求,也可能是https请求 2:需要加入连接池的概念,不能每次发起请求都新建一个连接(每次连接握手三次,效率太低) 准备使用httpc ...
- Jenkins持续集成企业实战系列之Jenkins手动构建-----04
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- 学习markdown语法,易读易写,放2个教程地址
http://wowubuntu.com/markdown/basic.html http://wowubuntu.com/markdown/basic.html
- gevent 传参, 中文编码
#coding=utf-8 import os from gevent import monkey,pool monkey.patch_all() import gevent import time ...
- I/O设备
I/O(Input/Output)设备是指与计算机进行数据传输的硬件,具体分为字符设备.块设备.网络设备. 字符设备 字符设备(character device),又叫做人机交互设备.用户通过这些设备 ...
- C++_异常4-将对象用作异常类型
通常,引发异常的函数将传递一个对象.这样做的重要优点之一就是,可以利用不同的异常类型来区分不同的函数在不同的情况下引发的异常. 对象可以携带信息,程序员可以根据这些信息来确定异常的原因. 同时,cat ...
- Kibana6.x.x源码分析--启动时无反应分析
今天执行启动命令后,不报错,但是也没有反应,一时不知道是什么原因造成的,后来经过分析发现,无意间删除了根目录下的一个文件夹plugins,重新创建上这个文件夹后,再次运行就OK了.