在Python 3

时间:2016-04-19 19:22:56

标签: sockets python-3.x struct

我建立了一个传感器单元,在一个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文件。我无法改变传感器线的制作方式。

我不知道如何打包不同类型的列表,并不断向客户端发送此类列表。

1 个答案:

答案 0 :(得分:1)

实际上它解包正确。问题不在于拆包,而在于打印。

尝试:

unpackedM = patternStruct.unpack(packedM)
print(unpackedM)

unpackedM是一个包含多个值的元组。带有元组的字符串格式化失败。

编辑: 要转换整个对象,可以使用python msgpack。这就是我们在python和php到python的通信python中使用的。