GB28181的设备端开发(一)

项目要求设备要支持GB28181,发现网上资源比较少,记录一下自己开发过程。
首先GB28181是基于sip协议进行传输的一项协议,网上的sip开源库不少,这里我选择了PJSIP作为sip的开发用的库。

0.流程图

引用 CSDN 另一位博主的大概思路,我也将大致按照这个流程进行开发:
图引自https://blog.csdn.net/Zhu__/article/details/90967400
图引自https://blog.csdn.net/Zhu__/article/details/90967400

1.交叉编译PJSIP

PJSIP的下载地址:https://www.pjsip.org/
我用的是12.10版,下载好后解压缩到linux虚拟机中,根据官方说明安装以下方法安装
./configure --host=aarch64-linux-gnu --enable-shared --enable-ffmpeg --with-ffmpeg=/opt/ --prefix=/home/liu/workspace/pjsip
make dep
make
make install

说明下
–with-ffmpeg : ffmpeg的安装目录
–prefix : 指定编译后保存生产库的路径
–host : 指定交叉编译器

make dep的时候出现了报错 fatal error: emmintrin.h: No such file or directory
根据此解决办法将第一步配置修改为
./configure --host=aarch64-linux-gnu --enable-shared --enable-ffmpeg --with-ffmpeg=/opt/ --disable-libwebrtc --prefix=/home/liu/workspace/pjsip
安装完成,接下来先写个程序让设备能注册到SIP服务器上。

2.部署SIP服务器

测试的话肯定得有个支持GB28181的服务器,我用的是青柿的liveGBS,安装步骤十分简单,官网也有详细教程,过程就不说明了。官网链接:https://www.liveqing.com/docs/download/LiveGBS.html#%E7%9B%B8%E5%85%B3%E4%BB%8B%E7%BB%8D

3.simple_pjsua.c

PJSIP有好几个API版本,我选择了封装较高的pjsua。API的说明在http://www.pjsip.org/docs/latest-2/pjlib/docs/html/index.htm。
要了解pjsua的使用,simple_pjsua.c是一个很好的例子,程序在下载目录下的 pjsip-apps/src/samples/simple_pjsua.c

#include <pjsua-lib/pjsua.h>

#define THIS_FILE	"APP"

#define SIP_DOMAIN	"example.com"
#define SIP_USER	"alice"
#define SIP_PASSWD	"secret"

//来电回调函数
/* Callback called by the library upon receiving incoming call */
static void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id,
			     pjsip_rx_data *rdata)
{
    pjsua_call_info ci;

    PJ_UNUSED_ARG(acc_id);
    PJ_UNUSED_ARG(rdata);
	
	//	  获得呼叫信息
    pjsua_call_get_info(call_id, &ci);

    PJ_LOG(3,(THIS_FILE, "Incoming call from %.*s!!",
			 (int)ci.remote_info.slen,
			 ci.remote_info.ptr));
	
	//	  自动应答呼叫
    /* Automatically answer incoming calls with 200/OK */
    pjsua_call_answer(call_id, 200, NULL, NULL);
}
				 
 //呼叫状态改变的回调函数
/* Callback called by the library when call's state has changed */
static void on_call_state(pjsua_call_id call_id, pjsip_event *e)
{
    pjsua_call_info ci;

    PJ_UNUSED_ARG(e);

    pjsua_call_get_info(call_id, &ci);
    PJ_LOG(3,(THIS_FILE, "Call %d state=%.*s", call_id,
			 (int)ci.state_text.slen,
			 ci.state_text.ptr));
}

//媒体状态改变的回调函数
/* Callback called by the library when call's media state has changed */
static void on_call_media_state(pjsua_call_id call_id)
{
    pjsua_call_info ci;

    pjsua_call_get_info(call_id, &ci);
	
	//	  当媒体为激活时,连接呼叫和声音设备
    if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) {
	// When media is active, connect call to sound device.
	pjsua_conf_connect(ci.conf_slot, 0);
	pjsua_conf_connect(0, ci.conf_slot);
    }
}

/* Display error and exit application */
static void error_exit(const char *title, pj_status_t status)
{
    pjsua_perror(THIS_FILE, title, status);
    pjsua_destroy();
    exit(1);
}

/*
 * main()
 *
 * argv[1] may contain URL to call.
 */
int main(int argc, char *argv[])
{
    pjsua_acc_id acc_id;
    pj_status_t status;
 
//  创建PJSIP
    /* Create pjsua first! */
    status = pjsua_create();
    if (status != PJ_SUCCESS) error_exit("Error in pjsua_create()", status);
 
//  校验被叫SIP地址是否正确
    /* If argument is specified, it's got to be a valid SIP URL */
    if (argc > 1) {
	status = pjsua_verify_url(argv[1]);
	if (status != PJ_SUCCESS) error_exit("Invalid URL in argv", status);
    }
 
//    初始化PJSUA,设置回调函数
    /* Init pjsua */
    {
	pjsua_config cfg;
	pjsua_logging_config log_cfg;
 
	pjsua_config_default(&cfg);
	cfg.cb.on_incoming_call = &on_incoming_call;
	cfg.cb.on_call_media_state = &on_call_media_state;
	cfg.cb.on_call_state = &on_call_state;
 
	pjsua_logging_config_default(&log_cfg);
	log_cfg.console_level = 4;
 
	status = pjsua_init(&cfg, &log_cfg, NULL);
	if (status != PJ_SUCCESS) error_exit("Error in pjsua_init()", status);
    }
 
//    创建PJSIP的传输端口
    /* Add UDP transport. */
    {
	pjsua_transport_config cfg;
 
	pjsua_transport_config_default(&cfg);
	cfg.port = 5060;
	status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &cfg, NULL);
	if (status != PJ_SUCCESS) error_exit("Error creating transport", status);
    }
 
//    启动PJSIP
    /* Initialization is done, now start pjsua */
    status = pjsua_start();
    if (status != PJ_SUCCESS) error_exit("Error starting pjsua", status);
 
//    设置SIP用户帐号,并注册到sip服务器
    /* Register to SIP server by creating SIP account. */
    {
	pjsua_acc_config cfg;
 
	pjsua_acc_config_default(&cfg);
	cfg.id = pj_str("sip:" SIP_USER "@" SIP_DOMAIN);
	cfg.reg_uri = pj_str("sip:" SIP_DOMAIN);
	cfg.cred_count = 1;
	cfg.cred_info[0].realm = pj_str(SIP_DOMAIN);
	cfg.cred_info[0].scheme = pj_str("digest");
	cfg.cred_info[0].username = pj_str(SIP_USER);
	cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
	cfg.cred_info[0].data = pj_str(SIP_PASSWD);
 
	status = pjsua_acc_add(&cfg, PJ_TRUE, &acc_id);
	if (status != PJ_SUCCESS) error_exit("Error adding account", status);
    }
 
//    发起一个呼叫
    /* If URL is specified, make call to the URL. */
    if (argc > 1) {
	pj_str_t uri = pj_str(argv[1]);
	status = pjsua_call_make_call(acc_id, &uri, 0, NULL, NULL, NULL);
	if (status != PJ_SUCCESS) error_exit("Error making call", status);
    }
 
//    循环等待
    /* Wait until user press "q" to quit. */
    for (;;) {
	char option[10];
 
	puts("Press 'h' to hangup all calls, 'q' to quit");
	if (fgets(option, sizeof(option), stdin) == NULL) {
	    puts("EOF while reading stdin, will quit now..");
	    break;
	}
 
	if (option[0] == 'q')
	    break;
 
	if (option[0] == 'h')
	    pjsua_call_hangup_all();
    }
 
    /* Destroy pjsua */
    pjsua_destroy();
 
    return 0;
}

先写个makefile看能编译通过吗

make失败,提示缺少库,查了下官方文档里有对makefile的说明
makefile
因为我的虚拟机没有安装pkg-config工具,所以安装方法2修改makefile文件,增加以下内容

include /home/liu/Downloads/pjproject-2.10/build.mak

CC      = $(PJ_CC)
LDFLAGS = $(PJ_LDFLAGS)
LDLIBS  = $(PJ_LDLIBS)
CFLAGS  = $(PJ_CFLAGS)
CPPFLAGS= ${CFLAGS}

 $(CPPFLAGS) $(LDFLAGS) $(LDLIBS)

编译通过,把编译生成的文件和动态库发到开发板上就能运行了

4.注册到sip服务器

基础配置
打开青柿的sip服务器,按照基础配置页面的内容将simple_pjsua.c #define的内容做如下修改

#define SIP_DOMAIN	"3402000000"			//和服务器的SIP域相同
#define SIP_USER	"34020000002000000999"	//20位国标设备ID,自行分配,不可重复
#define SIP_PASSWD	"12345678"				//和统一接入密码相同

还要在代码中添加服务器的IP地址,方法为在设置账户信息,注册服务器处添加以下内容

	pjsua_acc_config cfg;

	pjsua_acc_config_default(&cfg);
	cfg.proxy_cnt=1;		//添加一个代理服务器
	cfg.proxy[0] = pj_str("sip:192.168.31.103:15060");	//服务器的ip和端口号

编译运行可以在服务器上看到设备已经成功注册了。
设备列表
查看日志可以看见服务器向我们发了一个查询设备的信息的请求等待回复,至于怎么处理这个请求我们下章再说。

14:30:33.688           pjsua_core.c  .RX 526 bytes Request msg MESSAGE/cseq=4 (rdata0x7f7c001928) from UDP 192.168.31.103:15060:
MESSAGE sip:34020000002000000999@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.31.103:15060;rport;branch=z9hG4bK875664499
From: <sip:34020000002000000001@3402000000>;tag=993664499
To: <sip:34020000002000000999@3402000000>
Call-ID: 342664499
CSeq: 4 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: LiveGBS v201123
Content-Length: 156

<?xml version="1.0" encoding="GB2312"?>
<Query>
  <CmdType>Catalog</CmdType>
  <SN>12664499</SN>
  <DeviceID>34020000002000000999</DeviceID>
</Query>

--end msg--
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GB28181设备SDK是一种用于实现GB28181视频监控设备标准的软件开发工具包。该SDK可以帮助开发人员快速、高效地构建符合GB28181标准的设备应用程序。 GB28181设备SDK主要包括以下功能: 1. 实时视频传输:可以通过该SDK实现设备的实时视频传输功能,将视频数据实时传输给平台或客户应用程序。 2. 视频录像回放:支持设备的视频录像回放功能,通过SDK可以实现设备存储视频数据的回放操作。 3. 网络管理:提供网络管理接口,可以对设备网络参数进行配置和管理,确保设备的正常运行。 4. 设备状态监控:可以监控设备的运行状态,包括设备连接状态、网络质量等,及时发现并解决设备故障。 5. 报警处理:支持设备的报警处理功能,可以将设备上的报警信息实时传输给平台或客户应用程序。 6. 设备配置管理:提供对设备配置参数的管理,包括设备ID、设备名称、设备通信参数等。 7. SDK集成支持:该SDK可以被集成到设备厂商的产品中,为设备提供符合GB28181标准的功能。 通过使用GB28181设备SDK,用户可以轻松地开发出符合GB28181标准的设备应用程序,实现与平台和客户的数据交互和管理。这样可以大大提高设备的互操作性和兼容性,并且简化了设备的管理和运维工作。 ### 回答2: GB28181设备SDK是基于GB28181协议开发的软件开发工具包(SDK)。GB28181是中国国家标准化管理委员会发布的一个视频监控领域的标准协议,用于实现视频监控系统中设备之间的互联互通。 GB28181设备SDK提供了一系列的函数和接口,用于设备开发人员快速集成和开发符合GB28181标准的设备软件。通过SDK,开发人员可以方便地实现设备的注册、邀请和控制等基本功能,包括视频的编码、解码、存储和传输等核心技术。 使用GB28181设备SDK可以帮助开发人员实现以下功能: 1. 设备注册和呼叫管理:可以通过调用SDK提供的函数实现设备的注册和呼叫等管理功能,包括设备的状态维护和传输通道的建立。 2. 视频编码与解码:SDK提供了视频编码和解码的接口,可以将实时视频数据进行压缩和解压缩,实现视频的传输和显示。 3. 视频存储和传输:SDK支持将视频数据保存到本地存储设备,或者通过网络传输到其他设备。可以实现视频的实时监控和远程回放等功能。 4. 设备控制和事件处理:SDK提供了设备控制和事件处理的接口,可以实现设备的远程控制和事件的处理,如设备的PTZ控制和告警事件的响应等。 总之,GB28181设备SDK是一款用于开发符合GB28181协议的设备软件的工具包,通过使用SDK可以方便地实现设备的注册、呼叫、编码、解码、存储、传输和控制等功能。它为开发人员提供了丰富的接口和功能,帮助他们更快速、高效地进行开发工作。 ### 回答3: GB28181设备SDK是一种用于实现GB28181协议的网络视频监控设备的软件开发工具包。该SDK可以帮助开发者快速集成和开发符合GB28181标准的视频监控设备。它提供了一系列的接口和功能,包括视频流采集、编码压缩、网络传输、远程控制等,使开发者能够在满足GB28181标准的前提下,轻松地开发出稳定、高效的设备GB28181设备SDK的特点有以下几点: 1.易于使用:该SDK提供了简洁、易用的接口和文档,以及详细的示例代码,使开发者能够快速上手。无论是初学者还是有经验的开发者都可以使用它进行开发。 2.高度兼容:SDK严格遵循GB28181的规范,保证了设备与其他符合协议的设备之间的兼容性。无论是与其他GB28181设备进行集成,还是与监控中心进行对接,都可以实现无缝连接。 3.稳定性和可靠性:SDK经过了大量的测试和验证,具有很好的稳定性和可靠性。它能够实时采集、编码、传输视频流,并保证数据的完整性和可靠性,使得设备可以长时间稳定运行。 4.灵活性:SDK提供了丰富的配置选项,开发者可以根据实际需求进行定制。可以根据设备的性能、网络环境等因素进行调整,以达到最佳的性能和效果。 总之,GB28181设备SDK是一种强大的工具,可以帮助开发者快速开发符合GB28181标准的视频监控设备。它提供了丰富的功能和灵活的配置选项,能够实现稳定、高效的视频传输和远程控制,满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值