2012-04-27 3 views
1

В настоящее время я работаю над проектом, где мне нужно общаться с микроарговым сотовым модемом IPn3G. У меня есть модем, настроенный для отправки сообщений на мой компьютер через TCP, и я могу получить сообщение в сокете.Как разобрать двоичные данные из сокета в python?

сообщение выглядит это, хотя:

���������DKReadyCANRogersWirelessInc. Home354626030393530302720391029547 

Теперь я могу признать некоторые из этих областей, как положение или Carrierinfo, а также и IMSI номер IMEI, в конце концов.

Моя проблема в том, как разобрать забавные вещи? Я пробовал структуру, но мне это, похоже, не очень помогло.

В документации модема я только нашел это:

Modem_event структура сообщения:

  • фиксированный заголовок фиксированного размера (20 байт)
  • Modem ID (uint64_t (8 байт))
  • Тип сообщения маска (uint8_t (1 байт))
  • защищены
  • длина пакета (uint16_t (2 байта)) Примечание: длина пакета = длина фиксированного заголовка + длина полезной нагрузки сообщения. Информация

Carrier:

  • Содержание Длина 2 ЧИСЛО (uint16_t)
  • RSSI 1 BYTE (uint8_t)
  • РФ Группа 2 ЧИСЛО (uint16_t)
  • Service Тип STRING (1- 30 байт)
  • Номер канала STRING (1-30 байт)
  • Номер SIM-карты STRING (1-30 байт)
  • Телефон STRING (1-30 байт)

Мне кажется, что сообщение даже не выстраиваются в очередь с тем, что это должно быть. Я был бы очень рад, если бы кто-нибудь посоветовал, как решить эту проблему.

Спасибо

+1

Что такое сообщение «выглядит», например. при печати на консоль не очень полезно. В частности, любые байты NUL ('' \ x00'') вряд ли появятся.Вместо 'print message' do' print repr (message) ' –

+0

Указывает ли документация, сколько времени зарезервировано? Что вы подразумеваете под «или» в «Я могу распознать несколько таких полей, как« Статус »или« Carrierinfo »? Что такое «Статус»? Что должно быть в «фиксированном заголовке»? –

+0

@JohnMachin: новый вывод с представлением (сообщением) - «\ xb7 \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ x04 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00Z \ x00D \ x00 \ xf3 \ x00 \ x00Ready \ x00CANRogersWirelessInc. \ x00Home \ x00354626030393530 \ x00302720391029547 \ x00" . – masterlampe

ответ

0

Python имеет большой struct модуль, который позволяет упаковывать и распаковывать двоичные данные.

Я вижу, что вы уже пытались его использовать. У меня нет документации для вашего устройства (идите и проверьте это!), Но я могу предположить, что строки имеют нулевое завершение (у них их размер не задан раньше).

Получите размер строковой части сообщения (от размера других полей и длины пакета) и прочитайте все строки в одну строку Python с помощью <number>s и разделите их на поиск нулевых символов.

Смежные вопросы