1.1
通信的本质
通信就是信息的传递,信息传递又分为单向信息传递和双向信息传递。用喇叭进行广播是单向信息传递,打电话是双向信息传递。
单向信息传递较为简单,只需要向信息接收者实时发送信息,而不用管信息是否到达及到达后是否被处理。这种信息传递方式适用于对数据完整性要求不高的场景,如采集温度传感器的数据。但如果数据源或传感器比较多的话,就要考虑并发量的问题。随着互联网技术的发展,并发问题也可以得到很好的解决。
双向信息传递相对复杂,不仅涉及发送数据的问题,还涉及信息握手、数据补传等一系列交互问题。客户端和服务端进行信息交互时,还涉及是哪一方先发起信息传递,如客户端主动向服务端发送数据,服务端会接收数据并进行处理,但有时候服务端不希望接收客户端发送的数据,只有服务端向客户端发送请求命令后,客户端根据命令才可以返回相应的数据。在与硬件进行双向通信的时候,还涉及载波通道是半双工和全双工的问题:半双工是同一时刻在通道上只能A向B或B向A发送数据,即数据只能单向传输;全双工是A向B发送数据,同时B也可以向A发送数据,发送和接收数据可以同步进行。这种信息传递方式适用于对数据安全性要求比较高的应用场景。
不管是单向信息传递还是双向信息传递,都涉及传输协议、编码方式和数据校验。传输协议是能够封装和解析并且能够相互理解的数据格式,它是一种数据规约方式,可以使用标准协议满足通用应用场景的需求,如Modbus、XMPP、AMQP、MQTT等,也可以使用自定义协议;有了传输协议后,传输过程还涉及编码方式,如GBK、UTF、ASCII,有可能在编码的基础上还要进行加密,以保证数据的安全性;为了保证数据包的完整性、唯一性及相互可解析,需要增加对数据的校验,常用的校验方式为CRC。传输协议、编码方式和数据校验的目的只有一个,就是防止数据在传输过程中受到干扰或被恶意篡改。打个比方,一个中国人说普通话,一个外国人说英语,语法不一样,“编码格式”不一样,结果就是彼此讲话听不懂。
现在系统性软件框架开发都采用面向对象的开发方式,创建一个对象并给对象的属性赋值后,直接把对象传给接口函数完成数据发送。这种操作方式使开发者更关注业务层面,从而忽略了和通信技术相关的很多细节,如通信机制、序列化、协议、编码、字节流的操作等。
但是,SuperIO(即框架)对底层字节流(byte[])的操作,更多的是关注通信框架、数据协议、数据缓存、数据处理流程、设备驱动、插件、二次开发等方面。因为在物联网时代将会面对很多数据源,包括各种传感器、手机、PC端、智能硬件、传统嵌入式设备等,协议众多,并且很难统一,所以最直接的数据操作就是字节流。笔者在2006年参加工作时,传输速率为300波特率,同时受寄存器的存储空间限制,为了减少通道传输的数据量,1个字节要表示8种状态类型。
在物联网时代,会面临各种通信情况,如一个串口或网络通道,面临一个通道对应一个设备、一个通道对应多个设备的通信,所以,没有一个好的框架就无法满足多种IO通道、多种协议、多种交互机制的通用性和兼容性要求。
要实现串口通信和网络通信并不难,无非是发送数据、接收数据、处理数据这三个流程,但是把多种通信通道、多种交互机制、多种协议兼容、高并发应用等考虑周全并不是一件容易的事,并且有些问题不是很好解决。单一问题可以通过堆代码的方式来解决,复杂的应用场景问题则需要一种框架体系来解决。