Contiki IPv4 UDP广播包未发送

时间:2012-12-09 21:21:38

标签: contiki

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

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

我查看了源代码,发现在uip_over_mesh.c中,发现数据包用于外部网络,然后被发送到网络上的网关节点,而不是分发到所有节点。如果没有网关节点,则只丢弃该数据包。 因此实际上,不是将数据包广播到网络中的所有节点,而是将其丢弃或仅发送到网关节点和外部网络。

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

谢谢:)

P.S。这是获取要发送消息的粗略代码。

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数据包发送到广播地址,即使用全部addr发送到网络上的所有设备。但我发现发送设备只会将消息转发到网关节点(如果它存在于网络上)。

2 个答案:

答案 0 :(得分:0)

问题不明确,但我从你想要匿名向所有邻居节目广播消息的问题中理解。你有两个选择。

  1. 如果您正在使用contiki的RIME堆栈。在示例/ rime / example-broadcast.c下已有代码(看看第79,80行(packetbuf_copyfrom(“Hello”,6); broadcast_send(& broadcast));我已经测试了代码,它是在teleosB下工作得非常好。我强烈建议你使用RPL使用uIP(IPv6)堆栈。对于大型网络来说,维护rime堆栈将非常困难。

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

答案 1 :(得分:0)

在更多地阅读Contiki源代码后,我发现问题出在uip_over_mesh.c中。 当发送广播消息(255.255.255.255)时,当发送功能检查目的地是否在本地网络内时(基于网络掩码和目的地地址),它正在跳闸。如果失败了,它会尝试将其发送到本地网关(如果存在)以将其路由出网络。

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

从我从这里收集的内容和邮件列表中,IPv6是重点所在,而且知识渊博或使用IPv4 uip堆栈的人并不多。当我有一些时间我会挖掘我修改过的uip_over_mesh.c并看看我是否可以推动修改,但我确定这是一个黑客攻击,并没有太大的用处,因为上面提到的缺乏兴趣。