Pull to refresh

Comments 8

Как то резко перешли с сырых данных, к структуре пакетов, можно подробнее как среди всего этого нашли границы чисел. Сам пытался разобраться в протоколе умной кнопки (диммера), но далее получения сырых данных PulseView не продвинулся.

В первую очередь необходимо выделить пакеты среди всего массива данных. Принимающая сторона должна быть способна отделить один пакет от другого. Есть несколько способов: добавить старт-стоп байт в пакет (как в этом случае) или сделать паузы между пакетами, тогда можно будет ловить пакеты на основании Idle Line прерывания.

Сразу удалось выявить старт/стоп байт 0x12 (18 в десятичной системе), пакеты мы нашли и отделили. Дальше записываем их рядом и сравниваем. Видим что они разной длины,которая указана во втором (и как оказалось в третьем) байте.

Для проверки корретности получения информации обычно используют некую контрольную сумму, которую добавляют в конец пакета (в основном). 4-х байтный CRC32 удалось выделить достаточно быстро. А дальше сложнее, если не используется какой-либо определенный стандарт формата пакета (modbus, например), приходится много сидеть и сравнивать отличия в разных пакетах, искать патерны и зависимости.

Данные по UART передаются в основном 8-ми битном формате, с определенной скоростью. Чтобы передать значение двух-восьми байтной переменной, нужно делить на байты. Очень полезно понимать, как записываются многобайтовые переменные в памяти (little-endian и big-endian), какой формат представления для вещественных чисел (float, double).

Можно экселем обойтись, но это долго при большом количестве данных. Я написал библиотечку парсера для удобства. Я сегодня выложу на гитхаб (сылка в конце статьи) excel файл с даными после работы парсера. Посморите визуально на разные пакеты, может станет понятнее.

Вчера только сдался с dyson и HA. У меня PH01 с wifi модулем, но от этого не легче. Приложение mydyson в России не работает. vpn, fakeGPS не помогают, зависает на последнем этапе подключения намертво. Мой ph01 не создаёт точку доступа как было на прошлых версии устройства, сейчас он подключается по BLE и передаёт данные точки доступа, к точке доступа подключается. С помощью wireshark анализировал всё общение Bluetooth и wifi но никаких паролей от устройства он передает, к серверам не коннектится. Вот и получается что в локалке торчит mqtt сервер на dyson, а сделать с ним ничего не могу. Ушёл на внешние датчики и управление по ИК. Теперь думаю о разборе и присоединения esp32 для сбора данных, спасибо за статью.

Может, он где-то через открытый вайфай плохого набрался?

Перед подключением к WiFi я сразу запустил wireshark. Увы, но увлажнитель только транслирует в сеть своё имя nDNS, а в мировую паутину и не пытается постучать. Насколько я понял алгоритм подключения анализируя пакеты, телефон по BLE подключается к увлажнителю, далее получает серийный номер и состояние подключения к сети wifi, если подключения нет, приложение говорит выбери сеть, причем поиск сети происходит на телефоне (в том числе предлагает ввести ручками) и увлажнителю передается лишь ssid и пароль. Увлажнитель подключается к wifi и передаёт снова пакет с серийником и статусом подключения. После этого приложение переходит на другой экран и пытается достучаться до серверов dyson передавая серийник. Тут я догадываюсь и есть основная проблема, в серийнике явно указана страна RU, и ответа от сервера не приходит, приложение пытается повторно отправлять пока не истечет timeout и выдает ошибку подключения. Увлажнитель кстати даже не проверяет есть ли выход в интернет на wifi, то есть его можно подключить к сети без интернета и его будет всё устраивать, а приложение всё так же скрупулёзно пытаться подключиться.

Спасибо, всегда интересно читать про реверс)) этакий детектив от мира ит

Да, пробовал и так, и сяк. Разворачивал тело пакета, разворачивал контрольную сумму, отдельно байты переменных тоже переставлял, ничего не подошло. Возможно, не удалось подобрать правильные настройки самой reveng. Если кому будет интересно попытаться самостоятельно, пользуясь reveng, взломать CRC32, дамп всех пакетов за 10 секунд работы выложен в репозитории проекта на гитхабе.

Есть вероятность, что для подсчёта CRC32 используется аппаратный модуль в контроллере STM32, поэтому reveng не срабатывает. Reveng считает побайтный crc, a в модуль подсчёта crc контроллера грузится по 4 байта за один раз. Для выравнивания последних байт пакета до кратных 4-м, что-то дописывается. Если это так, то, не зная этого, никогда не вскрыть crc.

Я иду сейчас другим путём. Ещё один доп провод в нужное место на плате, и будем имитировать управление с IR пульта. Нужные посылки уже расшифрованы, допишу программную часть и сделаю продолжение детектива.

Sign up to leave a comment.

Articles