一、了解通信方式
搭建4G DTU设备对应的云平台过程中第一个问题就是,如何在自己的服务器上面与设备进行通信。
刚开始的时候,我看到说明书上写着TCP协议,还以为是用HTTP协议,用RequestHeaders和Request Params访问设备,然后会返回想要的数据,但是多方求证无果,最后发现仅仅是TCP协议,也就是单纯的Socket通信。
第二个问题是端口的问题。
以前公司里用过一次以太网转串口的服务器,在哪台设备上,特定的串口都是绑定到特定的端口的,比如说:
刚开始我也以为这个DTU设备的串口透传是要通过特定的端口来访问的,但是问了厂家的技术人员,但是对方好像不是很了解,问了两天结果问了个寂寞😅(不知道是我的表达问题还是啥)。
然后自己写了个控制台程序,把端口都遍历了一遍:
但是全被拒绝了。
分析问题,应该是因为设备上设置了服务器的端口,所以这个设备只会跟服务器上面的特定端口进行通信,其他的端口即使尝试建立连接也会被拒绝。而我遍历设备端口的时候正是实时生成随机端口来访问设备的。
后来尝试在TCP连接(三次握手)建立之后,在建立连接的套接字上面向设备不停的发送数据,这一次成功了,从而知道,透传的端口不是特定的,而是在建立TCP连接的端口就可以透传数据。
二、对云平台数据采集部分进行编码
同样,采集数据还是直接用控制台程序,因为没有什么参数好设置的。
这一部分,又可以拆分出来三个小部分:数据通信,数据校验,数据存储。
1、数据校验
这一部分主要是针对CRC16 modbus校验来编写的,首先根据CRC16的定义得到以下的校验算法(这个算法是网上找的,出处忘了):
public static byte[] CRC16(byte[] bytes)
{
//计算并填写CRC校验码
int crc = 0xffff;
int len = bytes.Length;
for (int n = 0; n < len; n++)
{
byte i;
crc = crc ^ bytes[n];
for (i = 0; i < 8; i++)
{
int TT;
TT = crc & 1;
crc = crc >>