我们正在使用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通过代码发送和接收数据的方法,以便它们可以自主运行。
如果有人可以协助我们完成我们的项目,我们将不胜感激!
谢谢!
乔纳森
答案 0 :(得分:0)
There are a few errors in your code:
otMessageSetLength()
. The message length is automatically increased as part of otMessageAppend()
.otMessageAppend()
should be: otMessageAppend(test_message, buf, (uint16_t)strlen(buf))
.
&
before buf
.sizeof()
with strlen()
.Couple other things you should consider:
otUdpNewMessage()
, if any following call returns an error, make sure to call otMessageFree()
on the message buffer.
otUdpSend()
.udpSend()
from interrupt context.
Hope that helps.