Упаковка данных в Python со структурой из примера C - PullRequest
1 голос
/ 30 января 2020

Я использую пример C и документацию производителя для извлечения данных из модуля сбора данных. Я успешно реализовал несколько функций (например, запрос версии прошивки, получение / установка системного режима и т. Д. c), но я застрял с одной конкретной функцией. Я думаю, что проблема заключается в том, как я упаковываю свои данные, которые отправляются в модуль. Ниже моя последняя попытка.

def SetSubObject(soc):
    tx = struct.pack('hh32sIIHhfBBH', 30, 127, 'test_name', 7, 0xffffffff, 0 , 0x00, 1.0, 0x03, 0x00, 0)
    soc.send(tx)

Это не работает. Модуль перестает отвечать на запросы до тех пор, пока сокет не будет закрыт и соединение не будет восстановлено.

Ниже приведен пример C, предоставленный производителем.

****** header file ******
#define MSG_SET_SUBOBJECT 30
#define MSG_GET_SUBOBJECT 31

typedef struct
{
    short msgId;
    short id;
    char name[32];
    unsigned int jobType;
    unsigned int variant;
    unsigned short kind;
    short objectId;
    float quantifier;
    char sensor_mask;
    char event_mask;
    unsigned short _1;
}msgSubobject_t;
****************

***** Practical example *********
msgSetSubobject_t msgSetSubobject;
msgSetSubobject.msgId = MSG_SET_SUBOBJECT;
msgSetSubobject.id = 127;
strcpy_s(&(msgSetSubobject.name), "test_name");
msgSetSubobject.jobType = 7;         
msgSetSubobject.variant = 0xffffffff;         // subobject active on every variant of the VSE
msgSetSubobject.kind = 0;
msgSetSubobject.objectId = 0;
msgSetSubobject.quantifier = 1.0;
msgSetSubobject.sensor_mask = 0x03;           // sensor1|sensor2|~sensor3|~sensor4
msgSetSubobject.event_mask = 0x00;            // ~IN1|~IN2
msgSetSubobject._1 = 0;                                              // reserved
************

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

Документация производителя

Я пытался упаковать данные несколькими способами, а также отправка немного других данных (например, числа в шестнадцатеричном или десятичном формате, двоичные и т. д. c). Я использовал таблицу символов символов для справки, найденной в https://docs.python.org/2/library/struct.html.

Есть ли очевидная ошибка в моем коде Python? Одна вещь, которую я заметил в документации производителя (в таблице MsgSubobject), похоже, что они утверждают, что object_id должен быть s16 и 6 байтов длиной. Количество байтов увеличивается с 42 до 48, с object_id до квантификатор . Это смутило меня еще и потому, что в примере C этот параметр объявлен как короткий.

-------------------- EDIT ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ----------------------

Как указано ниже в комментариях, я попытался использовать tcpdump, чтобы увидеть, что фактически отправлен на устройство, с которым я пытаюсь связаться. После некоторого поиска в Google я попытался:

sudo tcpdump host 192.168.0.1 and port 3321 -vvv -X -qns 0

Запуск моего кода (открыть сокет, отправить пакет, закрыть сокет) это то, что я получаю из команды tcpdump выше (192.168.0.1 порт 3321) это модуль):

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:13:56.847427 IP (tos 0x0, ttl 64, id 62124, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.3.36648 > 192.168.0.1.3321: tcp 0
    0x0000:  4500 003c f2ac 4000 4006 c6ba c0a8 0003  E..<..@.@.......
    0x0010:  c0a8 0001 8f28 0cf9 0383 467b 0000 0000  .....(....F{....
    0x0020:  a002 7210 8183 0000 0204 05b4 0402 080a  ..r.............
    0x0030:  112a c966 0000 0000 0103 0307            .*.f........
15:13:56.847659 IP (tos 0x0, ttl 255, id 58375, offset 0, flags [none], proto TCP (6), length 44)
    192.168.0.1.3321 > 192.168.0.3.36648: tcp 0
    0x0000:  4500 002c e407 0000 ff06 566f c0a8 0001  E..,......Vo....
    0x0010:  c0a8 0003 0cf9 8f28 00c7 91b1 0383 467c  .......(......F|
    0x0020:  6012 0110 a1bc 0000 0204 0110 0000       `.............
15:13:56.847759 IP (tos 0x0, ttl 64, id 62125, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.0.3.36648 > 192.168.0.1.3321: tcp 0
    0x0000:  4500 0028 f2ad 4000 4006 c6cd c0a8 0003  E..(..@.@.......
    0x0010:  c0a8 0001 8f28 0cf9 0383 467c 00c7 91b2  .....(....F|....
    0x0020:  5010 7210 816f 0000                      P.r..o..
15:13:56.848424 IP (tos 0x0, ttl 64, id 62126, offset 0, flags [DF], proto TCP (6), length 96)
    192.168.0.3.36648 > 192.168.0.1.3321: tcp 56
    0x0000:  4500 0060 f2ae 4000 4006 c694 c0a8 0003  E..`..@.@.......
    0x0010:  c0a8 0001 8f28 0cf9 0383 467c 00c7 91b2  .....(....F|....
    0x0020:  5018 7210 81a7 0000 1e00 7f00 7465 7374  P.r.........test
    0x0030:  5f6e 616d 6500 0000 0000 0000 0000 0000  _name...........
    0x0040:  0000 0000 0000 0000 0000 0000 0700 0000  ................
    0x0050:  ffff ffff 0000 0000 0000 803f 0300 0000  ...........?....
15:13:56.848641 IP (tos 0x0, ttl 64, id 62127, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.0.3.36648 > 192.168.0.1.3321: tcp 0
    0x0000:  4500 0028 f2af 4000 4006 c6cb c0a8 0003  E..(..@.@.......
    0x0010:  c0a8 0001 8f28 0cf9 0383 46b4 00c7 91b2  .....(....F.....
    0x0020:  5011 7210 816f 0000                      P.r..o..
15:13:56.848788 IP (tos 0x0, ttl 255, id 58631, offset 0, flags [none], proto TCP (6), length 40)
    192.168.0.1.3321 > 192.168.0.3.36648: tcp 0
    0x0000:  4500 0028 e507 0000 ff06 5573 c0a8 0001  E..(......Us....
    0x0010:  c0a8 0003 0cf9 8f28 00c7 91b2 0383 46b5  .......(......F.
    0x0020:  5011 0110 b49b 0000 0000 0000 0000       P.............
15:13:56.848857 IP (tos 0x0, ttl 64, id 62128, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.0.3.36648 > 192.168.0.1.3321: tcp 0
    0x0000:  4500 0028 f2b0 4000 4006 c6ca c0a8 0003  E..(..@.@.......
    0x0010:  c0a8 0001 8f28 0cf9 0383 46b5 00c7 91b3  .....(....F.....
    0x0020:  5010 7210 816f 0000                      P.r..o..
^C
7 packets captured
7 packets received by filter
0 packets dropped by kernel
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...