协议特性

1、 T CP 连接

2、使用CRC16数据帧错误检查,多项式码0xA 0 01.

3、通讯数据为16进制数据。

4 、若服务器收到错误命令,则不会响应终端的命令。

5 、除CRC16字段是低字节在前,高字节在后外,其他字段的多字节以高字节在前,低字节在后处理。

二、协议说明

1)通用帧格式

序号

内容

字节数

说明

备注

1

设备ID

4

设备ID号

唯一 ,平台进行ID注册

2

命令域

1

命令码

 

3

数据长度

1

数据域的长度

发送或应答 有效 数据域长度

4

数据域

N

数据

 

5

校验域

2

CRC16校验码 (从设备ID到数据域,包括数据域)

低前高后

 

  2)协议命令码

序号

命令码

含义

备注

1

0 X A 2

发送实时数据

上传要素数量和数据长度可变。 服务器 依据数据长度读取 实时 数据 并不是固定的 0x40,只是说最大为0x40个字节 一般为0x 40

 

 

 

 

 

3)通讯协议详细说明

温度数据都以有符号16进制表示,如数据为0x 00 0x FE ,表示为十进制数即 254 (0x 00FE ),温度含 1 位小数,则实际 温度值 25.4℃.即数据字节的高位在前,低位在后,此顺序不能错,否则数据值将错误。

土壤湿度数据都以有符号16进制表示,如数据为0x 01 0 Xc 3 ,表示十进制数 45 1 (0x 01c 3 ),土壤湿度含 1 位小数点,则实际土壤湿度为 45. 1 %。十六进制数据高位在前,低位在后, 此顺序不能错,否则数据值将错误。

 

 

 

终端向服务器发送数据

终端发送:

10 06 1C 01 A2 4 0 2 E EE 01 46 00 FE 01 50 00 F4 01 47 00 F 6 01 48 00 F 5 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 7F FF 12 09 13 0D 02 28 7F FF 7F FF 42 83

说明 : 4 0 代表终端发送了 64 字节 有效数据给服务器 最大字节数的发包 0x 00 FE (=254)表示水温为25.4℃ ;其他通道数据为无效数据0 x7FFF 。 终端会发送十六个 标准 通道数据( 加16个扩展通道,共32个通道, 每个通道占2个字节)到服务器

16个 标准 通道分别对应 (每个通道对应的哪种要素最好可配置,当然如果只用于导管土湿可按如下表格对应。) :

CH0

电池电量 ( 单位 V, 3 位小数 .若单位是mv没有小数点 ) 12.014 V

CH 8

 

土温 4

24.5

 

CH 1

土湿1

32.6

CH 9

气温

CH 2

土温 1

25.4°

CH 10

保留

CH 3

土湿2

33.6

CH1 1

保留

CH 4

土温 2

24.4

CH 12

保留

CH 5

土湿3

32.7

CH 13

保留

CH 6

土温 3

24.6

CH 14

保留

CH 7

土湿4

32.8

CH 15

保留

16个扩展通道对应:

CH 16

保留

CH 24

保留

CH1 7

保留

CH 25

保留

CH 18

保留

CH 26

保留

CH 19

保留

CH 27

当前 时间  年月

12    18年

09     9月

CH 20

保留

CH 28

当前 时间  日 时

13    19日

0D     13点

CH 21

保留

CH 29

当前 时间  分 秒

02    2分

28     40秒

CH 22

保留

CH 30

保留

CH 23

保留

CH 31

保留

 

服务器返回:

10 06 1C 01 A2 0 8 10 06 1C 00 00 00 02 58 C3 46

说明:若数据接收成功,则服务器返回实时时间。 10 06 1C 00 00 00 指年,月,日,时,分,秒 02 58 为上传间隔时间( 600秒,高字节在前,低字节在后。平台可修改,在收到上传的实时数据后下发给终端 。最低 300秒 )。 C3 46 CRC校验码

 

三 计算CRC码的步骤:

1、预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;

2、把第一个8位数据与16位CRC寄存器的低8位相异或,把结果放于CRC寄存器;

3、把寄存器的内容右移一位(朝低位),用0填补最高位,并检查右移后的移出位;

4、如果最低位为0:重复第3步(再次右移一位)

   如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;

5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;

6、重复步骤2到步骤5,进行下一字节8位数据的处理;

7、将该通讯帧所有字节(除CRC字段)按上述步骤计算完成后,得到的16位CRC寄存器高低字节进行交换;

8、将CRC结果放入信息帧时。

//************************************************************************************************

//**名      称:CRC16

//**说      明:CRC效验函数

//**形      参:*p效验帧的指针   帧长 datalen

//**返  回  值:效验字

//************************************************************************************************

unsigned int CRC16(unsigned char * p, uint16 datalen )

{

unsigned char CRC16Lo,CRC16Hi,CL,CH,SaveHi,SaveLo;

int i,Flag;

    CRC16Lo = 0xFF;     CRC16Hi = 0xFF;

    CL = 0x01;          CH = 0xA0;

for(i=0;i<datalen;i++)

    {

        CRC16Lo ^=*(p+i);//每一个数据与CRC寄存器进行异或

for(Flag=0;Flag<8;Flag++)

        {

            SaveHi = CRC16Hi;  SaveLo = CRC16Lo;

            CRC16Hi >>= 1 ;CRC16Lo >>= 1 ; //高位右移一位,低位右移一位

            if ((SaveHi & 0x01) == 0x01)  //如果高位字节最后一位为1

            CRC16Lo  |=0x80 ;     //则低位字节右移后前面补1否则自动补0

            if ((SaveLo & 0x01) == 0x01) //如果LSB为1,则与多项式码进行异或

{ CRC16Hi  ^= CH;  CRC16Lo  ^= CL; }

        }

    }

    return (CRC16Hi<<8)|CRC16Lo; (返回后再进行高低位转换)

}