回到目录

用 Siri 控制你的电器

2016-11-30

上周参加了公司一个叫「鹅厂黑科技party」的活动,结合自己平时动手折腾硬件的经历,做了一个叫「用 Siri 控制你的电器」的分享。现场反响不错,是评分最高的一个分享,故整理成文章分享在此。

下面是正文:

首先,问大家一个问题:作为鹅厂股东兼互联网从业者对互联网前沿科技有极大爱好同时喜欢看「黑镜」「Her」这类科技电影以及对新鲜事物充满好奇的你们,想不想打造一个属于自己的智能家庭并享受一机(控制器)在手天下我有的快感?

想 si 不 si,不要怂就是干。那现在智能家居市场是个什么情况?


什么?「太多厂商了」「很难选择」「每家都有自己的标准」「各自为政,想做生态里的霸主」,这样吧,你上车我带你逛逛。

选择一:买国内的

国内的厂商里小米自然是做得比较大而全的,你看看他们都卖些什么:

哎哟屌哦,还是蛮全的。但是也许我家还有美的空调、飞利浦灯,包括其他厂商的电器。当我每天拖着被掏空的身体回家之后,尴尬的场面发生了:

与其依次通过每个 App 打开电器还不如走多两部直接打开开关呢。不!能!忍!这不是我要的生活,__科技是来服务我的__,不是践踏我的。

选择二:买国外的

车头一转,驶向苹果爸爸,随和 iOS 10 的发布,大家的手机里会突然间多了个叫「Home」的 App。也许它就是救命稻草啊!我仔细地体验了这款 App 起来。

其实苹果在 2014 年的 WWDC 上就介绍过一个智能家居的解决方案:HomeKit。不过当时只是简单几句介绍,并没有深入讲。核心即通过 iPhone 来控制家庭所有智能电器(这难道不就是我要的滑板鞋吗?哈哈哈哈哈哈)

现在过了两年了,2016 年的 WWDC 专门有一段隆重介绍了新的进展,各位先看看视频:

总结一下,四大优势:

  • 结合 App:通过 Home App 可视化操作
  • 基于地点:房间、客厅、厨房、车库...
  • 基于场景:回家、睡觉、做菜、出门...
  • 结合 Siri:与 Siri 结合,通过语音操作

确实牛逼,我已经跃跃欲试想买支持 HomeKit 的智能电器来武装我的出租屋了。那现在问题来了,HomeKit 在国内的现状如何?

1、国内只有四家支持(可能还有,但其他的品牌我认不出来呵呵)

2、噢哟,还有地产商做更深度的嵌入:

这里可以看到完整的支持 HomeKit 的电器列表

3、目前基本覆盖了所有智能家庭所需设备:

然而,一道阻碍横亘在我与触手可及的科技生活之间——万恶的价格!

看完价格之后觉得智能家居离我还很远,而且国外电器电压标准不一,购买麻烦,售后麻烦。作为一个还没有适应股东生活的有痔青年,我决定自己 DIY 一套支持 HomeKit 的智能电器。

选择三:自己动手

在科技与我家之间的十字路口,我停下了车。锁上车后锁,X拜 App 里显示扣款 1 块。

首先明确一下,我要 DIY 的电器是个灯,对标物是 Philips Hue,就是下面这个398 人民币的灯泡,也就是我的灯要能变色、也能调节亮度。

这还不够,而且我的 DIY 灯还可以:

  • 接入 HomeKit
  • 通过 Home App 控制
  • 通过 Siri 语音控制
  • 远程控制

第一个问题:接入 HomeKit 和 App 控制

所有 HomeKit 智能电器都有一个标签:

想要有这个标签,就必须有 MFI (Make For iOS) 认证许可。它是苹果公司对其授权配件厂商生产的外置配件的一种标识使用许可。没有的话首先你制作的设备就无法经过官方认证,也拿不到开发接口。

咋整,第一步就受挫了,我开始怀疑我的动机是否理性。幸运的是我在程序员的 Gay 圈找到了一个巨大突破:HAP-NODEJS。它的产生得益于一个大牛对苹果 HAP 服务端的逆向工程。

简单来说,HomeKit 采用的是 HAP(HomeKit Accessory Protocol,基于 BTLE 低功耗蓝牙技术的智能家居硬件通信协议)与设备进行通信,而上述的项目可以通过 Node.js 搭建一个 HomeKit 服务器跳过蓝牙匹配实现与设备的通信,自然包括控制。

废话少说,下载代码稍微做了调整运行一下,果然可以识别出来了:

(查看密码:hahnzhu)

第一第二成就达成:

  • ✓ 接入 HomeKit
  • ✓ 通过 Home App 控制
  • 通过 Siri 语音控制
  • 远程控制

第二个问题:通过 Siri 控制

然而,点击「房间灯」并没有什么变化(废话我都还没有灯),于是我单身一人勇闯华强北,买下了 DIY 灯的核心原件:


最终组装完毕,请大家帮我脑补一个牛逼的外壳!成本不足 25 块的智能灯问世。

接下来是高能的原理部分,你要是没有兴趣可以直接看下面的视频:

先介绍几个 HomeKit 中的术语:

  • Accessory:也就是我们的智能设备
  • Service:Accessory 注册的服务,用来控制设备逻辑
  • Characteristic:特性,可以理解为 Accessory 的状态,如开、关
  • Bridge:桥接口,用于发布一个或多个 Accessory


(上面这张图是我自己按照理解画出来的,要是错了有劳纠正)

一个 Accessory 可以有多个 Service 和 Charactistic, HomeKit 采用观察者模式,Charactistic 的变化会触发注册该 Charactistic 的 Service。每种 Accessory、Service、Characteristic 都是苹果自己定义好的,所以不要惊讶于为什么 Siri 可以听懂你的各种指令,都是定义好的,我们只是拿来用而已。而 Bridge 作为 Accessory 的 host 对外发布这个设备。

Home App 通过 HAP 与设备通信(在这里通过 HAP-NODEJS),匹配成功后即可通过 Siri 与之交互。下面是视频,我用到了一台电脑(运行 HAP-NODEJS),一部 iPhone,一个「智能灯」。电脑和 iPhone 连接的是家庭的 WiFi,「智能灯」中的 nodemcu 先连接家庭 WiFi,发搭建一个局域网。这个局域网会被 HAP-NODEJS 中的 Service 作为发送请求的地址。

请看下面视频:

(查看密码:hahnzhu)

第一第二第三成就达成:

  • ✓ 接入 HomeKit
  • ✓ 通过 Home App 控制
  • ✓ 通过 Siri 语音控制
  • 远程控制

第三个问题:远程控制

远程控制实现思路即把之前的局域网变成广域网,可以通过任意网络访问即可,恰好家里前段时间买了小米路由器,于是在上面安装了 Nginx 和 MySQL(还说什么深度定制,阉割就阉割呗,安装得好辛苦):

然后借助花生壳服务实现内网穿透(其实我也不知道是什么意思,但是插上一个叫「花生棒」的东西到路由器 Lan 口之后就可以配置外网域名映射了),于是我顺利得通过外网访问到我家的局域网了。


所以如下图所示,自己在服务器用 PHP 写了 GET 和 SET 的接口,然后 nodemcu 定时轮询:

上视频(3G 访问,并且访问的是外部地址):

(查看密码:hahnzhu)

最后,总结

保持我一直以来的高尚品格和动手能力的最重要因素就是——穷。结束了没有?其实还可以再优化一下:

  • 换一个更牛逼的灯泡,并 3D 打印一个更有逼格的外壳
  • 采用 MQTT 物联网传输协议
  • 以树莓派做为服务器,小米路由器渣渣

PS:其实我最希望是做一个智能铲屎机的。