我有点晚了,但我希望它可以帮助你:
在发送您的 lighton 请求之前,您必须发送第一个请求以获取 wifi 桥接会话。您还需要根据您的请求计算 Milight 所谓的“校验和”。
您还要确定您拥有什么样的灯泡,是 WW 灯泡还是 CW?我被困了好几天,因为我发送了错误的请求..
我做了一个实现,它在 php 中,但你可以在 Objective-C 中以同样的方式使用它。
检查一下:https://github.com/winosaure/MilightAPI
更新:
根据无限的“文档”(http://www.limitlessled.com/dev/),这是请求的组成方式:
UDP 十六进制发送格式:80 00 00 00 11 {WifiBridgeSessionID1}
{WifiBridgeSessionID2} 00 {SequenceNumber} 00 {COMMAND} {ZONE NUMBER}
00 {校验和}
这就是为什么你必须先获取 wifibridge 会话然后你需要计算校验和。
让我举一个关于如何打开灯的例子。
文档说:
31 00 00 08 04 01 00 00 00 = 灯亮
31 00 00 08 04 01 00 00 00 参考上面的{COMMAND}。
到目前为止,完整的请求必须是:
80 00 00 00 11 {WifiBridgeSessionID1} {WifiBridgeSessionID2} 00 {SequenceNumber} 00 31 00 00 08 04 01 00 00 00 {ZONE NUMBER} 00 {Checksum}
现在让我们获取 Wifibridge 会话。文件说:
要获得 WifiBridgeSessionID1 和 WifiBridgeSessionID2 发送这个
命令 UDP。
发送十六进制字节:20 00 00 00 16 02 62 3A D5 ED A3 01 AE 08
2D 46 61 41 A7 F6 DC AF (D3 E6) 00 00 1E
这就是我这样做的原因:
private function getWifiBridgeSession()
{
$command = array (
0x20,0x00, 0x00,
0x00, 0x16, 0x02,
0x62, 0x3A, 0xD5,
0xED, 0xA3, 0x01,
0xAE, 0x08, 0x2D,
0x46, 0x61, 0x41,
0xA7, 0xF6, 0xDC,
0xAF, 0xD3, 0xE6,
0x00, 0x00, 0x1E);
return $this->sendCommand($command);
}
一旦你用这个命令发送一个 UDP 请求,你就会得到一个结果。
Wifi Bridge session1 指的是响应的第 20 个字节,WifiBridge Session2 指的是响应的第 21 个字节(不要忘记我们是从 0 开始计数的,所以你必须采取类似“response[19]”和“response [20]")。
比方说,在发送这个请求后,我得到了这个响应:
28 00 00 00 11 00 02 AC CF 23 F5 7A D4 69 F0 3C 23 00 01 05 00
所以我的“WifiBridgesession1”是 0x05 而“Wifibridgesession2”是 0x00
所以现在我们“打开”灯的请求是:
80 00 00 00 11 0x05 0x00 00 {SequenceNumber} 00 31 00 00 08 04 01 00 00 00 {ZONE NUMBER} 00 {Checksum}
所以现在我们需要找出 {SequenceNumber} {Zone Number} 和 {Checksum}
什么是“序列号”?
医生说:
顺序字节只是有助于保持命令的正确顺序,
它有助于忽略已经收到的重复数据包。增量
每个新命令的这个字节加 1。
所以放上你想要的,并为每个请求将这个值增加到 1。 (我个人总是发送 0x01)。
“区域编号”是指您同步灯光的区域。
{ZONE NUMBER} 的有效列表 0x00 全部 0x01 Zone1 0x02 Zone2 0x03
Zone3 0x04 Zone4
假设我们的“区域”是 0x01。
快完成了。我们现在只需要计算“校验和”。
医生说:
取命令的 9 个字节,区域的 1 个字节,加上 0
= 校验和 = (校验和 & 0xFF) 例如SUM((31 00 00 08 04 01 00 00 00)(command) 01(zone) 00) = 3F(chksum)
所以我们命令的校验和是:
31+00+00+08+04+01+00+00+00+01+00 = 0x54
我为区域添加命令的所有字节(打开)+ 0x01 + 0x00
所以现在我们拥有了一切,打开灯的完整请求是:
80 00 00 00 11 05 00 00 01 00 31 00 00 08 04 01 00 00 00 01 00 54
就是这样。
注意:不要只是复制粘贴请求,我是根据例子计算的值,每次开灯的请求都会改变,根据你的计算。
也许你注意到我写了“00 31 00 00 08 04 01 00 00 00”来执行“打开”命令,这仅适用于CW灯泡。该文档没有指定...
WW 灯泡的相同命令是 00 31 00 00 07 03 01 00 00 00
所以 WW 灯泡的完整命令是:
80 00 00 00 11 05 00 00 01 00 31 00 00 07 03 01 00 00 00 01 00 54
CW 和 WW 灯泡有什么区别?
我可以说 CW 指的是“冷白”,WW 指的是“暖白”。但由于我不是“led 灯泡”方面的专家,我无法解释更多,我也不知道为什么我们需要为两者编写不同的请求。
无论如何,我希望我足够清楚。
让我知道情况如何。