我建立了一个传感器单元,在一个Raspberry Pi上收集数据并通过网络发送给另一个。 我的第一个Pi创建了一条具有来自不同传感器的多个读数的线。它应该创建一个服务器并将其发送给客户端。客户Pis需要接收句子,进行进一步处理或可视化。
为了测试我的解决方案,我想从txt文件中读取数据,该文件是在实验中构建的。问题是有时数据已损坏,具有不同的格式,具体取决于传感器,不同的设置行可能不同。
我已经构建了一个函数,假设将输入行更改为字节。 (我尝试了不同的方法,但只有这个笨重的函数最接近任何结果)。但它不通过网络进行转换
import struct
message = ['First sensor', 'second data', 'third',1, '19.04.2016', 0.1]
def packerForNet(message):
pattern = ''
newMessage = []
for cell in message:
if isinstance( cell, int ):
pattern += ('I')
newMessage.append(cell)
elif isinstance( cell, float ):
pattern += ('d')
newMessage.append(cell)
elif isinstance(cell, str):
pattern += (str(len(cell)))
pattern += ('s')
newMessage.append(cell.encode('UTF-8'))
else:
cell = str(cell)
pattern += (len(cell))
pattern += ('s')
newMessage.append(cell.encode('UTF-8'))
return (newMessage, pattern)
newMessage, pattern = packerForNet(message)
patternStruct = struct.Struct(pattern)
packedM = patternStruct.pack(*newMessage)
函数的输出无法正确解压缩:
packedM = b'First sensorsecond datathird\x01\x00\x00\x0019.04.2016\x00\x00\x00\x00\x00\x00\x9a\x99\x99\x99\x99\x99\xb9?'
56
print('unpacked = %s' % patternStruct.unpack(packedM))
TypeError: not all arguments converted during string formatting
另外我需要知道pattern
在客户端解压缩它,所以一般来说它没有意义。
在最终版本中,服务器需要以客户端连接后的方式工作,它将每毫秒从传感器发送到客户端线路。传感器解析在C中实现,目前它创建了一个用于离线处理的txt文件。我无法改变传感器线的制作方式。
我不知道如何打包不同类型的列表,并不断向客户端发送此类列表。
答案 0 :(得分:1)
实际上它解包正确。问题不在于拆包,而在于打印。
尝试:
unpackedM = patternStruct.unpack(packedM)
print(unpackedM)
unpackedM是一个包含多个值的元组。带有元组的字符串格式化失败。
编辑: 要转换整个对象,可以使用python msgpack。这就是我们在python和php到python的通信python中使用的。