Commit 08faa0f5 authored by Juan Pablo Sarubbi's avatar Juan Pablo Sarubbi

Replace DHT22-Zbx.ino

parent ef945bc8
/**************************************************************************************
/******************************************************************************************************
Implementacion de sistema de monitoreo de temepratura y humedad con sensor DHT22 y
agente Zabbix.
Version: 0.7
Fecha: 02/07/2019
Version: 0.8 - Implementacion de funcion zbx_print() para enviar el mensaje con protocolo Zabbix
Fecha: 04/07/2019
- Monitor de temperatura y humedad con implementación de agente Zabbix
Mas informacion: https://pablo.sarubbi.com.ar
**************************************************************************************/
*******************************************************************************************************
/*
El Sketch usa 16274 bytes (50%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
Las variables Globales usan 714 bytes (34%) de la memoria dinámica, dejando 1334 bytes para las variables locales. El máximo es 2048 bytes.
El Sketch usa 19194 bytes (59%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
Las variables Globales usan 666 bytes (32%) de la memoria dinámica, dejando 1382 bytes para las variables locales. El máximo es 2048 bytes.
*/
#define DEBUG_SERVICE
......@@ -18,11 +17,11 @@ Las variables Globales usan 714 bytes (34%) de la memoria dinámica, dejando 133
#include <DHT.h> // Libreria que implementa de manera sencilla la lectura del sensor de temperatura/humedad
String zbx_cmd ="";
static const byte zbx_head[5] = { 'Z', 'B', 'X', 'D', 0x01 }; // ZBXD\1
EthernetServer zServer(10050);
static byte mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE};
static byte ip[4] = {192, 168, 1, 2};
static byte ip[4] = {10, 10, 0, 76};
#define PIN_DHT 9 // Nro. de pin donde se encuentra conectado el sensor
#define DHTTYPE DHT22 // Modelo de sensor, puede ser DHT11, DHT21 o DHT22
......@@ -58,49 +57,42 @@ void loop() {
}
EthernetClient zClient = zServer.available();
if (zClient) {
if (zClient.available() > 0) {
char thisChar = zClient.read();
if( thisChar == 0x01 ) {
thisChar = zClient.read();
for (int i = 0; i < 7; i++){
if( thisChar == 0x01 ) { // Busco un byte en 1 como separador del header y el lenght del mensaje
thisChar = zClient.read(); //
for (int i = 1; i < 8; i++){
zClient.read();
}
for ( int i = int (thisChar); i > 0; i--){
thisChar = zClient.read();
zbx_cmd += thisChar;
}
if(zbx_cmd.indexOf("agent.ping") >= 0) {
byte zbx_msg[9] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31};
zServer.write(zbx_head,5);
zServer.write(zbx_msg,9);
byte zbx_msg[1] = {0x31};
zbx_print(zbx_msg, sizeof(zbx_msg));
} else if(zbx_cmd.equals("agent.hostname")) {
zServer.write(zbx_head,5);
byte zbx_msg[22] = { 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'A', 'r', 'd', 'u', 'i', 'n', 'o', '_', 'S', 'e', 'n', 's', 'o', 'r' };
zServer.write(zbx_msg,22);
byte zbx_msg[14] = { 'A', 'r', 'd', 'u', 'i', 'n', 'o', '_', 'S', 'e', 'n', 's', 'o', 'r' };
zbx_print(zbx_msg, sizeof(zbx_msg));
} else if(zbx_cmd.equals("agent.version")) {
zServer.write(zbx_head,5);
byte zbx_msg[12] = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '0', '.', '7', '0'};
zServer.write(zbx_msg,12);
byte zbx_msg[4] = { '0', '.', '7', '0'};
zbx_print(zbx_msg, sizeof(zbx_msg));
} else if(zbx_cmd.equals("dht.temperature")) {
char zbx_msg[8];
dtostrf(temperature, 6, 2, zbx_msg);
byte zbx_len[8] = {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
zServer.write(zbx_head,5);
zServer.write(zbx_len,8);
zServer.write(zbx_msg,8);
int len = sizeof(zbx_msg);
zbx_print(zbx_msg, sizeof(zbx_msg));
} else if(zbx_cmd.equals("dht.humidity")) {
char zbx_msg[8];
dtostrf(humidity, 6, 2, zbx_msg);
byte zbx_len[8] = {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
zServer.write(zbx_head,5);
zServer.write(zbx_len,8);
zServer.write(zbx_msg,8);
zbx_print(zbx_msg, sizeof(zbx_msg));
} else { // ZBX_NOTSUPPORTED
zServer.write(zbx_head,5);
byte zbx_msg[46] = { 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'Z', 'B', 'X', '_', 'N', 'O', 'T', 'S', 'U', 'P', 'P', 'O', 'R', 'T', 'E', 'D', 0x00, 'U', 'n', 's', 'u', 'p', 'p', 'o', 'r', 't', 'e', 'd', ' ', 'i', 't', 'e', 'm', ' ', 'k', 'e', 'y', '.' };
zServer.write(zbx_msg,46);
byte zbx_msg[38] = {'Z', 'B', 'X', '_', 'N', 'O', 'T', 'S', 'U', 'P', 'P', 'O', 'R', 'T', 'E', 'D', 0x00, 'U', 'n', 's', 'u', 'p', 'p', 'o', 'r', 't', 'e', 'd', ' ', 'i', 't', 'e', 'm', ' ', 'k', 'e', 'y', '.' };
zbx_print(zbx_msg, sizeof(zbx_msg));
}
zClient.stop();
zbx_cmd ="";
......@@ -110,3 +102,21 @@ void loop() {
}
delay(1);
}
/*
URL: https://www.zabbix.com/documentation/3.4/manual/appendix/protocols/header_datalen
4 Header and data length - Overview
Header and data length are present in response and request messages between Zabbix components. It is required to determine the length of message.
<HEADER> - "ZBXD\x01" (5 bytes)
<DATALEN> - data length (8 bytes). 1 will be formatted as 01/00/00/00/00/00/00/00 (eight bytes, 64 bit number in little-endian format)
To not exhaust memory (potentially) Zabbix protocol is limited to accept only 128MB in one connection.
*/
void zbx_print(byte my_msg[], int len_msg){
static const byte zbx_head[5] = { 'Z', 'B', 'X', 'D', 0x01 }; // ZBXD\1
byte my_len[8] = {len_msg, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
zServer.write(zbx_head,5);
zServer.write(my_len,8);
zServer.write(my_msg,len_msg);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment