苹果在2014年推出的HomeKit智能家居平台的确给人眼前一亮的感觉。随着时间的推移,国外的黑客对HomeKit该逆向的逆向,结果也都汇总到了git。本着折腾到死的极客心态,从网上淘了一块树莓派进行测试。

0×01 基本工具

硬件在某宝上都有卖的,加起来不到300块

硬件:
32G SD卡
2.5V电源线
Raspberry pi3
两根杜邦线
LED灯
保护壳

联动HomeKit的工程在git上找到两个,都是基于nodejs的,这边先测试的是HAP-NodeJS

软件
raspbian 
https://github.com/nfarina/homebridge
https://github.com/KhaosT/HAP-NodeJS

0×02 安装

先解决依赖

  1. # apt-get install avahi-daemon avahi-discover libnss-mdns libavahi-compat-libdnssd-dev  build-essential -y
  2. # service avahi-daemon start

增加nodejs源

  1. curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

  1. # apt-get install nodejs

克隆源代码

  1. git  clone  https://github.com/KhaosT/HAP-NodeJS.git

安装node-gyp

  1. $ sudo npm install -g node-gyp

然后切换到HAP-NodeJS文件夹下,运行

  1. node Core,js

缺哪个库安装哪个库

最后安装

  1. npm install python-shell

打开iPhone手机的HomeKit就能看到伪造的智能设备了

在accessories的目录下新建一个LivingLight_accessory.js,代码如下

  1. //Light_accessory.js
  2. var PythonShell = require('python-shell');
  3. // HomeKit types required
  4. var types = require("./types.js")
  5. var exports = module.exports = {};
  6. var execute = function(accessory,characteristic,value){ console.log("executed accessory: " + accessory + ", and characteristic: " + characteristic + ", with value: " +  value + "."); }
  7. exports.accessory = {
  8.   displayName: "Living Light",
  9.   username: "1A:5B:3C:4A:5E:FF",
  10.   pincode: "031-45-154",
  11.   services: [{
  12.     sType: types.ACCESSORY_INFORMATION_STYPE,
  13.     characteristics: [{
  14.         cType: types.NAME_CTYPE,
  15.         onUpdate: null,
  16.         perms: ["pr"],
  17.         format: "string",
  18.         initialValue: "Living Light",
  19.         supportEvents: false,
  20.         supportBonjour: false,
  21.         manfDescription: "Bla",
  22.         designedMaxLength: 255
  23.     },{
  24.         cType: types.MANUFACTURER_CTYPE,
  25.         onUpdate: null,
  26.         perms: ["pr"],
  27.         format: "string",
  28.         initialValue: "Oltica",
  29.         supportEvents: false,
  30.         supportBonjour: false,
  31.         manfDescription: "Bla",
  32.         designedMaxLength: 255
  33.     },{
  34.         cType: types.MODEL_CTYPE,
  35.         onUpdate: null,
  36.         perms: ["pr"],
  37.         format: "string",
  38.         initialValue: "Rev-1",
  39.         supportEvents: false,
  40.         supportBonjour: false,
  41.         manfDescription: "Bla",
  42.         designedMaxLength: 255
  43.     },{
  44.         cType: types.SERIAL_NUMBER_CTYPE,
  45.         onUpdate: null,
  46.         perms: ["pr"],
  47.         format: "string",
  48.         initialValue: "A1S2NASF88EW",
  49.         supportEvents: false,
  50.         supportBonjour: false,
  51.         manfDescription: "Bla",
  52.         designedMaxLength: 255
  53.     },{
  54.         cType: types.IDENTIFY_CTYPE,
  55.         onUpdate: null,
  56.         perms: ["pw"],
  57.         format: "bool",
  58.         initialValue: false,
  59.         supportEvents: false,
  60.         supportBonjour: false,
  61.         manfDescription: "Identify Accessory",
  62.         designedMaxLength: 1
  63.     }]
  64.   },{
  65.     sType: types.LIGHTBULB_STYPE,
  66.     characteristics: [{
  67.         cType: types.NAME_CTYPE,
  68.         onUpdate: null,
  69.         perms: ["pr"],
  70.         format: "string",
  71.         initialValue: "Light 1 Light Service",
  72.         supportEvents: false,
  73.         supportBonjour: false,
  74.         manfDescription: "Bla",
  75.         designedMaxLength: 255
  76.     },{
  77.         cType: types.POWER_STATE_CTYPE,
  78.         onUpdate: function(value)
  79.     {
  80.             console.log("Change:",value);
  81.             if (value) {
  82.             PythonShell.run('/python/light1.py', function (err) {
  83.                    console.log('Light1 On Success');
  84.             });
  85.             } else {
  86.                 PythonShell.run('/python/light0.py', function (err) {
  87.                     console.log("Off Success");
  88.                 });
  89.             }
  90.         },
  91.         perms: ["pw","pr","ev"],
  92.         format: "bool",
  93.         initialValue: false,
  94.         supportEvents: false,
  95.         supportBonjour: false,
  96.         manfDescription: "Turn On the Light",
  97.         designedMaxLength: 1
  98.     },{
  99.         cType: types.HUE_CTYPE,
  100.         onUpdate: function(value) { console.log("Change:",value); execute("Test Accessory 1", "Light - Hue", value); },
  101.         perms: ["pw","pr","ev"],
  102.         format: "int",
  103.         initialValue: 0,
  104.         supportEvents: false,
  105.         supportBonjour: false,
  106.         manfDescription: "Doesn’t actually adjust Hue of Light",
  107.         designedMinValue: 0,
  108.         designedMaxValue: 360,
  109.         designedMinStep: 1,
  110.         unit: "arcdegrees"
  111.     },{
  112.         cType: types.BRIGHTNESS_CTYPE,
  113.         onUpdate: function(value) { console.log("Change:",value); execute("Test Accessory 1", "Light - Brightness", value); },
  114.         perms: ["pw","pr","ev"],
  115.         format: "int",
  116.         initialValue: 0,
  117.         supportEvents: false,
  118.         supportBonjour: false,
  119.         manfDescription: "Doesn’t actually adjust Brightness of Light",
  120.         designedMinValue: 0,
  121.         designedMaxValue: 100,
  122.         designedMinStep: 1,
  123.         unit: "%"
  124.     },{
  125.         cType: types.SATURATION_CTYPE,
  126.         onUpdate: function(value) { console.log("Change:",value); execute("Test Accessory 1", "Light - Saturation", value); },
  127.         perms: ["pw","pr","ev"],
  128.         format: "int",
  129.         initialValue: 0,
  130.         supportEvents: false,
  131.         supportBonjour: false,
  132.         manfDescription: "Doesn’t actually adjust Saturation of Light",
  133.         designedMinValue: 0,
  134.         designedMaxValue: 100,
  135.         designedMinStep: 1,
  136.         unit: "%"
  137.     }]
  138.   }]
  139. }

然后在HAP-NodeJS下新建python文件夹,新建light1.py,用来开启灯

  1. import RPi.GPIO as GPIO
  2. GPIO.setwarnings(False)
  3. GPIO.setmode(GPIO.BOARD)
  4. GPIO.setup(16, GPIO.OUT)
  5. GPIO.output(16, 1)
  6. #GPIO.cleanup()

light0.py用来关闭灯

  1. import RPi.GPIO as GPIO
  2. GPIO.setwarnings(False)
  3. GPIO.setmode(GPIO.BOARD)
  4. GPIO.setup(16, GPIO.OUT)
  5. GPIO.output(16, 0)
  6. #GPIO.cleanup()

重新运行node Core.js即可在HomeKit看到新建的Living Light

把这个添加,pincode就是031-45-154

硬件连接

我这边用的是物理接口的16口和34口

0×03 测试

后记

这里有个前提条件是树莓派和iPhone在同一个子网上,如果想从外网控制就得需要映射公网WEB服务器或者是第三方物联网WEB的形式。而如果想将树莓派作为智能家庭网络的中心,后期还有很多工作要做,比如服务开机启动,连接继电器,线路改造,车库门,温度感应器,电视,摄像头等,有机会再继续聊吧

Reference:

http://www.instructables.com/id/Raspberry-Pi-2-Homekit-from-zero-to-Hey-Siri/?ALLSTEPS

https://github.com/KhaosT/HAP-NodeJS

极客DIY:如何用Siri与树莓派“交互”的更多相关文章

  1. 极客DIY:使用树莓派制作一套“NAS+私有云盘+下载机”

    原创作者:HackLiu 0×00 前言 ‍ ‍ 如果你家里有多台设备需要联网需要娱乐,你一定会或多或少遇到设备碎片化带来的烦恼.当然,已经有很多厂商包括新晋的小米.360在内的互联网公司做了这个事情 ...

  2. 极客DIY:使用树莓派制作一架四轴无人机

    如果你想DIY一台属于自己的无人机,那么接下来可以阅读这篇文章,阅读完毕之后也许对你会有启发. 这个项目主要用到的零件主要来自Erle Robotics(一个使用Linux系统的开源四轴飞行器项目). ...

  3. 极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位

    0×00 前言 GNSS是Global Navigation Satellite System的缩写.中文称作:全球卫星导航系统.全球导航卫星系统. GNSS泛指所有的卫星导航系统,包括全球的.区域的 ...

  4. 极客DIY:制作一个可以面部、自主规划路径及语音识别的无人机

    引言 现在大部分无人机厂商都会为第三方开发者提供无人机API接口,让他们更容易地开发无人机飞行控制应用程序,让无人机想怎么玩就怎么玩.有的API接口可以帮助开发者开发基于Web版的APP.手机APP甚 ...

  5. 极客DIY:如何构建一台属于自己的基站

    写在前面(原文作者) 上周我去特拉维夫(Tel Aviv)探望我的朋友结果有了一些收获,一块崭新的BladeRF(x40),即一个支持USB3.0的SDR平台,这就意味着可以同时发送和接收信息了.而H ...

  6. 极客DIY:打造属于自己的无线移动渗透测试箱

    本文中介绍的工具.技术带有一定的攻击性,请合理合法使用. 你想不想拥有一款属于自己的移动无线渗透测试箱,如果你感兴趣,下面介绍的设备将会对你很有帮助.这个箱子被称为“MiTM(中间人攻击)WiFi箱” ...

  7. 极客DIY:打造你的专属黑客U盘

    简介 由于“Bad USB漏洞”的存在,USB闪存驱动器也成了常见的攻击目标.Bad-USB让黑客可以重新编程微控器作为一个“人机界面装置”(HID)或键盘,然后在目标机器上执行自定义键盘敲击.这种情 ...

  8. 极客DIY:开源WiFi智能手表制作

    如果你喜欢拥有一款属于自己的无线手表,那么请不要错过,相信阅读完这篇文章对你会很有帮助. 硬件规格 ESP8266(32Mbit闪存) MPU-9250(陀螺仪传感器)以及 AK8963(内置磁力计) ...

  9. 极客DIY:RFID飞贼打造一款远距离渗透利器

    本文使用最新的渗透工具RFID飞贼(Tastic RFID Thief)和RFID感应破解技术来获取一些拥有安防的建筑物的访问权限. Tastic RFID Thief是一个无声远距离RFID读卡器, ...

随机推荐

  1. 适合于图像处理方向的SCI期刊杂志列表【转】

    适合于图像处理方向的SCI期刊杂志列表[转]   表1. 适合于图像处理方向的SCI期刊杂志列表 ISSN 期刊名 出版周期 1057-7149 IEEE TRANSACTIONS ON IMAGE ...

  2. Unixbench测试工具和使用

    安装过程 wget http://soft.laozuo.org/scripts/UnixBench5.1.3.tgz tar xf UnixBench5.1.3.tgz cd UnixBench5. ...

  3. salt stack 工具之一——远程命令

    salt stack 远程命令 salt stack是一种自动化的运维工具,可以同时对N台服务器进行配置管理.远程命令执行等操作. salt stack分为两个部分: salt-master,部署在控 ...

  4. Nginx重新编译添加模块

    原文链接:http://www.linuxidc.com/Linux/2013-06/86438.htm 找到安装nginx的源码根目录,如果没有的话下载新的源码 http://nginx.org t ...

  5. TFS2012 安装 配置笔记

    TFS2012安装   具体请看文档..   http://yunpan.cn/cmt4X6S7TjEgq  访问密码 464e     TFS2012配置 环境:VS2012  SQL2008  T ...

  6. SVN Tree Conflict 的分析

    所谓Tree Confict,就是至少有一个人修改了目录结构,包括文件或者文件所在目录的改名.删除.移动.然后Update或Merge的时候就报了Tree Conflict. 介绍一下概念Delete ...

  7. 关于在windows上的wamp集成环境和xampp上安装mongo扩展

    今天来学习下mongodb,在装PHP扩展的时候本来是一个很轻松的事情,结果并不是我想想的那么简单. 我的集成环境是xampp的php版本是5.6的x86.我开启了安全模式,所以我需要mongo时ts ...

  8. [整理]Android开发(一)环境安装

    所有相关下载均可通过http://www.androiddevtools.cn/下载 安装JAVA JDK 下载Windows x64 180.44 MB jdk-8u45-windows-x64.e ...

  9. [设计模式] javascript 之 策略模式

    策略模式说明 定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用 ...

  10. parastor2000挂载方式

    1.先授权 2.客户端安装使用0528parastor-client-centos6.6-38390.tar.xz clusconf -f fatnodes --sync-do "cd /m ...