Итак, общение с контроллером идёт в 2 захода, и это хорошо видно по логу программы LimitlessLED:
Код: Выделить всё
Switch On:
Start Wifi Bridge Session...
Send UDP commands to 192.168.0.100 port 5987
Sent: 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
Received: 28 00 00 00 11 00 02 F0 FE 6B 2С C2 A0 14 CA 28 EE 00 01 4D 01 00
LimitlessLEDWifiBridgeSessionID1 is 4D
LimitlessLEDWifiBridgeSessionID2 is 01
IP Address is 192.168.0.100
MAC Address is FE:6B:2С:C2:A0:14
Sequence Number is 05
Checksum is 3F
Sent: 80 00 00 00 11 4D 01 00 05 00 31 00 00 08 04 01 00 00 00 01 00 3F
Command SUCCESSFUL.
Received: 88 00 00 00 03 00 05 00
Command completed.
Первым делом нужно отправить своеобразное приветствие, которое одинаково для всех команд и для всех отправителей (пробовал отправлять с разных компов)
Код: Выделить всё
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
В ответ на это приветствие, контроллер ответит, например так:
Код: Выделить всё
[ начало ответа ][MAC адрес контроллера] [ ]--SessionID. Вот его нам и надо!
28 00 00 00 11 00 02 F0 FE 6B 2С C2 A0 14 CA 28 EE 00 01 4D 01 00
[ ]--вот это не знаю, что, но оно всегда одинаковое
Из этого ответа нам нужен SessionID. Далее отправляем команду на включение света, которая будет выглядеть так:
Код: Выделить всё
[начало команды] [ ]--Sequence number [ ]--канал
80 00 00 00 11 4D 01 00 05 00 31 00 00 08 04 01 00 00 00 01 00 3F
[ ]--SessionID [ ]--контрольная сумма команды
[ ]--команда
В качестве разделителя между частями команды используется 00
На это контроллер ответит:
Код: Выделить всё
[ ]--начало
88 00 00 00 03 00 05 00
[ ]--текущий Sequence number
В принципе можно всегда использовать 01 для Sequence number, а можно и хранить его где-то в глобальной переменной, и при следующем вызове команды добавлять 1, но помнить, что это значение должно быть в HEX-виде. Я заморачиваться на это не стал
Теперь, как прикрутить это к МДМ. Я сделал скрипт, такого содержания:
Код: Выделить всё
$ip = $params["ip"];
$hello = hex2bin("200000001602623AD5EDA301AE082D466141A7F6DCAFD3E600001E");
$port = $params["port"];
$cmd = $params["cmd"];
$chan = $params["chan"];
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_sendto($sock, $hello, strlen($hello), 0, $ip, $port);
socket_recvfrom($sock, $bufbin, 44, 0, $ip, $port);
$buf = bin2hex($bufbin);
$sessionID = substr($buf,38,4);
$outhex = "8000000011".$sessionID."00".$chan."00";
$off = "3100000804020000000100";
$on = "3100000804010000000100";
switch($cmd){
case "off";
$outcmd= $off;
break;
case "on";
$outcmd = $on;
break;
}
$crcdec = 0;
for ($i = 0; $i <= 21; $i+=2) {
$crcdec = $crcdec + hexdec(substr($outcmd,$i,2));
}
$crc = dechex($crcdec);
$outhex = $outhex.$outcmd.$crc;
$out = hex2bin($outhex);
socket_sendto($sock, $out, strlen($out), 0, $ip, $port);
socket_recvfrom($sock, $buf, 16, 0, $ip, $port);
socket_close($sock);
Кстати, в ролике про управление кондиционером, автор сделал функцию для преобразования HEX в BIN. Погуглив обратное преобразование, я нашёл, что в РНР это уже всё встроено.
Теперь для включения лампы можно вызывать этот скрипт с параметрами ip=ip_контроллера&port=5987&chan=01&cmd=on
Так как я пользуюсь интеграцией МДМ и HomeKit, которая работает только с "простыми устройствами", управление лампочкой я привязал к Switch1. В методах этого объекта (turnOn и turnOff) я добавил РНР-код вызова скрипта с соответствующими параметрами.
Жаль, что обратной связи нет. В планах поиграть с уровнями яркости, как настрою - отпишу тут.