我在嵌入式堆栈中实现了一个 RESTful Web API,它提供了一个没有 REST 功能的网络服务器。准确地说,嵌入式堆栈是运行在 MQX RT 操作系统之上的 RTCS,微 Controller 是 Freescale 的 Kinetis K60。我能够区分 GET/POST/DELETE/PUT 请求并使用参数获取 url(假设/this/firstValue/that/secondValue/...)。
我使用 strtok 来分隔 url 的不同元素并做出决定。但是我的代码很难看,因为它充满了 strcmp 函数和 if 语句。我还需要检查 firstValue 和 secondValue 的边界(我可以在设置/获取函数中执行此操作,但每个参数的 2 个函数将重复)。此外,我希望能够在不弄乱决策树的情况下添加参数。
我有两个问题:
- 如何使代码简洁明了?
- 您认为 REST 网络服务适合通过网络控制我的微 Controller 吗?你有这样的例子吗?我正在使用 REST web 服务,因为它提供身份验证(没有保密,但是因为我还不能设置 SSL 套接字)而且我认为这是一个优雅的解决方案。
-
我评估了一些其他解决方案:
- SNMP (snmpset/snmpget):它可以工作,但设置 MIB 真的很痛苦,而且由于它是 SNMPv2,所以仍然没有保密性。
- telnet 服务器(我还没有 SSH 解决方案):除了 REST 可能更容易从外部控制之外,我没有看到任何优点/缺点,我正在用 curl 对其进行测试 :)
- SOAP 远程过程调用(我就是不喜欢)
- 还有其他想法吗?我需要一些简单且可扩展的东西,因为可能有多个目标需要控制。我的资源有限:s。在某些时候我需要保密,并且我希望在 CyaSSL(嵌入式 ssl 实现)移植到 MQX 时拥有它。他们说这会在下个月发生,所以保密将不再是问题,但如果你有其他想法......
--
埃米利安
最佳答案
REST 是一种架构模式,所以我猜你的意思是你的服务器提供 HTTP。
资源是“任何可以命名的数据”。例如嵌入式设备上的 LED 可以是“/leds/led3”的 URI。您可以使用标准 PUT 请求更改它保存的数据(其状态、rgb led?等),GET 应该返回其当前状态。
至于编码,如果内存允许使路径查找尽可能简单,则通用树结构可能是明智的。叶子上有数据和函数指针(模拟对象)
关于嵌入式 Web 服务器中的 CRUD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971531/