Andrew RappのXBee-APIを使用して、3つ以上のエンドポイントからコーディネーターを介してI / Oデータをサンプリングするにはどうすればよいですか?
私は17のシリーズ1XBeesを持っています。1つをコーディネーター(APIモード= 2)に、残りをエンドポイントにプログラムしました。XBee-APIを使用して、各エンドポイントにユニキャストされたForce I / O Sample( "IS")リモートATコマンドを送信しています。これは、最大2つのエンドポイントがある場合に完全に機能しますが、3つ目のエンドポイントが追加されるとすぐに、3つのうちの1つが常に応答しなくなります(XBeeTimeoutExceptionでタイムアウトします)。応答を停止するのは常に同じ物理ユニットではありませんが、常に3番目のユニットです(たとえば、Force I / OサンプルをDevice1、Device2、およびDevice3に送信すると、Device3はタイムアウトになり、順序を次のように変更するとDevice3、Device1、Device2、Device2がタイムアウトします。
3つ以上のXBeをセットアップした場合、3つのうち約1つがタイムアウトになりますが、3つおきにタイムアウトするわけではありません。
XBees自体が正常であることを確認しました。私はインターネットとStackOverflowを特に検索しましたが、役に立ちませんでした。単純なZNetRemoteAtRequestを使用してみました。XBeeコーディネーターのシリアル接続を3つのデバイスすべてに対して1回、デバイスごとに1回、プログラムの実行ごとに1回開閉してみました。コーディネーターとエンドポイントの間の距離を変えてみました(5フィート以上離れてはいけません)。さまざまなコーディネーター構成パラメーターを試しました(Digiのドキュメントから)。コーディネーターのXBeeを変えてみました。
これは、Force I / O Sampleリクエストを各エンドポイントに送信し、応答を読み取るために使用しているコードです。
xbee = new XBee(); // Coordinator
xbee.open("/dev/ttyUSB0, 115200)); // Happens before any of the endpoints are contacted
... // Loop through known endpoint addresses
XBeeRequest request = new ZBForceSampleRequest(new XBeeAddress64(endpointAddress));
ZNetRemoteAtResponse response = null;
response = (ZNetRemoteAtResponse) xbee.sendSynchronous(request, remoteXBeeTimeout);
if (response.isOk()) {
// Process response payload
}
... // End loop and finally close coordinator connection
3つ以上のエンドポイントからのI/Oサンプルのポーリングに役立つ可能性があるものは何ですか?
EDIT: I found that Andrew Rapp's XBee-API library fakes multithreaded behavior, which causes the synchronization issues described in this question. I wrote a replacement library that is actually multithreaded and correctly maps responses from multiple XBee endpoints: https://github.com/steveperkins/xbee-api-for-java-1-4. When I wrote it Java 1.4 was necessary for use on the BeagleBone, Plug, and Zotac single-board PCs but it's an easy conversion to 1.7+.