Отправка и приём сообщений, описание
Добавлено: 14 окт 2017, 20:49
В этой теме будет описываться всё, что связано отправкой и приемом сообщений.
Итак, первый пост хочу начать с описания принципа работы отправки сообщений в MySensors, т.к. понятной для любителя информации на родном языке мало, поэтому эта тема остаётся не раскрытой. В следствие чего при создании сенсоров может возникать неправильная отработка алгоритма. В MyS существует два понятия подтверждения: первое подтверждение отправки (no Ack), второе подтверждение доставки (Ack).
Подтверждение отправки присутствует по умолчанию, функция bool send(); возвращает true если, как трактуют разработчики, сообщение достигло промежуточного узла, которым может выступать репитер или гейт. Существует несколько способов обработки этой функции, но самая простая val = send(msg.set(lightLevel)); а далее прописываете свои условия в зависимости от значения переменной bool val(true или false).
Подтверждение доставки включается добавлением true, в функцию bool send(); например вот так send(msg.set(lightLevel), true); В таком случае получатель должен послать отправителю подтверждающее сообщение. И для того чтобы обработать это сообщение необходимо в функцию void receive(const MyMessage &message) добавить
Ну и далее использовать полученное значение по вашему усмотрению.
На изображении показан лог обмена сообщениями Если вдаваться в подробности суть обмена состоит в следующем, гейт получив сообщение от отправителя пересылает его получателю и возвращает его же отправителю для подтверждения отправки, если в сообщении стоит флаг подтверждения доставки, перед отправкой обратно флаг снимается, чтобы не попасть в замкнутый цикл, а получатель получив сообщение с флагом отсылает его обратно для подтверждения доставки.
P.S. Если кто-то в это не верит читайте библиотеку и проводите тесты.
Итак, первый пост хочу начать с описания принципа работы отправки сообщений в MySensors, т.к. понятной для любителя информации на родном языке мало, поэтому эта тема остаётся не раскрытой. В следствие чего при создании сенсоров может возникать неправильная отработка алгоритма. В MyS существует два понятия подтверждения: первое подтверждение отправки (no Ack), второе подтверждение доставки (Ack).
Подтверждение отправки присутствует по умолчанию, функция bool send(); возвращает true если, как трактуют разработчики, сообщение достигло промежуточного узла, которым может выступать репитер или гейт. Существует несколько способов обработки этой функции, но самая простая val = send(msg.set(lightLevel)); а далее прописываете свои условия в зависимости от значения переменной bool val(true или false).
Подтверждение доставки включается добавлением true, в функцию bool send(); например вот так send(msg.set(lightLevel), true); В таком случае получатель должен послать отправителю подтверждающее сообщение. И для того чтобы обработать это сообщение необходимо в функцию void receive(const MyMessage &message) добавить
Код: Выделить всё
void receive(const MyMessage &message){
if (message.isAck()){
bool ask = true;
}
}
На изображении показан лог обмена сообщениями Если вдаваться в подробности суть обмена состоит в следующем, гейт получив сообщение от отправителя пересылает его получателю и возвращает его же отправителю для подтверждения отправки, если в сообщении стоит флаг подтверждения доставки, перед отправкой обратно флаг снимается, чтобы не попасть в замкнутый цикл, а получатель получив сообщение с флагом отсылает его обратно для подтверждения доставки.
P.S. Если кто-то в это не верит читайте библиотеку и проводите тесты.