это похоже на типичный протокол датчиков через UART- по асинхронному последовательному каналу)А нет никакой ссылки. Протокола в открытом доступе нет. И у меня его нет. Wireshark немного помог ...
Можете посмотреть, что я накалякал - https://slacky1965.github.io/electricity_meter_ble/
Вот тут еще обсуждение - https://www.radiokot.ru/forum/viewtopic.php?f=25&t=171991&sid=039243297acb0ce1b677287ae40e41c2
Но нужно учитывать, что ответ может быть разной длины. У меня два обсолютно одинаковых счетчиков присылали ответы с разницей в один байт. Оригинальная программа оба счетчика читала корректно.
В приходящем ответе мы точно знаем несколько вещей.Код:735520008d4effff0500000000ae55 - запрос 15 73551a00ffffxxxx0530067500 |3af51400|a2203001|0000|44050600|91240600|65cb0800|00000000|bc55 - ответ 41 73551a00ffff8d4e053006731100|bad62300|a2203001|0000|ea260b00|598d0a00|77220e00|00000000|6d55 - ответ 42 head | sum | ? | ? | tariff1| tariff2| tariff3| tariff4|
1 байт всегда 73
2 байт всегда 55
3 байт содержит длину полезной нагрузки.
4 байт всегда 00
5-6 байты тип соединения (для оптопорта это всегда FFFF)
7-8 адрес устройства
9 команда
предпоследний байт - crc
последний байт всегда 55
Считываем сразу весь буфер. Проверяем. Зная размер считанного, размер неменяющегося (первые 9 байт) и размер полезной нагрузки (3-й байт) просто вырезаем всю меняющуюся середину. И получаем всегда вот такой пакет
КомандыКод:73551a00ffff8d4e05|bad62300|a2203001|0000|ea260b00|598d0a00|77220e00|00000000|6d55
C:typedef enum _cmd_t { cmd_open_channel = 0x01, cmd_current_data = 0x05, cmd_volts_data = 0x29, cmd_amps_data = 0x2c, cmd_power_data = 0x2d, } cmd_t;
-----------------------
Может лучше ничего не преобразовывать, а сделать прозрачный мост счетчик-компьютер или смартфон.
Все преобразования делать на пк или смартфоне.
тогда устройство передачи будет универсальным простым и тупым. - сделал раз и забыл.