智能家居技术初探
全文由wibus-wee编写,预计字数超过6000字
摘要
智能家居属于当代的热门话题,本篇文章将会研究智能家居技术是什么、如何工作的、如何设计组网、智能家居的问题以及如何开发智能家居设备(HomeKit)
什么是「智能家居」?
将“智能家居”这个词拆分来开,我们可以得到:智能和家居,「家居」是指我们日常生活中家里面用到的物品,也可以是增添我们生活乐趣的物品。总之,就是在家里使用的基本所有的东西。在外国对这个词他们称为:Smart Home
智能家居中的集成,并不是简简单单的将几个系统进行堆积,而是将很多原本单独、独立的系统,变成一个融合的、相互联系的、高效的系统。它能提升家居的安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。本文将会详细讲述关于第二代智能家居系统的技术问题
怎么才能称得上智能?
简而言之,就是家居产品集成现代通信技术后变得聪明和高效,提升了家居生活的便捷性和舒适性。仅从字面理解,好像就是给家居产品加上「智能」两个字,那怎样才算智能呢?
智能不是电流和网络的专属。任何家居产品(当然主要是家里的电器产品),让人省心,能降低人的家务劳动量,就称得上智能。它也许不会说话,也许不用联网,更不一定需要你时刻打开手机
智能家居的特点
智能家居系统随着网络技术、工程技术、集成技术的发展,也在不断迭代,直到今天以及发展为一个较为稳定的版本了。它涉及到的是对一整个家庭网络内所有智能家居设备和系统的操作,它呈现的特点有:
- 通过家庭智能网关以及系统软件建立起智能家居系统
家庭网关是智能家居局域网的核心部分,它们的任务是实现家居直接不同协议的转化连接和信息共享,以及对外部信息进行处理和反馈
- 所有都集中在一个统一的平台管理
统一的平台可以使所有的指令变得可控化,可以识别出指令的安全性。而不是一个分离平台,需要多个管理员进行监管。
- 可以通过外载模块实现家居互连
家庭智能网关可以通过有线或无线的方式,按照特定的通信协议,借助外部扩展模块控制家电或照明设备
- 结合成为嵌入式系统
对于此部分由于并不是主要研究方向,在此提供一篇论文:嵌入式智能家居网关的研究与实现-袁荣亮,不过在后面我们也会提到其中的一些技术。
「智能家居」是怎么工作的?
智能家居可以通过不同的协议技术,组网后可以进行交互工作,因此智能家居工作靠的就是组网和平台控制。其中有三种组网方式:
- 集中布线技术
- 无线射频技术
无线射频技术包含了众多其他的技术,Wi-Fi、Zigbee、BlueTooth都在这个范畴内
- X10 电力载波
Wi-Fi 组网
我们首先来讲Wi-Fi组网,它连接简单,不需要额外装置网关,直接和路由器进行通讯。如「天猫精灵」的产品,有很多的产品是通过Wi-Fi组网进行交互控制的。当天猫精灵助手得到某个指令后,对上游服务器上传指令,上游服务器传输指令给对应的智能设备,智能设备就能反应指令。
这一项技术大多数用于不同厂家的智能设备交互使用,通过2.4GWi-Fi进行连接。使用Wi-Fi组网,2.4G的穿墙性能还是不错的
但是使用Wi-Fi连接设备对路由器的要求比较高,性能差的路由器连接的设备多了之后经常出现掉线的情况,很影响体验。
IEEE 802.15.4
首先先来讲一下IEEE 802.15.4是怎么回事。IEEE 802.15.4中指定了两个物理频段和直接序列扩频(DSSS)物理层频段:868/915MHz和2.4GHz。2.4GHz的物理层支持空气中250kb/s的速率,而868/915MHz的物理层支持空气中20kb/s和40kb/s的传输速率
由于数据包开销和处理延迟,实际的数据吞吐量会小于规定的比特率
IEEE 802.15.4将协议模型划分为物理层(the physical layer)和媒体接入控制层(the MAC layer)两个子层进行实现(更严格讲还有 Higher layers),其中物理层是全球使用的OSI参考模型中的初始层,MAC层是通过使用物理信道实现MAC帧的传输层
IEEE 802.15.4定义了两种标准的网络节点:
- FFD:全功能设备
FFD作为个人区域网络的协调者,就像它可以作为公共节点一样。它实现了一种通信模型,允许它与任何其他设备通信,FFD也可以中继消息,在这种情况下,它被称为协调器
- RFD:功能降低的设备
接下来讲一下拓扑的问题:
- IEEE 802.15.4星形网络和点对点网络(star or peer-to-peer networks)
每个网络中必须有一个FFD充当协调器。因此,网络由相隔适当距离的设备组形成。每个设备都有一个唯一的 64 位标识符,如果满足某些条件,则可以在受限环境中使用简短的 16 位标识符。
也就是说,在每个 PAN 域内,通信可能会使用短标识符。
点对点网络可以形成任意的连接模式,其扩展仅受每对节点之间距离的限制。标准提到了簇树作为一种结构,它利用 RFD 一次只能与一个 FFD 相关联来形成一个网络,其中 RFD 仅是部分小节点,并且大多数节点都是 FFD。这个结构可以扩展为后来的Mesh网络(后文将会提到)在此不多讲
Zigbee 组网
Zigbee技术是一种低速短距离传输的无线网上协议,底层是采用IEEE 802.15.4标准规范的媒体访问层与物理层。在ZigBee协议层从下到上分别为物理层(PHY)、媒体访问层(MAC)、网络层(NWK)、应用层(APL)等。
Zigbee的通讯节点可以有路由的能力,传输信号可以在有路由功能的节点间进行接力式的传输,这样大大增大了信号的传输距离,增强了信号穿透障碍的能力。
- 低功耗
- 低成本
- 低速率
- 近距离
- 短时延
- 高容量
- 高安全
但是,我们必须认识到,Zigbee的很多功能落实在智能家居的应用场景中之后,就变成了看起来很美的优点
BlueTooth Mesh 组网
这是智能设备中讲的最多的一个词了,基本一堆的智能设备在描述页面都会说Mesh组网。随之的无线Mesh网络是由Ad Hoc网络发展而来的。Mesh网络可以保持每个节点间的连线完整,当网络拓扑中有某节点失效或无法服务时,这种架构允许使用“跳跃”的方式形成新的路由后将讯息送达传输目的地。
它和传统的Wi-Fi不同的是,无线Mesh网络中的AP可以采用无线连接的方式进行互连,并且AP间可以建立多跳的无线链路。
无线Mesh网络实施中涉及到的关键技术主要包括:
- 多信道协商
无线Mesh网络进行多信道接入时,网络中的MP节点一次只能侦听一个信道,为了使用多信道,节点不得不在可用信道之间动态切换,这就需要一种协调机制,以保证通信节点都工作在相同信道上
- 信道分配
信道分配技术主要用于多信道无线Mesh网络中多个信道的使用和管理,在保证网络良好连通性的同时,降低Mesh网络中发生信道冲突的概率,以提升网络效率
- 网络发现
网络发现技术主要是用于Mesh网络中新节点和邻居节点的发现以及建立相应的信息列表。
- 路由转发
Mesh的技术特点大部分其实都来源于Mesh的网状网络。因此路由转发是一个非常重要的技术,它将会直接导致Mesh网络的效率,影响最终处理性能
- Mesh安全,但本篇不过深讨论关于MSA安全架构的问题(Mesh Security Association)
整体来看,Mesh组网的应用也是非常广泛的,毕竟它的本质其实就是BlueTooth技术,对于智能设备直接连接所使用的是无线mesh网络,它由mesh routers(路由器)和mesh clients(客户端)组成。
这一种技术其实最好的特点是自配置、自愈合、高带宽、高利用率、兼容性。它的好处在于:如果附近的AP由于流量传输量过大而导致网络拥堵的时候,那么数据就可以自动重新路由到一个通信流量较小的临近节点进行传输。
总结组网技术
Wi-Fi的优势是应用广泛,已经普及到千家万户;ZigBee的优势是低功耗和自组网;蓝牙的优势组网简单。然而,这3种技术,也都有各自的不足,没有一种技术能完全满足智能家居的全部要求
智能家居的设计
路由器的工作模式有很多很多,大体可以分为路由模式和AP模式。AP模式中又有AP模式、中继模式、桥接模式和客户端模式。
上面的工作方式,多个路由器之间可以形成AP+AC & Mesh组网两种方式,从而达到无缝覆盖的效果。
Wi-Fi 组网
对于Wi-Fi组网,我们每一个家庭基本上都应该有一个光猫,Wi-Fi组网有两种:路由/AP
首先是路由模式:使用光纤将光猫连接上互联网,再通过网线,将主路由和二级路由相互连接(当然主路由和二级路由之间也可以继续使用Wi-Fi进行中继,但是这一种方式实际效果并不是很理想)
但是这一种方式无法实现两个路由器之间的无缝漫游,一个Wi-Fi信号减弱并切换到另一个过程伴随IP地址的变化,网络中断感觉比较明显。
因此提出了AP(Access Point)模式:使用AP模式的路由器就只有接入功能而没有路由功能了。虽然没有路由功能,但这并不代表整体的路由功能就不存在,只不过是用了另一个路由器进行协作。
启动AP模式的路由器通过网线和上级路由器进行连接,仅有接入功能作为无线覆盖的扩展(主力也行),路由和DHCP等等的功能由上级路由器来完成。因此接入AP的手机或者电脑和上级路由器是处于同一个网段的,可以互通
不过虽然AP的SSID和密码都可以独立设置,和上级路由器相同或者不同的都可以。如果SSID设置不同,两个设备之间懂得都懂,肯定不能无缝漫游,只能是一个信号太弱断开之后再连一个,或者,手动断开连接,又或者使用一些脚本进行操作,但脚本的灵活性并不大,也不是一个好方式
每个节点都要分别配置,相互独立工作,因此叫做”Fat AP”
但即使是SSID相同了,看起来是只有Wi-Fi信号了,但其实AP和主路由器的无线信号缺乏交互,配置管理都很麻烦,也是无法实现无缝漫游的。你看FatAP,虽然功能完善,但是没有一个统一的管理(请注意智能家居的特点)各自的覆盖也没法漫游,家里还好,但是一旦去到超大空间,这种方式直接就挂了
那怎么办?
我们接入一个Access Controller(AC),将AP只保留最最基本的接入功能,将配置管理功能独立出来给AC。那么AC就可以管理所有的AP,只需要AC的配置,所有的AP节点都能相应。而且AP的状态在AC上也可以进行监控,维护起来非非非非常方便,那么这一种组网方式的AP,负担就少很多了
更重要的是,通过让AP们支持802.11k/v/r协议,就可以实现AP间的无缝漫游了。因此在家庭网络中,这一种方式给智能设备的交互就已经够用了,各厂家的AP产品中,也大多数是这一种协议。
不过有没有什么可以更优化一点呢?其实是可以的,利用的是AC+AP+PoE但是本文就不多赘述了
ZigBee 组网
那么在这一章节,我们来点实例:假如我们采用CC2530作为主控芯片,用于ZigBee无线模块的片上系统
我们首先就需要创建一个终端节点和路由节点,终端节点主要的是负责Zigbee数据采集,通过射频电路传送信息到协调器节点。路由节点允许子设备假如网络当中,利用多跳路由并且协助终端节点进行通信
接下来,根据前文,我们要创建一个协调器节点,这个节点负责的是整一个网络的初始化,确定Zigbee网络ID号和物理信道,提供数据路由和管理服务。
Zigbee协议栈软件系选择ZigBee-Pro,协议栈版本为ZSTACK-CC2530-2.3.O-1.4.0(详细请见Zigbee技术栈)。整个系统无线网络由事先被定义为协调器的主节点建立。但是由于其中的技术过于复杂,详情可以从Zigbee技术栈中取得更多信息
Mesh 组网
Mesh组网不一定需要提前预留网线,可以根据信号的强弱增减节点,甚至可以根据具体情况,移动节点。
在Mesh组网中包括了有线Mesh组网和无线Mesh组网,一般会使用有线组网,效果更好。
在其中某个节点出现问题是,Mesh的网状结构还有自我修复功能,并不会影响其他节点的正常工作。
首先,不能仅根据“最小跳数”来进行路由选择,而要综合考虑多种性能度量指标,综合评估后进行路由选择;其次,要提供网络容错性和健壮性支持,能够在无线链路失效时,迅速选择替代链路避免业务提供中断;第三,要能够利用流量工程技术,在多条路径间进行负载均衡,尽量最大限度利用系统资源;第四,要求能同时支持MP和Mesh STA。
如何开发智能家居设备/HomeKit?
由于篇幅原因,我们在这篇文章使用HomeKit作为示例。
HomeKit是苹果公司推出的一个软件框架,它可以让用户使用苹果设备对智能家居电器进行配置、沟通和控制。通过在HomeKit服务中设计房间、物品和动作,用户可以通过对Siri的简单语音命令或通过家庭(Home)应用来实现家中的自动动作。
小米的产品大多数都提到可以使用HomeKit,当然还有Apple自己卖的和Aqara,在这里是首推Aqara的产品,它的产品是真的为HomeKit来设计的,当然价格也相对高点。至于其他的....就不多说了,本章节将会讲述关于涉及HomeKit的开发以及非Apple认可的设备如何骗过HomeKit认证
HomeKit应用服务只提供给通过App Store发布的app应用程序。在你的Xcode工程中, HomeKit应用程序需要额外的配置,你的app必须有开发证书和代码签名才能使用HomeKit。
💡 不过,在Xcode的Capabilities面板使用HomeKit,可避免代码签名的问题。
这样的话你就可以无需直接在Xcode或者会员中心编辑授权文件。
HomeKit 创建Home布局
HomeKit 允许用户创建一个或者多个Home布局。每个Home代表一个有网络设备的住所。
用户拥有Home的数据并可通过自己的任何一台iOS设备进行访问。用户也可以和客户共享一个Home,但是客户的权限会有更多限制。被指定为primary home的home默认是Siri指令的对象,并且不能指定home。
每个Home一般有多个room,并且每个room一般会有多个智能配件。在home中,每个房间是独立的room,并具有一个有意义的名字,例如“卧室”或者“厨房”,这些名字可以在Siri 命令中使用。一个 accessory
代表实际家庭中的自动化设备,例如车库开门器。一个 sevice
是accessory提供的?种实际服务,例如打开或者关闭车库,或者车库上的灯。
如果你的app 缓存了home布局的信息,那么当其布局发声改变的时候,app就需要更新这些信息。使用HMHomeManager对象可以从HomeKit数据库获取HMHome和其他相关的对象。
本章描述的API获取对象后,你应该通过代理回调函数保持获取对象和HomeKit数据库同步,具体描述请参看“Observing HomeKit Database Changes"
使用Home Manager—一个 HMHomeManager
对象的访问home、room、配件、服务以及其他HomeKit对象。在创建家庭对象管理器(home manager)之后,直接设置它的代理,以便获取到这些对象之后及时的通知到你。
self.homeManager = [[HMHomeManager alloc] init];self.homeManager.delegate = self;
当你创建一个home manager对象时,HomeKit就开始从HomeKit数据库获取这些homes和相关对象,例如room和 accessory
对象。当HomeKit正在获取那些对象时,home manager 的 primaryHome
属性是nil,并且homes属性是个空数组。你的app应该处理用户还没有完成创建home的情况,但是app应该等待直到HomeKit完成初始化。当获取对象完成之后,HomeKit 会发送 homeManagerDidUpdateHomesmermaid :
消息给 home manager
的代理。
⚠️ 注意:当app进入前台或者在后台Home manager属性发生改变时,这个homeManagerDidUpdateHomes:方法就会被调用
获取Primary Home和 Homes集合
通过home manager的 primaryHome
属性,可以得到primary home,代码如下:
HMHome *home = self.homeManager.primaryHome;
使用home manager的homes属性可以得到用户的所有home的集合;
例如自家主要居所、度假别墅以及办公室。每个home都对应一个独立的home对象。
HMHome *home;
for(home in self.homeManager.homes ){
…}
获取 Home中的所有room
在一个home中,rooms属性定义 accessories
的物理位置。用home的rooms属性可以 枚举
home中的所room。
HMHome *home = self.homeManager.primaryHome;
HMRome *room;
for(roomin home.rooms){
…
}
获取Room 中的Accessories
Accessories 数组属于home,但是被指定给了home中的room。假如用户没有给一个accessory指定room,那么这个accessories被指定一个默认的room ,这个room是roomForEntireHome方法的返回值。用room的accessories属性可以枚举room中所有的accessory。代码如下:
HMAccessory *accessory;
for(accessory in room.accessories){
…
}
📎 如果你要展示一个个accessory的相关信息或者允许用户控制它,可设置accessory的代理方法并实现这个代理方法
一旦你获取到一个accessory对象,你就可以访问它的服务和对象
获取Home中的Accessories属性
使用HMHome类中的accessories的方法,可以直接从Home对象中获取所有的accessory对象,而不用枚举home中的所有room对象(详情请见“Getting the Accessories in a Room”。
使用 HomeBridge 骗过HomeKit
Homebridge是一个轻量级的 NodeJS 服务器,它可以模拟 iOS HomeKit API 的家庭网络上运行。
由于 Siri 支持通过 HomeKit 添加的设备,这意味着使用 Homebridge 您可以让 Siri 控制根本不支持 HomeKit 的设备。例如,仅使用一些可用的插件就可以把你家和HomeKit毫无关联的灯给打开
首先,你需要有个服务器(建议为Linux或macOS,本文以Linux Docker为例,使用Ubuntu Impish 21.10)
在Linux系统中装一个Docker软件,如果你曾经安装过旧的Docker软件,请运行以下命令来删除旧的docker
sudo apt-get remove docker docker-engine docker.io containerd runc
那么接下来运行以下命令
sudo apt-get update
sudo apt-get install ca-certificates curl gunpg lsb-release
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加官方的GPG Key
echo \\
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] <https://download.docker.com/linux/ubuntu> \\
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
那么就安装好了!如果你想验证一下是否安装,那么你可以运行以下hello-world镜像:
sudo docker run hello-world
最后安装以下Docker Compose 关于运行环境的内容就搞定啦
接下来我们创建一个 docker-compose.yml
并且填入以下内容:
version: '2'
services:
homebridge:
image: oznu/homebridge:latest
container_name: homebridge
restart: always
network_mode: host
environment:
- TZ=Australia/Sydney
- PGID=1000
- PUID=1000
- HOMEBRIDGE_CONFIG_UI=1
- HOMEBRIDGE_CONFIG_UI_PORT=8581
volumes:
- ./homebridge:/homebridge
接下来,我们运行 docker-compose up -d
来启动Docker 容器
最后我们打开浏览器,进入http://<ip address>:8581
即可到达HomeBridge UI界面,默认的用户和密码都为 admin(运行hostname -I 即可找到IP地址)
智能家居存在的问题
虽然智能家居的前景非常的好,也代表了时代的进步,但是智能家居以及技术存在的问题也是非常明显了。
- 商家过分炒作概念,协议标准被随意曲解,没有一个大平台进行管控
- 厂商推进的技术过快,迭代跟不上
- 智能设备的维护过于复杂,学习成本高
- 大多是理论阶段,或者是没有表明发展方向
- 设备间的交互依然存在问题,各大厂商各自玩各自的,使用的协议也不一样,加密方式也不一样
- 智能家居的稳定性不足,仍然出现一些非正常的情况
- 信息安全缺乏规范管控
结语
智能家居是大势所趋,未来的方向一方面在于真正的互联互通,未来的发展方向当然是不断的深入到每个人的家庭生活的各个细节。靠产品取胜,而不是靠生态封闭取胜(Ps:Apple在这方面并没有封闭,官方已经提供ADK了)
以后的智能家居,靠的一定是要深度学习,适应用户习惯
我还是对于智能家居的未来感到激动的,未来也会对有关智能家居交互的领域作出一些微小的贡献!
参考资料
Apple Developer-HomeKit Overview
Apple-Observing HomeKit Database Changes
Apple-homeManagerDidUpdateHomes
Apple-Observing Changes to the Collection of Homes
Apple-Accessing Services and Characteristics
Apple-Getting the Accessories in a Room