源设备向目标设备发送设备控制命令,控制命令的类型包括球机/云台控制、远程启动、录像控制、 报警布防/撤防、报警复位、强制关键帧、拉框放大、拉框缩小、看守位控制、设备配置等。
设备控制采用 IETFRFC3428中的 Message方法实现。
源设备包括SIP客户端、网关或者联网系统,目标设备包括SIP设备、网关或者联网系统。
源设备向目标设备发送球机/云台控制命令、远程启动命令、强制关键帧、拉框放大、拉框缩小命令后,目标设备不发送应答命令。
源设备向目标设备发送录像控制、报警布防/撤防、 报警复位、看守位控制、设备配置命令后,目 标设备应发送应答命令表示执行的结果。
命令流程描述如下:
a) 1:源设备向SIP服务器发送设备控制命令,设备控制命令采用 Message方法携带;
b) 2:SIP服务器收到命令后返回200OK;
c) 3:SIP服务器向目标设备发送设备控制命令,设备控制命令采用 Message方法携带;
d) 4:目标设备收到命令后返回200OK。
有应答命令流程

- MESSAGE sip:34020000011310000038@183.192.2.222:11589 SIP/2.0
- Via: SIP/2.0/UDP 152.100.10.22:5063;branch=z9hG4bK3ee5503300e5503344e55033c,SIP/2.0/UDP 152.100.10.22:5060;branch=z9hG4bKc75e3979f95e3979bd5e39793
- Call-ID: 262de6fd182de6fd5c2de6fddd2de6fda82de@152.100.10.22
- From:
;tag=1eb40c8f20b40c8f64b40c8fe5b40c8f - To:
- CSeq: 777 MESSAGE
- Max-Forwards: 70
- Expires: 90
- User-Agent: GbAgent
- Contact:
- Content-Type: application/MANSCDP+xml
- Content-Length: 161
-
- "1.0"?>
- <Control>
- <CmdType>DeviceControlCmdType>
- <SN>30SN>
- <DeviceID>34020000011310000038DeviceID>
- <TeleBoot>BootTeleBoot>
- Control>
对应的Android处理如下:
如果在进行语音广播,先停掉广播数据接收和播放,重置目前状态,重新注册或有针对性的做其他处理即可。
- /*
- * MainActivity.java
- *
- * WebSite: https://daniusdk.com
- * Github: https://github.com/daniulive/SmarterStreaming
- *
- */
-
- @Override
- public void ntsOnDeviceControlTeleBootCommand(String deviceId, String teleBootValue) {
- handler_.postDelayed(new Runnable() {
- @Override
- public void run() {
- Log.i(TAG, "ntsOnDeviceControlTeleBootCommand device_id:" + device_id_ + " tele_boot_value:" + tele_boot_value_);
-
- stopAudioPlayer();
- destoryRTPReceiver();
-
- if ( gb28181_agent_ != null) {
- if (gb_broadcast_source_id_ != null && gb_broadcast_target_id_ != null)
- gb28181_agent_.byeAudioBroadcast(gb_broadcast_source_id_, gb_broadcast_target_id_);
- }
-
- gb_broadcast_source_id_ = null;
- gb_broadcast_target_id_ = null;
- btnGB28181AudioBroadcast.setText("GB28181语音广播");
- btnGB28181AudioBroadcast.setEnabled(false);
-
- stopGB28181Stream();
- destoryRTPSender();
-
- if (gb28181_agent_ != null ) {
- gb28181_agent_.terminateAllPlays(true);
- gb28181_agent_.stop();
- }
-
- // 发送注销消息后,等待2000毫秒, 再释放资源
- handler_.postDelayed(new Runnable() {
- @Override
- public void run() {
- if (gb28181_agent_ != null ) {
- Log.i(TAG, " gb28181_agent_.unInitialize++");
- gb28181_agent_.unInitialize();
- gb28181_agent_.unBindLocalPort();
- gb28181_agent_.releaseSipStack();
- Log.i(TAG, " gb28181_agent_.unInitialize--");
-
- gb28181_agent_ = null;
- }
-
- // 200毫秒后再重启
- handler_.postDelayed(new Runnable() {
- @Override
- public void run() {
- Log.i(TAG, "restart gb sip agent.");
-
- if (null==gb28181_agent_) {
- if (!initGB28181Agent()) {
- Log.e(TAG, "init gb sip agent failed.");
- return;
- }
- }
-
- if (!gb28181_agent_.isRunning()) {
- if ( !gb28181_agent_.start() ) {
- Log.e(TAG, "restart gb sip agent failed.");
- }
- }
- }
-
- },200);
-
- }
-
- },2000);
- }
-
- private String device_id_;
- private String tele_boot_value_;
-
- public Runnable set(String device_id, String tele_boot_value) {
- this.device_id_ = device_id;
- this.tele_boot_value_ = tele_boot_value;
- return this;
- }
-
- }.set(deviceId, teleBootValue),0);
- }
需要注意的是,由于国标平台虽有统一标准,但是实现细节并不统一,在做GB28181平台对接的时候,还是尽量以官网spec和其他相关规范为准。