一.数据帧格式 为防止DTU和服务器传输过程中因网络原因导致拆包、粘包,因此约定传输的基本数据帧格式如下,DTU上传和服务器下发的数据包均需满足此数据帧格式要求。服务器应解决TCP传输过程中的拆包粘包问题,确保每次处理的是完整的数据包。 基本数据帧格式: | | | | | | | | | | | | | | | | | 从Data到CheckSum的字节数。大端格式(高字节在前) |
| 从Type开始按字节累加到本域的前一字节.每次累加进位去掉。 |
Type:数据包类型,也理解为Command. 不同的Tyep其对应的Length大小可能不同,Data也有所区别。 Length:在此之后的数据长度。大端格式。 CheckSum:校验和,虽然TCP传输协议本身已经有CRC校验,但网络传输路径的复杂性仍然无法保证数据一定无误,因此需要对每个数据帧(包)再进行简单的校验。
二.Login和LoginAck及其Data含义DTU每次和服务器建立TCP连接后,首先必须先往服务器发Login命令,服务器根据业务需要判断其合法性(鉴权),然后回复LoginAck命令。 | | | | Data内容格式 (按顺序排列,排在前面的先传输,大端格式) | | | | | PSN(uint32)|PASS(uint32)|PName(uchar[8])|CurVer(uint16)| CCID(char[20]) | | | | | | 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<x<255):当第1~x个Test参数中有任何一个变化时马上上传,否则将根据SendTestTime所设定的时间定时上传. Test测量值顺序按终端和服务器约定的SendTest命令中Data的TestValue顺序排列,2字节一组(组成unsigned short 或short类型数据)。 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链路。 四. SaveSetup和SaveSetupAck及其相关的Data含义:SaveSetup用于服务器配置自动上传数据的时间间隔,以及DTU里关于寄存器地址的信息列表,即“寄存器列表”,DTU将根据此列表读取对应寄存器地址的值(value)。配置成功后DTU用SaveSetupAck包把所配置的寄存器列表返回给服务器,可供服务器用于校验配置成功与否。 | | | | Data内容格式 (按顺序排列,排在前面的先传输,大端格式) | | | | | SendTestTime(uchar)| SetDev1(uchar)|SetAddr1 (int16)|SetDev2(uchar)| SetAddr2(int16)|... | | | | | Result(uchar)|SendTestTimeAck(uchar)|SetDevAck1(uchar)|SetAddrAck1 (int16)|SetDevAck2(uchar)| SetAddrAck2(int16)|... |
寄存器地址列表: 下行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里存储的自动上传时间间隔参数,以及“寄存器列表”。 | | | | Data内容格式 (按顺序排列,排在前面的先传输,大端格式) | | | | | | | | | | 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数据包上传给服务器。 | | | | Data内容格式 (按顺序排列,排在前面的先传输,大端格式) | | | | | NetState(uchar)|TestCode(uchar)|Value1(int16) | Value2(int16)... | | | | | |
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)组成。 | | | | Data内容格式 (按顺序排列,排在前面的先传输,大端格式) | | | | | ReadValueDev1(uchar)|ReadValueAddr1 (int16)|ReadValueDev2(uchar)| ReadValueAddr2(int16)|... | | | | | 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响应服务器的数据包,跟服务器下发的配置参数一致,可供服务器校验配置成功与否。 | | | | Data内容格式 (按顺序排列,排在前面的先传输,大端格式) | | | | | SetValueDev1 (uchar) |SetValueAddr 1(int16)| SetValue(int16)1| SetValueDev2 (uchar) |SetValueAddr 2(int16)| SetValue(int16)2|...... | | | | | 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内的寄存器列地址和寄存器值列表示意:
完整的Word格式文档51黑下载地址: |