转战物联网·基础篇03-从JSON数据到短指令谈思维的转变


  了解了物联网项目的大体结构之后,我们先从物联网的联网相关部分说起,这也是物联网项目中的关键环节。在联网环节中,不仅要考虑如何连接上,还要考虑连接后如何传输数据。换句话说数据是以什么格式进行传输,对系统压力和稳定性以及整体项目更有利。在互联网项目开发中,多数情况大家习惯了用JSON数据包来进行网络两端的数据交互。转入到物联网项目中也自然会想到用JSON来交换数据,一些大厂的物联网平台也是这样做的,但是同时又提供了一种自定义字节串(字节流)的方式进行数据交换,这节我们就说这两个的差别。

  字节(Byte),常用的是八位的字节,即它包含八位的二进制数(关于进制将在下一节中讨论),也是互联网传输数据的基本单位。在C语言中就是unsigned char类型,一个8位的无符号整数,数值范围是0-255之间。字节串(也可以理解为字符串,后面会有针对性讨论)也就是一个unsigned char类型的数组。其它编程语言中也有相对应数据类型,如Python语言中的bytes和bytearray、Go语言中的uint8(别名byte)、Java语言中的byte、PHP语言中以字节流方式接收到的字符串等。网络中每传输一组数据,实际就是在传输N多个字节,至于这个字节代表的是什么,是由协议标准来定义的(后面会专门讨论协议相关的),但是传输过程是不需要理会它是代表什么的,只要按照原值传递就可以了。磁盘保存文件也是如此,无论是文本文件,还是图像音频文件,磁盘只是按照每个字节对应的8个位来记录0和1即可,不会去理会这个是什么类型的文件,因为这是数据的最底层数值。

  下面举一个例子,设备要上报给服务端一个烘烤房的室内温度值、工作时长和当前的电热器的开关状态,假设当前室温是126℃,已经工作105分钟,当前电热器状态是开启的。

  常用JSON数据形式如下:

{
    "temp": 126,
    "time":105,
    "status": true
}

  总计37个字节需要传输,这里面最有价值的就是“126”、“105”和“true”,如果按照短指令格式传输则是如下形式:

0xXX 0xXX 0x7E 0x69 0x01 0xXX       //用16进制描述的,用10进制也可以,只是16进制是每个字节等宽书写,便于交流

  总计6个字节需要传输,第一个0xXX是标志头,第二个0xXX是指令代号,第三个0xXX是标志尾,取值在0x00--0xFF之间自己定义(自有协议指定后面会专门讨论)。0x7E就是10进制的126,0x69就是10进制的105,0x01就是10进制的1,三个参数已经携带过去了,只需用顺序位置定义具体代表什么即可。

  在物联网信息交互中,复杂的数据关系嵌套很少用到,所以JSON的优势就没那么明显了,反而造成传输字节变得太长。因为物联网的联网工作环境相对于互联网应用要复杂和不稳定的多,所以就需要尽可能的减少单次数据传输的时间,来提高数据传输的可靠性。那么在数据结构上,使用短指令就有明显的优势。同时也减少了服务器并发的拥堵时间,单位时间内服务端接收的每条指令字节数越少,可接收处理的条数就越多,也相当于并发能力越强,承载能力越强。

  由于传输的是字节值,这个值直接代表了需要上报信息的具体数值,那么代码在获取的时候,直接以字节形式读取即可,不需要编码转换等过程(不同开发语言获取方法不同),也减少了计算量,进一步提高服务器的承载能力。

  在说一下为什么是优选MQTT或CoAP,而不是直接使用HTTP。一个主要原因还是因为数据量的原因,一个HTTP请求无论需要携带的内容有多少,单信息头就会有几百字节,这对物联网要求的简短快速结束一次通信来说,是太多了。而MQTT或CoAP的信息头只有几个字节,显然针对的场景是不同的。大的数据量就会占用长的时间传输,就要求这段时间网络必需保证稳定畅通,否则这一个数据包就会传输失败。再者HTTP是无状态请求,不利于实现服务端向硬件设备发送指令的及时传送。

  写习惯了互联网的WEB项目,可能有人会说使用JSON便于维护,便于数据交换和沟通,这是高可维护的一项啊。之所以本文标题说是谈思维的转变,主要就是体现在这里。前面我强调过,物联网不是单纯的服务器上跑代码,要有硬件设备与之配套运行。而硬件设备往往又是海量存在的,这就是涉及到成本问题。实际上制造硬件设备的企业,对成本控制是很严格的,只要技术性能上能满足,那么能用8位单片机的绝对不用32位单片机,能用小内存的绝不用大内存的,主张够用即可(非量产的产品或抬杠的请忽视这句话,看着就好)。因为成本不同,除非产品是不需要量产普及的。那么单片机的开发中,处理JSON数据虽然有现成的函数库可用,但是对硬件要求就提高了不少,成本自然就上升了。还有处理速度也没有短指令那么快,虽然单片机提高了一个档次,但是因为要处理JSON数据,接收和发送指令时的速度并没有得到显著提升。所以不能因为用习惯了JSON就不顾及其他因素。

  关于可维护性,这个体现在开发过程中相关工具和文档建立的是否够完备,如果为项目中的短指令创建专门的生成和解析工具,并有完备的文档同步更新,这同样会事半功倍,维护性反而更好(后面会介绍如何创建短指令工具)。

  综上所述,想要提高物联网连接服务器性能,尽可能加大单台服务器的接入量(短指令代替JSON数据包的思路进行开发,对服务器承载能力扩大不只几倍,优化好会提升10几倍甚至更高),那么使用短指令是个必要的选择,再配以相适应的开发方法,会是物联网项目整体性能大幅提升。


作者:学为所用,发布于:2019/07/12
原文:https://www.cnblogs.com/xueweisuoyong/p/11171804.html