前两篇也说明了一些应答的相关内容,对于刚接触的开发者来说恐怕还是不太容易理解,这里专门列举一个篇幅来讲解如何针对终端设备上报的信息进行应答。
严格来讲,如果不应答,终端设备会判别为服务平台断开连接,就会重复发送相同的信息直到平台应答。
应答有两种:注册应答和通用应答。
注册应答
顾名思义,注册应答是指在设备初次连接平台时会发送注册信息,消息 id 一般为:0x0100
具体参考部标协议截图如下:
(图一)
应答的消息 id 为:0x8100
具体参考部标协议截图如下:
(图二)
值得一提是,上图的内容其实不够全面,完整的应答格式应该包含部标协议中的 消息头
,消息头必须存在于每一条消息中,不管是终端发给平台还是平台发给终端,都必须包含消息头。
举例,如果平台收到一条终端发来的注册消息如下:
7e0100002c01918051355000110000000037303131325345472d39383838470000000000000000000000303531333535300130353133353530167e
我们该怎么来分析这条消息呢,首先,挑出 消息标示
,也就是首尾的7e
。0100002c0191805135500011
这一段是消息头,标准的字符串长度是:4(消息 ID)+4(消息体属性)+12(终端手机号)+4(消息流水号)=24 个字符,12 个字节。拆分一下就是这样:0100
`002c019180513550
0011`
剩下的就是终端注册时携带的具体内容,可以参考(图一)去分拆消息。
如何应答这条消息呢?其实也是比较简单的,消息头可以直接复用,也就是把终端发送来的消息头直接截取出来使用,加上图二中的信息然后加上 校验码
,首位拼接上 7e 即可。
应答流水号
:可以直接为0000
结果
:如果设备号存在于平台则应答:00
或者 03
如果设备号不存在或者平台不允许不存在于平台数据库的设备连接则映带 04 或者选择不应答。具体看需求策略。
鉴权码
:当应答 结果
为03
时无需填写,01
时填写,设备接收后会保存,下次注册时携带。
综合下来就是这样:7e
`81000003
0191805135500001
001103
b5`7e
需要注意的有两点:
- 1 . 在封装完消息后,还未拼接首位的
7e
时要对消息进行一次转义,具体就是把消息中所有的7e
替换为7d02
所有的
7d
替换为7d01
- 2. 所有的消息发送完毕后服务端不要立即关闭连接(server->close()),这其实是个常识为题,obd 为长连接状态,关闭后 obd 会不停触发注册信息。
平台通用应答(0x8001)
这个在上篇中已经说的比较详细了。相比上面的注册应答,通用应答更为简单,在理解了注册应答后再开看通用应答无非是应答 id 要随着终端上报的消息 id 而改变,应该的结果为:00
其他的没有什么区别。