【问题标题】:TCP/IP communication from the unix server to the Pure Data从 unix 服务器到 Pure Data 的 TCP/IP 通信
【发布时间】:2013-03-05 21:08:19
【问题描述】:

我对从 Unix 服务器到 Pure Data 的 TCP/IP 通信感兴趣。我在 Unix 服务器端使用套接字,在纯数据端使用 netclient 实现了它。我为此利用了聊天服务器教程(3.Networking > 10.chat_client.pd)。

现在问题在于服务器将数据作为“;”分隔的“字符串”消息流式传输

我的问题是,有没有办法将字符串消息以外的东西发送到 Pure Data,比如字节流或序列化数字流? Pure Data 可以接收此类消息吗?

由于字符串需要太多字节来传输,例如数字“1024;”已经是5个字节了,而这样一个整数只有4个字节。

更新:对于偶然发现这篇文章以寻找答案的每个人。

显然,纯数据端的 [netclient] 只能收到 ;分隔的消息。 所以上面提出的问题的解决方案: 我的问题是,有没有办法将字符串消息以外的东西发送到 Pure Data,比如字节流或序列化数字流? Pure Data 可以接收此类消息吗?

解决办法是使用[tcpclient],它可以接收字节流数据。

现在我的问题是,如何获得四个紧凑的数字? 现在我有一系列字节,至少顺序正确。

我正在从我的 UNIX 服务器发送一个结构

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

样本数据可能是 2 1000000 51 2000.56

当在 Pure Data 中接收和打印时,我会得到如下输出:

:0 0 0 2 0 10 114 26 0 0 0 51 0 16 242 78

你可以清楚地注意到数字 2 和数字 51,我猜其他的也是正确的。

如何将这些数字恢复为可用格式? 也许对 [bytes2any] 和 [route] 进行了一些操作,但我无法用它提取数据?

【问题讨论】:

  • 整数 1000000 应转换为 0 15 66 64 而不是 0 10 114 26(如果您的字节顺序是大端(网络传输的默认设置),则为 684570)

标签: unix networking client-server puredata


【解决方案1】:

这里是你必须做的事情的大纲:

  • 将字节列表重新打包成适合各种类型的正确大小的小消息。

    由于您的所有元素都是 4 字节长,您只需重新打包您的列表(或字节流,因为 TCP/IP 不保证将您的 16 字节作为单个列表提供,但也可以决定将其分解为一个列表任意长度)到多个 4 个原子列表。

    最稳定的方法可能是第一次序列化列表(查看 [list] 帮助中的“序列化器”示例),然后将该列表重新组合为 4 个元素。

    如果你可以使用像 zexy 这样的外部工具,你可以使用 [repack 4]。

    如果您信任 [netclient] 将您的消息输出为完整列表,您可以简单地使用一个大的 [unpack ....] 和 4 个 [pack]s

  • 解释每个子列表的原始数据

    整数比较简单,浮点数比较复杂

整数:

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

浮动留给用户作为练习:-)

【讨论】:

  • 对于不耐烦的人,我在 pd-list 中发布了一个 bytes2float 补丁
【解决方案2】:

解决您的问题的真正方法是使用定义明确的应用层协议,而不是自己编写。

Pd 等应用程序使用最广泛的协议当然是OSC

为了将原始 OSC 字节解码为 Pd 消息,请使用 [unpackOSC](“mrpeach”库的一部分;在 Debian 上,您可以通过 pd-osc 包安装它)

在“服务器”端,您可以使用liblo 对数据进行编码和发送。

注意

请注意,由于 OSC 是基于数据包的,因此您需要为基于流的协议(如 TCP/IP)提供数据包化机制。与 OSC-1.2 一样,这应该是 SLIPliblo 应该已经解决了这个问题。查看 [unpackOSC] 附带的补丁,了解如何在 Pd 中执行此操作。

如果您使用 UDP 作为传输,则不需要所有这些。

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 2012-06-29
    • 2015-06-06
    • 2016-05-16
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多