2

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

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

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

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

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

显然,纯数据端的 [netclient] 只能收到 ; 分隔的消息。所以上面提出的问题的解决方案: 我的问题是,有没有办法向纯数据发送字符串消息以外的东西,比如字节流或序列化数字流?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] 进行了一些操作,但我无法用它提取数据?

4

2 回答 2

1

这是您必须做的事情的概要:

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

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

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

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

    如果您信任 [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 一样,这应该是SLIPliblo应该已经处理好了。检查 [unpackOSC] 附带的补丁以了解如何在 Pd 中执行此操作。

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

于 2013-03-21T18:33:31.117 回答