2012-12-09 54 views
2

我目前在Contiki上实现了Telos bmote中的第一个应用程序,并遇到了问题。Contiki IPv4 UDP广播数据包不发送

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

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

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

谢谢:)

附:这是让消息发送的粗略代码。

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

+0

确切地说你在问什么不是很清楚 – maguirre

+0

是的,你是对的,对不起。我从原来的问题中修改了它,因为我再次排查了一些问题,发现问题在其他地方。但是在我试图提出这个新问题时,我忘了提出这个问题,我很傻。谢谢 –

回答

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,看看我是否可以推动这些修改,尽管我确信这是一种破解,并且由于上述缺乏兴趣而没有多大用处。

0

的问题是不明确的,但你要匿名消息广播到所有邻居微尘我从问题的理解。你有两种选择。

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

  2. 你可以使用基于udp的ipv6 enable broadcast例子examples/ipv6/simple-udp-rpl。除非你需要更多的附加功能,否则你不需要为接收函数改变任何东西,这个函数会打印接收端口,发送端口和数据长度,你可以添加“addr”如果你想打印IP地址,在接收函数中使用“uip_ipaddr_t”;对于发送者,代码行是(76-91)。你不需要改变像“hello”这样简单的消息。颂歌,它工作得很好。