1

我目前正在 Contiki 在 Telos bmote 上实现我的第一个应用程序并遇到了问题。

对于我的应用程序(使用 uIP IPv4 堆栈),我需要能够向所有节点广播消息。

我查看了源代码,发现在 uip_over_mesh.c 中发现数据包是针对外部网络的,然后被发送到网络上的网关节点,而不是分发到所有节点。如果不存在网关节点,它只会丢弃数据包。所以事实上,不是将数据包广播到网络中的所有节点,它要么只是被丢弃,要么只是被发送到网关节点和外部网络。

我的问题是我需要它广播到网络中的其他节点(应该如此),是否有我遗漏的步骤或者我做错了什么?

谢谢 :)

ps 这是获取要发送的消息的粗略代码。

struct uip_udp_conn *udp_conn = udp_broadcast_new(UIP_HTONS(5001), state);
udp_bind(udp_conn,UIP_HTONS(5001));
uip_udp_packet_send(udp_conn, "hello",5);

抱歉,我的问题似乎不清楚。为了澄清我想要做的是将 IPv4 UDP 数据包发送到广播地址,即使用 allones addr 发送到网络上的所有设备。但是我发现发送设备只会将消息转发到网络上存在的网关节点。

4

2 回答 2

0

问题尚不清楚,但我从您想向所有邻居微尘匿名广播消息的问题中了解到。你有两个选择。

  1. 如果您使用的是 Contiki 的 RIME 堆栈。在 example/rime/example-broadcast.c 下已经有一个代码(看看第 79,80 行(packetbuf_copyfrom("Hello", 6); broadcast_send(&broadcast)));我已经测试了代码,它运行良好在 teleosB 下很好。我强烈建议您使用 RPL 使用 uIP (IPv6) 堆栈。对于大型网络,维护 rime 堆栈将非常困难。

  2. 您可以使用示例/ipv6/simple-udp-rpl 中的基于 udp 的 ipv6 启用广播示例。除非您想要更多附加功能,否则您无需为接收器功能进行任何更改。该函数将打印接收端口、发送端口和数据长度。如果要打印 IP 地址,可以在接收器函数中从“uip_ipaddr_t”添加“addr”。对于发件人,代码行是 (76-91)。您无需更改“hello”之类的简单消息。我测试了代码,它工作得很好。

于 2013-05-13T13:49:17.340 回答
0

在大量阅读 Contiki 源代码后,我发现问题出在 uip_over_mesh.c 中。当发送广播消息(255.255.255.255)时,发送函数将检查目标是否在本地网络内(基于网络掩码和目标地址),它会跳闸。否则,它将尝试将其发送到本地网关(如果存在)以将其路由到网络之外。

虽然 IPv4 UDP 广播已内置到 api 中,但我没有看到它实际上在 uip_over_mesh.c 中实现的证据(我可能错了,完全错过了它)。因此,为了解决这个问题,我添加了一个广播 RIME 频道,并添加了对前面提到的网关检查所在的所有地址的检查。还实现了一种接收广播消息的方法,以确保正确接收广播消息并将其传递给上层。

从我从这里收集的信息和邮件列表来看,IPv6 是重点,没有多少人了解或使用 IPv4 uip 堆栈。当我有时间时,我会挖掘我修改后的 uip_over_mesh.c 并查看是否可以推送修改,尽管由于上述缺乏兴趣,我确信它有点小技巧并且没有多大用处。

于 2013-07-29T15:36:11.730 回答