El trabajo continuo con la nube Intel IoT Analytics se centrará en los comentarios del dispositivo, enviando comandos para administrar el dispositivo. La primera parte de Intel Edison. Trabaje con la nube Intel IoT Analytics: registro y envío de datos . Nos damos cuenta de la operación de encender / apagar el LED y el relé. Para demostrarlo, toma una posición de una publicación anterior.Para enviar comandos al dispositivo, se utiliza un tipo de componente especial: Actuación . En una publicación anterior, consideramos el tipo de componente "sensor", que le permite enviar datos desde el dispositivo. La actuación transmite datos a través del protocolo MQTT y WebSocket. Este tipo de componente llama al comando cadena de comandos y sus parámetros de nombre / valor.Registro de la actuación en la nube Intel IoT AnalyticsConsidere la actuación predeterminada , que se ajustará sin cambios para el LED. Abra la sección Cuenta , la sección Catálogo , el componente Powerswitch.v1.0 .
Ventana Propiedades del
componente Powerswitch.v1.0 . Tipo de componente actuador . Porque El LED solo puede estar en dos estados, entonces el tipo de datos es booleano . LED.v1.0 : comando para el LED. Tecla / valor, nombre - LED , el valor aceptado es 0 o 1 .El relé es del mismo tipo de componente con un LED, por lo que también creamos un actuador para el relé.
Tipos de componentes creados.Configuración del agente iotkit en Intel EdisonAhora debe iniciar sesión a través de SSH en Intel Edison. En una publicación anterior, se configuró Wi-Fi, por lo que puede conectarse al dispositivo a través de LAN. El soporte delcomponente de actuación se ha anunciado solo con la versión 1.5.2 y superior del agente. Se recomienda que actualice el agente a la última versión actual.Averigüe la versión del agente:# iotkit-admin -VComando de actualización del agente:# npm update iotkit-agentEn la última versión del agente, fue posible trabajar en WebSocket. Para trabajar en WebSocket, debe configurar el agente con el comando:# iotkit-admin protocol rest + wsVuelva al modo MQTT:# iotkit-admin protocol mqtt
Registre el actuador para el LED y el relé en Intel Edison.El registro de los sensores se realiza con el comando # iotkit-admin register [sensor_name] [sensor_type] .Ejecutamos los comandos: # iotkit-admin register led1 powerswitch.v1.0# iotkit-admin register relay1 relay.v1.0
Preparando un boceto para ArduinoLos componentes están registrados. Ahora prepararemos un boceto para Arduino, tome el ejemplo IoTKitActuationExample.Considere el código:la función void setup () no es diferente del ejemplo anterior.En la función void loop () , se introduce una función para verificar periódicamente los mensajes recibidos, donde json es un puntero a un mensaje en formato JSON.void loop() {
iotkit.receive(callback);
delay(5000);
}
Función de devolución de llamada nula (char * json)void callback(char* json) {
Serial.println(json);
aJsonObject* parsed = aJson.parse(json);
if (&parsed == NULL) {
// invalid or empty JSON
Serial.println("recieved invalid JSON");
return;
}
Si los datos recibidos están presentes, los analizamos más a fondo. aJsonObject* component = aJson.getObjectItem(parsed, "component");
aJsonObject* command = aJson.getObjectItem(parsed, "command");
aJsonObject* argv = aJson.getObjectItem(parsed, "argv");
aJsonObject* argvArray = argv->child;
aJsonObject* name = argvArray->child; // name : on
aJsonObject* value = name->next; // value: 1/0
Comprobación de los comandos LED.v1.0 recibidos y los valores "0" o "1" if ((component != NULL)) {
if (strcmp(component->valuestring, "power") == 0) {
if ((command != NULL)) {
if (strcmp(command->valuestring, "LED.v1.0") == 0 && strcmp(value->valuestring, "0") == 0) {
Serial.println("Light Off!");
pinMode(13, OUTPUT);
digitalWrite(13, false);
}
if (strcmp(command->valuestring, "LED.v1.0") == 0 && strcmp(value->valuestring, "1") == 0) {
Serial.println("Light on!");
pinMode(13, OUTPUT);
digitalWrite(13, true);
}
}
}
}
Boceto final con sensores y controles:
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define LCD_I2C_ADDR 0x20
#define BACKLIGHT 7
#define LCD_EN 4
#define LCD_RW 5
#define LCD_RS 6
#define LCD_D4 0
#define LCD_D5 1
#define LCD_D6 2
#define LCD_D7 3
LiquidCrystal_I2C lcd(LCD_I2C_ADDR,LCD_EN,LCD_RW,LCD_RS,LCD_D4,LCD_D5,LCD_D6,LCD_D7);
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
#include <IoTkit.h> // include IoTkit.h to use the Intel IoT Kit
#include <Ethernet.h> // must be included to use IoTkit
IoTkit iotkit;
float temperature1;
int pressure1;
int moisturevalue1;
bool led1,relay1;
void setup() {
iotkit.begin();
Serial.begin(9600);
bmp.begin();
lcd.begin (20,4);
lcd.setBacklightPin(BACKLIGHT,NEGATIVE);
lcd.setBacklight(HIGH);
lcd.home ();
lcd.setCursor ( 0, 0 );
lcd.print("Edison. Habrahabr");
pinMode(8, OUTPUT);
digitalWrite(8, !false);
pinMode(9, OUTPUT);
digitalWrite(9, false);
iotkit.send("led1", 0);
iotkit.send("relay1", 0);
}
void loop() {
lcd.setCursor ( 0, 1 );
lcd.print("Tempera. = ");
lcd.print(bmp.readTemperature());
lcd.print(" *C");
lcd.setCursor ( 0, 2 );
lcd.print("Pressure = ");
lcd.print(bmp.readPressure());
lcd.print(" Pa");
lcd.setCursor ( 0, 3 );
lcd.print("Moisture Value = ");
lcd.print(analogRead(0));
temperature1=bmp.readTemperature();
pressure1=bmp.readPressure();
moisturevalue1=analogRead(0);
Serial.println("Sensors");
Serial.print("temperature1=");
Serial.println(temperature1);
iotkit.send("temperature1", temperature1);
delay(2000);
Serial.print("pressure1=");
Serial.println(pressure1);
iotkit.send("pressure1", pressure1);
delay(2000);
Serial.print("moisturevalue1=");
Serial.println(moisturevalue1);
moisturevalue1=20;
iotkit.send("moisturevalue1", moisturevalue1);
iotkit.receive(callback);
delay(1000);
}
void callback(char* json) {
Serial.println(json);
aJsonObject* parsed = aJson.parse(json);
if (&parsed == NULL) {
Serial.println("recieved invalid JSON");
return;
}
aJsonObject* component = aJson.getObjectItem(parsed, "component");
aJsonObject* command = aJson.getObjectItem(parsed, "command");
aJsonObject* argv = aJson.getObjectItem(parsed, "argv");
aJsonObject* argvArray = argv->child;
aJsonObject* name = argvArray->child;
aJsonObject* value = name->next;
if ((component != NULL)) {
if (strcmp(component->valuestring, "led1") == 0) {
if ((command != NULL)) {
if (strcmp(command->valuestring, "LED.v1.0") == 0 && strcmp(value->valuestring, "0") == 0) {
Serial.println("Light Off!");
digitalWrite(8, !false);
iotkit.send("led1", 0);
}
if (strcmp(command->valuestring, "LED.v1.0") == 0 && strcmp(value->valuestring, "1") == 0) {
Serial.println("Light on!");
digitalWrite(8, !true);
iotkit.send("led1", 0);
}
}
}
}
if ((component != NULL)) {
if (strcmp(component->valuestring, "relay1") == 0) {
if ((command != NULL)) {
if (strcmp(command->valuestring, "RELAY.v1.0") == 0 && strcmp(value->valuestring, "0") == 0) {
Serial.println("Relay Off!");
digitalWrite(9, false);
iotkit.send("relay1", 0);
}
if (strcmp(command->valuestring, "RELAY.v1.0") == 0 && strcmp(value->valuestring, "1") == 0) {
Serial.println("Relay on!");
digitalWrite(9, true);
iotkit.send("relay1", 0);
}
}
}
}
}
Envío deequipos de administración Envíe equipos de administración desde la nube Intel IoT Analytics. Abre la sección de Control . Elija un dispositivo y componente.
Agregue acciones para encender y apagar el LED. Después de completar los campos, haga clic en el botón Agregar acción.
Hacemos lo mismo para los relevos. Como resultado, aparecen cuatro entradas en la tabla. Para encender el LED, seleccione la última línea y haga clic en el enlace Enviar .
Después de un par de segundos, el LED se encenderá.
En resumen, laadministración de dispositivos no es más complicada que recibir datos de sensores. El desarrollador debe analizar la solicitud entrante en formato JSON y aplicar la lógica adecuada.Referencias- Bosquejo de listado de código de IoTkit
- github.com - enableiotcom
- Guía de inicio de Edison - Windows
- Intermitente Intel Edison (cableado) - Windows
- Cloud Intel IoT Analytics
- Intel Internet of Things (IoT) Developer Kit IoT Cloud-Based Analytics Guía del usuario Noviembre de 2014