Как я могу получать данные через UDP на встроенном устройстве

#c #c #udp #stm32 #mbed

#c #c #udp #stm32 #mbed

Вопрос:

в настоящее время я работаю над скриптом UDP-клиента для проекта Mbed. Я работаю с платой разработки B-L475E-IOT01A и хочу получать данные с другого сетевого устройства.

Отправляющая сторона (на другом устройстве) работает. Я протестировал его с помощью скрипта python на своем компьютере.

У меня следующая проблема: я могу установить подключение к сети и я могу инициализировать сокет UDP с open() помощью функции. Моя проблема в том, что если я пытаюсь bind() подключить сокет либо к порту, либо к адресу сокета, я получаю nsapi_error_t код -3002 , который означает «неподдерживаемая функциональность». Вот этот код:

 #include "UDPSocket.h"
#include "mbed.h"

const char SSID[] = "";
const char password[] = "";
const uint16_t Port = 37020;

UDPSocket socket;
WiFiInterface *wifi;
BufferedSerial pc(USBTX, USBRX, 115200);

int main() {
  pc.set_format(8, SerialBase::None, 1);

  wifi = WiFiInterface::get_default_instance();
  if (!wifi) {
    printf("ERROR: No WiFiInterface found.n");
    return -1;
  }

  printf("nConnecting to %s...n", SSID);
  int ret = wifi->connect(SSID, password, NSAPI_SECURITY_WPA2);
  if (ret != 0) {
    printf("nConnection error: %dn", ret);
    return -1;
  }

  SocketAddress a;
  wifi->get_ip_address(amp;a);
  printf("IP: %sn", a.get_ip_address());

  int returnable = 1;
  while (returnable != 0) {
    returnable = socket.open(wifi);
    printf("%drn", returnable);
    wait_us(500000);
  }

  returnable = 1;
  while (returnable != 0) {
    returnable = socket.bind(Port);
    printf("%drn", returnable);
    wait_us(500000);
  }

  while (1) {
    char message[500];
    int n = socket.recv(amp;message, sizeof(message));
    printf("%drn", n);
    printf("%s", message);
    wait_us(100000);
  }
  wifi->disconnect();

  printf("nDonen");
}
 

Я удалил данные Wi-Fi по соображениям безопасности. Вот результат:

 Connecting to ...
IP: 192.168.178.25
0
-3002
 

Мой вопрос в том, почему я не могу привязать свою плату к определенному порту. У вас есть какие-нибудь идеи?
Заранее благодарю вас.

Комментарии:

1. C или C ? Пожалуйста, отметьте язык, который вы на самом деле используете. C и C имеют некоторое совпадение, но это разные языки

2. mbed использует оба языка, но основным языком является C

3. вы компилируете опубликованный вами код как C или как C ?

4. Я компилирую его как код на C

Ответ №1:

MBED объявляется socket.bind как bind (const Host amp;me) . Аргументом является не номер порта, а Host экземпляр. Измените его на

 sock.bind(Host(IpAddr(), port));
 

Комментарии:

1. В устаревших версиях bind() объявлено, как вы упомянули, но в версии mbed 6 я получил эти две функции для работы: nsapi_error_t bind(const SocketAddress amp;address) или nsapi_error_t bind(uint16_t port) . Последняя функция вызывает первую функцию с IP-адресом 0.0.0.0 . Я пробовал оба, но ни один из них не работал так, как я думал.