本帖最后由 hevake_lcj 于 2017-8-1 07:53 编辑
入手一只米家的魔方控制器。
按照惯例,先看入网过程:
与门磁一致的
model: lumi.sensor_cube
appver: 3
还有一个私有的属性报告
暂不管。
据说,这个魔方控制器是由两个传感器组成:加速度传感器、角度传感器。
动作上报的属性
上报的属性报告是格式:
cluster_id: 0x0012, attribute_id: 0x0055, data_type: uint16, data: 0x0002
动作不同与之相关的只是 data 的值不同。
于是找了标签纸,给每个面标一个数字。
0 摇一摇
2 (3)推
5 (1)推
4 (2)推
1 (4)推
0 (5)推
3 (6)推
翻转
正 反
1-2 108 101
2-3 98 84
3-4 81 74
1-5 104 69
1-6 107 93
2-5 96 68
2-6 99 92
4-5 72 65
4-6 75 89
....
我看不仅是相近的可以这动,从正面翻反面也行。
算了一下,每个面可以翻到另5个面,共计 6 * 5 = 30 个这样的数值表。
根据多年的软件经验推测,一定有什么规律在里面!
于是仔细分析了每组数值的二进制值。
发现:
00 000 xxx # 表示当 xxx 朝下时推一推或敲一敲
01 fff ttt # 表示从 fff 朝下翻转到 ttt 面朝下
那么,我们重新定义正方体的6个面。
现在思路就比较清晰了。不管它怎么翻,都能从数值中提取是从哪个面翻到哪个面的。
水平旋转
数据格式:
cluster_id: 0x000c, attribute_id: 0xff05, data_type: uint16, data: xxx
attribute_id: 0x0055, data_type: float, data: yyyyyyyy
暂时还不太明白 0xff05 是表示什么。
我看0x1f4出现比例最大,其值为500
yyyyyy 为角度的单精度浮点数,具体单精度是多少的值,只有代入计算机才能显示入值来。
值得注意的是:旋转是endpoint 3,其它都是 endpoint 2
敲与推是同一个动作?!
我去App看一下,发现App是可以区别推一推与敲一敲的。
一定是我漏了什么细节~
仔细对比敲两下与推一推的数据包。
经比对,我漏了uint16的高8位的差别。
原来,高8位为1表示推一推,为2表示敲两下。
那么,之前说摇一摇跟推一推能不能区分呢?
原来,遥一摇的高8位是0。
那么,翻转呢?
翻转的高8位是0。
总结:
游客,本帖隐藏的内容需要积分高于 20 才可浏览,您当前积分为 0
其实,小米的魔方控制器可以表现的状态远远超过米家App所显示的。
米家App只显示了6个,实际上有:
摇一摇,1
甩一下,1
敲两下,6 (6个面)
推一推,6 (6个面)
翻转90,6 * 4 = 24 (6个面,第个面都可以向4个面转90度)
翻转180,6 (6个面)
水平旋转,1
总计:45个
哦,对了忘了测它的心跳了。
观查一早上的心跳:
看似并没有什么规律可言。 |