Обратный инженер ИБП последовательный протокол: контрольная сумма / CRC? - PullRequest
2 голосов
/ 02 ноября 2019

Я получил устройство ИБП APC SMC1000, которое я хочу использовать для питания приложения на основе микроконтроллера и выполнения некоторых задач перед выключением. ИБП имеет как последовательный, так и USB-порт, но протокол последовательного порта, похоже, не документирован. Поскольку USB-хоста нет на канале uC, я хочу общаться с ним через последовательный порт.

После некоторого возни с использованием скрипта Python ИБП начинает говорить, и я могу определить некоторую информацию. Тем не менее, в конечном итоге, кажется, что ожидается сообщение, прежде чем продолжить, поэтому я хочу выяснить, как это сделать.

ИБП всегда отправляет 19-байтовые сообщения, где первый байт является идентификатором, затем 16-байтовыеданных, а затем предположительно 2 байта некоторой неизвестной контрольной суммы или контрольной суммы.

[ Msg ID | 16 byte data | 2 byte checksum? ]

Как получить тип контрольной суммы CRC или контрольной суммы? Я уже попробовал несколько схем и в конце концов использовал месть без удачи для следующих сообщений с идентификатором 7f:

0x7f 0000000019c90013004e000001790000 3190
0x7f 0000000019ca0013004e000001790000 259b
0x7f 0000000019cb0013004e000001790000 19a6
0x7f 0000000019cc0013004e000001790000 0db1
0x7f 0000000019cd0013004e000001790000 01bc
0x7f 0000000019ce0013004e000001790000 f4c7
0x7f 0000000019cf0013004e000001790000 e8d2
0x7f 0000000019d00013004e000001790000 dcdd
0x7f 0000000019d10013004e000001790000 d0e8
0x7f 0000000019d20013004e000001790000 c4f3
0x7f 0000000019d30013004e000001790000 b8fe
0x7f 0000000019d40013004e000001790000 ac0e
0x7f 0000000019d50013004e000001790000 a015
0x7f 000000001c67001500530000017c0000 5eb8

Буду признателен за любые полезные мысли!

1 Ответ

1 голос
/ 04 ноября 2019

Я потратил слишком много времени на это. Но, эй, как только вы спуститесь в кроличью нору ...

Благодаря @rcgldr я больше не искал чеки CRC и решил вместо этого искать различные простые контрольные суммы. В итоге я получил скрипт Python, который запускает различные контрольные суммы на приведенных выше примерах и сравнивает его с последними 2 байтами. Он не был успешным, пока я не добавил первый байт в контрольную сумму, дав мне 8-битную контрольную сумму Флетчера. Для этого я использовал код из https://github.com/njaladan/hashpy.

7f0000000019c90013004e000001790000 0x3190 PASS
7f0000000019cb0013004e000001790000 0x19a6 PASS
7f0000000019cc0013004e000001790000 0xdb1 PASS
7f0000000019cd0013004e000001790000 0x1bc PASS
7f0000000019ce0013004e000001790000 0xf4c7 PASS
7f0000000019cf0013004e000001790000 0xe8d2 PASS
7f0000000019d00013004e000001790000 0xdcdd PASS
7f0000000019d10013004e000001790000 0xd0e8 PASS
7f0000000019d20013004e000001790000 0xc4f3 PASS
7f0000000019d30013004e000001790000 0xb8fe PASS
7f0000000019d40013004e000001790000 0xac0a FAIL
7f0000000019d50013004e000001790000 0xa015 PASS
7f000000001c67001500530000017c0000 0x5eb8 PASS

Это также показывает, что в одном из образцов была неверная контрольная сумма. К сожалению, у меня сложилось впечатление, что сообщение 7f является некой строкой вызова для хоста. Возможно, я тоже смогу решить эту загадку :)

Идентификаторы протокола

До сих пор я также идентифицировал несколько идентификаторов сообщений, просто просматривая данные и ища значения, о которых сообщил PowerChute APC.

  • 0x00: Заголовок с информацией о протоколе (16 байтов)
    • байт 0: неизвестно (всегда 0A на блоках, которые я проверял, может быть, версия протокола?)
    • байт1: размер сообщения
    • байт 2: доступные идентификаторы
  • 0x40: серийный номер (14 байтов)
  • 0x41: имя устройства
  • 0x43: Тип устройства
  • 0x45: Версия прошивки 1
  • 0x46: Версия прошивки 2
  • 0x48: Код замены батареи
  • 0x49: Производитель
  • 0x7e: Часть вызова (с)
  • 0x7f: Часть вызова (с)

Возможно, я буду обновлять этот список по мере продвижения

Обновление9/11/2019

Я сейчас документирую свой прогресс по https://sites.google.com/site/klaasdc/apc-smartups-decode

...