简介
我正在研究机器人采样应用程序。每个机器人都有一个带电源,TCP / IP和气体传感器管道的有线接口。机器人在ARM平台上,我打算用Python完成大部分编程。机器人移动缓慢,没有任何计算密集的运行。
每个机器人都应该执行这些“服务”:
每个机器人都会报告这些传感器读数或事件:
客户端 - 服务器架构
我将每个机器人视为客户端,将传感器中心计算机视为服务器。 服务器将具有已知的IP和侦听端口,并允许机器人连接。 服务器将执行测量调度,并命令机器人从扇区移动到扇区。
服务器可以使用包含以下内容的状态向量来维护和更新每个机器人的模型。
[ position, switches, sensor-readings, status]
问题
通过调试串行通信,我体验到了具有严格的轮询响应结构的人类可读通信接口的好处。但我不确定应该如何设计这个界面。
我为广泛而模糊的问题表达道歉,这可能更像是一个哲学问题,而不是一个软件问题。但是,我将非常感谢您的想法,经验和建议。
TLDR
为客户端 - 服务器架构设计TCP通信协议的指导原则是什么?
答案 0 :(得分:2)
总体ID建议使用python Twisted来构建服务器和客户端(机器人端)应用程序(https://twistedmatrix.com/trac/)。无论如何回答你的问题:
“为这类设备设计通信接口是否有最佳实践?”
请参阅下面的其他问题的答案。
“我应该考虑数据包丢失和损坏,还是TCP完全处理?”
TCP保证您获得的数据的完整性。需要担心的主要问题是客户端/服务器是否已连接。您可以使用ReconnectingClientProtocol在重新启动服务器时使连接更加健壮(请参阅Twisted规范)。另请注意,TCP是一种流媒体协议(您可能无法立即获得整个消息),因此请确保在采取行动之前获得了整个消息。如果您要快速发送消息,那么您的TCP缓冲区中也可能有多条消息用于该客户端。
“我应该将所有内容设计为服务器轮询的服务,还是应该让机器人广播它的传感器读数和事件?”
避免投票。当机器人启动时,它们应该与服务器建立持久的TCP连接。应该异步发送和接收(处理)消息。
“我应该实现命令的确认,例如转到下一节”
不会受伤。适用于您的应用程序中的流量控制以及从重新启动服务器或机器人的情况中恢复,并且您无法确定是否处理了消息。
“为客户端 - 服务器架构设计TCP通信协议的指导原则是什么?”
为您的应用程序做的事情可能是设计一个简单的命令响应协议。首先设计简单的消息集,从客户端到服务器,另一个从服务器到客户端。您可以使用简单的人类可读XML消息集,如下所示:
服务器到客户端
<SCMessage type="TurnRight"></SCMessage> <SCMessage type="TurnLeft"></SCMessage> <SCMessage type="NextSector"><param key="sectorName" value="B"/></SCMessage> <SCMessage type="GetStatus"></SCMessage> <SCMessage type="Ack"></SCMessage>
客户端到服务器
<SCMessage type="SensorUpdate"><param key="data" value="123"/></SCMessage> <SCMessage type="StatusChanged"><param key="status" value="Good"/></SCMessage> .... <SCMessage type="Ack"></SCMessage>
因此,在解析这些消息时,您可以通过查找SCMessage启动停止标记将它们分开。收到消息后,您可以使用XML解析器来解析消息内容。或者你可以使用JSON,这实际上可能会更容易(基本上你会来回发送小字典)。
你有很多阅读待办事项;)我从阅读python开始扭曲了一点,制作小玩具程序以使事情变得舒适。