转战物联网·基础篇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几倍甚至更高),那么使用短指令是个必要的选择,再配以相适应的开发方法,会是物联网项目整体性能大幅提升。
本节完,待续......
转战物联网·基础篇03-从JSON数据到短指令谈思维的转变的更多相关文章
- 转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式
网络上搜索MQTT协议,会出现太多的解释,这里就不做官方标准释义的复制了.这一节我们从实战理解角度,通俗的将MQTT协议的作用及实现原理说一下,旨在可以快速理解MQTT协议.所以可能会出现很多看似 ...
- 转战物联网·基础篇07-深入理解MQTT协议之控制报文(数据包)格式
在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable ...
- 转战物联网·基础篇09-选择MQTT协议还是CoAP协议
前面章节介绍过,MQTT协议和CoAP协议都是物联网中比较流行的协议,都对传输量做了很大的精简,传输开销小,以适应物理网的网络环境. XMPP协议也有人说是适合物联网通信的,但它是基于XML, ...
- 转战物联网·基础篇08-例说MQTT协议各控制报文
前面讨论了MQTT协议的控制报文的格式,下面分别举例探讨各个控制报文的详细内容. 01.CONNECT – 连接服务端 客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CO ...
- 转战物联网·基础篇06-深入理解MQTT协议之基本术语
通过上一节我们对MQTT协议已经有了初步的印象,这一节我们开始深入的理解一下MQTT协议,介绍常用的MQTT 3.1.1版本,5.0版本后面指介绍新增部分即可.这一节我们先介绍MQTT里常用的术语 ...
- iOS系列 基础篇 03 探究应用生命周期
iOS系列 基础篇 03 探究应用生命周期 目录: 1. 非运行状态 - 应用启动场景 2. 点击Home键 - 应用退出场景 3. 挂起重新运行场景 4. 内存清除 - 应用终止场景 5. 结尾 本 ...
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...
- WebBug靶场基础篇 — 03
基础篇 6 - 16 关... 在记录之前,先说一件事 = =! 小学生真多 = =!好心提供一个靶场,玩玩就算了,他挂黑页 ?现在好了,以后这个靶场不对外啊!你高兴了?爽了吧? 都是新手过来的,好心 ...
- 【Spark机器学习速成宝典】基础篇03数据读取与保存(Python版)
目录 保存为文本文件:saveAsTextFile 保存为json:saveAsTextFile 保存为SequenceFile:saveAsSequenceFile 读取hive 保存为文本文件:s ...
随机推荐
- 【原创】你的Redis怎么持久化的
引言 (本文改编自生活真实案例,如有类同,绝不是巧合!) 端午节,烟哥正在一边愉快的学习.... 突然,微信一阵抖动.原来是老刘呼唤烟哥!善良的烟哥本以为人家是要约我出去玩!然而,打开微信一看,出现下 ...
- IT兄弟连 HTML5教程 CSS3属性特效 transition过渡
CSS3的transition允许css的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值. transitio ...
- C# 中的基本数值类型
在之前的文章中(地址:https://www.vinanysoft.com/c-sharp-basics/introducing/),以 HelloWorld 程序为基础,介绍 C# 语言.它的结构. ...
- windows 本地链接 VMware虚拟机 redis服务
使用本地Windows链接 VMware虚拟机 redis服务 我用的虚拟机系统是:windows Server 2012 先把Redis服务器拷贝到服务器并解压,目录如下 这里仅仅作为演示,所以就不 ...
- angular8自定义管道、指令以及获取dom值
版本: 1.自定义管道: example: 定义一个*ngFor 可以获取key值的管道 keyObject.pipe.ts // key value 管道 import { Pipe, PipeTr ...
- Android 极光IM-高级篇-玩聊天app诞生
距离上一次写 基础篇有了4个月,终于我写了一个 功能完善的即时通讯app,作为高级篇的担当出现.废话不多说,上图 app预览 实现功能 1.用户的登录注册 2.单聊,能清空聊 ...
- Oracle 11g与12c的审计详解
最近遇到一些脚本诱发的审计相关BUG,感觉有必要重新梳理一下11g与12c的审计模式,于是根据官网修正了一下以前的一篇笔记这里发出来. 一.审计功能的开启: SQL> show paramete ...
- tensorflow 神经网络模型概览;熟悉Eager 模式;
典型神经网络模型:(图片来源:https://github.com/madalinabuzau/tensorflow-eager-tutorials) 保持更新,更多内容请关注 cnblogs.com ...
- Linux系统学习 十五、VSFTP服务—匿名用户访问(不推荐使用,不安全)
匿名用户访问 基本配置: anonymous_enable #允许匿名用户访问 anon_upload_enable #允许匿名用户上传 anon_mkdir_write ...
- 如何通过 subprocess 持续获取输出内容
在实际应用中会用到subprocess的Popen方法执行一些命令,而我们需要通过执行这个命令的来获取输出进行一些信息记录或者分析使用,如果是很快就可以执行完的那还好,有时需要持续跟踪内容的输出,比如 ...