来自main.c的Openthread CLI UDP通信(NRF52840)

时间:2019-01-09 20:55:38

标签: udp command-line-interface nrf52 openthread

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

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

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

CLI:打开udp,udp发送ff03 :: 1 1994哈罗

在所有已打开udp的节点的情况下,udp bind :: 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通过代码发送和接收数据的方法,以便它们可以自主运行。

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

谢谢!

乔纳森

1 个答案:

答案 0 :(得分:0)

There are a few errors in your code:

  1. Remove the call to otMessageSetLength(). The message length is automatically increased as part of otMessageAppend().
  2. The call to otMessageAppend() should be: otMessageAppend(test_message, buf, (uint16_t)strlen(buf)).
    1. Removed the & before buf.
    2. Replaced sizeof() with strlen().

Couple other things you should consider:

  1. After calling otUdpNewMessage(), if any following call returns an error, make sure to call otMessageFree() on the message buffer.
    • Custody is only given to OpenThread after a successful call to otUdpSend().
  2. Do not call udpSend() from interrupt context.
    • OpenThread library was designed to assume a single thread of execution.

Hope that helps.