7

FreeRTOS + LwIPを使用して、イーサネット ベースのベッドサイド ナース コール デバイスを開発しています。いくつかの例とドキュメントを読んだ後、LwIP のnetconn APIを使用して TCP でデータを送受信したいと考えています。なぜなら、私は BSD スタイルの API に慣れておらず、生の API は難しいかもしれないからです。

netconn_accept()リモートホストからの接続要求が到着するまでプロセスをブロックするnetconn_recv()機能と、データが到着するのを待っている間もプロセスをブロックする機能は知っています...これらの機能は両方ともプロセスをブロックします。サーバーに適していますただし、データを受信するには、患者がボタンを押したときにナースセンターへの「呼び出し」をトリガーする必要があるクライアントとしても機能する必要があります。では、リモート ホストからの接続を待機している (プロセスをブロックしている) 間に、TCP パケットの送信を開始するにはどうすればよいでしょうか?

SIP (Session Initiation Protocol) を使用して通話を開始する必要があるため、TCP を送信する必要があります。これは医療機器であるため、信頼できるはずです。どうもありがとうございました


@Kyle Heironimus 、@werewindle 私はあなたが LwIP の経験を持っていることを知っているので、あなたを私の質問に追加します。

4

1 に答える 1

7

接続を開始する前に、リモート ホストにデータを送信することはできません。それはまったく意味がありません。私の質問は、デバイスをリモート ホストに接続するか、それともリモート ホストがデバイスへの接続を開始するかです。

現在、デバイスで netconn_accept を使用しています。つまり、デバイスがリモート ホストに信号を送る前に、リモート ホストがデバイスへの接続を開始するのを待っているということです。これは、あなたが書いたコードの完全に予想される動作ですが、これについて心配しているようです. これはあなたの意図ではありませんか?そうでない場合、なぜそのようにコーディングしたのですか?もう 1 つの方法は、デバイスがリモート ホストへの接続を開始するようにすることです。netconns hereの使用例があります。もちろん、これにはシステム内の他のデバイスへの変更も含まれます。

したがって、その話の教訓は、接続が存在しない場合はデータを送信できず、データを送信する前に接続を待機しているということです。接続を待ちたくないので、相手側が接続を開始するのを待つのではなく、接続を開始するようにソフトウェアを変更する必要があります。

遭遇するかもしれないもう 1 つの問題は、同じ接続で同時にデータを送受信できるようにしたいということです。lwip で見たほとんどの例では、データを待機している呼び出しをブロックし、そのデータに応答して何かを送り返しています。何かを最初に受信せずに、何かを送り返したい場合があります。私もそれを手伝うことができます。

これは、リスニング netconn 接続を作成したときにうまくいったことです。

まず、次のように設定してタイムアウトを有効にする必要があります。

#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 呼び出しは、新しいデータを 10 ミリ秒待ってから戻ります

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

//受信データの処理

}

//ここで、必要な送信を行います

} // 上記の while ループの終了

このコードにより、ブロッキングを気にせずに送受信を同時に行うことができます。

于 2012-04-26T16:15:10.347 に答える