Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C示例中的struct在Python中打包数据_Python_C_Struct - Fatal编程技术网

使用C示例中的struct在Python中打包数据

使用C示例中的struct在Python中打包数据,python,c,struct,Python,C,Struct,我使用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示例和制造商文档从数据采集模块检索数据。我已经成功地实现了多个功能(例如,请求固件版本、获取/设置系统模式等),但我只能使用一个特定的功能。我认为问题在于如何打包发送到模块的数据。下面是我的最新尝试

def SetSubObject(soc):
    tx = struct.pack('hh32sIIHhfBBH', 30, 127, 'test_name', 7, 0xffffffff, 0 , 0x00, 1.0, 0x03, 0x00, 0)
    soc.send(tx)
这是行不通的。在关闭插座并重新建立连接之前,模块将失去响应

下面是制造商提供的C示例i

****** 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
************
我已经将文档中与我正在研究的内容相关的部分放在一起,请参见下面的链接

我尝试过以多种方式打包数据,并发送稍有不同的数据(例如十六进制格式的数字或十进制、二进制等)。我使用了在中找到的格式字符表作为参考

我的Python代码中有没有明显的错误?我在制造商文档(MsgSubobject表中)中注意到一件事,他们似乎指出对象id应该是
s16
,并且长度6字节。字节计数从42到48,从object_id到quantifier。这让我很困惑,因为在C示例中,这个参数被声明为short

--------------------编辑添加的更多信息----------------------

正如下面的评论中所建议的,我已经尝试使用tcpdump查看实际发送到我试图与之通信的设备的内容。在谷歌搜索之后,我试着:

sudo tcpdump主机192.168.0.1和端口3321-vvv-X-qns 0

运行我的代码(打开套接字、发送数据包、关闭套接字)这是我从上面的tcpdump命令中得到的(192.168.0.1端口3321是模块):

tcpdump:侦听eth0,链路类型EN10MB(以太网),捕获大小262144字节
15:13:56.847427 IP(tos 0x0,ttl 64,id 62124,偏移量0,标志[DF],协议TCP(6),长度60)
192.168.0.3.36648>192.168.0.1.3321:tcp 0
0x0000:4500003C f2ac 4000 4006 c6ba c0a8 0003 E。。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|
0x0020:60120110 a1bc 0000 0204 0110 0000`。。。。。。。。。。。。。
15:13:56.847759 IP(tos 0x0,ttl 64,id 62125,偏移量0,标志[DF],协议TCP(6),长度40)
192.168.0.3.36648>192.168.0.1.3321:tcp 0
0x0000:45000028 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,偏移量0,标志[DF],协议TCP(6),长度96)
192.168.0.3.36648>192.168.0.1.3321:tcp 56
0x0000:45000060 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.试验
0x0030:5f6e 616d 6500 0000_名称。。。。。。。。。。。
0x0040:0000 0700 0000。。。。。。。。。。。。。。。。
0x0050:ffff ffff 0000 0000 80300 0000。。。。。。。。。。。?。。。。
15:13:56.848641 IP(tos 0x0,ttl 64,id 62127,偏移量0,标志[DF],协议TCP(6),长度40)
192.168.0.3.36648>192.168.0.1.3321:tcp 0
0x0000:45000028 f2af 4000 4006 c6cb c0a8 0003 E。。。。。。。
0x0010:c0a8 0001 8f28 0cf9 0383 46b4 00c7 91b2…..(...F。。。。。
0x0020:50117210816F 0000 P.r.o。。
15:13:56.848788 IP(tos 0x0,ttl 255,id 58631,偏移量0,标志[none],协议TCP(6),长度40)
192.168.0.1.3321>192.168.0.3.36648:tcp 0
0x0000:45000028 e507 0000 ff06 5573 c0a8 0001东…(…美国…)。。。。
0x0010:c0a8 0003 0cf9 8f28 00c7 91b2 0383 46b5。
0x0020:5011010 b49b 0000 P。。。。。。。。。。。。。
15:13:56.848857 IP(tos 0x0,ttl 64,id 62128,偏移量0,标志[DF],协议TCP(6),长度40)
192.168.0.3.36648>192.168.0.1.3321:tcp 0
0x0000:45000028 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包
过滤器接收到7个数据包
内核丢弃了0个数据包

格式的最后3个“h”为2个字节,而char和unsigned short仅为1个字节,因此发送到多个字节。格式的最后三个字符应为“bbB”您是指bbH(或ccH),C结构的最后一个字段是无符号的短字符串,不是字节。@Heteperfan,@Masklin。我已经尝试过BBH、BBH、ccH,最后一次尝试hhH。ccH因“struct.error:char需要长度为1的字符串”而失败,因此我尝试以
chr(0x03)的形式传递数据
但仍然不工作。所有这些都会导致模块挂起,没有回复,甚至没有错误消息。对object\u id参数有什么想法吗?是不是在object\u id之后应该有4字节的填充(可能是为了让浮点在8字节边界上对齐)?无论如何,如果文档显示了显式的字节偏移量,那么关注它们似乎是个好主意。@TurePålsson,谢谢你的评论。是的,我也考虑过。我尝试添加“xxxx”(4个pad bytes)在onject_id的“h”之前或之后。它不起作用。同样在他们的C示例中,他们只是将其声明为短字符,与文档相反,短字符为2个字节。格式的最后3个“h”为2个字节,而char和unsigned short仅为1个字节,因此发送到多个字节。格式的最后三个字符应为“bbB”Y你的意思是bbH(或ccH),C结构的最后一个字段是一个无符号的短字段,不是一个字节。@Heteperfan,@Masklin。我已经尝试过bbH、bbH、ccH,最后一次尝试hhH。ccH因“struct.error:char需要长度为1的字符串”而失败,所以我尝试以
chr(0x03)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