在上面的通信模型中,手机和网关由于处于同一个局域网中,因此可以直接通信。如果手机不在局域网中呢?那么就要通过云端的服务器来转发了,通信模型如下:
以上描述的是控制指令的流程,如果是设备发出的报警信息呢,数据的流向就是反向进行的。 可以看出,网关是所有设备之间通信的中心节点,也是内网与外网之间通信的中转节点,也就是把各种智能设备连接到互联网的中转器。 2.3 协议转换上面已经提到,硬件设备上的通信模块都是确定的(RF,ZigBee,ZWave等等),一般来说,可以把这些通信模块称呼为无线通信协议。在一套智能家居系统中,所有设备的无线通信协议大部分都是相同的。 那么,不同类型的无线通信协议设备是否可以共存在同一个系统中呢? 答案是:可以。只要在网关中,集成了相应的无线通信协议模块就可以达到这个目的!如下图所示: 从手机APP上看,所有的设备都是相同的,不会关心设备的无线通信协议是什么,因此,发出的控制指令都是协议无关的。 当网关接收到控制指令时,首先根据指令内容查找出目标设备,然后确定目标设备的无线通信协议,最后把指令发送给对应的硬件通信模块,由该通信模块通过无线电信号把控制指令发送到设备。 从这个指令的传输过程来看,网关就充当着协议转换的角色。 另外还有一种通信场景:当系统中的一个“输入”设备与一个“输出”设备进行绑定/关联时,例如:
如果“输入”设备与“输出”设备是不同类型的无线通信协议,也需要网关来进行协议转换。 2.4 设备管理在一个智能家居系统中,设备可多可少,对这些设备进行管理也是很重要的事情。网关作为系统的中心节点,对设备进行管理的重任理所当然就由网关来承担。 设备管理功能包括:
2.5 边沿计算(自动化控制)在正常的情况下,网关是可以通过路由器,与服务器保持着长连接的。如果服务器的处理能力比较强大,智能家居系统中所有需要处理的事情都可以丢给服务器来计算、处理,服务器在计算之后把处理结果再发送给网关。看起来想法很完美! 但是,考虑下面这 2 种情况:
对于上面的这些场景,把一些计算、处理操作放在网关这一端来处理也许更合适!这也是近几年比较流行的边沿计算。 1. 边缘计算,是指在靠近物或数据源头的一侧,采用网络、计算、存储、应用核心能力为一体的开放平台,就近提供最近端服务。2. 其应用程序在边缘侧发起,产生更快的网络服务响应,满足行业在实时业务、应用智能、安全与隐私保护等方面的基本需求。3. 边缘计算处于物理实体和工业连接之间,或处于物理实体的顶端。而云端计算,仍然可以访问边缘计算的历史数据 三、网关内部进程之间的通信在设计一个应用程序的架构时,可以通过多线程来实现,也可以通过多进程来实现,每个人的习惯都不一样,各有各的好处。我们这里不去讨论孰优孰劣,因为我对多进程这样的设计思想比较偏爱,所以就直接按照多进程的程序架构来讨论。 3.1 网关中需要哪些进程网关中需要执行的所有进程,是根据网关的功能来决定的,假设包括如下的功能: (1)连接外网的进程 Proc_Bridge 网关需要连接到云端的服务器,需要一个进程与服务器之间保持长连接,这样就可以及时接收到服务器发来的控制指令,以及把系统内部数据及时上报给服务器。 这个进程需要把从服务器接收到的指令转发到网关系统内部,把从系统内部接收到的信息转发给服务器,类似于桥接的功能,因此命名为 Proc_Bridge。 (2)设备管理进程 Proc_DevMgr 这个进程用来执行设备管理功能,设备的添加(入网)、删除(退网),都由此进程来管理。 (3)协议转换进程 Proc_Protocol 下行:把应用层的统一通信协议,转换成不同类型无线通信协议,发送给相应的无线模块。 上行:把设备上报的、不同类型的无线通信协议,转换成应用层的统一通信协议。 (4)边沿计算进程(自动化控制) Proc_Auto 很明显,这需要一个独立的进程来处理各种计算,这个进程就相当于系统的大脑。 (5)无线通信协议相关的进程 Proc_ZigBee, Proc_RF, Proc_ZWave 在硬件上,每一种无线通信模块通过串口或其他硬件连接方式与到网关的 CPU 进行通信,因此,每一种无线通信模块都需要一个相应的进程来处理。 (6)其他“软设备”进程 Proc_Xxx 在之前的项目中,还遇到一些硬件设备,它们与门磁、插座等设备在逻辑上处于同一个层次,但是与网关之间是通过 TCP 来连接。对于这样的设备,也可以使用一个独立的进程来进行管理。 上面的这些进程,在网关中的运行模型如下: 3.2 MQTT消息总线以上这些进程之间需要相互通信,不是简单的点对点通信,而是一个网状的通信模型。比如:
也就是说,这些进程中间的通信是相互交叉的,如果通过传统的 IPC 方式(共享内存、命名管道、消息队列、Socket)等,处理起来比较复杂。 引入了 MQTT 消息总线之后,每个进程只需要挂载到总线上。每个进程只需要监听自己感兴趣的 topic,就可以接收到相应的数据。 既然这些进程之间的通信关系比较复杂,那么一个良好的 topic 设计规范就显得很重要了! 3.3 Topic 的设计MQTT 的通信模型是基于订阅/发布的模式,一个客户端(进程)接入到消息总线之后,需要注册自己感兴趣的 主题 topic,其他客户端(进程)往这个 topic 发送消息,即可被订阅者接收到。 主题 topic 是一个以反斜线(/)分割的字符串,用来表示多层的分级结构,例如下面的这 2 个 topic,是亚马逊 AWS 平台中在线升级(OTA)相关的 topic:
在我们的示例场景中,可以按照下面这样来设计主题 topic: (1) Proc_DevMgr 订阅主题: iot/v1/ZigBee/Register iot/v1/ZigBee/UnRegister iot/v1/RF/Register iot/v1/RF/UnRegister iot/v1/ZWave/Register iot/v1/ZWave/UnRegister (2) Proc_Bridge 订阅主题: $iot/v1/Device/Report 发出数据的主题: iot/v1/Device/Control iot/v1/Device/Remove iot/v1/Auto/AddRule iot/v1/Auto/RemoveRule (3) Proc_Protocol 订阅主题: iot/v1/Device/Control iot/v1/Device/Remove iot/v1/ZigBee/Report iot/v1/RF/Report iot/v1/ZWave/Report 发送数据主题: iot/v1/Device/Report iot/v1/ZigBee/Control iot/v1/ZigBee/Remove iot/v1/RF/Control iot/v1/RF/Remove iot/v1/ZWave/Control iot/v1/ZWave/Remove (4) Proc_Auto 订阅主题: iot/v1/Auto/AddRule iot/v1/Auto/RemoveRule iot/v1/Device/Report 发送数据主题: $iot/v1/Device/Control (5) Proc_ZigBee 订阅主题: iot/v1/ZigBee/Control iot/v1/ZigBee/Remove |