【发布时间】:2016-10-03 16:29:55
【问题描述】:
使用 AMSend.send(AM_BROADCAST_ADDR, msg, len) 可以通过无线电发送数据包。在 receive.receive 中,我可以检查我从哪个节点收到消息。但是如何将消息发送回我收到消息的同一节点。我有节点 ID,如何获取接收数据的网络地址并将其发回给它。不仅仅是确认数据包。收到数据后,我需要发送数据。任何帮助将不胜感激。
【问题讨论】:
使用 AMSend.send(AM_BROADCAST_ADDR, msg, len) 可以通过无线电发送数据包。在 receive.receive 中,我可以检查我从哪个节点收到消息。但是如何将消息发送回我收到消息的同一节点。我有节点 ID,如何获取接收数据的网络地址并将其发回给它。不仅仅是确认数据包。收到数据后,我需要发送数据。任何帮助将不胜感激。
【问题讨论】:
AMSend.send的签名是:
command error_t send(am_addr_t addr, message_t* msg, uint8_t len);
addr 被记录为发送数据包的地址。 AM_BROADCAST_ADDR 是一个常量,表示广播地址:发送到该地址的数据包被无线电范围内的所有节点接收。一旦您收到一个数据包并获得了发件人的 ID(通过AMPacket.source),提供为addr 到AMSend.send。它具有相同的类型am_addr_t,基本上是一个整数(8 位或 16 位)。
请注意,通常在编译或编程节点期间分配 id(请参阅this presentation,幻灯片 61),并且通常默认情况下所有节点都具有相同的 id,除非您明确分配。
【讨论】:
uses{ interface AMSend; interface SplitControl as AMControl; interface Packet; interface AMPacket; }Receive.receive(msg_t* msg, void *payload, uint8_t len) {msg_t* data = (msg_t*)payload; am_addr_t addr = call AMPacket.source(msg); send_message(addr); //rest of the code } void send_message(addr){ //send msg to source now using AMSend.send() }