使用pjsip封装自定义软电话sdk

打印 上一主题 下一主题

主题 913|帖子 913|积分 2739

情况: window10_x64 & vs2022
pjsip版本: 2.14.1
python版本: 3.9.13
近期有关于windows情况下软电话sdk开发的需求,必要开发动态库给上层应用调用,今天整理下使用pjsip封装简朴的自定义软电话sdk条记,并提供相干资源下载。
我将从以下几个方面展开:

  • 功能分析
  • 接口设计
  • 接口实现
  • 接口调用示例 (python及c#)
  • 配套资源下载
pjsip编译及使用,可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/18542615/pjsip-vs2022
一、功能分析

库名称: sipClient.dll
功能:
windows10情况下,封装pjlib库给上层应用,以便实现基于sip协议的软电话功能。
团体布局如下:

 实现原理:
1)基于pjsip封装sdk;
2)封装底子操作及回调函数;

完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20241217 获取。二、接口设计

1、init

功能
初始化接口,用于初始化dll库。
接口声明
  1. int init(int sock_type, int local_port);
复制代码
入参
sock_type : soket类型,设置如下
1 => udp
2 => tcp (后续支持)
3 => tls (后续支持)
local_port : 本地监听端口,设置为0则为随机端口
返回值
0 : 成功
-1 : 失败
2、set_incoming_cb

功能
设置呼入回调函数,用于处理呼入请求。
接口声明
  1. int set_incoming_cb(pCallBack cb);
复制代码
入参
cb : 回调函数,格式如下
  1. int(*pCallBack)(int, int);
复制代码
返回值
0 : 成功
-1 : 失败
3、acc_reg

功能
账号注册操作,提供账号信息注册到指定服务器。
接口声明
  1. int acc_reg(char* sip_domain, char* sip_user, char* sip_passwd,char* realm);
复制代码
入参
sip_domain : 注册服务器
sip_user : 用户名
sip_passwd : 密码
realm : 注册域
返回值
account id : 成功
-1 : 失败
4、acc_unreg

功能
账号注销操作,注销指定账号。
接口声明
  1. int acc_unreg(int acc_id);
复制代码
入参
acc_id :账号id
返回值
call id : 成功
-1 : 失败
5、acc_make_call

功能
外呼操作,使用指定账号进行外呼。
接口声明
  1. int acc_make_call(int acc_id, const char* dst_num);
复制代码
入参
acc_id :账号id
dst_num : 被叫号码
返回值
call id : 成功
-1 : 失败
6、acc_answer_call

功能
挂机操作,挂断指定呼叫。
接口声明
  1. int acc_answer_call(int call_id);
复制代码
入参
call_id : 必要接听的呼叫id值。
返回值
0 : 成功
-1 : 失败
7、acc_hangup_call

功能
挂机操作,挂断指定呼叫。
接口声明
  1. int acc_hangup_call(int call_id);
复制代码
入参
call_id : 必要挂机的呼叫id值。
返回值
0 : 成功
-1 : 失败
8、destory

功能
回收pjsua资源。
接口声明
  1. int destory();
复制代码
入参

返回值
0 : 成功
-1 : 失败
三、接口实现

 使用vs2022进行dll封装,配置类型设置为dll类型。

 1、编写头文件;

 完整内容可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20241217 获取。2、编写cpp文件

完整内容可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20241217 获取。3、编译成动态库
在sipClient工程右键选中“生成”即可进行编译。

 打包的vs2022工程文件及编译好的dll文件,可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20241217 获取。四、示例代码(python)

这里以python为例,展示下怎样调用dll库。
必要留意下,这里的dll和python版本pjsua还是不一样的,对python版本无要求。
如需编译python版pjsua,可参考如下文章:
https://www.cnblogs.com/MikeZhang/p/centos7py39pjsua20230608.html
https://www.cnblogs.com/MikeZhang/p/pyPjsuaExample20230623.html
1、来电处理

功能分析:
1)注册账号;
2)来电自动接听;
3)等候特定时间后执行挂机操作;
4)挂机操作;
5)注销操作;
示例代码如下(autoAnswer1.py):
  1. import time
  2. from ctypes import *
  3. pDll = CDLL("./sipClient.dll")
  4. # typedef int (*Func)(int, int);
  5. cbType = CFUNCTYPE(c_int, c_int, c_int)
  6. def incoming_callback(acc_id, call_id):
  7.     print("python callback called >>>>>>>>>>>>>>>>")
  8.     print("acc_id : {} , call_id : {}".format(acc_id, call_id))
  9.     pDll.acc_answer_call(call_id)
  10.     time.sleep(30)
  11.     pDll.acc_hangup_call(call_id)
  12.     return 0
  13. pDll.init(1,0)
  14. incoming_cb = cbType(incoming_callback)
  15. pDll.set_incoming_cb(incoming_cb)
  16. reg_host=b"192.168.137.100:5060"
  17. domain=create_string_buffer(reg_host)
  18. user=create_string_buffer(b"1002")
  19. passwd=create_string_buffer(b"0000")
  20. realm=create_string_buffer(b"*")
  21. acc_id = pDll.acc_reg(domain,user,passwd,realm)
  22. print("acc_id : ",acc_id)
  23. time.sleep(1)
  24. print("wait call")
  25. input("#############################\n")
  26. pDll.acc_unreg(acc_id)
  27. time.sleep(1)
  28. pDll.destory()
复制代码
注册结果如下:

 自动接听结果如下:

2、手动外呼

功能分析:
1)注册账号;
2)主动发起外呼请求;
3)挂机操作;
4)注销操作;
示例代码如下(manualCallout1.py):
  1. import ctypes,time
  2. pDll = ctypes.CDLL("./sipClient.dll")
  3. pDll.init(1,0)
  4. reg_host=b"192.168.137.100:5060"
  5. domain=ctypes.create_string_buffer(reg_host)
  6. user=ctypes.create_string_buffer(b"1002")
  7. passwd=ctypes.create_string_buffer(b"0000")
  8. realm=ctypes.create_string_buffer(b"*")
  9. acc_id = pDll.acc_reg(domain,user,passwd,realm)
  10. print("acc_id : ",acc_id)
  11. input("#############################")
  12. #dst_uri = ctypes.create_string_buffer(b"sip:1000@" + reg_host)
  13. dst_num = ctypes.create_string_buffer(b"1000")
  14. callid = pDll.acc_make_call(acc_id,dst_num)
  15. input("#############################")
  16. pDll.acc_hangup_call(callid)
  17. input("#############################")
  18. pDll.acc_unreg(acc_id)
  19. time.sleep(1)
  20. pDll.destory()
复制代码
呼叫结果如下:

 接听结果如下:

 可运行的python脚本及dll文件,可从文末提供的渠道获取。
五、示例代码(c#)

这里参考python示例代码,用c#展示怎样调用sipClient库。
1、来电处理

功能分析:
1)注册账号;
2)来电自动接听;
3)等候特定时间后执行挂机操作;
4)挂机操作;
5)注销操作; 
示例代码如下(csAutoAnswer1):

完整内容可从可从文末提供的渠道获取。
运行结果如下:

 对应的工程文件(csAutoAnswer1.zip)可从文末提供的渠道获取。
2、手动外呼

功能分析:
1)注册账号;
2)主动发起外呼请求;
3)挂机操作;
4)注销操作;
示例代码如下(csManualCallout1):

完整内容可从可从文末提供的渠道获取。
 外呼结果如下:

 对应的工程文件(csManualCallout1.zip)可从文末提供的渠道获取。
六、资源下载

本文涉及源码及相干文件,可从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20241217 获取。

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表