我们正在使用 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 发送和接收数据的方式,让它们能够自主运行。
如果有人可以帮助我们完成我们的项目,我们将不胜感激!
谢谢!
乔纳森