简介
我正在开发机器人采样应用程序。每个机器人都有一个带有电源、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/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,