转战物联网·基础篇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 ...
随机推荐
- Linux_crontab参数表示的意思
* * * * * (下面的字体对应) 分 时 日 月 周 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满 ...
- python爬虫学习心得:中国大学排名(附代码)
今天下午花时间学习了python爬虫的中国大学排名实例,颇有心得,于是在博客园与各位分享 首先直接搬代码: import requests from bs4 import BeautifulSoup ...
- ES、kibana安装及交互操作
一.ES的安装与启动 1.ES安装(Windows环境) 下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch 版本 ...
- Apollo 分布式配置中心(补充)
1. Namespace 1.1. 什么是Namespace Namespace是配置项的集合,类似于一个配置文件的概念. Apollo在创建项目的时候,都会默认创建一个“application ...
- jvm虚拟机笔记<三> 类文件结构与类加载机制
java虚拟机具有语言无关系,它只和“class文件“这种特定的二进制文件格式绑定. 不同语言的编译器将对应的程序编译成字节码文件(*.class),送给jvm执行. class文件本质上就是一张表, ...
- SQL server 安装成功到使用Sa SQL server验证登录等一系列问题
使用 Windows 身份验证方式登录 出现错误 无法连接到 本地服务器 解决问题: SQL server配置管理器:服务远程过程调用失败 https://blog.csdn.net/gfjjggg/ ...
- MySQL数据库~~~~~创建用户和授权、备份和还原
一 MySQL创建用户和授权 1.1 对新用户增删改 1.创建用户: # 指定ip:192.118.1.1的chao用户登录 create user 'chao'@'192.118.1.1' iden ...
- python发送邮件(smtplib)
我们在测试完成后,都会发一份邮件也就是我们的测试报告,那么既然要自动化,是不是也可以通过python帮助我们发送邮件?当然这么强大的python可以帮助你完成这个需求 SMTP SMTP(Simple ...
- [洛谷P4942][题解]小凯的数字
这题打着高精的旗号其实是闹着玩的……(我不是题目) 数据范围就是提示你这题O(1)的 我们知道,一个数膜9的余数等于它数字和膜9的余数 我们可以把l到r加起来然后膜9 也就是(l+r)(r-l+1)/ ...
- [译]Vulkan教程(24)索引buffer
[译]Vulkan教程(24)索引buffer Index buffer 索引buffer Introduction 入门 The 3D meshes you'll be rendering in a ...