了解了物联网项目的大体结构之后,我们先从物联网的联网相关部分说起,这也是物联网项目中的关键环节。在联网环节中,不仅要考虑如何连接上,还要考虑连接后如何传输数据。换句话说数据是以什么格式进行传输,对系统压力和稳定性以及整体项目更有利。在互联网项目开发中,多数情况大家习惯了用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几倍甚至更高),那么使用短指令是个必要的选择,再配以相适应的开发方法,会是物联网项目整体性能大幅提升。

  本节完,待续......

最新文章

  1. 用户中心mysql数据库表结构的脚本
  2. 练习:使用nmcli 配置网络连接
  3. 解决阿里云SLB无法添加https证书的问题
  4. win8.1禁用和去除SkyDrive任务栏图标方法
  5. busybox inetd tftpd
  6. js获取非行内样式
  7. OpenLDAP 安装及配置 笔记
  8. Eclipse使用技巧总结
  9. ubuntu下设置开机自动挂载硬盘
  10. 为Activity设置特定权限才能启动
  11. zz将 VSTO 插件部署给所有用户
  12. C#实现邮件发送功能
  13. BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )
  14. XOR算法的原理和实现
  15. eclipse中git解决冲突
  16. jdk源码->集合->ArrayList
  17. 守护态运行Docker容器
  18. JMeter学习-042-JMeter BeanShell 脚本应用实例之正则应用:正则提取,批量获取测试数据
  19. Usaco 4.3.1 Buy Low, Buy Lower 逢低吸纳详细解题报告
  20. SQL获取当前时间月份为两位数

热门文章

  1. Linux中防火墙命令
  2. MySQL 有关MHA搭建与切换的几个错误log
  3. linux globbing文件名通配
  4. IT兄弟连 HTML5教程 CSS3属性特效 CSS3分栏布局
  5. UWP 在ShellPage.xaml.cs 中导航至其他页面引发System.Exception
  6. Java中"或"运算与"与"运算快慢的三三两两
  7. SQL Server如何通过Page_ID找到对应的表
  8. FTP 代码含义
  9. WEB UI分布式自动化测试框架
  10. Orcl分页查询的语法示例