1

TinyOS の使用に完全に迷っており、ここで助けが必要だと思います。

私は彼をリッスンするすべてのノードにメッセージを送信するノードを持っているので、時々このノードは彼のすべての「子供」にメッセージを送信します

event void Timer.fired() {
   call Read.read();
}

event void Read.readDone(error_t result, uint16_t data) {
   if (!busy) {
     Msg* localpkt = (Msg*) (call Packet.getPayload(&packet, sizeof(Msg)));
     if (localpkt == NULL) { return; }
     localpkt->data = data;
     if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(Msg)) == SUCCESS) {
       busy = TRUE;
     }
}

次に、 receive メソッドがあります (すべてのメソッドは同じ .nc にあります)

event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){
   if (len == sizeof(Msg)) {
     Msg* localpkt = (Msg*)payload;
     data = localpkt->data;
   }
   return msg;
}

メッセージを送信すると、親ノードは自分の子供からメッセージを受信しますが、魔女の子供が時間内に応答したことをどのように知ることができますか?

たとえば、1 人の父親が 3 つのノードにメッセージを送信している場合、このノードのうち何人が応答したか、また父親の ID をどのように知ることができますか?

言い忘れましたが、父ノードと子ノードは同じコードを実行しますが、父は「コーディネーター」のように振る舞うので、ときどき子供にメッセージを送信する必要があります。このコードをシミュレートするために TOSSIM を使用しています。

前もって感謝します!

4

2 に答える 2

1

私があなたの質問を正しく理解していれば、ブロードキャストを使用して宛先ごとにパケットの確認応答を取得する方法を探しています。TinyOS での私の経験はいくらか限られていますが、今のところ、それを行う直接的な方法はありません。

あなたが試すことができるのは、代わりにユニキャストメッセージを使用することです. したがって、たとえば、コーディネーターのみがリッスンするチャネルを介して小さなパケットを送信することにより、起動後に最初に子供をコーディネーターに「登録」させる追加のロジックをアプリケーションに追加できます。コーディネーターは、登録された子のリストを保持し、メッセージを 1 つずつ送信します。このようにして、tos.interfaces.PacketAcknowledgements を使用て各宛先の ack を取得し、どの子がメッセージを受信したかを確認できます。

于 2013-06-05T00:56:41.473 に答える
0

Msg パケットの構造は何ですか。必ず「uint_16 node_id」を含めてください。そして、Receive.receive メソッドで、ノード ID を node_id = localpkt->node_id として抽出します。node_id は、mica/telosb モートのコンパイル中に割り当てられます。

これが役立つことを願っています

于 2016-10-03T16:32:55.147 に答える