Использование AysncUDPMessage для ESP32 для отправки строковых данных

Я ищу несколько примеров того, как можно использовать AsyncUDPMessage в приложении для отправки пакетов UDP на хост с определенным IP-адресом и номером порта из ESP- Модуль WROOM-32 (Olimex ESP32-PoE)?

Класс для AsyncUDPMessage в библиотеке arduino-esp32 наследует от Print.

Я хочу отправить измерения датчиков в InfluxDB по линейному протоколу (специфично для InfluxDB).

Пример

 imu,location=front,nodeid=node1 status=0.00,liac_x=-1.18,liac_y=0.02,liac_z=9.63,eul_x=0.00,eul_y=-6.81,eul_z=0.25 1538507409930

Упомянутый выше пример хранится в форме String и методов отправки информации через UDP, а именно. Все send() sendTo() упоминают использование AsyncUDPMessage в качестве первого параметра.

цель

Отправить приведенное выше измерение на IP-адрес и порт конкретного устройства

udp.sendTo(Message, IPAddress(192,168,3,11), 8089);

В настоящее время я использую метод broadcastTo(const char * data, port) для отправки информации экземпляру InfluxDB.

Код

void loop(void) {

  DateTime now_time = rtc.now();

 // создаем измерение
  influxMeasurement row("imu");
  row.addTag("location", "front");
  row.addTag("nodeid", "node1");

// получаем информацию от BNO055
  imu::Vector<3> li_ac = bno.getVector(Adafruit_BNO055::VECTOR_ACCELEROMETER);
  imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
// Serial.print(li_ac.x());
// Serial.print(li_ac.y());
  row.addField("status", 0);
  row.addField("liac_x", li_ac.x());
  row.addField("liac_y", li_ac.y());
  row.addField("liac_z", li_ac.z());
  row.addField("eul_x", euler.x());
  row.addField("eul_y", euler.y());
  row.addField("eul_z", euler.z());

  // добавляем временную метку
  row.addTimeStamp_ms(String(now_time.unixtime()) + String(millis()%1000));

  // распечатываем вывод линейного протокола
  Serial.println(row.postString());

  // UDP-отправка
  char buf[2048]; // создаём буфер для `broadcastTo()`
  row.postString().toCharArray(buf, sizeof(buf)); // строка в массив символов
  // Serial.println(buf);
  udp.broadcastTo(buf ,8089);
  
  delay(100);
}

метод

Я создаю линейный протокол String, создаю буфер, преобразую строку в char [] и отправляю ее.

Вопрос

  1. как мне использовать AsyncUDPMessage, чтобы передать ему строку напрямую?

  2. Я не уверен, но будет ли char buf[2048] внутри цикла хорошей идеей, так как каждый раз, когда выделение буфера может привести к исчерпанию ESP32 памяти? А если AsyncUDPMessage можно избежать этой проблемы?

, 👍0

Обсуждение

Строка имеет .c_str(), @Juraj

в библиотеке есть пример AsyncUDPClient, @Juraj

Да, но нет упоминания об AsyncUDPMessage. есть только AsyncUDPPacket, @Shan-Desai


1 ответ


Лучший ответ:

1

Используйте udp.print(row.postString().c_str())

AsyncUDPMessage в библиотеке AsyncUDP — это всего лишь буфер. Он используется только в функции отправки AsyncUDP:

size_t AsyncUDPPacket::send(AsyncUDPMessage &message)
{
    return write(message.data(), message.length());
}
,

Итак, просто подключитесь один раз, а затем распечатайте информацию, и udp будет отправлен на порт назначения?, @Shan-Desai

udp не подключается. только библиотека принимает параметры сервера и порта в функции, подобной соединению. функция может преобразовать только имя хоста в IP. но реализация скрыта в SDK espressif с открытым исходным кодом., @Juraj

если вам не нужна неблокирующая отправка UDP, вам не нужна библиотека AsyncUDP, @Juraj