2016-04-19 8 views
0

データが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ファイルが作成されます。私はセンサーのラインの作り方を変えることはできません。

私はさまざまな種類のリストをパックする方法を知らず、常にそのようなリストをクライアントに送信します。

答えて

1

実際に正しく解凍されます。問題は開梱時ではなく、印刷物に伴う問題です。

試してみてください。

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

unpackedMが複数の値のタプルです。タプルによる文字列の書式設定に失敗しました。

編集: オブジェクト全体を変換するには、python msgpackを使用できます。それは私たちがPythonとPythonに通信するPythonに使用しているものです。

+0

このようなデータをパックする他の方法は知っていますか?その時点ではクライアント側は展開前にパターンを知る必要があるため、データの前に送信する必要があります。それは完全に非効率的です。 – tomasz74

+0

pythonをpythonに、またphpをpythonに伝えるには、[msgpack](https://pypi.python.org/pypi/msgpack-python)を使います。オブジェクト全体をシリアライズすることができます。 JSONも別の可能性があります。 – TehSphinX

+0

あなたは正式な答えにmsgpackに関する単語を追加してください。それを解決策として受け入れることができます。 (私はそれが素晴らしい作品をテストした) – tomasz74

関連する問題