当前位置: 首页 > 后端技术 > PHP

JT-T808协议:0x0001终端总响应和0x8001平台总响应

时间:2023-03-29 14:33:46 PHP

终端指的是obd设备,即车载obd设备。平台是指上述通过短信设置的上报IP指向的机器所提供的网关服务。这两种消息是终端设备发送的和平台发送的,都是通用响应的格式。所谓通用就是一种消息格式,可以用来回复其他消息。0x0001终端总响应起始字节字段数据类型说明及要求0响应序号WORD对应平台消息序号2响应IDWORD对应平台消息ID4结果BYTE0:成功/确认;1:失败;2:消息有错误;3:不支持ps。上表省略了消息头部分。默认情况下,所有响应和传输都有一个消息头。当平台下发指令或设置终端参数(0x8103)时,设备会响应此消息。Responseserialnumber:四位十六进制字符串,为平台消息的序号,可以为0000ResponseID:四位十六进制消息id,如(8103,0001等)Responseresult:两位数字符的十六进制字符,如表中的结果响应,00:成功,01:失败,02:消息错误等0x8001平台通用响应设备发送的消息,注册响应除外(0x8100),定时响应(0x8f01)其他数据数据可以使用此消息id响应发送。例如报文:7E80010005013183700516000005D2020000817E解析为:分号报文描述17e报文标签28100报文ID3000F报文正文属性4013183700516设备号50000报文序号605D2对应终端报文序号,即8000报文序号对应终端消息ID:success/confirmation;1:失败;2:错误信息;3:不支持;4:告警确认处理981校验码107emessagemarkedmessageheader此处不再赘述,需要注意的是,第7行中的0200是设备位置信息上报的messageid,表示这条消息是响应设备发送的位置信息报告(0x0200),不同的消息这里的数据不同。校验码的计算在上一篇文章中,我简单说了下计算方法。在这里,我将计算校验码和验证校验码的细节记下来。接收到的报文进行恢复和转义后,去掉报文标识和校验位,按位异或得到的结果就是该报文的校验码,与校验位进行比较,验证其一致性。将要发送的报文封装后,在位外进行标记,对位进行异或,将得到的校验码放在报文末尾,然后进行转义。#按位伪代码functionbcc(arraydata){xor=data[0];for(i=1;i7d01*7e->7d02*@returnmixed*/publicfunctionescape($msg=''){if($msg){return'7e'.str_replace($this->replace,$this->search,$msg)。'7e';}else{$this->hex='7e'.str_replace($this->replace,$this->search,substr($this->hex,2,-2)).'7e';}}/***撤销转义*7d01->7d*7d02->7e*@returnmixed*/publicfunctionescape($msg=''){if($msg){re转str_replace($this->search,$this->replace,$msg);}else{$this->hex='7e'.str_replace($this->search,$this->replace,substr($this->hex,2,-2))。'7e';}}}校验校验码示例#@paramcheck_code|如果校验码为空,则计算校验码,如果不为空,则校验校验码函数bcc($msg,$check_code=''){//将字符串拆分为两个字符$check_str_array=str_split($msg,2);$str_len=count($check_str_array);$xor=hexdec($check_str_array[0]);对于($i=1;$i<$str_len;$i++){$xor^=hexdec($check_str_array[$i]);}$xor=dechex($xor);$xor=str_pad($xor,2,0,STR_PAD_LEFT);#不足两位补0if(!$check_code){return$xor;}返回$xor==$check_code;}

猜你喜欢