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 Implementacion de sistema de monitoreo de temepratura y humedad con sensor DHT22 y
agente Zabbix. agente Zabbix.
Version: 0.7 Version: 0.8 - Implementacion de funcion zbx_print() para enviar el mensaje con protocolo Zabbix
Fecha: 02/07/2019 Fecha: 04/07/2019
- Monitor de temperatura y humedad con implementación de agente Zabbix - Monitor de temperatura y humedad con implementación de agente Zabbix
Mas informacion: https://pablo.sarubbi.com.ar 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. El Sketch usa 19194 bytes (59%) 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. 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 #define DEBUG_SERVICE
...@@ -18,11 +17,11 @@ Las variables Globales usan 714 bytes (34%) de la memoria dinámica, dejando 133 ...@@ -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 #include <DHT.h> // Libreria que implementa de manera sencilla la lectura del sensor de temperatura/humedad
String zbx_cmd =""; String zbx_cmd ="";
static const byte zbx_head[5] = { 'Z', 'B', 'X', 'D', 0x01 }; // ZBXD\1
EthernetServer zServer(10050); EthernetServer zServer(10050);
static byte mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE}; 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 PIN_DHT 9 // Nro. de pin donde se encuentra conectado el sensor
#define DHTTYPE DHT22 // Modelo de sensor, puede ser DHT11, DHT21 o DHT22 #define DHTTYPE DHT22 // Modelo de sensor, puede ser DHT11, DHT21 o DHT22
...@@ -58,49 +57,42 @@ void loop() { ...@@ -58,49 +57,42 @@ void loop() {
} }
EthernetClient zClient = zServer.available(); EthernetClient zClient = zServer.available();
if (zClient) { if (zClient) {
if (zClient.available() > 0) { if (zClient.available() > 0) {
char thisChar = zClient.read(); char thisChar = zClient.read();
if( thisChar == 0x01 ) { if( thisChar == 0x01 ) { // Busco un byte en 1 como separador del header y el lenght del mensaje
thisChar = zClient.read(); thisChar = zClient.read(); //
for (int i = 0; i < 7; i++){ for (int i = 1; i < 8; i++){
zClient.read(); zClient.read();
} }
for ( int i = int (thisChar); i > 0; i--){ for ( int i = int (thisChar); i > 0; i--){
thisChar = zClient.read(); thisChar = zClient.read();
zbx_cmd += thisChar; zbx_cmd += thisChar;
} }
if(zbx_cmd.indexOf("agent.ping") >= 0) { if(zbx_cmd.indexOf("agent.ping") >= 0) {
byte zbx_msg[9] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31}; byte zbx_msg[1] = {0x31};
zServer.write(zbx_head,5); zbx_print(zbx_msg, sizeof(zbx_msg));
zServer.write(zbx_msg,9);
} else if(zbx_cmd.equals("agent.hostname")) { } else if(zbx_cmd.equals("agent.hostname")) {
zServer.write(zbx_head,5); byte zbx_msg[14] = { 'A', 'r', 'd', 'u', 'i', 'n', 'o', '_', 'S', 'e', 'n', 's', 'o', 'r' };
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' }; zbx_print(zbx_msg, sizeof(zbx_msg));
zServer.write(zbx_msg,22); } else if(zbx_cmd.equals("agent.version")) {
} else if(zbx_cmd.equals("agent.version")) { byte zbx_msg[4] = { '0', '.', '7', '0'};
zServer.write(zbx_head,5); zbx_print(zbx_msg, sizeof(zbx_msg));
byte zbx_msg[12] = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '0', '.', '7', '0'};
zServer.write(zbx_msg,12);
} else if(zbx_cmd.equals("dht.temperature")) { } else if(zbx_cmd.equals("dht.temperature")) {
char zbx_msg[8]; char zbx_msg[8];
dtostrf(temperature, 6, 2, zbx_msg); dtostrf(temperature, 6, 2, zbx_msg);
byte zbx_len[8] = {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; int len = sizeof(zbx_msg);
zServer.write(zbx_head,5); zbx_print(zbx_msg, sizeof(zbx_msg));
zServer.write(zbx_len,8);
zServer.write(zbx_msg,8);
} else if(zbx_cmd.equals("dht.humidity")) { } else if(zbx_cmd.equals("dht.humidity")) {
char zbx_msg[8]; char zbx_msg[8];
dtostrf(humidity, 6, 2, zbx_msg); dtostrf(humidity, 6, 2, zbx_msg);
byte zbx_len[8] = {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; zbx_print(zbx_msg, sizeof(zbx_msg));
zServer.write(zbx_head,5);
zServer.write(zbx_len,8);
zServer.write(zbx_msg,8);
} else { // ZBX_NOTSUPPORTED } else { // ZBX_NOTSUPPORTED
zServer.write(zbx_head,5); 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', '.' };
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', '.' }; zbx_print(zbx_msg, sizeof(zbx_msg));
zServer.write(zbx_msg,46);
} }
zClient.stop(); zClient.stop();
zbx_cmd =""; zbx_cmd ="";
...@@ -109,4 +101,22 @@ void loop() { ...@@ -109,4 +101,22 @@ void loop() {
} }
} }
delay(1); delay(1);
} }
\ No newline at end of file
/*
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