首页 > 其他分享 >使用pjsip封装自定义软电话sdk

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

时间:2024-12-17 22:42:14浏览次数:4  
标签:acc 自定义 int pjsip call pDll 如下 id sdk

环境: 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库。

接口声明

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

功能
设置呼入回调函数,用于处理呼入请求。

接口声明

int set_incoming_cb(pCallBack cb);

入参

cb : 回调函数,格式如下

int(*pCallBack)(int, int);

返回值

0 : 成功
-1 : 失败

3、acc_reg

功能
账号注册操作,提供账号信息注册到指定服务器。

接口声明

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

功能
账号注销操作,注销指定账号。

接口声明

int acc_unreg(int acc_id);

入参

acc_id :账号id

返回值

call id : 成功
-1 : 失败

5、acc_make_call

功能
外呼操作,使用指定账号进行外呼。

接口声明

int acc_make_call(int acc_id, const char* dst_num);

入参

acc_id :账号id
dst_num : 被叫号码

返回值

call id : 成功
-1 : 失败

6、acc_answer_call

功能

挂机操作,挂断指定呼叫。

接口声明

int acc_answer_call(int call_id);

入参

call_id : 需要接听的呼叫id值。

返回值

0 : 成功
-1 : 失败

7、acc_hangup_call

功能
挂机操作,挂断指定呼叫。

接口声明

int acc_hangup_call(int call_id);

入参

call_id : 需要挂机的呼叫id值。

返回值

0 : 成功
-1 : 失败

8、destory

功能
回收pjsua资源。

接口声明

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):

import time
from ctypes import *

pDll = CDLL("./sipClient.dll")

# typedef int (*Func)(int, int);
cbType = CFUNCTYPE(c_int, c_int, c_int)

def incoming_callback(acc_id, call_id):
    print("python callback called >>>>>>>>>>>>>>>>")
    print("acc_id : {} , call_id : {}".format(acc_id, call_id))
    pDll.acc_answer_call(call_id)
    time.sleep(30)
    pDll.acc_hangup_call(call_id)
    return 0

pDll.init(1,0)
incoming_cb = cbType(incoming_callback)
pDll.set_incoming_cb(incoming_cb)

reg_host=b"192.168.137.100:5060"

domain=create_string_buffer(reg_host)
user=create_string_buffer(b"1002")
passwd=create_string_buffer(b"0000")
realm=create_string_buffer(b"*")

acc_id = pDll.acc_reg(domain,user,passwd,realm)

print("acc_id : ",acc_id)

time.sleep(1)
print("wait call")
input("#############################\n")

pDll.acc_unreg(acc_id)

time.sleep(1)
pDll.destory()

注册效果如下:

 自动接听效果如下:

2、手动外呼

功能说明:
1)注册账号;
2)主动发起外呼请求;
3)挂机操作;
4)注销操作;

示例代码如下(manualCallout1.py):

import ctypes,time

pDll = ctypes.CDLL("./sipClient.dll")

pDll.init(1,0)

reg_host=b"192.168.137.100:5060"

domain=ctypes.create_string_buffer(reg_host)
user=ctypes.create_string_buffer(b"1002")
passwd=ctypes.create_string_buffer(b"0000")
realm=ctypes.create_string_buffer(b"*")

acc_id = pDll.acc_reg(domain,user,passwd,realm)

print("acc_id : ",acc_id)

input("#############################")

#dst_uri = ctypes.create_string_buffer(b"sip:1000@" + reg_host)
dst_num = ctypes.create_string_buffer(b"1000")
callid = pDll.acc_make_call(acc_id,dst_num)

input("#############################")

pDll.acc_hangup_call(callid)

input("#############################")

pDll.acc_unreg(acc_id)

time.sleep(1)
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 获取。

 

标签:acc,自定义,int,pjsip,call,pDll,如下,id,sdk
From: https://www.cnblogs.com/MikeZhang/p/18613532/sipClient20241217

相关文章

  • 鸿蒙项目云捐助第十一讲鸿蒙App应用的捐助成功自定义对话框组件实现
    在生活中,用户做了一个好事后,很多场合都会收到一份感谢。在捐助的行业也是一样的,用户捐出了一片爱心,就会收获一份温情。这里的温情是通过自定义对话框实现的。一、通过自定义对话框组件实现捐款成功的信息页这里用户捐款成功或者捐赠物品成功,相当于用户获得一份爱心的回馈。这......
  • SpringBoot 自定义事件
    在SpringBoot中,自定义事件和监听器是一种强大的机制,允许你在应用程序的不同部分之间进行解耦通信。你可以定义自定义事件,并在需要的时候发布这些事件,同时让其他组件通过监听器来响应这些事件。以下是如何在SpringBoot中创建和使用自定义事件的基本步骤:1.定义自定义事件......
  • 第47节 ArkTS 创建自定义组件
    在ArkTS中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在ArkTS中创建和使用自定义组件的详细步骤:一、定义自定义组件1.使用@Component注解:为了注册一个组件,使其能够在其他文件中被引用,你需要使用@Component注解。例如:@ComponentstructMyComp......
  • Vue实现3D卡片效果,几行代码搞定,旋转、立体、自定义组件、嵌套任意内容
    文章目录效果预览1.组件结构2.脚本部分(`<script>`)属性(`props`)数据(`data`)方法(`methods`)生命周期钩子(`mounted`)3.样式部分(`<stylescoped>`)实现思路总结完整代码[高清壁纸,古风美女,萌趣表情包,创意视频,唯美图片https://coder4j.com/](https://coder4j......
  • Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率
    zhuan: https://www.cnblogs.com/wangzhongyang/p/18181397-------------------Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四) 前言上一篇文章带你实现了Go-Zero和goctl:解锁微服务开发的神器,快速上手指南,本文将继续深入探讨Go-Zero的强大之处,并介绍如何使用......
  • 开发自定义 UDFs 和库
    开发自定义UDFs和库1.创建项目结构使用构建工具设置项目推荐使用SBT或Maven来管理依赖项和构建过程。以下是使用SBT的示例:build.sbt文件配置:name:="CustomUDFLibrary"version:="1.0"scalaVersion:="2.12.15"//根据你的Spark版本选择合适的Sca......
  • SDK与项目使用同样的三方依赖库如何解决符号冲突问题
    使用公共依赖,项目和SDK都依赖同一个库,这样就需要沟通和协调,一旦需要升级改动,也许会牵一发而动全身,就是都得跟着改的意思各自维护,谁挖的坑谁填,这样的好处就不会相互牵连,职责相对明确清晰,坏处就是少了复用性,增加冗余具体实施:做成公共组件,由项目宿主(壳工程)依赖,......
  • QT 自动伸缩的工具栏和自定义配置的工具栏 QToolBar更多按钮的样式设置
    1.实现目标如下图所示,播放窗口的工具栏,有很多按钮,当窗口的宽度不够时,能够自动生成更多按钮,点击更过按钮就会出现多余按钮的menu菜单;2。实现方法一开始我还想着加个按钮控件,在播放窗口resize函数中判断工具栏的宽度能容纳几个按钮,判断宽度是否够,如果不够的话,则要显示更多按钮,点......
  • 《鸿蒙开发-答案之书》自定义弹框
    《鸿蒙开发-答案之书》自定义弹框系统的弹框不适用的,很难用。下面我们来自定义弹框试试步骤一:用@CustomDialog注解,标识你是自定义弹框,然后在build里面写你弹框布局示例代码如下:@CustomDialogexportstructChatGoldStandardDialog{goldSum:numbercontroller:C......
  • XSYL10103利用控件获取值也可以用自定义
    stringCKID=this._page.GetControlValue("btnCKMC");pu10103,btnCKMC是一个下拉框namespaceXSYLKCGL{publicclassCKWLDY:ISuwfBus{///<summary>///initialization///</summary>privateSlnS......