- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
简介
我正在开发机器人采样应用程序。每个机器人都有一个带有电源、TCP/IP 和气体传感器管道的电缆接口(interface)。机器人在 ARM 平台上,我打算用 Python 进行大部分编程。机器人移动缓慢,上面没有任何计算密集型的运行。
每个机器人都应该执行这些“服务”:
每个机器人报告这些传感器读数或事件:
客户端-服务器架构
我将每个机器人视为客户端,将传感器中枢计算机视为服务器。服务器将有一个已知的 ip 和监听端口,并允许机器人连接。服务器将进行测量调度,并命令机器人从一个扇区移动到另一个扇区。
服务器可以使用包含以下内容的状态向量维护和更新每个机器人的模型:
[位置、开关、传感器读数、状态]
问题
通过调试串行通信,我体验到了拥有具有严格轮询-响应结构的人类可读通信接口(interface)的好处。然而,我不确定我们应该如何设计这个界面。
对于广泛而模糊的问题表述,我深表歉意,这可能更像是一个哲学问题,而不是软件问题。但是,我将非常感谢您的想法、经验和建议。
TLDR
为客户端-服务器架构设计 TCP 通信协议(protocol)的指导原则是什么?
最佳答案
总体而言,我建议使用 python Twisted 来构建您的服务器和客户端(机器人端)应用程序 (https://twistedmatrix.com/trac/)。无论如何回答你的问题:
“在为这些设备设计通信接口(interface)时是否有任何最佳实践?”
在下面查看您其他问题的答案。
“我应该考虑数据包丢失和损坏,还是这完全由 TCP 处理?”
TCP 保证您获取的数据的完整性。要担心的主要事情是客户端/服务器是否已连接。您可以使用 ReconnectingClientProtocol 使您的连接在服务器重新启动时更加稳健(请参阅 Twisted 规范)。还要注意 TCP 是一种流式传输协议(protocol)(您可能无法一次获得整个消息),因此请确保在执行操作之前获得了整个消息。如果您正在快速发送消息,您的 TCP 缓冲区中可能还会有不止一条消息用于该客户端。
“我应该将所有内容设计为由服务器轮询的服务,还是机器人应该广播它的传感器读数和事件?”
避免轮询。当机器人启动时,它们应该与服务器建立持久的 TCP 连接。消息应该异步发送和接收(处理)。
“我应该执行命令确认,例如转到下一节”
不会受伤。对于您的应用程序内的流量控制以及从服务器或机器人重新启动且您无法确定消息是否已处理的情况中恢复将很有用。
“为客户端-服务器架构设计 TCP 通信协议(protocol)的指导原则是什么?”
可能需要为您的应用设计一个简单的命令响应协议(protocol)。从设计简单的消息集开始,从客户端到服务器,另一个从服务器到客户端。您可以使用简单的人类可读 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 Twisted,然后编写一些小玩具程序来熟悉一些东西。
关于python - 为机器人设计 TCP/IP 命令接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999869/
给定的输入是192.168.3.78/27 输入可以是任意C类ip地址,以上ip为例进行尝试 预期输出应显示从 192.168.3.65 到 192.168.3.94 的所有 IP如下 192.168
您好,我是一名 javascript 菜鸟,正在为 IP 范围编写验证器。例如,1.1.1.1-2.2.2.2 是一个有效范围,但我想确保第一个 IP 不大于第二个 IP。 2.2.2.2-1.1.1
在 MySQL 数据库中存储多种 IP 类型的最佳方式是什么: - 单一 IP (123.123.123.123) - IP 范围 (123.123.123.1 - 123.123.123.121)
所以我有一个带有子网的 IP:8.8.8.0/24 我如何将其转换为 8.8.8.0 和 8.8.8.255(实际上是它们的 ip2long 结果) 在 PHP 和 JavaScript 中 最佳答案
我有 Windows7 作为我的基本操作系统。最重要的是,我在 Ubuntu 上安装了 Virtual Box。我希望 ubuntu 获得与我的基本操作系统(Win7)相同的 IP 地址。我如何实现这
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
阅读后List of IP Space used by Facebook : “真实”列表是最后一个答案,但我想知道 Igy(答案标记为解决方案)如何通过将连续的类添加到更大的类中来大幅缩小列表(通过
我正在开发一个 web 应用程序,我已经在我的本地主机中创建了这个项目,但是网络用户需要访问我的项目,我不想给他们一个不友好的 ip 地址,所以我想用户访问一个名称例子 http://myprojec
有人可以向我解释 Azure 在逻辑应用程序的出站 IP 地址之间不同的新方式之间的区别。 我认为文档在对该问题的正确解释方面非常精简。读起来听起来好像 IP 地址在逻辑应用程序中具有完全相同的作用。
我正在尝试熟悉一个项目中java中的数据报系统,目前,我们只使用UDP包。 为了发送消息,我们在 DatagramPacket 上设置目标 IP。 /* * The fields o
我有一个 Java 服务器,当我获得连接时,我需要检查 IP 是本地 IP 还是公共(public) IP。当它是我自己的本地 IP 时,我可以检测到它,但我在使用其他本地 IP 时遇到了一些问题。J
所以我在网上看到了很多例子,这些例子展示了如果你知道起始 IP 和结束 IP 如何获得完整的 IP,但我需要的是在提供后告诉我完整的 IP 范围带有起始 IP 和所需 IP 地址数的代码。 因此,例如
我创建了一个 python 项目,用于扫描 IP 范围(即 x.y.z.0/24)并返回在线主机列表。它将在线主机列表保存到仅包含 IP 的文件中(即 ['192.168.0.1'、'192.168.
如果用户的 ip 在某个 IP 范围之间,我正在使用重定向。但是,我正在使用多个 ip 范围,所以我想知道执行此操作的最佳方法。我目前正在使用它来重定向, 但是如果 IP 范围是 72.122.166
好的,现在是星期五下午,我度过了漫长的一周,希望能得到一些帮助!目前,我有一个 IP 范围列表,如下所示: List ipRanges = new List(); ipRanges.Add(new I
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
下面是我的 CloudFormation 模板的片段,用于将弹性 IP 地址与网络接口(interface)的主 IP 相关联: "MyInterfaceSelfEipAssociat
我在 Azure 上创建了 Python 函数,该函数调用外部 API 服务,该服务仅允许访问白名单 IP。 根据 Microsoft 文档 ( https://learn.microsoft.com
我在 Azure 上创建了 Python 函数,该函数调用外部 API 服务,该服务仅允许访问白名单 IP。 根据 Microsoft 文档 ( https://learn.microsoft.com
我在我的 CentOS 5 x86_64 中使用 IP 别名。为简化此示例:IP 地址 A 是 eth0 地址,IP 地址 B 是 eth0:0地址。我有 2 个 Apache 实例(版本 2.2.3
我是一名优秀的程序员,十分优秀!