IoT -- (九) IoT通讯技术选型与模型设计

IoT时代的无线通讯技术

“世界上最遥远的距离就是没有网络”,网络通讯是IoT的基础,常见的无线网络通讯技术有:WiFi、NFC、ZigBee、Bluetooth、WWAN(Wireless Wide Area Network,包括GPRS、3G、4G、5G等)、NB-IoT、Sub-1GHz等。它们在组网、功耗、通讯距离、安全性等方面各有差别,因此拥有不同的适用场景。WiFi、Bluetooth、WWAN是现阶段物联网的主力,占所有应用的95%以上。ZigBee主要用在全屋智能领域,NB-IoT是针对IoT设计的下一代网络。

那么如何在众多无线通讯技术中找到适合自己的呢?下面根据我的经验做一下简单总结,供大家参考。

为什么选WiFi
WiFi最大的优点是连接快速、持久、稳定,它是IoT设备端连接的首选方案,唯一需要考虑的是智能设备对WiFi覆盖范围的依赖导致smart devices的活动范围比较小,不适合随时携带和户外场景。

举例:各种智能家电可以通过WiFi被远程控制。

为什么选Bluetooth
Bluetooth最大的优点是不依赖于外部网络、便携、低功耗。只要有手机和智能设备,就能保持稳定的连接,走到哪连到哪。所以大部分运动和户外使用的设备都会优先考虑Bluetooth。它的主要不足是:不能直接连接云端,传输速度比较慢,组网能力比较弱。

举例:智能手环,共享单车的智能蓝牙锁,iBeacon定位。

为什么选WWAN
WiFi的不足是智能设备移动范围小,蓝牙的短板是设备不能直连云端和组网能力弱,而WWAN既可以随时移动,也可以随时联网,完美弥补了WiFi和Bluetooth的不足。但实际上它也存在二个短板:一是它在使用的过程中会产生费用,二是网络状况不稳定,常常遇到无网或弱网的环境。

举例:车载智能设备,政府的城市公共自行车。

无线模块选型分析

前面介绍了主流的三种无线技术,下面是一些特殊场景用到的无线技术选型。

ZigBee的使用
在全屋智能(精装修智能房屋)的场景中,从交付开始,家中就已存在大量IoT设备,如果使用WiFi方案,每个设备配网会非常麻烦,并且WiFi每次做移动或修改密码,智能设备都要做相应的调整。如果使用蓝牙方案,以目前的BLE 4.2标准来说,蓝牙的组网只能一个Central连接7个外设(部分芯片会有能力扩充,因为比较少见,所以这里忽略),蓝牙组网能力弱,也满足不了需求。所以在全屋智能场景中,经常会使用ZigBee+WiFi的二合一网关。ZigBee和蓝牙一样都是近距离低功耗的通讯技术,但它相比蓝牙最大的优势就是强大的组网能力,ZigBee和WiFi的二合一网关通过ZigBee连接IoT设备,通过WiFi将数据同步到云端。

Sub-1GHz的使用
飞行器常常在没有WiFi,山上等GPRS无信号或弱网的环境中使用,而且通常有较远的飞行距离,这样WiFi、Bluetooth、ZigBee和WWAN这种单一的无线模块不能很好的解决飞行器的通讯需求,所以需要多种无线模块的组合使用。通过Bluetooth让遥控器和手机连接,通过Sub-1GHz处理长距离飞行时飞行器和遥控器的通讯,通过其他波长处理中距离或短距离飞行中的数据通信。这种组合既能满足手机操控,又能在中距离有高质量的图像数据,在远距离还能继续控制。

同样功能的设备不一定选相同的通讯模块

例如补水仪,统一的功能,都是从设备喷出水汽到皮肤,给皮肤补水,但有便携式和固定式两种,便携式体积小,便于携带,随时使用,可以选择Bluetooth;固定式功能多,可以冷热交替补水,一般在家中使用,选WiFi没错。

总结和整理
图片描述
上表对前面介绍的无线通讯技术做了个总结,方便大家了解其中的差别,选到适合自己的方案。

IoT物联模型

应用侧的架构,根据接入设备的种类和数量,复杂度会相差很大,其中物联平台的架构最为复杂,例如阿里智能、微信物联、米家、百度物联这类平台级的系统。不过能做平台级物联系统的公司还很少,大部分还是针对特定设备类型或共同特征的智能设备的载体,它们的结构相对简单些,也是本文重点介绍的部分。

以智能手机、智能设备,智能云三者交互为例,主要涉及的无线通讯方式就是WiFi、WWAN、Bluetooth,其中WiFi和WWAN的场景几乎一致,Bluetooth架构多一层媒介层,本文主要介绍这三种场景。

WWAN/WiFi和Bluetooth在应用架构设计上最重要的区别是WWAN的智能设备可以直接和云端交互,而Bluetooth智能设备需要一个中转媒介,大部分时候,这个媒介指的是智能手机,偶尔也可能是其他的形态,比如蓝牙网关,或是一台装有操作系统的智能冰箱。

WWAN和WiFi物联模型的主要区别在于WWAN设备只要插上上网卡,就可以上网,而WiFi设备需要多一步配网的过程。

WWAN/WiFi物联模式

WWAN/WiFi物联模型如图1所示。
图片描述

图1 WWAN/WiFi物联模式

图片描述

图2 Bluetooth物联模式

WiFi在设备初次使用时,首先需要配网操作。通过WiFi在手机和智能设备之间建立点对点连接,手机把WiFi的SSID和密码传递到智能设备,然后再断开手机与智能设备的直连,把智能设备连接的WiFi网络切换至用于连接的WiFi设备(在家的场景,通常指的是家中的路由器)。WiFi smart device在联网成功后,会向云端发送设备激活的消息,此后设备端和云端就建立了一个稳定,长期的连接,保证了数据上行和命令下发。

Bluetooth物联模式
蓝牙设备一般都作为外设,和智能手机建立一对一的连接之后,通过智能手机作为媒介,间接与云端进行数据同步。通常情况,BLE 智能手机设备和智能手机的通讯非常重要(通道1),设备操控和数据同步都是通过这层连接完成的,相比之下通道2经常只是智能手机的普通API请求,用做Bluetooth 智能手机设备的数据持久层使用。

IoT模型优化

上一节介绍了WWAN/WiFi和Bluetooth的物联模型,IoT模型在设计的时候,有很多需要考虑的地方,常见的有:通道的安全、物联协议、动态化等。

通道的安全
通道安全往往是通过对连接通道认证和数据对称/非对称加密这两件事情保障的。对于安全性较高的设备,一定要在建立连接通道时,确保通道的安全性,在数据和命令上下行时,尽可能不要使用明文传输。安全通道的建立可以使用一些成熟的方案或者成熟的加密算法去实现,选择算法时要考虑到设备端的计算能力。设备端因为成本和体积,计算能力较弱,如果算法过于复杂会严重影响到设备端的处理能力和稳定性。

物联协议
物联协议是大型IoT平台必须考虑的问题,因为接入的设备类型多,很多场景需要多个设备互联互动,良好的物联协议设计可以减低设备接入的成本,提高稳定性和处理能力。现在每个物联平台都有自己的物联协议。

物联协议可以细分为通用协议和领域定制协议。通用协议可以做物联通道的兜底方案,对设备有一个统一的收口,而具体领域定制协议可以根据品类和业务深入定制行业解决方案,优化领域和领域设备的接入速度,优化业务流程和场景质量。一个优秀的领域协议需要综合平台、方案商、设备制造商多方经验才能制定,忌讳由平台制定后强推。

下面用蓝牙来举例说明一下平台的物联协议和业务协议。

微信物联的蓝牙协议要求:广播包中包含ServiceUUID:FEE7作为统一标识,FEA1为数据出口,FEA2为数据入口,把蓝牙协议扁平化形成一种请求,相应的数据模式。这是一个通道的固定,并没有涉及业务。
业务协议举例:蓝牙体重秤,协议如图3。

图片描述

图3 蓝牙体重秤协议

业务协议根据具体的通道,规定了二进制流中每一位数据的含义、数据长度、单位、大小端模式等。业务协议和智能设备具体的功能和要做的业务紧密相关。

动态化
物联平台因为接入的设备各种各样,芯片有各种不同的方案,如果要兼容多种设备和方案,就必须要求这个架构有着非常好的灵活性,而动态化可以极大提高灵活性。

客户端通过HTML5、React-Native等动态化渲染技术,解决业务层的动态化;数据协议的动态化可以在客户端或者服务端,通过动态化脚本方案实现;设备端的动态化可以考虑OTA固件升级实现。

上面只是动态化的一些具体实现方向,对于大型的物联平台,往往是通过一整套架构和模型去解决的,阿里IoT平台就有自己的一整套解决方案,因为会涉及到商业机密,这里不再详述。

总结

本文浅尝辄止地介绍了IoT方向的一些无线通信技术以及IoT模型选择的思考,欢迎大家入坑。这些方案是近年来的主流方案,而随着IoT的飞速发展,也许几年后就会出现一些杀手级的方案完全改变IoT的现状和格局。也有许多已知技术正在孕育当中,比如Bluetooth5和NB-IoT,Bluetooth5相比4.2,在组网和传输距离上有了很大提升,连接范围扩大了4倍,速度提高了2倍,无连接数据广播能力提高了8倍,同时提升了组网能力。笔者和TI,Nordic工程师有聊到过,设备厂商的5.0芯片都已经开发完成,等待生产。量产后,预计会对ZigBee有很大的冲击。

而NB-IoT的提出就是针对IoT的使用场景,其最大特色是覆盖面广,价格便宜。NB-IoT现在联盟的力量很强大,大部分芯片商、通讯商、电信运营商都参与其中,积极推进NB-IoT的公共网络建设,预计就在这一年两内NB-IoT的网络会覆盖国内很多地区,未来潜力非常值得关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM中PageHelper的使用步骤与com.github.pagehelper.PageHelper3系列与5系列的区别

SSM中PageHelper的使用步骤 一. 在pom.xml导入依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version></dependency>二. 交给IOC管理 在SqlSessionFactory…

@requestbody和@requestparam作用

1、什么都不写 GET 可以自动封装为对象模型&#xff0c;没有的数值自动为0值 POST 请求体里面放了数据&#xff0c;但是还是使用了RequestParam里的数据 总结&#xff1a; 在不使用注解的情况下&#xff0c;相当于默认使用了RequestParam里的数据 &#xff08;这种理解是错…

@RequestBody的使用

提示&#xff1a;建议一定要看后面的RequestBody的核心逻辑源码以及六个重要结论本文前半部分的内容都是一些基 本知识常识&#xff0c;可选择性跳过。 声明&#xff1a;本文是基于SpringBoot&#xff0c;进行的演示说明。 基础知识介绍&#xff1a; ​ RequestBody主要用来接…

@RequestBody 和 @RequestParam可以同时使用

RequestParam和RequestBody这两个注解是可以同时使用的。 网上有很多博客说RequestParam 和RequestBody不能同时使用&#xff0c;这是错误的。根据HTTP协议&#xff0c;并没有说post请求不能带URL参数&#xff0c;经验证往一个带有参数的URL发送post请求也是可以成功的。只不过…

mysql索引使增删变慢_mysql优化之索引篇

mysql&#xff0c;对it打工人&#xff0c;这个几乎是必备的技能之一。mysql可以解决我们平时工作中的大量的、有关增删查改的问题。所以想深入了解mysql&#xff0c;我觉得关键在于他的增删查改背后的算法&#xff0c;开搞。面对增删查改等问题&#xff0c;直接通过场景来看吧场…

POST、GET、@RequestBody和@RequestParam区别

RequestParam 注解RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中。 RequestParam可以接受简单类型的属性&#xff0c;也可以接受对象类型。 RequestParam有三个配置参数&#xff1a; required 表示是否必须&#xff0c;默认为 true&#xff0c;必须。de…

centos安装mysql卡住_CentOS 6.4安装MySQL的过程中出现的bug

在CentOS 6.4下安装MySQL&#xff0c;下载一个源码包&#xff0c;感觉很简单&#xff0c;tar&#xff0c;./configure&#xff0c;make&#xff0c;make install 经典四步&#xff0c;弄这个也不是第一次了&#xff0c;但今天就是老出错&#xff0c;首先是./configure中&#x…

SpringMVC接受List的几种方式

说到SpringMVC接受List参数&#xff0c;可能有人会说这个是个坑&#xff01;下面我来跟大家说怎么补这个坑。下面我分几种情况来讲&#xff1a; 一、只接收一个List 1、form表单提交 controller代码&#xff1a; ResponseBody RequestMapping("test") public voi…

mysql怎么加固_mysql安装及加固

mysql安装查看是否安装mysql我们先看一下有没有安装mysqlyum list installed mysql | grep mysql本地只安装了php链接mysql的库&#xff0c;没有安装mysql如果有安装&#xff0c;可以使用安装的或者卸载了重新安装添加yum源去mysql官网查找下面我就来安装下yum源sudo rpm -ivh …

RabbitMQ保姆级教程

文章目录 前言一、MQ是什么&#xff1f; 1.1 AMQP 二、在Linux安装RabbitMQ 2.1 安装2.2 RabbitMQ启动命令2.3 开启RabbitMQ 后台管理界面 2.3.1 登录rabbitMQ UI界面 2.3 Docker启动RabbitMQ2.4 常见消息模型2.5 生产者(Producer) / 消费者(Consumer)2.6 工作队列模式(Work Q…

spring mysql 连接池配置_SpringBoot数据库连接池常用配置

关注公众号&#xff1a;程序猿王国 持续更新&#xff0c;每日分享在配置文件中添加配置如下(我使用的是多数据源)&#xff1a;spring.datasource.primary.urljdbc\:mysql\://localhost\:3306/test?useUnicode\true&characterEncoding\utf-8spring.datasource.prim…

交换机到底是啥?

1、交换机 交换机个人资料&#xff1a; 1.证件照 注&#xff1a;copy 百度百科 我的博客/交换机到底是啥&#xff1f; 这东西乍一看有点像月光宝盒&#xff0c;是不是。 2.个人简介 交换机&#xff08;Switch&#xff09;意为“开关”是一种用于电&#xff08;光&#xff0…

unity3d 动态合批设置_Unity3D SkinnedMeshRenderer合批优化

最近做了性能优化相关的工作&#xff0c;其中一些是关于战斗模块的渲染的。主要是对场景中使用的基于SkinnedMeshRenderer的网格进行了一些合批优化(降DC)&#xff0c;记录如下。项目使用的Unity版本为5.6.4p1。游戏中的战斗模块是这样的&#xff1a;战斗逻辑由服务器承担&…

java类的加载顺序_java类加载先后顺序

这里讲的不是类加载机制,是类的加载先后顺序。话不多说了&#xff0c;先设定以下场景:package com.jingdong;public class A {public static void main(String[] args){System.out.println(Ib.b);B bnew B();b.ibTest();}}public class B implements Ib{private D d;private C …

MyBatis:模糊查询的4种实现方式

1、根据姓名模糊查询员工信息 1.1、方式一 步骤一&#xff1a;编写配置文件 步骤二&#xff1a;测试 步骤三&#xff1a;分析 此种方式需要在调用处手动的去添加“%”通配符。 1.2、方式二 说明&#xff1a; 使用方式一可以实现模糊查询&#xff0c;但是有一点不方便的地…

java 阻塞 socket_java socket非阻塞I/O

1 非阻塞(Nonblocking)体系结构在这一部分&#xff0c;我将从理论的角度来解释非阻塞体系的结构及其工作原理。这部“喜剧”(当然&#xff0c;如果你喜欢的话也可以称做戏剧)的“人物”如下&#xff1a;●服务器端&#xff1a;接收请求的应用程序。●客户端&#xff1a;向…

java mod函数的使用方法_java 数学计算的具体使用

java.lang.Math 库提供了常用的数学计算工具常量final double E 2.7182818284590452354; // 自然对数底数final double PI 3.14159265358979323846; // 圆周率final double DEGREES_TO_RADIANS 0.017453292519943295; // 角度转弧度final double RADIANS_TO_DEGREES 57.295…

java的debug模式_java第六章:debug模式介绍及大量实例练习

1.Debug模式1.1什么是Debug模式【理解】是供程序员使用的程序调试工具&#xff0c;它可以用于查看程序的执行流程&#xff0c;也可以用于追踪程序执行过程来调试程序。1.2Debug模式操作流程【应用】如何加断点选择要设置断点的代码行&#xff0c;在行号的区域后面单击鼠标左键即…

注解RequestMapping中的URI路径最前面到底需不需要加斜线?

注解RequestMapping中的URI路径最前面到底需不需要加斜线? 您有没有这样的困惑&#xff1a;在协同开发过程中&#xff0c;使用RequestMapping&#xff0c;或者是GetMapping&#xff0c;或者是PostMapping这类注解时&#xff0c;有的程序员加了斜线&#xff0c;有的程序员没有…

java ajax jquery分页插件_jquery ajax分页插件的简单实现

说到基于jQuery的ajax分页插件&#xff0c;那我们就先看看主要的代码结构&#xff1a;1、首先定义一个pager对象&#xff1a;var sjPager window.sjPager {opts: {//默认属性pageSize: 10,preText: "pre",nextText: "next",firstText: "First"…