物联网平台通信层设计思考
自2012年起到现在,在物联网这个行业已经打磨将近8年。时常会思考,这个行业当中碰到的主要问题在哪里,从工业时代到信息化时代,时代带给我们的又有哪些,是什么促使时代的变化。而物联网又是一个在互联网环境下,催生的一个产物。当有互联网的时候,物体之间怎么进行数据交换,达到某种目的。
先阐述下物联网的基本概念:
物联网(The Internet of Things,简称IOT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、 连接、互动的物体或过程,采集其声、光、热、电、力学、化 学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络。(摘自百度百科-物联网)
通信层设计的衍生思考我在这里先提出一个假设(源于最简单的思维),某人产生了想要去了解某种物体的想法,那么就需要有某种方式获取该物体的基本信息。当对该物体信息了解后,想要去控制它,那么就需要另一种方式去实现这个动作。
现在让我们跳出这个思维,进入另一个思维。
什么是通信?通信,通即交流,信即信息。在计算机的世界中,通即电子运动,信即电子规律运动表达的意思。
人能用到的工具有自身,以及制造的外在工具。要实现物联网,关键的纽带就在于信息交互工具。即通信层。
在寻找通信交互方式的过程中,发现有很多方式可以实现通信,TCP,UDP,485/232,短距离无线传输(433MHz)等等。
针对服务器来说,最常见的方式就是TCP,UDP。
要实现数据采集与设备,需要一个有效的沟通方式。若对实时性有一定的要求,则需要一般会选择TCP长连接。TCP长连接主要解决的一个问题是,对象的唯一性与实时性。
选择长连接的原因是,现阶段使用的是IPv4,而IPv4已经接近用完的情况,不能一个地址代表一个物体,所以需要socket来进行标识。需要对物体进行控制时,找到这个物体关联的socket(可以理解成一条管道),将数据传输到物体上。而万物互联的理想情况是,对每个物体(对实际需要进行观察的物体)进行身份标识(IPv6能解决这个问题)。而因为现有条件不能满足要求,则需要创造出该条件,则出现了另一个维度的标识该物体的方式(socket)(所有的设想都是建立在现有的技术的基础上)。
设计系统时,就需要以这个为前提进行设计。一个IP,外加一个PORT,形成一个入口。一个TCP长连接(socket),形成一条通道。该通道代表该物体的连接线,可以理解成是月老在服务器与物体之间牵了一条红线。
通道连接上后,之后的问题就是,数据流的问题了。
数据进行发送的时候,就像河水一样,数据是一直处于流通的状态。而流通状态中,数据势必会粘连在一起,所谓粘连也就是说,不知道这些数据从哪里开始与哪里结束。那么就催生出了各种协议。协议的目的是为了将数据进行拆解,得到有效的数据(该数据代表一种意思)。
有了数据之后,人们就会想,这个数据被截获了怎么办?那么就需要将数据进行某种改动,让数据不可猜想。就诞生了加密。而数据在传输过程中有可能传输过程中有可能产生错乱,那么数据校验就产生了。以这些为思考,就产生了技术。技术到底是什么,这值得思考。
通信层设计思路要实现物联网则需要一种手段来处理数据。物理网通信层就此诞生。华为的物联网平台,阿里的物联网平台等各种大平台也是为了解决这个问题。设备硬件厂商只要实现各大平台相关协议,就能接入到这些平台中。而这些平台解决的是,物体通信管道的问题。当通信解决后,其他的衍生功能,就可以围绕业务需求进行展开了。
虽然现在已经有了各种成熟的平台,但是总是会碰到需要自己进行设计通信层的场景存在。也就有了今天这篇总结性的**。
在设计通信层的过程中,碰到了很多问题,诸如设备在线情况,设备标识问题,控制实时性,数据准确性,数据一致性,数据粘包等一系列问题。
通信的作用主要是为了交换数据,服务器与设备交换数据后,对数据进行处理和判断,并进行反馈。
设计当中需要注意的主要有一下几点:
1. TCP长连接保活
2. TCP虚连接
3. 数据粘包
4. 设备标识
5. 数据校验
TCP长连接TCP通信中,经常碰到的问题是需要发送命令命令给设备的时候,设备不在线。这就需要设备实现长连接功能,一直保持socket有效。这时就需要引入心跳包的概念,在固定时间间隔内,设备发送特定报文给服务器,而服务器判断特定时间内是否有报文在发送,或者定时判断每个socket是否有心跳包报文。
TCP虚连接由TCP建立连接叫做虚连接,底层系统不对连接提供硬件或软件支持,所以当服务器或运营商出现以外的断开,虚连接未得到及时反馈,导致虚连接处于连接状态。这是就需要有一种机制,需要知道虚连接是否有效,这时,就需要心跳包来处理。当一定时间端内(如10秒),硬件发送心跳后,服务器没有回馈,则代表服务器或者运营商网络出现问题,需要重新发起TCP连接。
数据粘包TCP通信中,数据是以数据流的方式进行传输的。TCP本身会保证数据的有效性,则一般情况下,不需要验证数据包正确与否,而是主要处理数据粘包问题。
一般数据分为两种,字符型数据与16进制数据。
字符型数据需要处理好编码问题,主要关注点就是windows与linux中的系统编码,windows中一般为GB2321,而linux中一般为UTF-8,而同时客户端也需要相应的进行解码和编码。
16进制数据则需要定义一种协议规则,一般设计原则是,数据长度+功能码+数据内容+校验码。
设备标识设备标识代表设备,用于通信中将数据准确的送到设备上,设计一个设备注册报文,tcp连接成功后,发送该报文,服务器接收到注册报文后,把设备标识赋值给socket。
数据校验服务器接收到数据后,若我们需要对数据进一步校验,则在报文中需要加入校验字段,这个校验字段可以是CRC校验、奇偶校验或者其他类型的校验,保证硬件上发的数据是本身就是正确的(如果数据在硬件层面就发送错误的话)。当校验失败的时候,需要一种策略来处理数据,是否向硬件传递一个信息,让硬件重新发送正确的数据,或者将错误信息推送给管理人员等。