Aquila 2.0 MQTT Problema al compilar cliente


#1

Buenas Tardes.

Inicie con el Aquila 2.0 guiado por el tutorial del blog de rodrigo e instale todo lo requerido y lo que dicen en su blog.

Descargue el bridge de" altair-mqtt-sn-bridge-master" que se encuentra en el GIT, y lo cargue sin ningún problema en el altair que ha de fungir como bridge.

Descargue el cliente “altair-mqtt-sn-client-example-master” que de igual manera se encuentra en el GIT, y al momento de cargarlo al altair me marca el error siguiente:

Compiling .pioenvs\altair\src\main.ino.o
Compiling .pioenvs\altair\FrameworkArduino\HardwareSerial.o
C:/Users/Alejandro/Desktop/estadia/Proyecto/FIRMWARE CLIENTE EJEMPLO/altair-mqtt-sn-client-example-master/cliente/src/main.ino:3:26: fat

al error: MQTTSNClient.h: No such file or directory
#include <MQTTSNClient.h>
^
compilation terminated.

Si pudieran orientarme y decir en que ando errando, se los agradecería demasiado.

Gracias


#2

Hola @archal, ahora que lo reviso, no es suficiente con descargar el zip de altair-mqtt-sn-client ya que este no trae todas las dependencias, por eso no te compila.

La forma más fácil de descargarlo con todas las dependencias es por medio de git por la línea de comandos:

git clone --recursive https://github.com/Rodmg/altair-mqtt-sn-client-example.git

Este comando descargará automáticamente el proyecto junto con sus dependencias.

Alternativamente tendrías que descargar manualmente y copiar cada una de las dependencias que salen con un ícono de carpetas gris aquí: https://github.com/Rodmg/altair-mqtt-sn-client-example/tree/master/lib

Muchas gracias por reportarlo, agregaré estas instrucciones al tutorial.


#3

Muchas gracias Rodrigo.

Clone como bien me mencionaste y si compilo perfectamente.
Anteriormente había realizado lo del modo alternativo (descargar las dos dependencias y copiarlas donde se ubicaban las librerías de Altair Mesh,Aquila protocol, etc… pero no compilaba.

En fin, me ando adaptando al PlataformIO. muchas gracias por la pronta respuesta.


#4

Disculpa las molestias.

me podrias ayudar en como iniciar mi aquila-gateway . (estoy trabajando en Windows 7)
ya inicie mosca sin problema, mi bridge esta en el COM3 (asi me lo indica el platformIO)

— En otra terminal, ejecuta:
— aquila-gateway -p | bunyan

---- Yo digito:

$ aquila-gateway -p /COM3/USBtoUART | bunyan
O o-o o o o-O-o o O
/ \ o o | | | | /
o—o| | | | | | o—o
| |o O | | | | | |
o o o-O\ o-o o-O-o O—oo o
_ mqtt-sn
__ _ __ | | _____ __ ____ _ _ _
/ / _ | / -) V V / ` | || |
_
, _
,|__|_/_/_,|_, |
|
/ |_/

C:\Users\Alejandro\AppData\Roaming\npm\node_modules\aquila-gateway\Forwarder.js:89
throw err;
^

Error: Opening C:/Program Files/Git/COM3/USBtoUART: Unknown error code 123
at Error (native)
[2017-02-21T00:24:27.250Z] ERROR: aquila-gateway/1808 on Lap-Otro: There was an error connecting to the Bridge, make sure it’s connected to the computer.

De antemano Muchas gracias por su tiempo.


#5

:pensive:

Realice la misma operacion desde una terminal de windows, no el bash de git y si inicio mi Gateway.

Dusculpas…
Checare como se comporta.


#6

Hola, en Windows el puerto sería únicamente COM3, no “/COM3/USBtoUART”


#7

Buenas Tardes.

Siguiendo los pasos para crear el flujo en el NODE-RED me encontre con que copiando y pegando el Codigo que compartirte.

Fui copiando y pegando cada uno de los nodos para ver cual causaba el conflicto y me encontré con que eran estos dos.

{“id”:“94416a6.9ba9a98”,“type”:“ui_template”,“z”:“cba35010.5428a”,“group”:“5010d576.b0a54c”,“name”:“Subscriptions”,“order”:0,“width”:“9”,“height”:“4”,“format”:"

Subscriptions

\n<!–\n

{gfm-js-extract-pre-1}\n–>\n\n

\n \n \n \n \n \n <tr ng-repeat=“sub in msg.payload”>\n \n \n \n \n
DeviceTopicQOS
\n {{sub.device}}\n \n {{sub.topic}}\n \n {{sub.qos}}\n
",“storeOutMessages”:true,“fwdInMessages”:true,“x”:500,“y”:296,“wires”:[[]]},{“id”:“f39c0c6c.86ac”,“type”:“ui_template”,“z”:“cba35010.5428a”,“group”:“5010d576.b0a54c”,“name”:“Topics”,“order”:0,“width”:“9”,“height”:“4”,“format”:"

Topics

\n<!–

{gfm-js-extract-pre-2}\n–>\n\n

\n \n \n \n \n \n \n <tr ng-repeat=“topic in msg.payload”>\n \n \n \n \n \n
IDDeviceNameType
\n {{topic.id}}\n \n {{topic.device}}\n \n {{topic.name}}\n \n {{topic.type}}\n
",“storeOutMessages”:true,“fwdInMessages”:true,“x”:486,“y”:353,“wires”:[[]]}

Si me pudieras orientar en como darle resolución, te lo agradecería.

Mi Broker mosca y el Gateway-Aquila al parecer se encuentran corriendo bien.

de antemano agradezco tu apoyo.


#8

Hola, aparentemente copié mal los nodos en el post, aquí está correcto:

[{"id":"f9059690.7dac18","type":"mqtt out","z":"cba35010.5428a","name":"","topic":"gw/devices/get","qos":"1","retain":"false","broker":"28f0b2cb.53e90e","x":345,"y":51,"wires":[]},{"id":"170a5acf.8e5dc5","type":"mqtt out","z":"cba35010.5428a","name":"","topic":"gw/subscriptions/get","qos":"1","retain":"false","broker":"28f0b2cb.53e90e","x":368,"y":118,"wires":[]},{"id":"ae873b1d.687958","type":"mqtt out","z":"cba35010.5428a","name":"","topic":"gw/topics/get","qos":"1","retain":"false","broker":"28f0b2cb.53e90e","x":351,"y":177,"wires":[]},{"id":"3c84b33e.40dd3c","type":"mqtt in","z":"cba35010.5428a","name":"","topic":"gw/topics/res","broker":"28f0b2cb.53e90e","x":135,"y":345,"wires":[["cbf0ddd3.6f633"]]},{"id":"9afdf812.949598","type":"mqtt in","z":"cba35010.5428a","name":"","topic":"gw/devices/res","broker":"28f0b2cb.53e90e","x":147,"y":246,"wires":[["ef2010df.c19a6"]]},{"id":"46548252.3e793c","type":"mqtt in","z":"cba35010.5428a","name":"","topic":"gw/subscriptions/res","broker":"28f0b2cb.53e90e","x":164,"y":294,"wires":[["909b4123.5da46"]]},{"id":"c4eeddeb.5451c","type":"inject","z":"cba35010.5428a","name":"","topic":"","payload":"","payloadType":"num","repeat":"10","crontab":"","once":true,"x":159,"y":94,"wires":[["f9059690.7dac18","170a5acf.8e5dc5","ae873b1d.687958"]]},{"id":"c9e2a488.a403a8","type":"mqtt in","z":"cba35010.5428a","name":"","topic":"gw/devices/disconnected","broker":"28f0b2cb.53e90e","x":715,"y":295,"wires":[["8856b77a.157458"]]},{"id":"e3485f36.42228","type":"mqtt in","z":"cba35010.5428a","name":"","topic":"gw/devices/connected","broker":"28f0b2cb.53e90e","x":718,"y":247,"wires":[["41cef69c.d2acc8"]]},{"id":"ea7a8f5e.b04b4","type":"ui_text","z":"cba35010.5428a","group":"bd123138.cbcb2","order":"4","width":"9","height":"2","name":"Connected","label":"","format":"{{msg.payload}}","layout":"col-center","x":1028,"y":247,"wires":[]},{"id":"7828b4e5.89b89c","type":"ui_text","z":"cba35010.5428a","group":"bd123138.cbcb2","order":"5","width":"9","height":"2","name":"Disconnected","label":"","format":"{{msg.payload}}","layout":"col-center","x":1041,"y":299,"wires":[]},{"id":"41cef69c.d2acc8","type":"function","z":"cba35010.5428a","name":"","func":"var pl = JSON.parse(msg.payload);\nmsg.payload = JSON.stringify(pl, null, 2);\nreturn msg;","outputs":1,"noerr":0,"x":888,"y":245,"wires":[["ea7a8f5e.b04b4"]]},{"id":"8856b77a.157458","type":"function","z":"cba35010.5428a","name":"","func":"var pl = JSON.parse(msg.payload);\nmsg.payload = JSON.stringify(pl, null, 2);\nreturn msg;","outputs":1,"noerr":0,"x":894,"y":302,"wires":[["7828b4e5.89b89c"]]},{"id":"1d79be34.93fe92","type":"mqtt in","z":"cba35010.5428a","name":"","topic":"gw/forwarder/mode/res","broker":"28f0b2cb.53e90e","x":118,"y":454,"wires":[["214c620d.76957e"]]},{"id":"974dca04.9dd0a8","type":"ui_text","z":"cba35010.5428a","group":"bd123138.cbcb2","order":"1","width":"","height":"","name":"Mode","label":"Mode:","format":"{{msg.payload}}","layout":"row-center","x":321,"y":488,"wires":[]},{"id":"41483d91.2a1044","type":"mqtt out","z":"cba35010.5428a","name":"","topic":"gw/forwarder/mode/get","qos":"1","retain":"false","broker":"28f0b2cb.53e90e","x":359,"y":541,"wires":[]},{"id":"db278ea1.aa20a","type":"inject","z":"cba35010.5428a","name":"","topic":"","payload":"","payloadType":"num","repeat":"10","crontab":"","once":true,"x":163,"y":541,"wires":[["41483d91.2a1044"]]},{"id":"46311d5a.6c9d94","type":"ui_button","z":"cba35010.5428a","name":"Set Pair","group":"bd123138.cbcb2","order":"2","width":"","height":"","label":"Set Pair","color":"","icon":"","payload":"","payloadType":"str","topic":"","x":163.5,"y":589,"wires":[["449b7d69.93a954"]]},{"id":"449b7d69.93a954","type":"mqtt out","z":"cba35010.5428a","name":"","topic":"gw/forwarder/enterpair","qos":"1","retain":"false","broker":"28f0b2cb.53e90e","x":348,"y":589,"wires":[]},{"id":"4fa2305d.0effc","type":"mqtt out","z":"cba35010.5428a","name":"","topic":"gw/forwarder/exitpair","qos":"1","retain":"false","broker":"28f0b2cb.53e90e","x":351,"y":637,"wires":[]},{"id":"f0d8452f.e1a3f8","type":"ui_button","z":"cba35010.5428a","name":"Set Normal","group":"bd123138.cbcb2","order":"2","width":"","height":"","label":"Set Normal","color":"","icon":"","payload":"","payloadType":"str","topic":"","x":175,"y":637,"wires":[["4fa2305d.0effc"]]},{"id":"d1c06e5b.521c2","type":"ui_template","z":"cba35010.5428a","group":"5010d576.b0a54c","name":"Devices","order":0,"width":"9","height":"4","format":"<div ng-init=\"rodShowDetails = false; rodDevice = {};\">\n    <h1>Devices</h1>\n    \n    <div ng-if=\"!rodShowDetails\">\n        <table>\n            <tr>\n                <th>Address</th>\n                <th>Connected</th>\n                <th>State</th>\n                <th>Duration</th>\n                <th>Will Topic</th>\n                <th>LQI</th>\n                <th>RSSI</th>\n            </tr>\n            <tr ng-repeat=\"device in msg.payload\">\n                <td>\n                    {{device.address}}\n                </td>\n                <td>\n                    {{device.connected}}\n                </td>\n                <td>\n                    {{device.state}}\n                </td>\n                <td>\n                    {{device.duration}}\n                </td>\n                <td>\n                    {{device.willTopic}}\n                </td>\n                <td>\n                    {{device.lqi}}\n                </td>\n                <td>\n                    {{device.rssi}}\n                </td>\n            </tr>\n        </table>\n    </div>\n    \n    <div ng-if=\"rodShowDetails\">\n        <button class=\"md-button md-raised\" type=\"button\" ng-click=\"rodShowDetails = false;\">Back</button>\n    </div>\n</div>\n\n\n","storeOutMessages":true,"fwdInMessages":true,"x":510,"y":248,"wires":[[]]},{"id":"94416a6.9ba9a98","type":"ui_template","z":"cba35010.5428a","group":"5010d576.b0a54c","name":"Subscriptions","order":0,"width":"9","height":"4","format":"<h1>Subscriptions</h1>\n<!--\n<pre>\n    <code>{{msg.payload}}</code>\n</pre>\n-->\n\n<table>\n    <tr>\n        <th>Device</th>\n        <th>Topic</th>\n        <th>QOS</th>\n    </tr>\n    <tr ng-repeat=\"sub in msg.payload\">\n        <td>\n            {{sub.device}}\n        </td>\n        <td>\n            {{sub.topic}}\n        </td>\n        <td>\n            {{sub.qos}}\n        </td>\n    </tr>\n</table>","storeOutMessages":true,"fwdInMessages":true,"x":500,"y":296,"wires":[[]]},{"id":"f39c0c6c.86ac","type":"ui_template","z":"cba35010.5428a","group":"5010d576.b0a54c","name":"Topics","order":0,"width":"9","height":"4","format":"<h1>Topics</h1>\n<!--<pre>\n    <code>{{msg.payload}}</code>\n</pre>\n-->\n\n<table>\n    <tr>\n        <th>ID</th>\n        <th>Device</th>\n        <th>Name</th>\n        <th>Type</th>\n    </tr>\n    <tr ng-repeat=\"topic in msg.payload\">\n        <td>\n            {{topic.id}}\n        </td>\n        <td>\n            {{topic.device}}\n        </td>\n        <td>\n            {{topic.name}}\n        </td>\n        <td>\n            {{topic.type}}\n        </td>\n    </tr>\n</table>","storeOutMessages":true,"fwdInMessages":true,"x":486,"y":353,"wires":[[]]},{"id":"909b4123.5da46","type":"json","z":"cba35010.5428a","name":"","x":335,"y":296,"wires":[["94416a6.9ba9a98"]]},{"id":"cbf0ddd3.6f633","type":"json","z":"cba35010.5428a","name":"","x":329,"y":348,"wires":[["f39c0c6c.86ac"]]},{"id":"ef2010df.c19a6","type":"json","z":"cba35010.5428a","name":"","x":341,"y":250,"wires":[["d1c06e5b.521c2"]]},{"id":"214c620d.76957e","type":"json","z":"cba35010.5428a","name":"","x":279.5,"y":414,"wires":[["5bee0c1f.cb9f64"]]},{"id":"5bee0c1f.cb9f64","type":"change","z":"cba35010.5428a","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.mode","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":339.5,"y":451,"wires":[["974dca04.9dd0a8"]]},{"id":"28f0b2cb.53e90e","type":"mqtt-broker","z":"cba35010.5428a","broker":"localhost","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willRetain":null,"willPayload":"","birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":""},{"id":"bd123138.cbcb2","type":"ui_group","z":"cba35010.5428a","name":"Pairing","tab":"8c8f57f9.f65c38","disp":true,"width":"9"},{"id":"5010d576.b0a54c","type":"ui_group","z":"cba35010.5428a","name":"Gateway Database","tab":"8c8f57f9.f65c38","disp":true,"width":"9"},{"id":"8c8f57f9.f65c38","type":"ui_tab","z":"cba35010.5428a","name":"Gateway Aquila","icon":"dashboard","order":2}]


#9

Rodrigo. me podrías orientar en que estoy errando. Te explico

Tengo un sensor que tiene una tópico para publicar y 4 suscripciones.

const char publicacionLedRojo[] = “sensor2/led”;
const char subsLedAzul[] = “sensor1/led”;
const char subsOrdenLA[] = “sensor1/orden”;
const char subsOrdenLR[] = “sensor2/orden”;
const char subsInicio[] = “sensores/inicio”;

Todos tienen su handler para tratar el payload que mandara el broker, como el siguiente codigo

void handlerOrdenSA(struct MQTTSN::MessageData &msg)
{
char ordenSensorAzul;
Serial.print("Subscripcion: ");
Serial.println(subsOrdenLA);
Serial.print("Orden: ");
for(uint8_t i = 0; i < msg.message.payloadlen; i++)
{
ordenSensorAzul = (((char*)msg.message.payload)[i]);
ordenSA = ordenSensorAzul - ‘0’;
Serial.print(ordenSA);
}
Serial.println();
}

void handlerOrdenSR(struct MQTTSN::MessageData &msg)
{
char ordenSensorRojo;
Serial.print("Subscripcion: ");
Serial.println(subsOrdenLR);
Serial.print("Orden: ");
for(uint8_t i = 0; i < msg.message.payloadlen; i++)
{
ordenSensorRojo = (((char*)msg.message.payload)[i]);
ordenSR = ordenSensorRojo - ‘0’;
Serial.print(ordenSR);
}
Serial.println();
}

void handlerInicio(struct MQTTSN::MessageData &msg)
{
char aux;
Serial.print("Subscripción: ");
Serial.println(subsInicio);
Serial.print("Inicio: ");
for(uint8_t i = 0; i < msg.message.payloadlen; i++)
{
aux = (((char*)msg.message.payload)[i]);
inicio = aux - ‘0’;
Serial.print(inicio);
}
Serial.println();
}

void handlerLedAzul(struct MQTTSN::MessageData &msg)
{
estadoLedAzul = “”;
Serial.print("Subscripción: ");
Serial.println(subsLedAzul);
Serial.print("Estado Led: ");
for(uint8_t i = 0; i < msg.message.payloadlen; i++)
{
estadoLedAzul = estadoLedAzul + (((char*)msg.message.payload)[i]);
}
Serial.print(estadoLedAzul);
Serial.println();
}
En la funcion de conexion realizo las suscripciones y asigno los handlers a cada subscripcion.

client.registerTopic(publicacionLedRojo, strlen(publicacionLedRojo));
// Subscribe a function handler to a topic
client.subscribe(subsOrdenLA, QOS1,handlerOrdenSA);
client.subscribe(subsOrdenLR, QOS1,handlerOrdenSR);
client.subscribe(subsLedAzul, QOS1,handlerLedAzul);
client.subscribe(subsInicio, QOS1,handlerInicio);

El detalle se produce, cuando desde Node-Red realizo una inyección hacia esas suscripciones.

Si inyecto un valor a la publicación del “sensor1/orden” que es la subscripcion de subsOrdenLA, el valor lo tratan tambien lo trata el handler de la subscripcion de subsOrdenLR. obteniendo el mismo valor en ambos, o en ocasiones lo trata los tres funciones del handler

De antemano, gracias.


#10

Hola, me podrías pasar el código con el problema para que pueda replicarlo?

Saludos.


#11

Poniendolo en contexto, se quiere mandar el orden de encendido de tres altair, Uno utilizara el led rojo propio del altair, otro el led azul de igual manera propio del altair y otro uno externo para evitar el pareo.

El codigo es el siguiente

/* ----------------- ROJO -------------------

Codigo realizado para el sensor2 que utilizara el led Rojo para indicar la activacion del mismo
y que utilizara el sensor ultrasonico para apagarlo

Desarrollo: Alejandro Armendariz Chan

*/
#include <MQTTSNClient.h>
#include <WSNetwork.h>
#include <VirtualTimer.h>
#include <stdio.h>
#include <stdlib.h>

using namespace MQTTSN;

WSNetwork network;
Client client(network, 1000);

// sensor1 = Azul , sensor2 = Rojo

// Topic strings
const char lastWill[] = “lastwill”;
const char publicacionLedRojo[] = “sensor2/led”; // Topico que se publicara sensor2/led
const char subsLedAzul[] = “sensor1/led”;
const char subsOrdenLA[] = “sensor1/orden”; // Subscripcion a las publicaciones que se realicen hacia el topico sensor1/orden
const char subsOrdenLR[] = “sensor2/orden”; // Subscripcion a las publicaciones que se realicen hacia el topico sensor2/orden
const char subsInicio[] = “sensores/inicio”; // Subscripcion a las publicaciones que se realicen hacia el topico sensores/Inicio

// Timer for publishing example topic repeatedly
VirtualTimer timer;
// Pair support
#define PAIR_BTN 33
#define PAIR_LED 14
#define LED 13// para el sensor2 el led 13 (Rojo) sensor1 el led 15 (Azul)
long distancia;
long tiempo;
int inicio; //variable que a traves del handel almacenara el valor enviado por medio de la subscripcion al topico sensores/inicio
int ordenSA, ordenSR; // variable que funje como almacen para el valor del orden de los sensores;
String axiliar;
String estadoLedRojo; // variable que servira para almacenar el valor de la publicacion del topico sensor2/led
String estadoLedAzul; // variable que servira para almacenar el valor de la publicacion del topico sensor3/led
int estadoAnterior = HIGH;
int auxEstado;

//funcion para evaluar el sensor anterior al actual en el orden
bool descifrarAnterior(int sensorActual, int sensorEvaluar) // sensorA = 2 sensorR = 3 sensorV = 1
{
//
int aux = sensorActual - sensorEvaluar;
if (aux > 0)
{
return true;
}
else{
return false;
}
}

bool cambioEstadoLed()
{
int estadoActual = digitalRead(LED);
if (estadoActual==1 && estadoAnterior == 0){
auxEstado = estadoAnterior;
estadoAnterior = estadoActual;
}
else
{
auxEstado = estadoAnterior;
estadoAnterior = estadoActual;
}
if(auxEstado==estadoAnterior)
{
return false;
}
else{
return true;
}
}

void publicarEstado()
{
if(cambioEstadoLed())
{
int leerLED = digitalRead(LED);
if(leerLED==1)
{
Serial.println(“El led esta apagado”);
char payload[] = “Led Rojo Apagado”;
bool retained = false;
client.publish(publicacionLedRojo, payload, strlen(payload), QOS1, retained);
inicio = 0;
}
else{
Serial.println(“El led esta encendido”);
char payload2[] = “Led Rojo Encendido”;
bool retained2 = false;
client.publish(publicacionLedRojo, payload2, strlen(payload2), QOS1, retained2);
}

}
}
void setupPair()
{
pinMode(PAIR_BTN, INPUT);
pinMode(PAIR_LED, OUTPUT);
digitalWrite(PAIR_LED, HIGH);
}

void attendPairToggle()
{
if(!digitalRead(PAIR_BTN))
{
if(network.inPairMode())
{
network.enterNormalMode();
digitalWrite(PAIR_LED, HIGH);
}
else
{
network.enterPairMode();
digitalWrite(PAIR_LED, LOW);
}
delay(1000);
}
// Manage indicator LED state
if(network.inPairMode()) digitalWrite(PAIR_LED, LOW);
else digitalWrite(PAIR_LED, HIGH);
}

// handler para el trato de los datos enviados por las publicaciones del sensor1 (AZUL)
void handlerOrdenSA(struct MQTTSN::MessageData &msg)
{
char ordenSensorAzul;
Serial.print("Subscripcion: ");
Serial.println(subsOrdenLA);
Serial.print("Orden: ");
for(uint8_t i = 0; i < msg.message.payloadlen; i++)
{
ordenSensorAzul = (((char*)msg.message.payload)[i]);
ordenSA = ordenSensorAzul - ‘0’;
Serial.print(ordenSA);
}
Serial.println();
}

// handler para el trato de los datos enviados por las publicaciones del sensor2 (ROJO)
void handlerOrdenSR(struct MQTTSN::MessageData &msg)
{
char ordenSensorRojo;
Serial.print("Subscripcion: ");
Serial.println(subsOrdenLR);
Serial.print("Orden: ");
for(uint8_t i = 0; i < msg.message.payloadlen; i++)
{
ordenSensorRojo = (((char*)msg.message.payload)[i]);
ordenSR = ordenSensorRojo - ‘0’;
Serial.print(ordenSR);
}
Serial.println();
}

//funcion para obtener lo enviado al topico inicio
void handlerInicio(struct MQTTSN::MessageData &msg)
{
char aux;
Serial.print("Subscripción: ");
Serial.println(subsInicio);
Serial.print("Inicio: ");
for(uint8_t i = 0; i < msg.message.payloadlen; i++)
{
aux = (((char*)msg.message.payload)[i]);
inicio = aux - ‘0’;
Serial.print(inicio);
}
Serial.println();
}

void handlerLedAzul(struct MQTTSN::MessageData &msg)
{
estadoLedAzul = “”;
Serial.print("Subscripción: ");
Serial.println(subsLedAzul);
Serial.print("Estado Led: ");
for(uint8_t i = 0; i < msg.message.payloadlen; i++)
{
estadoLedAzul = estadoLedAzul + (((char*)msg.message.payload)[i]);
}
Serial.print(estadoLedAzul);
Serial.println();
}

void encenderLED(){
digitalWrite(10,LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(15);
digitalWrite(10, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(15);
tiempo=pulseIn(9, HIGH);/* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
deja de hacerlo, LOW, la longitud del pulso entrante*/
distancia= int(0.017*tiempo); /fórmula para calcular la distancia obteniendo un valor entero/
Serial.println(“Distancia “);
Serial.println(distancia);
Serial.println(” cm”);
if (distancia < 10){
digitalWrite(LED,HIGH);
}
else
{
digitalWrite(LED,LOW);
}
delay(100);
}

// Function for connecting with gateway
bool connectMqtt()
{
Serial.println(“Connecting MQTT…”);
// Set MQTT last will topic and blank message
client.setWill(lastWill, NULL, 0);
// Setup MQTT connection
static MQTTSNPacket_connectData options = MQTTSNPacket_connectData_initializer;
options.duration = 10; // Keep alive interval, Seconds
options.cleansession = true;
options.willFlag = true;
int status = client.connect(options);

if(status != SUCCESS) return false;
// Clear any previous subscriptions (useful if we are reconnecting)
client.clearSubscriptions();
client.clearRegistrations();
// We need to first register the topics that we may publish (a diference between this MQTT-SN implementation and MQTT)
client.registerTopic(publicacionLedRojo, strlen(publicacionLedRojo));
// Subscribe a function handler to a topic
client.subscribe(subsOrdenLA, QOS1,handlerOrdenSA);
client.subscribe(subsOrdenLR, QOS1,handlerOrdenSR);
client.subscribe(subsLedAzul, QOS1,handlerLedAzul);
client.subscribe(subsInicio, QOS1,handlerInicio);
return true;
}

void yield()
{
network.yield();
}

void setup()
{
Serial.begin(9600);
pinMode(LED,OUTPUT);
digitalWrite(LED,HIGH);
/activación del pin 9 como salida: para el pulso ultrasónico/
pinMode(10, OUTPUT);
/activación del pin 8 como entrada: tiempo del rebote del ultrasonido/
pinMode(9, INPUT);
network.begin();
timer.countdown_ms(100);
setupPair();
}

void loop()
{
// Attend network tasks
yield();
attendPairToggle();
if(network.inPairMode()) {
network.loop();
return;
}
client.loop();
if(!client.isConnected())
{
Serial.println(“MQTT disconnected, trying to reconnect…”);
if(!connectMqtt()) return;
}

if (inicio==1)
{
if(timer.expired())
{
publicarEstado();
timer.countdown_ms(100);
}

switch (ordenSR) {
  case 1:
        {
        encenderLED();
     }
     break;

case 2:
{
if(descifrarAnterior(ordenSR,ordenSA)){
if(estadoLedAzul==“Led Azul Apagado”){
encenderLED();

     }
 }
break;

}
} // cierre del case
}
else {
digitalWrite(LED,HIGH);
}

}


Node Red

[{“id”:“87242852.1b78c8”,“type”:“mqtt out”,“z”:“12905742.1d98e9”,“name”:“Iniciar Sensores”,“topic”:“sensores/inicio”,“qos”:“1”,“retain”:"",“broker”:“f377c66b.74ef38”,“x”:355,“y”:606,“wires”:[]},{“id”:“912977b9.a55a88”,“type”:“inject”,“z”:“12905742.1d98e9”,“name”:“Iniciar”,“topic”:“sensores/inicio”,“payload”:“1”,“payloadType”:“str”,“repeat”:"",“crontab”:"",“once”:false,“x”:184,“y”:606,“wires”:[[“87242852.1b78c8”]]},{“id”:“e9758b03.e3c7f8”,“type”:“inject”,“z”:“12905742.1d98e9”,“name”:“Led Rojo”,“topic”:“sensor2/orden”,“payload”:“1”,“payloadType”:“num”,“repeat”:"",“crontab”:"",“once”:false,“x”:177,“y”:261,“wires”:[[“1abbf8df.3b2e57”]]},{“id”:“87f5f5d2.416888”,“type”:“inject”,“z”:“12905742.1d98e9”,“name”:“Led Azul”,“topic”:“sensor1/orden”,“payload”:“2”,“payloadType”:“json”,“repeat”:"",“crontab”:"",“once”:false,“x”:175,“y”:303,“wires”:[[“1130fee1.397251”]]},{“id”:“1130fee1.397251”,“type”:“mqtt out”,“z”:“12905742.1d98e9”,“name”:“Orden Sensor1”,“topic”:“sensor1/orden”,“qos”:“1”,“retain”:"",“broker”:“f377c66b.74ef38”,“x”:421,“y”:303,“wires”:[]},{“id”:“1abbf8df.3b2e57”,“type”:“mqtt out”,“z”:“12905742.1d98e9”,“name”:“Orden Sensor2”,“topic”:“sensor2/orden”,“qos”:“1”,“retain”:"",“broker”:“f377c66b.74ef38”,“x”:427,“y”:262,“wires”:[]},{“id”:“f377c66b.74ef38”,“type”:“mqtt-broker”,“z”:"",“broker”:“localhost”,“port”:“1883”,“clientid”:"",“usetls”:false,“compatmode”:true,“keepalive”:“60”,“cleansession”:true,“willTopic”:"",“willQos”:“0”,“willPayload”:"",“birthTopic”:"",“birthQos”:“0”,“birthPayload”:""}]


#12

Hola @archal, no he podido probar tu código debido a que no se puso correctamente en el foro, para pegar correctamente código tienes que ponerlo todo entre tres comillas o acentos invertidos de la siguiente forma:

```
[pega el código aquí]
```

De esta forma tendrás el código formateado correctamente, por ejemplo:

void setup()
{
  Serial.begin(9600);
}

Esto se llama Markdown, puedes ver mas trucos aquí: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet

Saludos.