This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1312R7:使用 wfantund 和 Linux 应用程序进行多播

Guru**** 2348500 points
Other Parts Discussed in Thread: CC1312R7
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1482329/cc1312r7-multicast-using-wfantund-and-linux-applications

器件型号:CC1312R7

工具与软件:

大家好!

我正在使用一个 在 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 或其他一些实用程序(如我缺少的多路广播路由守护程序)是否会发生更改?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为清楚起见、我正在使用的 pyspinel 应用程序来自 https://github.com/TexasInstruments/ti-wisunfan-pyspinel、具体提交`7f528ccc42a977e042348f457615ae6253499730`(当前发布分支)。 对于 wfantund、我将使用  1.00.07.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    我能够重现您看到的错误。
    我在 wfantund 中看到的一种解决方法是使用 IPv6库生成数据包并将其发送到边界路由器。

    我与研发部门展开了内部讨论、征求他们对高级解决方案的意见、并将在讨论结束后更新该主题。

    此致、
    等等

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Theo、很高兴听到您可以重现问题。 您提到的权变措施听起来就像我提到的 RAW 套接字方法。 这种方法是不可接受的、因为它不能与现有应用程序和库(例如 libcoap、aiocoap)集成。 维护这样的经修改版本的内核库不是我目前打算探讨的内容、因为这会增加大量开销。

    理想情况下、只需指定发送 mutlicast 的接口即可。 如果在 wfantund 中允许转发的地址的某种配置需要这样做,我认为我们可以这样做(即,将它添加到配置文件中,使用 wfanttl 或使用 dbus 接口设置它)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    是的、完全正确。 解决方法是构建和传输原始 IP 数据包、可以使用 IPv6库来简化此过程。 还可以通过添加新命令在 wdextl 中实现转换。

    我看到的唯一"高级别"解决方法是添加一个新的 SPINEL 命令、您可以使用该命令将信息传递到边界路由器。 然后、可使用边界路由器上的 CoAP 库来构建数据包。

    我已将请求转发给研发部门、并将继续讨论。  

    此致、
    等等

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    我们已找到此问题的根本原因、并致力于尽快为您提供解决方案。

    此致、
    等等

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 theo、我期待测试解决方案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:  

    我通过邮件与您联系、提供了我们开发的补丁。

    如果其他人也需要此补丁、请在 e2e 上参考此主题。

    此致、
    等等