データが1つのRaspberry Piで収集され、ネットワーク経由で別のものに送信されるセンサーユニットを構築します。 私の最初のPiは、異なるセンサーからの複数の読み取り値を持つ線を作成します。サーバーを作成してクライアントに送信することになっていました。クライアントPisは、文を受け取るか、さらなる処理または視覚化を行う必要があります。Python 3のソケット上で破損したcsvラインを送信
私のソリューションをテストするには、実験でビルドされた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)
ネットワーク経由で変換しません:私は、一般的にので、クライアント側でそれを解凍するpattern
を知っておく必要があります。また
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
それは意味がありません。
最終バージョンでは、サーバーはクライアントが接続した後、センサからクライアントの回線にミリ秒ごとに送信されるように動作する必要があります。センサー解析はC言語で実装され、現時点ではオフライン処理用のtxtファイルが作成されます。私はセンサーのラインの作り方を変えることはできません。
私はさまざまな種類のリストをパックする方法を知らず、常にそのようなリストをクライアントに送信します。
このようなデータをパックする他の方法は知っていますか?その時点ではクライアント側は展開前にパターンを知る必要があるため、データの前に送信する必要があります。それは完全に非効率的です。 – tomasz74
pythonをpythonに、またphpをpythonに伝えるには、[msgpack](https://pypi.python.org/pypi/msgpack-python)を使います。オブジェクト全体をシリアライズすることができます。 JSONも別の可能性があります。 – TehSphinX
あなたは正式な答えにmsgpackに関する単語を追加してください。それを解決策として受け入れることができます。 (私はそれが素晴らしい作品をテストした) – tomasz74