一.数据帧格式
为防止DTU和服务器传输过程中因网络原因导致拆包、粘包,因此约定传输的基本数据帧格式如下,DTU上传和服务器下发的数据包均需满足此数据帧格式要求。服务器应解决TCP传输过程中的拆包粘包问题,确保每次处理的是完整的数据包。
基本数据帧格式:域名TypeLengthData[n]CheckSum
长度(byte)12n1
含义包类型包长n个数据校验和
备注决定了Data的内容从Data到CheckSum的字节数。大端格式(高字节在前)从Type开始按字节累加到本域的前一字节.每次累加进位去掉。
Type:数据包类型,也理解为Command. 不同的Tyep其对应的Length大小可能不同,Data也有所区别。
Length:在此之后的数据长度。大端格式。
CheckSum:校验和,虽然TCP传输协议本身已经有CRC校验,但网络传输路径的复杂性仍然无法保证数据一定无误,因此需要对每个数据帧(包)再进行简单的校验。
二.Login和LoginAck及其Data含义
DTU每次和服务器建立TCP连接后,首先必须先往服务器发Login命令,服务器根据业务需要判断其合法性(鉴权),然后回复LoginAck命令。传输方向Type名称Type值含义Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
上行Login0x12DTU请求登陆服务器PSN(uint32)|PASS(uint32)|PName(uchar[8])|CurVer(uint16)| CCID(char[20]) |
下行LoginAck0x12服务器应答DTU登陆请求Right(uchar)|FoTaFlag(uchar)|TickTime(uchar)|SendTestMode(uchar)|SendTestTime(uchar)|NewVer(uint16)|NewPort(uint16)|NewIP(uchar[4])|
PSN:DTU编码.每个DTU都有唯一的产品序列号(或简称DTU编码)。
PASS: DTU密码。
服务器建立PSN和PASS关系表,初始化情况下PASS为0,当DTU请求Login时,如果数据库里PSN对应的PASS为0时,不需比对直接通过,并将DTU上传的PASS值写入数据库中,下次DTU再登录服务器时,因数据库的PASS非0而需要比较DTU上传的PASS和数据库的PASS是否相同,不同则认为鉴权失败。
PName:产品名称,如HS121, 不够8字节的后面补0.
CurVer:当前DTU应用版本号。
CCID: SIM卡的ICCID号(20个字符)。
Right:服务器鉴权结果。
Right=0xEA表示鉴权成功! 其他值均表示鉴权失败。如果鉴权失败,服务器应在发完这条响应数据包后主动关闭此TCP连接。
FoTaFlag: 空中升级配置标志:
FoTaFlag =0--不支持空中升级;
FoTaFlag =1--可手动空中升级;用户通过串口或按键组合才能触发触发空中升级。
FoTaFlag =2--可自动空中升级。DTU收到此信息后应马上进入空中升级模式。
TickTime:上传心跳时间间隔
SendTestMode: 数据上传模式,可以选择服务器查询,或者DTU自动上传。(目前此模式无效,只支持定时上传)
SendTestMode=0 :任何一个测量值发生变化终端马上上传,但上传速度不大于SendTestTime 所设定的时间。如SendTestTime=3则最快上传速度为3 秒一次。
SendTestMode =255:忽略Test值是否有变化,只按照SendTestTime设定的时间间隔上传。
SendTestMode=x( 0
SendTestTime: DTU上传Test时间,在没有服务端下发查询的时候DTU以此时间间隔上传DTU保存值,为0时表示不自动上传。
NewVer:表示当前DTU软件的最新版本号,0表示没有新版本。当DTU检查到当前版本小于最新版本时,DTU根据FoTaFlag决定是否远程升级。
NewPort:新服务器端口。
NewIP:新服务器端IP地址。如123.86.55.33 第一个字节为123 按此顺序。
NewPort和NewIP 可用于服务器迁移和负载均衡需要。为0时终端不处理,非0时终端将更新存储的服务器IP和Port,下次链接服务器将用新的IP和Port.三、SendTick和SendTickAck及其Data含义:
DTU Login到服务器时,服务器下发的LoginAck中包含了TickTime参数(单位为秒),其值代表了DTU应该至少在多长时间内发起一次上行数据,如果在这个时间段内没有任何上行数据传输(如SendTest或SendSetup),则必须发一个SendTick 数据包到服务器,以便服务器持续保持TCP链路。传输方向Type名称Type值含义Data内容格式
上行SendTick0x13DTU上传心跳包无
下行SendTickAck0x13服务器回应心跳无四. SaveSetup和SaveSetupAck及其相关的Data含义:
SaveSetup用于服务器配置自动上传数据的时间间隔,以及DTU里关于寄存器地址的信息列表,即“寄存器列表”,DTU将根据此列表读取对应寄存器地址的值(value)。配置成功后DTU用SaveSetupAck包把所配置的寄存器列表返回给服务器,可供服务器用于校验配置成功与否。传输方向Type名称Type值含义Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
下行SaveSetup0x16服务器配置DTU的地址列表SendTestTime(uchar)| SetDev1(uchar)|SetAddr1 (int16)|SetDev2(uchar)| SetAddr2(int16)|...
上行SaveSetupAck0x16DTU响应服务器Result(uchar)|SendTestTimeAck(uchar)|SetDevAck1(uchar)|SetAddrAck1 (int16)|SetDevAck2(uchar)| SetAddrAck2(int16)|...
寄存器地址列表:从机号(uchar)寄存器地址(int16)
10x55
10x56
10x57
20x55
......
下行SaveSetup:
SendTestTime:配置自动上传数据的时间间隔(单位:秒)
SetDev1,SetAddr1:从机号,寄存器地址
SetDev2,SetAddr2:从机号,寄存器地址
SetDev3,SetAddr3:从机号,寄存器地址
SetDev4,SetAddr4:从机号,寄存器地址
SetDev5,SetAddr5:从机号,寄存器地址
......
上行SaveSetupAck:
成功返回:
Result:1
SendTestTimeAck: 自动上传数据的时间间隔(单位:秒)
SetDevAck1,SetAddrAck1:从机号,寄存器地址
SetDevAck2,SetAddrAck2:从机号,寄存器地址
SetDevAck3,SetAddrAck3:从机号,寄存器地址
SetDevAck4,SetAddrAck4:从机号,寄存器地址
SetDevAck5,SetAddrAck5:从机号,寄存器地址
......
失败返回:
Result:0五. ReadSetup和ReadSetupAck及其相关的Data含义:
ReadSetup用于服务器读取DTU里存储的自动上传时间间隔参数,以及“寄存器列表”。传输方向Type名称Type值含义Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
下行ReadSetup0x19服务器配置DTU的地址列表无
上行ReadSetupAck0x19DTU响应服务器SendTestTime (uchar)|ReadDev1(uchar)|ReadAddr1 (int16) | ReadDev2(uchar)|ReadAddr2(int16)|...
SendTestTime:自动上传时间间隔
ReadDev1,ReadAddr1:从机号,寄存器地址
ReadDev2,ReadAddr2:从机号,寄存器地址
ReadDev3,ReadAddr3:从机号,寄存器地址
ReadDev4,ReadAddr4:从机号,寄存器地址
ReadDev5,ReadAddr5:从机号,寄存器地址
......
六、SendTest和SendTestAck及其相关的Data含义:
SendTest是DTU定时自动上传的数据包,数据内容为寄存器里的值(value)。DTU将根据“寄存器列表”去获取从机的对应的寄存器里对应值(value),按顺序排列为如Value1,Value2,Value3... 将所有测量数据一起打包成SendTest数据包上传给服务器。传输方向Type名称Type值含义Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
上行SendTest0x14DTU上传测量数据NetState(uchar)|TestCode(uchar)|Value1(int16) | Value2(int16)...
下行SendTestAck0x14服务器响应DTU上传测量数据TestCode(uchar)
NetState: 网络状态.DTU通讯模块的CSQ值。
TestCode: 测量值标识码。为了DTU同步Value数据到服务器,服务器收到SendTest数据包并成功解析、存储后将此TestCode回传给DTU。
当DTU本地的各种Value发生变化且满足SendTestMode要求时,本地记录的TestCode加一(255加1等于0),然后和所有的Value打包成SendTest数据包上传给服务器,当服务器收到SendTest数据包且成功解析并保存后将其值返回给DTU即可,假如服务器收到的SendTest数据包和事先约定的数据包不相符(比如个数少了),则服务器可以通过将TestCode减一(0减1等于255)后再回传给DTU,这样DTU会触发重传。TestCode服务器不需要保存在数据库中。
Value1 : 第一个寄存器地址里的值;
Value2 : 第二个寄存器地址里的值;
Value3 : 第三个寄存器地址里的值;
Value4 : 第四个寄存器地址里的值;
......七.ReadTest和ReadTestACK及相关的Data含义
ResdTest用于服务器查询指定寄存器的数据。
ResdTestAck是DTU返回给服务器的数据包,由对应的寄存器的值(value)组成。传输方向Type名称Type值含义Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
下行ResdTest0x18服务器查询DTUReadValueDev1(uchar)|ReadValueAddr1 (int16)|ReadValueDev2(uchar)| ReadValueAddr2(int16)|...
上行ResdTestAck0x18DTU响应服务器查询Result(uchar)|ReadValue1(int16)| ReadValue12(int16)......
上行ResdTest:
ReadValueDev1,ReadValueAddr1:从机号,寄存器地址
ReadValueDev2,ReadValueAddr2:从机号,寄存器地址
ReadValueDev3,ReadValueAddr3:从机号,寄存器地址
ReadValueDev4,ReadValueAddr4:从机号,寄存器地址
ReadValueDev5,ReadValueAddr5:从机号,寄存器地址
......
下行ResdTestAck:
成功返回:
Result:1
ReadValue1: 第一个寄存器地址里的值
ReadValue2:第一个寄存器地址里的值
ReadValue3:第一个寄存器地址里的值
ReadValue4: 第一个寄存器地址里的值
ReadValue5:第一个寄存器地址里的值
......
失败返回:
Result:0八. SetControl和SetControl Ack及相关的Data含义
从机中,某些寄存器是用于配置的。SetControl用于服务器给DTU下发指令,让DTU去设置某些寄存器的参数. SetControlAck为DTU响应服务器的数据包,跟服务器下发的配置参数一致,可供服务器校验配置成功与否。传输方向Type名称Type值含义Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
下行SetControl0x17服务器控制DTUSetValueDev1 (uchar) |SetValueAddr 1(int16)| SetValue(int16)1| SetValueDev2 (uchar) |SetValueAddr 2(int16)| SetValue(int16)2|......
上行SetControlAck0x17DTU响应服务器Result(uchar)|SetValueDevAck1 (uchar)|SetValueAddrAck1 (int16)| SetValueAck1 (int16) |SetValueDevAck2 (uchar)|SetValueAddrAck2 (int16)| SetValueAck2 (int16)|......
下行SetControl:
SetValueDev1: 从机号
SetValueAddr1:寄存器地址
SetValue1:参数
SetValueDev2: 从机号
SetValueAddr2:寄存器地址
SetValue2:参数
......
上行SetControlAck:
成功返回:
Result:1
SetValueDevAck1: 从机号
SetValueAddrAck1:寄存器地址
SetValueAck1:参数
SetValueDevAck2: 从机号
SetValueAddrAck2:寄存器地址
SetValueAck2:参数
......
失败返回:
Result:0
附:
DTUDTU内的寄存器列地址和寄存器值列表示意:从机号(uchar)寄存器地址(int16)值(int16)
10x330x12
10x340x34
10x550x56
10x560x78
10x570x90
20x550x12
20x880x12
完整的Word格式文档51黑下载地址:
2018-9-15 15:26 上传
点击文件名下载附件
下载积分: 黑币 -5