====== Автоматический ответ ======
{{:wiki:photo_2025-11-07_21-42-14.jpg|}}
В данном разделе приведена информация по модификации исходного кода прошивки Meshtastic для реализации функционала автоматического ответа на сообщения с информированием об уровнях принятого сигнала.
===== Добавляем обработчик принятого сообщения =====
В файл **src\modules\ReplyModule.cpp** добавляем метод обработки приема сообщения
ProcessMessage ReplyModule::handleReceived(const meshtastic_MeshPacket &mp)
{
auto reply = allocDataPacket();
float P = mp.rx_rssi + mp.rx_snr - 10*log10f(pow10f(mp.rx_snr/10)+1);
sprintf(reinterpret_cast(reply->decoded.payload.bytes), "RSSI: %ddBm, SNR: %.2fdB, Signal: %.2fdBm", mp.rx_rssi, mp.rx_snr, P);
reply->decoded.payload.size = strlen(reinterpret_cast(reply->decoded.payload.bytes));
setReplyTo(reply, mp);
service->sendToMesh(reply);
return ProcessMessage::CONTINUE;
}
{{:screenshot_2025-11-07_215146.png|}}
Также требуется добавить метод в заголовочный файл **src\modules\ReplyModule.h**
ProcessMessage handleReceived(const meshtastic_MeshPacket &mp) override;
В нем же правим конструктор на следующее
ReplyModule() : SinglePortModule("reply", meshtastic_PortNum_TEXT_MESSAGE_APP) {}
{{:wiki:screenshot_2025-11-07_215049.png|}}
===== Подключаем модуль =====
В файл **src\modules\Modules.cpp** в начальной секции добавляем подключение файла модуля
#include "modules/ReplyModule.h"
{{:wiki:screenshot_2025-11-07_215249.png|}}
Также в секции ниже создаем объект созданного модуля
new ReplyModule();
{{:wiki:screenshot_2025-11-07_215325.png|}}
===== Обновление от 15.11.2025 =====
В код автоответа требуется добавить проверку на факт того, что сообщение адресованно именно вашей ноде. Иначе она при получения сообщения в общий канал также отреагирует и ответит в директ отправителю.
...
ProcessMessage ReplyModule::handleReceived(const meshtastic_MeshPacket &mp)
{
uint32_t nodeId = nodeDB->getNodeNum();
// Проверяем, нам ли адресован этот пакет
if (mp.to == nodeId) {
auto reply = allocDataPacket();
float P = mp.rx_rssi + mp.rx_snr - 10*log10f(pow10f(mp.rx_snr/10)+1);
....
{{:wiki:photo_2025-11-08_16-04-04.jpg|}}
Альтернативный вариант (более корректный):
...
ProcessMessage ReplyModule::handleReceived(const meshtastic_MeshPacket &mp)
{
// Проверяем, что пакет не является броадкаст
if (!isBroadcast(mp.to)) {
auto reply = allocDataPacket();
float P = mp.rx_rssi + mp.rx_snr - 10*log10f(pow10f(mp.rx_snr/10)+1);
....
===== Итог =====
Получили ноду, которая на принятые сообщения отвечает уровнем принятого сигнала и его характеристиками.
{{:wiki:photo_2025-11-07_21-54-25.jpg|}}