【问题标题】:Contiki IPv4 UDP broadcast packets not sendingContiki IPv4 UDP广播数据包不发送
【发布时间】:2013-07-30 01:10:05
【问题描述】:

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

对于我的应用程序(使用 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 数据包发送到广播地址,即使用 allones 地址发送到网络上的所有设备。但是我发现发送设备只会将消息转发到网络上存在的网关节点。

【问题讨论】:

  • 不太清楚你在问什么
  • 是的,你是对的,很抱歉。当我排除更多故障并发现问题出在其他地方时,我已根据原始问题对其进行了修改。但是在我试图提出新问题时,我忘了提出这个问题,我很傻。谢谢

标签: contiki


【解决方案1】:

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

  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”之类的简单消息。我测试了代码,它运行良好。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-14
      • 2016-07-26
      • 2019-06-17
      • 2014-06-23
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      相关资源
      最近更新 更多