
搬家完之后,大门锁是一个德斯曼门锁,型号是 T700,指纹识别特别拉胯,加上自己的手换季就有点脱皮,所以门锁一直用官方 app 开门,每次开门,都需要打开 App,靠近门锁,点击一下一键开门。
用了几个月之后,突然想到为啥这个门锁不支持像 Tesla 一样,靠近自动解锁呢?于是,我就在 app 上提了一个意见反馈,希望可以像 Tesla 一样,只要手机靠近,拉一下门把手就开门的功能。可能这个锁太小众,或者开发人员是外包?提交了需求,三个月过去了,后台一直都是待回复。
于是,自己写一个吧,虽然,没做过 iOS 开发,不过也不用做界面,就做蓝牙调用就好了。
分析协议
网络请求
iOS 使用 stream 抓包,获取网络 Http 请求,很容易就能找到 2 个关键请求。
/lock/command/secret
获取 command_secret ,这个值测试下来是固定的。
/lock/open/new
开锁
所有的请求使用 sessionId
进行用户验证,亲测一个 sessionId 基本可以用很久,几个月都不会过期。
蓝牙请求
使用 https://github.com/jnross/Bluetility 这个工具,即可扫描蓝牙设备,获取广播信息。可以找到锁的蓝牙特征值
1
| central.scanForPeripherals(withServices: [CBUUID(string: "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"),], options: [CBCentralManagerScanOptionAllowDuplicatesKey:**true**])
|
做个 App
拿到这些所有数据,就可以开始做个 app 了。步骤
1、蓝牙扫描周围设备,如果发现设备名称为 “LOCK_1234”的设备,即是自己的锁,1234 为锁的蓝牙 Mac 地址后 4 位拼接。
2、连接这个设备。
3、处理 notifyService 和 writeService。
4、将 Http 请求获取到的 command_secret 使用 hexWrite 写入蓝牙锁,锁会返回一个 secret 值。
5、使用锁返回的 secret 值,调用 /lock/open/new
即可获取开锁的 command
6、使用 hexWrite 写入 command ,锁就开了。
通过上面的流程,就可以完成一次开锁了,如何像 Tesla 一样,靠近,拉门把手,就开锁呢?
处理 deviceDidDisconnect
方法就可以了。断联后,自动等待下次连接,这个指令有 iOS 调度,所以也不用担心 App 后台的问题。
最终效果,还挺好,每天开门都不用掏手机了。
