V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
cctrv
V2EX  ›  分享创造

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

  cctrv · 2017-06-20 08:56:59 +08:00 · 14915 次点击
这是一个创建于 2748 天前的主题,其中的信息可能已经有所发展或是发生改变。

為你的米家提供完整的 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

第 1 条附言  ·  2017-06-21 00:38:01 +08:00

一個關於 Socket.io Java 的問題

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

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

已經設定重鏈接。

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

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

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

5 分鐘斷線

第 2 条附言  ·  2017-06-25 22:09:23 +08:00

Socket 的問題解決方案

這個問題只有小米有

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

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

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

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

如何設定神隱模式?

未命名.001

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

未命名.002

結語

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

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


gongjianwei
    15
gongjianwei  
   2017-06-20 10:34:16 +08:00 via Android
非常感谢
graetdk
    16
graetdk  
   2017-06-20 10:43:16 +08:00
哈哈哈,厉害~
aliuwr
    17
aliuwr  
   2017-06-20 11:13:22 +08:00
要脸不,还给不给中低端的前端 /后端 /产品活路?
Betacoefficient
    18
Betacoefficient  
   2017-06-20 11:16:07 +08:00
@aliuwr 你丢脸不,能力居然差,还觉得人能力强,还要人给你活路,你求她啊,哈哈哈
Exyn0s
    19
Exyn0s  
   2017-06-20 11:30:02 +08:00 via Android
小姐姐好強
tomczhen
    20
tomczhen  
   2017-06-20 12:02:43 +08:00 via Android
嗯,其实 pi 也可以省掉
http://post.smzdm.com/p/553097
sobigfish
    21
sobigfish  
   2017-06-20 13:37:46 +08:00
厉害了,

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

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

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

看得累,不利于知识传播分享,尤其是在一些低分辨率屏幕上,繁体字没法看。
故建议楼主改用简体字。
cctrv
    72
cctrv  
OP
   2017-06-21 18:43:39 +08:00
@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  
   2017-06-21 18:44:22 +08:00
@cctrv 下面三张 iOS 的截图的 app 叫什么, 这些东西的硬件是怎么联网的
cctrv
    74
cctrv  
OP
   2017-06-21 19:16:03 +08:00 via iPhone
qaulau
    75
qaulau  
   2017-06-21 19:38:29 +08:00 via Android
楼上一堆看到美女头像就认为是女的的,应该是单身久了的,难道只有我觉得楼主是抠脚大汉,而且是有信仰的抠脚大汉…
cctrv
    76
cctrv  
OP
   2017-06-21 21:41:27 +08:00
@qaulau 沒關係~ 我們又不會見面。
不過我有微博和 ins
jonechenug
    77
jonechenug  
   2017-06-21 23:46:54 +08:00 via Android
/吐血,不是微信控制,是楼主的微信号
Katy34
    78
Katy34  
   2017-06-22 10:14:47 +08:00
牛逼 666
azh7138m
    79
azh7138m  
   2017-06-22 11:28:58 +08:00 via Android
被设计师支配的恐惧(瑟瑟发抖的萌新
goldenlove
    80
goldenlove  
   2017-06-22 14:42:43 +08:00
默默地围观了楼主个人网站....佩服。
求 ins 围观地址~
DingSoung
    81
DingSoung  
   2017-06-22 15:29:25 +08:00
你后面三张 iOS 截图是什么 APP 的呀
wingyiu
    82
wingyiu  
   2017-06-22 17:04:42 +08:00
一晚几个小时哦
Thoxvi
    83
Thoxvi  
   2017-06-22 19:03:43 +08:00 via Android
@jonechenug 这里有个假装不想要的
dven
    84
dven  
   2017-06-23 15:21:04 +08:00
NanoPi NEO2,sunxi/Allwinner H5 A53 Quad ?
其實用緊繁體字都冇咩稀奇,喺廣州都幾常見下
dven
    85
dven  
   2017-06-23 15:24:47 +08:00
@qaulau
人地靚女來噶


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


@aksoft
技術并冇國界,更唔分男女
loveminds
    86
loveminds  
   2017-06-23 15:52:02 +08:00 via Android
😂比小敏更能折腾的妹子出现了
cctrv
    87
cctrv  
OP
   2017-06-23 17:27:09 +08:00 via iPhone
有人已經找到我微信了
19tj
    88
19tj  
   2017-06-24 15:11:37 +08:00
那个……你一定没有男朋友吧……
ihainan
    89
ihainan  
   2017-06-24 22:05:44 +08:00
老早就关注了小姐姐的微博……小姐姐棒棒。
Poko
    90
Poko  
   2017-06-24 22:18:03 +08:00
夭寿啦,没有活路啦
litpen
    91
litpen  
   2017-06-25 09:27:44 +08:00
不行,我也要努力了,不能呆在没有发展的公司里等死了!
cctrv
    92
cctrv  
OP
   2017-06-25 22:10:41 +08:00
我終於,找到神奇的 Socket Bug 的問題所在了。
ZiLong
    93
ZiLong  
   2017-06-25 22:59:24 +08:00
不就是膝盖么
Kalv8n
    94
Kalv8n  
   2017-07-02 11:34:22 +08:00 via Android
@cctrv 求 ins
LeoNG
    95
LeoNG  
   2017-07-03 19:17:55 +08:00
@cctrv #92 棒棒哒~
fumichael
    96
fumichael  
   2017-07-04 09:13:11 +08:00
哇,好酷的工作。
GeekCat
    97
GeekCat  
   2017-07-26 14:15:50 +08:00
忽然觉得被一个设计师在代码上给打败了。。。。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1385 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 37ms · UTC 17:38 · PVG 01:38 · LAX 09:38 · JFK 12:38
Developed with CodeLauncher
♥ Do have faith in what you're doing.