0

我们正在使用 NRF52840 加密狗,并希望能够让它们通过 OpenThread 网状网络自动通过 UDP 中继数据。我们在 OpenThread API 中找到了一个可靠的 Udp.h 库,其中包含我们需要创建在 main.c 加密狗上运行的代码所需的所有 Udp 函数。

下面是我们的代码,它应该向所有在端口 1994 上具有打开套接字的节点广播消息:“Hallo”。

我们已经读到 ipv6 地址 ff03::1 是为多播 UDP 广播保留的,并且在使用 CLI udp 命令手动执行时它可以完美地工作。

CLI:udp 打开,udp 发送 ff03::1 1994 你好

在所有打开 udp 的节点后,udp 绑定 :: 1994,接收来自发送节点的 Hallo 消息。

我们正在尝试在节点的 main.c 中重新创建它,以便我们可以为节点提供它们自己的一些智能。

当按下加密狗上的按钮时,这段代码会运行一次。代码编译完美,我们测试了返回 RGB LED 的函数(绿色 OK,红色不是),以确认没有产生任何错误(遗憾的是,并非所有函数都返回 no_error 值)

    void udpSend(){
    const char *buf = "Hallo";
    otMessageInfo messageInfo;
    otInstance *myInstance;
    myInstance = thread_ot_instance_get();
    otUdpSocket mySocket;

    memset(&messageInfo, 0, sizeof(messageInfo));

    // messageInfo.mPeerAddr = otIp6GetUnicastAddresses(myInstance)->mNext->mNext->mAddress;
    otIp6AddressFromString("ff03::1", &messageInfo.mPeerAddr);
    messageInfo.mPeerPort = 1994;
    messageInfo.mInterfaceId = OT_NETIF_INTERFACE_ID_THREAD;

    otUdpOpen(myInstance, &mySocket, NULL, NULL);

    otMessage *test_Message = otUdpNewMessage(myInstance, NULL);
    otMessageSetLength(test_Message, sizeof(buf));

    if (otMessageAppend(test_Message, &buf, sizeof(buf)) == OT_ERROR_NONE){
       nrf_gpio_pin_write(LED2_G, 0);
    }
    else{
       nrf_gpio_pin_write(LED2_R, 0);
    }

    otUdpSend(&mySocket, test_Message, &messageInfo);

    otCliUartOutputFormat("Done.\0");

   otUdpClose(&mySocket);
}

现在,我们并不完全是专家,所以我们不确定为什么这不起作用,因为我们在弄清楚如何调用/初始化所有内容时遇到了很多麻烦。我们希望通过代码创建一种通过 UDP 发送和接收数据的方式,让它们能够自主运行。

如果有人可以帮助我们完成我们的项目,我们将不胜感激!

谢谢!

乔纳森

4

1 回答 1

2

您的代码中有一些错误:

  1. 删除对 的调用otMessageSetLength()。消息长度作为otMessageAppend().
  2. 调用otMessageAppend()应该是:otMessageAppend(test_message, buf, (uint16_t)strlen(buf)).
    1. 删除了&之前的buf.
    2. 替换sizeof()strlen()

考虑其他一些你应该考虑的事情:

  1. 调用后otUdpNewMessage(),如果任何后续调用返回错误,请确保otMessageFree()在消息缓冲区上调用。
    • 只有在成功调用otUdpSend().
  2. 不要udpSend()从中断上下文中调用。
    • OpenThread 库旨在假设单个执行线程。

希望有帮助。

于 2019-01-09T22:29:18.480 回答