2

UnixサーバーからPureDataへのTCP/IP通信に興味があります。Unixサーバー側でソケットを使用し、PureData側でnetclientを使用することを実現しました。このためにチャットサーバーのチュートリアルを利用しました(3.ネットワーキング> 10.chat_client.pd)。

ここで問題となるのは、サーバーが「;」で区切られた「文字列」メッセージとしてデータをストリーミングしていることです。

私の質問は、バイトストリームやシリアル化された番号ストリームなど、文字列メッセージ以外のものをPure Dataに送信する方法はありますか?Pure Dataはそのようなメッセージを受信できますか?

文字列の転送にはバイト数が多すぎるため、たとえば数値「1024;」はすでに5バイトですが、そのような整数は4バイトです。

更新:答えを探してこの投稿に出くわしたすべての人のために。

どうやら、PureData側の[netclient]は;以外のものを受け取ることはできません。区切られたメッセージ。したがって、上記で提起された問題の解決策: 私の質問は、バイトストリームやシリアル化された番号ストリームなど、文字列メッセージ以外のものをPureDataに送信する方法はありますか?Pure Dataはそのようなメッセージを受信できますか?

解決策は[tcpclient]を使用することで、バイトストリームデータを受信できます。

さて、私の質問は、4つのコンパクトな数値をどのように使用できるかということです。 これで、少なくとも正しい順序で一連のバイトができました。

UNIXサーバーから構造を送信しています

typedef struct {
    int     var_code;
    int    sample_time;
    int     hr;
    float    hs;
} phy_data;

サンプルデータは21000000512000.56である可能性があります

Pure Dataで受信して印刷すると、次のような出力が得られます。

:0 0 0 2 0 10114 26 0 0 0 51 0 16242 78

2番と51番がはっきりとわかりますが、他も正しいと思います。

これらの数値を使用可能な形式に戻すにはどうすればよいですか? [bytes2any]と[route]を使った操作かもしれませんが、それを使ってデータを抽出できませんでしたか?

4

2 に答える 2

1

これがあなたがしなければならないことの概要です:

  • バイトリストを、さまざまなタイプに適したサイズの小さなメッセージに再パッケージ化します。

    すべての要素は4バイト長であるため、リストを再パッケージ化するだけです(または、TCP / IPは16バイトを単一のリストとして配信することを保証しないため、バイトストリームですが、任意の長さのリストに分割することもできます)。 4つの原子リストの数に。

    最も安定した方法は、おそらく最初にリストをシリアル化し([list]ヘルプの「シリアライザー」の例を確認してください)、そのリストを4つの要素に再アセンブルすることです。

    zexyのような外観を使用できる場合は、[repack4]を使用できます。

    [netclient]がメッセージを完全なリストとして出力することを信頼している場合は、大きな[unpack....]と4つの[pack]を使用するだけです。

  • 各サブリストの生データを解釈する

    整数はかなり単純で、浮動小数点数ははるかに複雑です

整数:

    |
    [unpack 0 0 0 0]
    |      |   |   |
    [<< 8] |   |   |
    |      |   |   |
    [+     ]   |   |
    |          |   |
    [<< 8]     |   |
    |          |   |
    [+         ]   |
    |              |
    [<< 8]         |
    |              |
    [+             ]
    |

フロートはユーザーの練習問題として残されています:-)

于 2013-03-21T16:12:24.073 に答える
0

問題の本当の解決策は、独自のプロトコルを作成するのではなく、明確に定義されたアプリケーション層プロトコルを使用することです。

Pdのようなアプリケーションで使用されている最も普及しているプロトコルは、確かにOSCです。

生のOSCバイトをPdメッセージにデコードするには、[unpackOSC](「mrpeach」ライブラリの一部。Debianではpd-oscパッケージを介してインストールします)を使用します。

「サーバー」側では、libloを使用してデータをエンコードして送信できます。

ノート

OSCはパケットベースであるため、TCP/IPなどのストリームベースのプロトコルにはパケット化メカニズムが必要になることに注意してください。OSC-1.2と同様に、これはSLIPである必要があります。libloすでにこれを処理する必要があります。Pd内でこれを行う方法については、[unpackOSC]に付属するパッチを確認してください。

UDPをトランスポートとして使用している場合、これはすべて必要ありません。

于 2013-03-21T18:33:31.117 に答える