Openthread CLI UDP связь с main.c (NRF52840) - PullRequest
0 голосов
/ 09 января 2019

Мы работаем с ключами NRF52840 и хотим, чтобы они могли автоматически передавать данные через ячеистую сеть OpenThread через UDP. Мы обнаружили в OpenThread API твердую библиотеку Udp.h со всеми функциями Udp, которые нам нужны для создания кода, который запускается на ключах из main.c.

Ниже приведен наш код, который должен транслировать сообщение «Hallo» всем узлам, имеющим открытый сокет на порте 1994.

Мы прочитали, что адрес ipv6 ff03 :: 1 зарезервирован для многоадресной широковещательной рассылки UDP и отлично работает при ручном выполнении с помощью команд CLI udp.

CLI: UDP открыт, UDP отправляет ff03 :: 1 1994 Hallo

Со всеми узлами, у которых открыт udp, udp bind :: 1994 получает сообщение Hallo от отправляющего узла.

Мы пытаемся воссоздать это в main.c наших узлов, чтобы мы могли предоставить узлам некоторый собственный интеллект.

Этот фрагмент кода запускается один раз при нажатии кнопки на ключе. Код прекрасно компилируется, и мы проверили функции, которые возвращаются с помощью индикатора RGB (зеленый ОК, красный нет), чтобы подтвердить, что не было никаких ошибок (к сожалению, не все функции возвращают значение 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 через код, чтобы они могли работать автономно.

Мы были бы очень благодарны, если бы кто-то помог нам с нашим проектом!

Спасибо!

Jonathan

1 Ответ

0 голосов
/ 10 января 2019

В вашем коде есть несколько ошибок:

  1. Удалить звонок на otMessageSetLength(). Длина сообщения автоматически увеличивается как часть otMessageAppend().
  2. Звонок на otMessageAppend() должен быть: otMessageAppend(test_message, buf, (uint16_t)strlen(buf)).
    1. Удалено & до buf.
    2. Заменено sizeof() на strlen().

Пара других вещей, которые вы должны учитывать:

  1. После вызова otUdpNewMessage(), если любой следующий вызов возвращает ошибку, обязательно вызовите otMessageFree() в буфере сообщений.
    • Депозитарий предоставляется OpenThread только после успешного вызова otUdpSend().
  2. Не вызывать udpSend() из контекста прерывания.
    • Библиотека OpenThread была рассчитана на выполнение одного потока.

Надеюсь, это поможет.

...