Проблемы с отправкой пакетов UDP (milight, limitlessled)

Я пытаюсь написать приложение menubar, чтобы получить контроль над моими огнями через Mac. Я пользуюсь системой milight (безлимит, easybulbs...). У них есть открытая система, где вы можете отправлять команды через UDP.

Я могу управлять своими источниками света через Python- библиотеку без ограничений в Python, поэтому я знаю, что сетевые функции, такие как IP и порт, правильные.

Так что я думаю, что делаю что-то не так с этим материалом UDP, с которым я никогда не работал. Я пытаюсь использовать библиотеку SwiftSocket для отправки своих команд, но ничего не происходит, я пробовал это 2 дня.

Вот что я пытаюсь:

let host = "192.168.2.102"
let port = 5987

var client: UDPClient!

@IBAction func lightOn(_ sender: NSButton) {

    let bridgeon: [UInt8] = [0x31, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x01]
    let rgbwon: [UInt8] = [0x31, 0x00, 0x00, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0]

    print("Licht an")
    print(client.send(data: bridgeon))
    sleep(1)
    print(client.send(data: rgbwon))
    sleep(1)

}

@IBAction func lightOff(_ sender: NSButton) {
    print("Licht aus")
}

override func viewDidLoad() {
    super.viewDidLoad()

    client = UDPClient(address: host, port: Int32(port))
}

Когда я сравниваю это со сложностью pythonlibrary, я уверен, что забыл что-то важное. Я еще не работал с сетями, поэтому будьте снисходительны со мной.

спасибо и привет.

1 ответ

Решение

Я немного опоздал, но я надеюсь, что это поможет вам:

Перед отправкой вашего запроса на Lighton вы должны отправить первый запрос, чтобы получить сеанс Wi-Fi Bridge. Вы также должны вычислить то, что Милайт назвал "контрольной суммой" на основе вашего запроса.

Вы также убедитесь в том, что у вас есть лампочка, это лампочка 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 см. {КОМАНДА} выше.

Пока полный запрос должен быть:

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<- отправить это по IP-адресу моста Wi-Fi v6

Вот почему я делаю это:

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 Bridge1 ссылается на 20-й байт ответа, а сеанс WifiBridge S2 ссылается на 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)(команда) 01(зона) 00) = 3F(чксум)

Таким образом, контрольная сумма для нашей команды: 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 относится к "Cold White", а WW к "Warm White". Но так как я не эксперт в "светодиодных лампах", я не могу объяснить больше, я не знаю, почему нам нужно написать разные запросы для обоих.

Во всяком случае, если бы я был достаточно ясен. Дайте мне знать, как все работает.

Другие вопросы по тегам