我正在写一个非常具体的应用协议,以实现2个节点之间的通信。节点1是嵌入式平台(微控制器),而节点2是普通计算机。
这种协议定义了可变长度的消息。这意味着有时节点1将100字节的消息发送到节点2,而有时节点1发送452字节的消息。
此类协议应独立于消息的传输方式。例如,可以通过USB,蓝牙等发送相同的消息。
我们假设协议消息定义为:
| Length (4 bytes) | ...Payload (variable length)... |
我正在为接收方如何识别传入消息持续多久而苦苦挣扎。到目前为止,我已经考虑了两种方法。
第一种方法
发送方首先发送长度(4个字节,始终为固定大小),然后发送消息。
例如,发件人会执行以下操作:
// assuming that the parameters of send() are: data, length of data
send(msg_length, 4)
send(msg, msg_length - 4)
接收方这样做:
msg_length = receive(4)
msg = receive(msg_length)
这对于某些“物理协议”(例如UART)可能是可以的,但是对于更复杂的协议(例如USB),使用单独的数据包传输长度可能会带来一些开销。原因是仅需要传输4个字节的附加USB数据包(包括控制数据和ACK数据包)。
但是,使用这种方法,接收方非常简单。
第二种方法
另一种选择是,接收方将数据继续接收到缓冲区中,并在某个时刻尝试查找有效消息。有效的意思是:首先找到消息的长度,然后找到其有效负载。
这种方法很可能需要在消息的开头添加一些“开始消息”字节,以便接收者可以使用它们来标识消息的开始位置。