Инструменты пользователя

Инструменты сайта


firmware-autoreply

Это старая версия документа!


Автоматический ответ

В данном разделе приведена информация по модификации исходного кода прошивки 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<char*>(reply->decoded.payload.bytes), "RSSI: %ddBm, SNR: %.2fdB, Signal: %.2fdBm", mp.rx_rssi, mp.rx_snr, P);
    reply->decoded.payload.size = strlen(reinterpret_cast<char*>(reply->decoded.payload.bytes));

    setReplyTo(reply, mp);
    service->sendToMesh(reply);

    return ProcessMessage::CONTINUE;
}

Также требуется добавить метод в заголовочный файл src\modules\ReplyModule.h

ProcessMessage handleReceived(const meshtastic_MeshPacket &mp) override;

В нем же правим конструктор на следующее

ReplyModule() : SinglePortModule("reply", meshtastic_PortNum_TEXT_MESSAGE_APP) {}

Подключаем модуль

В файл src\modules\Modules.cpp в начальной секции добавляем подключение файла модуля

#include "modules/ReplyModule.h"

Также в секции ниже создаем объект созданного модуля

new ReplyModule();

Обновление от 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);
....

Альтернативный вариант (по идее более логичный):

...
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);
....

Итог

Получили ноду, которая на принятые сообщения отвечает уровнем принятого сигнала и его характеристиками.

firmware-autoreply.1763235053.txt.gz · Последнее изменение: rsgrinko

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki