如何在 python 中解压 stxetx 数据
how to unpack stxetx data in python
我正在接收从 RS485 电平串行总线发送到 ESeye 的数据包
Hammerkop 发射器,然后 URL 对数据进行编码并将其发送到我的服务器。请求如下所示:
at=info method=GET path="/write/?type=stxetx&packet=ArcYX%01%00%00%00%00%00%00%03%00%F0%00%06%00%F0%008%0E%B0%27%00%00%E85&localpackettime=2016-12-20+16%3A00%3A27&serial=868324023356343&packettime=2016-12-20+16%3A00%3A27&receivetime=2016-12-20+16%3A00%3A28&timezone=UTC" host=dry-hollows-46605.herokuapp.com request_id=4d5bec23-0676-4e32-ae66-af26e26f0394 fwd="81.94.198.91" dyno=web.1 connect=1ms service=232ms status=500 bytes=63266
我使用 Django 1.9 作为我的框架并获取我使用的数据包数据:
packet_data = request.GET.getlist('packet')
我收到的数据如下:
packet_data = [u"A\x90cYX\x01\x00\x00\x00\x00\x00\x00\x03\x00\xf0\x00\x06\x00\xf0\x008\x0e\xb0'\x00\x00\xe85"]
然后我必须把它分成字节,第一个字母是一个简单的ascii字母,可以忽略,其余的都是字节。我试图将这个 unicode 字符串拆分成我需要的值,例如 'A' 之后的前 4 个字节是一个字节 int 时间戳。
我试过对这些值进行编码,例如:
a = packet_data[1].encode('utf-8')
b = packet_data[2].encode('utf-8')
c = packet_data[3].encode('utf-8')
d = packet_data[4].encode('utf-8')
将它们转换为 str 而不是 unicode
然后我打开它们:
timestamp = unpack('i',a+b+c+d)
但这只在某些时候有效,有时我会收到错误消息:
error: unpack requires a string argument of length 4
我收到这些时间戳值的错误,例如:
before encoding u'\x90', u'c', u'Y', u'X'
after encoding '\xc2\x90', 'c', 'Y', 'X'
建议会很有帮助,我已经研究了好几天了。
我唯一的想法是我 packing/unpacking 数据不正确,也许我遗漏了正确的填充,但我尝试了不同的 [填充类型,但它们似乎也无济于事.接下来有人会尝试什么?
Django 毫无帮助地将 GET 参数解码为文本而不是二进制数据。您将需要自己解析 request.META['QUERY_STRING']
的内容。
>>> import urlparse
>>> urlparse.parse_qs('...&packet=ArcYX%01%00%00%00%00%00%00%03%00%F0%00%06%00%F0%008%0E%B0%27%00%00%E85&...')['packet'][0]
"ArcYX\x01\x00\x00\x00\x00\x00\x00\x03\x00\xf0\x00\x06\x00\xf0\x008\x0e\xb0'\x00\x00\xe85"
我正在接收从 RS485 电平串行总线发送到 ESeye 的数据包
Hammerkop 发射器,然后 URL 对数据进行编码并将其发送到我的服务器。请求如下所示:
at=info method=GET path="/write/?type=stxetx&packet=ArcYX%01%00%00%00%00%00%00%03%00%F0%00%06%00%F0%008%0E%B0%27%00%00%E85&localpackettime=2016-12-20+16%3A00%3A27&serial=868324023356343&packettime=2016-12-20+16%3A00%3A27&receivetime=2016-12-20+16%3A00%3A28&timezone=UTC" host=dry-hollows-46605.herokuapp.com request_id=4d5bec23-0676-4e32-ae66-af26e26f0394 fwd="81.94.198.91" dyno=web.1 connect=1ms service=232ms status=500 bytes=63266
我使用 Django 1.9 作为我的框架并获取我使用的数据包数据:
packet_data = request.GET.getlist('packet')
我收到的数据如下:
packet_data = [u"A\x90cYX\x01\x00\x00\x00\x00\x00\x00\x03\x00\xf0\x00\x06\x00\xf0\x008\x0e\xb0'\x00\x00\xe85"]
然后我必须把它分成字节,第一个字母是一个简单的ascii字母,可以忽略,其余的都是字节。我试图将这个 unicode 字符串拆分成我需要的值,例如 'A' 之后的前 4 个字节是一个字节 int 时间戳。
我试过对这些值进行编码,例如:
a = packet_data[1].encode('utf-8')
b = packet_data[2].encode('utf-8')
c = packet_data[3].encode('utf-8')
d = packet_data[4].encode('utf-8')
将它们转换为 str 而不是 unicode 然后我打开它们:
timestamp = unpack('i',a+b+c+d)
但这只在某些时候有效,有时我会收到错误消息:
error: unpack requires a string argument of length 4
我收到这些时间戳值的错误,例如:
before encoding u'\x90', u'c', u'Y', u'X'
after encoding '\xc2\x90', 'c', 'Y', 'X'
建议会很有帮助,我已经研究了好几天了。
我唯一的想法是我 packing/unpacking 数据不正确,也许我遗漏了正确的填充,但我尝试了不同的 [填充类型,但它们似乎也无济于事.接下来有人会尝试什么?
Django 毫无帮助地将 GET 参数解码为文本而不是二进制数据。您将需要自己解析 request.META['QUERY_STRING']
的内容。
>>> import urlparse
>>> urlparse.parse_qs('...&packet=ArcYX%01%00%00%00%00%00%00%03%00%F0%00%06%00%F0%008%0E%B0%27%00%00%E85&...')['packet'][0]
"ArcYX\x01\x00\x00\x00\x00\x00\x00\x03\x00\xf0\x00\x06\x00\xf0\x008\x0e\xb0'\x00\x00\xe85"