工具与软件:
大家好!
我正在使用一个 在 Linux 主机上运行的系统、使用基于 CC1312R7的无线电与 Wi-SUN 网络进行通信。 我想使用多播 CoAP 消息来触发我的设备车队中的行为。
我的 FAN 器件支持多播、并已成功接收和处理使用 pyspinel 发送的多播。 `UDP`命令 开箱即可实现多播。 在`UDP`命令中移植了一些多播处理逻辑之后、我能够使用` CoAP `命令发送多播 GET。 具体来说、我需要添加以下代码块并将生成的_extension_headers 添加到生成的数据包中。
if ipaddress.IPv6Address(dst).is_multicast: # Tunnel the IPv6 header + frame (containing the multicast address) _extension_headers = [ipv6.HopByHop(options=[ ipv6.HopByHopOption(ipv6.HopByHopOptionHeader(_type=0x6d), ipv6.MPLOption(S=3, M=0, V=0, sequence=self._get_next_mpl_seq_number(), seed_id=ipaddress.ip_address(src).packed))])] _extension_headers.append(ipv6.IPv6Header(source_address=src, destination_address=dst, hop_limit=hop_limit)) dst = "ff03::fc" # Use the realm-all-forwarders address for the outer ipv6 header
接下来、我尝试切换到`wfantund`以便可以使用来自各种用户空间应用的网络套接字。 这样做时、器件不会接收多播消息。 我曾`过多播 ping (例如` ping6 -I wfan0 FF03:1 μ s)以及在 python 中使用 libcoap 和 aiocoap 的 CoAP。 在 ping 的情况下、我还从 BR 得到响应、但没有连接的器件。 在所有情况下、我都可以在 wfan0接口的 Wireshark 中看到多播数据包。 这表示数据包正在发送到接口的 Linux 端。 将日志级别设置为`All`时、我还可以在日志中看到这一点。 我似乎没有看到 wfantund 中的代码也处理了这个问题。
当我参考其他供应商有关通过其边界路由器实现发送多播的文档时、他们会设置 IPV6_MULTICAST_Hops 和 SO_BINDTODEVICE 套接字选项。 我还尝试了 IPv6_MULTICAST_IF 而非 SO_BINDTODEVICE。 在发送消息之前、我还尝试加入我要发送的多播组。
使应用能够通过 Linux 套接字接口发送多播的正确方式是什么(此处不选择 RAW 套接字、因为我们需要能够在顶部使用库)。 wfantund 或其他一些实用程序(如我缺少的多路广播路由守护程序)是否会发生更改?
谢谢