7

我正在使用 FreeRTOS + LwIP开发基于以太网的床边护士呼叫设备。看了一些例子和文档后,我想用LwIP的netconn API在TCP下发送和接收数据,因为我不熟悉BSD风格的API,原始API可能比较难。

我知道该netconn_accept()函数会阻塞进程,直到来自远程主机的连接请求到达,并且该netconn_recv()函数也会在等待数据到达时阻塞进程......这两个函数都会阻塞进程,这对服务器有好处接收数据,但是,我的设备还需要充当客户端,当患者按下按钮时,需要触发对护士中心的“呼叫”。那么它如何在等待来自远程主机的连接(阻塞进程)的同时发起发送 TCP 数据包呢?

我需要发送 TCP,因为我必须使用 SIP(​​会话发起协议)来发起呼叫,它应该是可靠的,因为它是一个医疗设备。非常感谢你


@Kyle Heironimus ,@werewindle 我将您添加到我的问题中,因为我知道您在 LwIP 方面有经验,希望不会给您带来不便,希望您能提供帮助,谢谢。

4

1 回答 1

7

在远程主机启动连接之前,您不能将数据发送到远程主机。那没有任何意义。我的问题是:您希望您的设备连接到远程主机,还是希望远程主机启动与您的设备的连接?

现在您正在设备中使用 netconn_accept - 这意味着您正在等待远程主机启动与您的设备的连接,然后您的设备才能向远程主机发出信号。对于您编写的代码,这完全是预期的行为,但您似乎对此感到担忧。这不是你的本意吗?如果不是,你为什么要这样编码?另一种选择是让您的设备启动与远程主机的连接。这里有一个使用 netconns 的例子。当然,这也涉及对系统中其他设备的更改。

所以这个故事的寓意是,当没有连接时,您不能发送任何数据,并且您在发送数据之前正在等待连接。您不想等待连接,因此您必须更改软件以启动连接,而不是等待对方启动它。

您可能遇到的另一个问题是您希望能够同时在同一连接上发送和接收数据。我看到的关于 lwip 的大多数示例都涉及阻塞等待数据的调用,然后通过回传某些内容来对该数据做出反应。有时您想在没有先接收到某些内容的情况下将某些内容传回。我也可以帮忙。

当我创建监听 netconn 连接时,这对我有用。

首先,您必须通过设置启用超时:

#define LWIP_SO_RCVTIMEO 1

然后你必须像这样设置你的netconn:

pxTCPListener = netconn_new (NETCONN_TCP);

netconn_bind (pxTCPListener, NULL, 23);

netconn_listen (pxTCPListener);

pxNewConnection = netconn_accept (pxTCPListener); //这会阻塞直到连接被接受

//这是重要的一行!

pxNewConnection->recv_timeout = 10; //注意这是毫秒 - lwip 在毫秒内工作

//这个循环直到连接关闭

while(!ERR_IS_FATAL(pxNewConnection->err)) { //致命错误包括连接被关闭、重置、中止等

//此 netconn_recv 调用现在将等待 10ms 等待任何新数据,然后返回

if ((pxRxBuffer = netconn_recv (pxNewConnection)) != NULL) {

//处理接收到的数据

}

//在这里,做任何你想要的传输

} //上面的while循环结束

该代码将允许您同时进行传输和接收,而不必担心阻塞。

于 2012-04-26T16:15:10.347 回答