Необходимые компоненты:
- Основа системы — Arduino UNO R3
- Модуль локальной сети (ethernet-shield W5100)
- И, собственно, цифровой датчик температуры на базе DS18B20
- Arduino IDE
Сборка устройства не составляет труда. Сетевой модуль надевается на основную плату «бутербродом», термодатчик припаивается к его пинам или через контактные штырьки. Подключение датчика: красный +5 В, чёрный — земля, жёлтый — данные; между +5V и Data припаиваем подтягивающий резистор 4,7 кОм.


После сборки аппаратной части переходим к программной.
Устройство будет работать в сети и притворяться заббикс-агентом, протокол обмена с заббикс-сервером описан в документации.
Для работы компонентов необходима библиотека microDS18B20.h


Код
#include <microDS18B20.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // random MAC
byte ip[] = { 192, 168, 29, 5 }; //ip
byte subnet[] = { 255, 255, 252, 0 };
String readString = String(64);
MicroDS18B20 <A4> ds;
EthernetServer server(10050); // Zabbix port
// Zabbix protocol description:
// https://www.zabbix.com/documentation/1.8/protocols
// https://www.zabbix.com/documentation/1.8/protocols/agent
void setup() {
delay(500);
// start the Ethernet connection:
Ethernet.begin(mac, ip, subnet);
server.begin();
}
void loop() {
byte l;
float celsius;
readString = "";
l = 0;
if (EthernetClient client = server.available())
{
while (client.connected()) {
if (client.available()) {
if (l < 63) {
char c = client.read();
readString.concat(c);
l = readString.length();
}
if ((l > 5) & (l == (byte)readString[5] + 13)) // end of query from zabbix server
{
String request = readString.substring(13);
if (request.endsWith("\n")) {
request.remove(request.length() - 1);
}
if (request.equals("agent.ping")) {
client.print("ZBXD\x01"); // reply header
byte replyBytes [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '1'}; //4 bytes - length, 4 - reserved, 1 - data
client.write(replyBytes, 9);
}
else
if (request.equals("env.temp")) {
ds.requestTemp();
delay(1000);
ds.readTemp();
celsius = ds.getTemp();
client.print("ZBXD\x01"); // reply header
byte replyBytes [] = {(byte) String(celsius).length(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //4 bytes - length, 4 - reserved
client.write(replyBytes, 8);
client.print(celsius);
}
else {
client.print("ZBXD\x01"); // reply header
byte replyBytes [] = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //4 bytes - length, 4 - reserved
client.write(replyBytes, 8);
client.print("ZBX_NOTSUPPORTED");
}
break;
}
}
}
delay(10);
client.stop();
}
}
После заливки кода в контроллер и подключения ethernet-кабеля проверяем из консоли:
$ zabbix_get -s 192.168.29.5 -k agent.ping
1
$ zabbix_get -s 192.168.29.5 -k env.temp
23.12
$ zabbix_get -s 192.168.29.5 -k bla-blah
ZBX_NOTSUPPORTED
В админке заббикса создаём новый хост с выбранным IP, в нём — два ключа(Элемента данных), Numeric (unsigned) agent.ping и Numeric (float) env.temp, наслаждаемся работой. Графики, триггеры — всё как обычно.
Питание устройства — через родной USB. Корпус — по желанию: подходящая пластиковая коробочка, термоусадка, синяя изолента.
Добавить комментарий