#tcp-server #coap #coap-server #networking #connection #built #embedded-nal

no-std embedded-nal-minimal-coaptcpserver

基于嵌入式-nal构建的最小CoAP-over-TCP服务器实现

4个版本

0.2.0 2024年1月17日
0.1.2 2021年11月11日
0.1.1 2021年11月10日
0.1.0 2021年11月2日

#1008 in 嵌入式开发


coap-message-demos中使用

MIT/Apache

50KB
550

Build Status Maintenance

嵌入式-nal-minimal-coaptcpserver

基于[嵌入式_nal]构建的最小CoAP-over-TCP服务器实现。

这是嵌入式-nal-minimal-coapserver的TCP等价物;它用于说明差异,并作为基准工具来比较CoAP-over-TCP和CoAP-over-UDP。从长远来看,它还可能在CoAP-over-TCP对约束设备(在NAT穿越中)实用的地方有用;为此,它需要获得一些基本客户端功能来发送请求。

用法和操作

另见等效部分:拥有一个[ServerPool]并在可能发生网络活动时调用ServerPool::poll

每个TCP连接需要一些(少量)状态,该状态与套接字一起存储在[ConnectionState]中。ServerPool所做的一切就是接受连接、单独轮询连接并在收到错误时丢弃状态(包括此时已关闭的套接字)。如果想要使用其他管理连接的方法,包括主动打开连接,只需替换ServerPool并手动调用ConnectionState::poll_connection即可。

如果你不想提供接收和发送缓冲区的堆分配,而是用一些刮擦内存替换它,目前可以通过以下方式手动进行每连接轮询:ConnectionState::poll_connection_with_buffer可以与一个锁定区域一起使用。

注意事项

请参阅等效部分,以下有修改:

  • 作为一个TCP服务器,它不易受到放大缓解的影响,不需要执行消息去重,并且不易受到细微的响应地址问题。

    虽然这是CoAP-over-UDP服务器需要幂等性的原因,但以下原因仍需要幂等性。

  • 与CoAP-over-UDP不同,服务器没有“错过”请求的余地。

    如果读取了请求但发送响应失败(因为发送缓冲区未就绪),仍然需要处理请求而不会造成太大的暂停点;此服务器所做的就是响应5.03并等待客户端重试。因此,仍然建议处理程序需要是幂等的。

    (即使发送缓冲区完全满,发送5.03也可能失败,在这种情况下,连接将被终止)。

    幸运的是,这种事件(需要发送5.03,更不用说终止)可以预期是罕见的,至少当客户端同步发送请求时(客户端完全有权利不这样做,但许多应用程序简单地同步)。

    如果TCP套接字指示某些大小的outbuffer可以得到保证,这可以减轻这种情况;这种实现可以仅在最大响应可用时才开始读取请求。

    (更复杂的服务器可能会希望处理程序的响应数据尽可能小,正如它在[coap-handler]生态系统中所应有的。然后,它可以为已处理请求设置一个暂停点(状态机状态),并等待构建响应所需的确切大小可用。这种实现将不会这样做。较简单的服务器可以存储令牌,并且至少可以可靠地发送5.03,即使稍后)。

  • 底层堆栈必须能够在一个非阻塞读取中提供完整的CoAP请求(直到某个大小)。否则,CoAP库需要为每个可能缓慢流入的连接保留自己的缓冲区。

    这仅由实现embedded_nal_tcpextensions::TcpExactStack特征的TCP堆栈提供,该特征在https://github.com/rust-embedded-community/embedded-nal/issues/59中讨论。

路线图

服务器仍在开发中,但至少是基本功能的。

此服务器的目标是保持简单和最小化组件,在生产就绪性方面比embedded-nal-minimal-coapserver有较低的雄心。

许可:MIT OR Apache-2.0

依赖关系

~2MB
~35K SLoC