我正在使用FreeRTOS + LwIP 来开发基于以太网的床边护士呼叫设备。在阅读了一些示例和文档后,我想使用LwIP的 netconn API 在TCP下发送和接收数据,因为我不熟悉BSD样式API,原始API可能很难。
我知道netconn_accept()
函数将阻止进程,直到来自远程主机的连接请求到达,netconn_recv()
函数也会在等待数据到达时阻止进程...这些功能将阻止该过程,这对于接收数据的服务器是有益的,但是,我的设备还需要充当客户端,当患者按下时需要触发对护士中心的“呼叫”一个按钮。 那么当它还在等待远程主机的连接(阻塞进程)时,它如何启动发送TCP数据包?
我需要发送TCP,因为我必须使用SIP(会话启动协议)来发起呼叫,它应该是可靠的,因为它是一个医疗设备。非常感谢你
答案 0 :(得分:7)
在启动连接之前,您无法将数据发送到远程主机。这没有任何意义。我的问题是:您希望您的设备连接到远程主机,还是希望远程主机启动与您设备的连接?
现在您正在设备中使用netconn_accept - 这意味着您正在等待远程主机启动与设备的连接,然后设备才能向远程主机发送信号。对于您编写的代码,这完全是预期的行为,但您似乎对此感到担心。这不是你的意图吗?如果没有,为什么你这样编码?另一种方法是让您的设备启动与远程主机的连接。有一个使用netconns here的例子。当然,这也涉及对系统中其他设备的更改。
因此,该故事的寓意是,当没有连接时,您无法发送任何数据,并且在发送数据之前您正在等待连接。您不想等待连接,因此您必须更改软件以启动连接,而不是等待另一方启动它。
您可能遇到的另一个问题是您希望能够同时在同一连接上发送和接收数据。我看到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; // note这是毫秒 - lwip工作在ms
//循环直到连接关闭
while(!ERR_IS_FATAL(pxNewConnection-> err)){//致命错误包括关闭,重置,中止等连接
//此netconn_recv调用现在将等待10ms以获取任何新数据,然后返回
if((pxRxBuffer = netconn_recv(pxNewConnection))!= NULL) {
//处理收到的数据
}
//在这里,做你想要的任何传输
} //从上面结束while循环
该代码允许您同时进行传输和接收,而不必担心阻塞。