Adminhs пишет:
Я не знаком с проектом MySensors и с его протоколом, если есть где-то его описание (желательно на русском), то можно посмотреть..
Проект строится поверх библиотеки NRF24 (для дуины). Посредником между высокоуровневым контроллером и сетью NRF является Serial, Ethernet или MQTT-шлюз (ардуинка с nrf24l01+ подключенная по usb к контроллеру в версии serial, либо через эзернет-шилд во втором или третьем случае). Этот шлюз обеспечивает адресацию и роутинг пакетов в радиосети. Сенсорные узлы сети - ноды представляют собой ардуинку с тем же nrf24l01+ и являются клиентами шлюза напрямую, либо посредством ретрансляции пакетов через другие ноды.
Все сообщения отсылаемые нодой, как я понимаю формируются следующим кодом из
MySensor.cpp
// Inline function and macros
inline MyMessage& build (MyMessage &msg, uint8_t sender, uint8_t destination, uint8_t sensor, uint8_t command, uint8_t type, bool enableAck) {
msg.sender = sender;
msg.destination = destination;
msg.sensor = sensor;
msg.type = type;
mSetCommand(msg,command);
mSetRequestAck(msg,enableAck);
mSetAck(msg,false);
return msg;
}
Характерный скетч для
ноды с датчиком DHT -
здесь.
Включаем библиотеку Mysensors
Инициализируем класс
Задаем типы сообщений от ноды (
как в MyMessage.h, для обработки на шлюзе)
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
Далее Void setup, где инитим радиомодуль ( коллбэк-функция для входящего сообщения, id, режим ретрансляции, родителская нода, скорость, уровень мощности, канал)
Шлём на шлюз инфу о ноде (для отправки используется та же структура build, что указана выше)
// Send the Sketch Version Information to the Gateway
gw.sendSketchInfo("Humidity", "1.0");
Презентуем шлюзу номенклатуру того, что есть на ноде
// Register all sensors to gw (they will be created as child devices)
gw.present(CHILD_ID_HUM, S_HUM);
gw.present(CHILD_ID_TEMP, S_TEMP);
Получаем, в какой системе единиц работаем
metric = gw.getConfig().isMetric;
Далее в цикле читаем температуру и влажность и шлём на шлюз (всё тот же build)
gw.send(msgTemp.set(temperature, 1));
gw.send(msgHum.set(humidity, 1));
Ну и как водится, немного спим
gw.sleep(SLEEP_TIME); //sleep a bit
Готов перевести, что необходимо.