V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
cctrv

作為一個設計師,我用了一晚時間入門了 Android 開發並且為 HomeKit 提供了米家大部分設備的控制權

  cctrv · Jun 20, 2017 · 15812 views
This topic created in 3246 days ago, the information mentioned may be changed or developed.

為你的米家提供完整的 HomeKit 接入方案

Homebridge 方案一直鑒於米家開放度不足,所以總是不能把所有的米家設備都控制起來,我已經不爽很久了。終於,我把它解決了。
設計師折騰系列上文:

https://www.v2ex.com/t/336563#reply56

項目地址

https://github.com/qoli/MiHomePlus

演示視頻

http://staticshare.5mlstudio.com/img-5168-mov(2017-06-20T08:13:45+08:00).mov

操作原理
  • 調用「無障礙」特性,監視和控制米家 App,當「 TYPE_WINDOW_CONTENT_CHANGED 」觸發時候,與 MiPlusServer 同步設備狀態。
  • 與 MiPlusServer 透過 Socket.io 觸發 MIHomePlus 進行狀態切換。
  • 在 Homebridge 基於 Switcheroo 插件提供操作接口。
  • 所以 MiPlusServer 本質是 Web 接口

項目起因

天氣開始熱起來了,某日突發奇想,買了一個 NanoPi。

Nano Pi

IMG_5071

搭建了很 Cool 的 HomeBridge。

IMG_5099

後來數日后,歡喜地買了一個小米的空調伴侶。悲劇就從而而生了。

悲劇

小米的空調伴侶,竟然是不支持裝好的 Homebridge ! 我無法接受的我,開始了浪費生命的折騰。

IMG_5176

Android ADB 腳本方案

鑒於我只是一個設計師而言,我首先想到的辦法,是基於 Android ADB 指令,透過數據線去操作 Android 手機作為代理。 在大約 30 分鐘 ~ 60 分鐘后,我寫出了像樣的腳本了。

![螢幕快照 2017-06-17 上午 6.00.00]( http://ok7ct2124.bkt.clouddn.com/2017-06-20-螢幕快照 2017-06-17 上午 6.00.00.png)

把 ADB 方案集成到 HomeKit

在集成到 Homebridge 時候就遇到大問題了。調用腳本操作時候一切都好,但是就是無法在 HomeKit 使用。我上網檢查了文檔,發現 HomeKit 最長允許 2s 以內的指令,然而,我這個模擬方案,指令時長達到 30s 以上。 所以,只能放棄此 ADB 方案。

image

尋覓新方案,基於 Android Accessibility

我作為人生從沒開發過 Android / iOS 的設計師。只會前端 / Nodejs / PHP 這三個語言。 經過我一番搜索之後,我看到 Accessibility 相關的代碼好像特別簡單。 所以,我決定下載一個 Android Studio 來啟動我的 Android 之旅。

寫起來,發現 Android 開發其實不難

經過了 2 天時間,我終於把能用的 Android App 寫好了。我沒有覺得太多坑,我只是覺得英文資料太多,看起來很累而已。除了每次編譯的速度真的很慢之外,其他都還挺好的。

在寫的過程中,我都很少去看文檔,主要依賴 Google 知識點,閱讀別人的源代碼,很快地,就把核心功能組裝好了。又花了 120 分鐘時間,把服務器通信部分也組裝好了。

又花了好多好多時間,把 Socket IO 也折騰好了。

服務器端﹣Nodejs

Nodejs 部分最為簡單了,畢竟還是熟悉的嘛~簡單的接口就折騰好了。

Homebridge 接口

Homebridge 使用了 homebridge-switcheroo 作為通信插件,搞定。

一切的都搞定了,除了程序配置化

演示視頻:

http://staticshare.5mlstudio.com/img-5168-mov(2017-06-20T08:13:45+08:00).mov

IMG_5178

FullSizeRende

Supplement 1  ·  Jun 21, 2017

一個關於 Socket.io Java 的問題

由於需要實時通信服務,所以我使用了 Socket.io.

現在注意到一個問題就是,當在大約 5 分鐘的時候。就會服務器發送到手機就沒響應了。

已經設定重鏈接。

請問各位大神有解決辦法嗎?這個問題卡有一段時間了。

另外,Pong Ping 代碼也寫了,維持在 2 秒一次心跳。

只要 App 重啟了,就可以正常通信了。真的好奇怪!!!但是重啟 App 的話,無障礙的開關必須手工重啟。

5 分鐘斷線

Supplement 2  ·  Jun 25, 2017

Socket 的問題解決方案

這個問題只有小米有

我在小米的手機測試到無奈了。 就拿錘子測試了一下。

在錘子相同的代碼運作正常。很久很久也正常。

後來經過刷 ROM 等一系列無意義的掙扎之後,突發奇想地在 Google 搜索了「MIUI Socket 5 分鐘 斷線」。竟然被我找到一個叫做「神隱模式」的說明。

原文:https://kknews.cc/tech/zpav83.html

如何設定神隱模式?

未命名.001

保持運作 22 分鐘以上妥妥的!

未命名.002

結語

國產機的坑,真的好難猜得到啊。

97 replies    2017-07-26 14:15:50 +08:00
mritd
    1
mritd  
   Jun 20, 2017 via iPhone
老铁双击 666 完美,周末折腾
mritd
    2
mritd  
   Jun 20, 2017 via iPhone
讲真,Ios 的米家跟屎一样,动不动闪退
cctrv
    3
cctrv  
OP
   Jun 20, 2017
imyip
    4
imyip  
   Jun 20, 2017
佩服!!
designer
    5
designer  
   Jun 20, 2017 via iPhone   ❤️ 1
极客美少女!
scnace
    6
scnace  
   Jun 20, 2017 via Android   ❤️ 7
我拿起了我布满灰尘的树莓派 拍了拍上面的灰 叹了口气 又放下了…
brucewzp
    7
brucewzp  
   Jun 20, 2017 via iPhone
前后端都写了,最后你跟我说你只是一个设计师?[滑稽]好东西赞一个[认真脸]
abmin521
    8
abmin521  
   Jun 20, 2017 via Android
nano pi 不烧手吗
crossoverJie
    9
crossoverJie  
   Jun 20, 2017
全栈现在包含设计师啦 现在的小姐姐都这么 6 了嘛 😱
manihome
    10
manihome  
   Jun 20, 2017
全栈不仅包设计师还包产品。。。
alexskywin
    11
alexskywin  
   Jun 20, 2017
不会安卓开发的前端不是设计师,完美诠释
kely
    12
kely  
   Jun 20, 2017
我是一个假的前端,徘徊在被设计师支配的恐惧中
aksoft
    13
aksoft  
   Jun 20, 2017
现在的女孩子这么厉害??谁能罩得住
cctrv
    14
cctrv  
OP
   Jun 20, 2017


gongjianwei
    15
gongjianwei  
   Jun 20, 2017 via Android
非常感谢
graetdk
    16
graetdk  
   Jun 20, 2017
哈哈哈,厉害~
aliuwr
    17
aliuwr  
   Jun 20, 2017
要脸不,还给不给中低端的前端 /后端 /产品活路?
Betacoefficient
    18
Betacoefficient  
   Jun 20, 2017
@aliuwr 你丢脸不,能力居然差,还觉得人能力强,还要人给你活路,你求她啊,哈哈哈
Exyn0s
    19
Exyn0s  
   Jun 20, 2017 via Android
小姐姐好強
tomczhen
    20
tomczhen  
   Jun 20, 2017 via Android
嗯,其实 pi 也可以省掉
http://post.smzdm.com/p/553097
run2
    21
run2  
   Jun 20, 2017
厉害了,

服务器 IP 端口什么的 可以通过 bonjour 来广播吧

另求推荐个小巧的 android 盒子来做管理中枢
qceytzn
    22
qceytzn  
   Jun 20, 2017
米家这个东西联网吗?你不担心隐私泄露?
amorphobia
    23
amorphobia  
   Jun 20, 2017
@cctrv 如果我理解没错的话,没有 Android 设备的情况下,不小心买了“空调伴侣”,就不适用这个方法了,对吗?
queuey
    24
queuey  
   Jun 20, 2017
这个界面设计,佩服之极
GPU
    25
GPU  
   Jun 20, 2017
@tomczhen #20 楼主这个好像要 Pi 也要安卓机。
mysticzt123
    26
mysticzt123  
   Jun 20, 2017
这不是全栈 是全能 好厉害的小姐姐
Tunar
    27
Tunar  
   Jun 20, 2017 via Android
界面好看
U7Q5tLAex2FI0o0g
    28
U7Q5tLAex2FI0o0g  
   Jun 20, 2017
啊 好厉害的小姐姐
21grams
    29
21grams  
   Jun 20, 2017
一晚?
cctrv
    30
cctrv  
OP
   Jun 20, 2017 via iPhone
@amorphobia 嗯,我這個是必須要 Android 的方案。
Pi 可以參考 20 樓的教程也替換為 Android。

不過 NanoPi 好便宜。才 59-79 而已。
cctrv
    31
cctrv  
OP
   Jun 20, 2017 via iPhone
@21grams 對的啊。
一晚時間從沒寫過 Android 和 JAVA 到學會入門。
什麼功能完善的確花了額外 1 天(連續時間)
doggg
    32
doggg  
   Jun 20, 2017
人漂亮,设计漂亮,技术也漂亮。膝盖给你就是。
doggg
    33
doggg  
   Jun 20, 2017
有一群很棒的同事一起打理喜欢的事业应该每天都很有趣吧。
cctrv
    34
cctrv  
OP
   Jun 20, 2017 via iPhone
@qceytzn 洩漏吧~我大約 1/3 的密碼還是社工庫能找到的⋯😰
對個人隱私沒什麼在乎的普通玩家⋯😂
cctrv
    35
cctrv  
OP
   Jun 20, 2017 via iPhone
@doggg 可惜我是個人工作室⋯接接設計外包而已。
哈哈哈哈
AsisA
    36
AsisA  
   Jun 20, 2017 via Android
233,这真是「不会写程序的设计师不是好作家」了,设计好,程序好,文章也好
cctrv
    37
cctrv  
OP
   Jun 20, 2017 via iPhone
@tomczhen 這個辦法好啊。可惜我買 Pi 了。另外,我的手機是小米的。
amorphobia
    38
amorphobia  
   Jun 20, 2017
@cctrv 别替换成 Android 啊,我有两个 pi 却没一个 Android [捂脸]
meathill
    39
meathill  
   Jun 20, 2017
极客妹子很强力
onion83
    40
onion83  
   Jun 20, 2017
我也希望拥有 “人体感情器” !
MASAILA
    41
MASAILA  
   Jun 20, 2017
很强啊 看开头 还以为会是哪家开发平台的软问
aristotll
    42
aristotll  
   Jun 20, 2017
amazing
imyip
    43
imyip  
   Jun 20, 2017 via iPhone
我也希望像楼主那样打扮成漂漂亮亮
mingyun
    44
mingyun  
   Jun 20, 2017
厉害了
leopku
    45
leopku  
   Jun 20, 2017
666 的小姐姐
kingcos
    46
kingcos  
   Jun 20, 2017
真厉害。。
mns
    47
mns  
   Jun 21, 2017
设计师,,,
huyinjie
    48
huyinjie  
   Jun 21, 2017 via iPhone
好强
flowerains
    49
flowerains  
   Jun 21, 2017
很厉害了,关键是有心专研技术
yangff
    50
yangff  
   Jun 21, 2017
感觉抓个包会比较简单吧…
虽然米家的设备经常有一种搞法是先发到小米的服务器再推送下来… 安全性做得还算不错的…
newton108
    51
newton108  
   Jun 21, 2017
完爆 99% v2exer
kn007
    52
kn007  
   Jun 21, 2017 via Android
扎心了,老铁。小姐姐,你为何这么 6
Yien
    53
Yien  
   Jun 21, 2017 via iPhone
佩服!
aleung
    54
aleung  
   Jun 21, 2017 via Android
树莓派装过 home assistant,但小米的开放性太低,玩不了什么,就放弃了。没想过通过无障碍特性可以模拟人工操作 mihome 应用,这个思路超赞!
badreamm
    55
badreamm  
   Jun 21, 2017
一晚時間從沒寫過 Android 和 JAVA 到學會入門
扎心了 老姐
steveshi
    56
steveshi  
   Jun 21, 2017
这个牛了……
Jasoncao
    57
Jasoncao  
   Jun 21, 2017
@cctrv 流撇坏了
likaci
    58
likaci  
   Jun 21, 2017
不错啊,不知道直接用 homebridge 连 Android 红外控制传统设备行不行的通
test4zhou
    59
test4zhou  
   Jun 21, 2017
看了小姐姐 github 的项目,厉害!
denonw
    60
denonw  
   Jun 21, 2017
cxl008
    61
cxl008  
   Jun 21, 2017
一直不忍心下单米家全套。。。。
xuan_lengyue
    62
xuan_lengyue  
   Jun 21, 2017
示例视频看到最后有亮点…
xuan_lengyue
    63
xuan_lengyue  
   Jun 21, 2017
看错了…
cctrv
    64
cctrv  
OP
   Jun 21, 2017
@yangff
我的思路是,先去看看抓包。
抓包全部都是加鹽加密。我看到就不想破解了。
接著,去看看 adb 控制 Android,就是說的效率太低了。
最後才是無障礙服務……
cctrv
    65
cctrv  
OP
   Jun 21, 2017   ❤️ 1
@likaci
homebridge-switcheroo 是走 API 接口的。所以沒問題。
不過,紅外接口的缺點是狀態判斷不準確。
gyteng
    66
gyteng  
   Jun 21, 2017
没有 iPad 和 AppleTV 的情况下如何才能远程控制 HomeBridge 呢
yangxuan8282
    67
yangxuan8282  
   Jun 21, 2017
@gyteng 用 vpn 应该可以,另外有网友说用 mqtt 也行
LeoNG
    68
LeoNG  
   Jun 21, 2017
关于 Socket.io

我最近也在做智能家居的一个项目,不过是 iOS 端的,遇到了和楼主类似的情况,而且是 100%可以重现的:
1. 打开,app 退到后台,锁屏。
2. ....... 干等,或者抠鼻屎,随你。
3. 再次打开 app,和 UDP 服务器之间的通讯,指令发送、心跳等等,一切都 ok。唯独,和 WiFi 模块之前的通过挂掉了。由于和硬件的通讯是局域网内的广播。所以不知是否是这个有影响。这个问题一直困扰了我很就,各种谷歌,Apple forum 去找,还真让我发现了一个:https://forums.developer.apple.com/thread/45283, 当时想着终于可以甩锅了,但是仔细斟酌(良心发现),发现情况不太一样。也同你一样,写了 Ping 请求保持手机 wifi 模块不休眠,然而没什么用。

之前,我是每次发送 UDP 都会判断是否绑定了端口,是否连接,按理说,这个没问题。但是如果手机锁屏后重新打开,在重连的过程中,发现没有 close socket,所以我在每次 reopen 的时候,都会手动 close。这样就没再出现过这种情况了。至于为什么,我暂时也不太清楚。端口被占用也考虑过,但是想了想不应该唯独 udp 广播有问题。所以想不通了。。。。

一点个人经验,希望能帮到你。
jonechenug
    69
jonechenug  
   Jun 21, 2017 via Android   ❤️ 1
这么多人,只有我一个人想要微信吗?
esmdxx1
    70
esmdxx1  
   Jun 21, 2017 via iPhone
Lucups
    71
Lucups  
   Jun 21, 2017
恕我直言,在大陆,楼主使用繁体字是不科学的。

看得累,不利于知识传播分享,尤其是在一些低分辨率屏幕上,繁体字没法看。
故建议楼主改用简体字。
cctrv
    72
cctrv  
OP
   Jun 21, 2017
@gyteng
HomeKit 必須 iPad 或 AppleTV。
HomeBridge 我記得有一個相關項目 Home-Assistant,你看看這個。http://www.keepwn.com/technology/build-home-cloud-center-for-IT/


@LeoNG
所以?
我大約 4 分鐘就先自行 close 來做一次重新連接就可能好了?
我遲些有空試試,因為做了這個項目。
我的外包的上帝在催死我了。

@jonechenug
微信可以啊~ 反正是 WebAPI。
你把 HomeKit 扔了,用這個 Android App + Server,你打開網頁都可以控制開關呢。反正我用 GET 來調用服務。


@Lucups
所以嘛~ 習慣繁體字就好了。
謝謝你的建議咯。我是不會改的。^-^
DingSoung
    73
DingSoung  
   Jun 21, 2017
@cctrv 下面三张 iOS 的截图的 app 叫什么, 这些东西的硬件是怎么联网的
cctrv
    74
cctrv  
OP
   Jun 21, 2017 via iPhone
qaulau
    75
qaulau  
   Jun 21, 2017 via Android
楼上一堆看到美女头像就认为是女的的,应该是单身久了的,难道只有我觉得楼主是抠脚大汉,而且是有信仰的抠脚大汉…
cctrv
    76
cctrv  
OP
   Jun 21, 2017
@qaulau 沒關係~ 我們又不會見面。
不過我有微博和 ins
jonechenug
    77
jonechenug  
   Jun 21, 2017 via Android
/吐血,不是微信控制,是楼主的微信号
Katy34
    78
Katy34  
   Jun 22, 2017
牛逼 666
azh7138m
    79
azh7138m  
   Jun 22, 2017 via Android
被设计师支配的恐惧(瑟瑟发抖的萌新
goldenlove
    80
goldenlove  
   Jun 22, 2017
默默地围观了楼主个人网站....佩服。
求 ins 围观地址~
DingSoung
    81
DingSoung  
   Jun 22, 2017
你后面三张 iOS 截图是什么 APP 的呀
wingyiu
    82
wingyiu  
   Jun 22, 2017
一晚几个小时哦
Thoxvi
    83
Thoxvi  
   Jun 22, 2017 via Android
@jonechenug 这里有个假装不想要的
dven
    84
dven  
   Jun 23, 2017
NanoPi NEO2,sunxi/Allwinner H5 A53 Quad ?
其實用緊繁體字都冇咩稀奇,喺廣州都幾常見下
dven
    85
dven  
   Jun 23, 2017
@qaulau
人地靚女來噶


@GPU
@cctrv
如果喺我可能中意摞 Linux 跑多 D 咯


@aksoft
技術并冇國界,更唔分男女
loveminds
    86
loveminds  
   Jun 23, 2017 via Android
😂比小敏更能折腾的妹子出现了
cctrv
    87
cctrv  
OP
   Jun 23, 2017 via iPhone
有人已經找到我微信了
19tj
    88
19tj  
   Jun 24, 2017
那个……你一定没有男朋友吧……
ihainan
    89
ihainan  
   Jun 24, 2017
老早就关注了小姐姐的微博……小姐姐棒棒。
Poko
    90
Poko  
   Jun 24, 2017
夭寿啦,没有活路啦
litpen
    91
litpen  
   Jun 25, 2017
不行,我也要努力了,不能呆在没有发展的公司里等死了!
cctrv
    92
cctrv  
OP
   Jun 25, 2017
我終於,找到神奇的 Socket Bug 的問題所在了。
ZiLong
    93
ZiLong  
   Jun 25, 2017
不就是膝盖么
Kalv8n
    94
Kalv8n  
   Jul 2, 2017 via Android
@cctrv 求 ins
LeoNG
    95
LeoNG  
   Jul 3, 2017
@cctrv #92 棒棒哒~
fumichael
    96
fumichael  
   Jul 4, 2017
哇,好酷的工作。
GeekCat
    97
GeekCat  
   Jul 26, 2017
忽然觉得被一个设计师在代码上给打败了。。。。
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3009 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 379ms · UTC 07:18 · PVG 15:18 · LAX 00:18 · JFK 03:18
♥ Do have faith in what you're doing.