Использование 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 []
и отправляю ее.
Вопрос
как мне использовать
AsyncUDPMessage
, чтобы передать ему строку напрямую?Я не уверен, но будет ли
char buf[2048]
внутрицикла
хорошей идеей, так как каждый раз, когда выделение буфера может привести к исчерпанию ESP32 памяти? А еслиAsyncUDPMessage
можно избежать этой проблемы?
@Shan-Desai, 👍0
Обсуждение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
- Arduino Ethernet shield server и клиент одновременно
- Как создать сервер сокетов Arduino для получения сообщений
- Есть ли библиотека Arduino, которая использует ARP для получения списка подключенных устройств в сети?
- Использование c_str() для String для IPAddress с NTPClient дает неправильные значения
- esp32 - кулачок застрял в повторном башмаке
- Как получить ответ HTTP_POST?
- Arduino Ethernet Shield часто теряет свой IP-адрес
- Шлюз не работает в Arduino EthernetENC
Строка имеет .c_str(), @Juraj
в библиотеке есть пример AsyncUDPClient, @Juraj
Да, но нет упоминания об AsyncUDPMessage. есть только
AsyncUDPPacket
, @Shan-Desai