Добрый день.
На Ардуине был такой код (взято тут):
(на местном форуме странные теги, куда подевались переносы строк в коде - не знаю, самое важное в картинке)

Там самая для меня интересная строка вот эта:
if (c == '\n') // end of query from zabbix server
Она позволяла обрабатывать запросы от сервера Zabbix версии 3.2. Т.е. как только встречался символ переноса строки, агент понимался что это конец запроса и нужно давать ответ.
Тут описано что Server request для zabbix 3.2 имеет вид:
<item key>\n А вот тут написано что для zabbix 4.0 Server request имеет другой вид:
<item key> т.е. потерялся перенос строки. И как теперь переписать код для агента не могу понять. Подскажите, пожалуйста.
На Ардуине был такой код (взято тут):
Code:
#include <OneWire.h> #include <UIPEthernet.h> byte mac[] = { 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 }; // random MAC byte ip[] = { 192, 168, 4, 5 }; // IP address in local network String readString = String(20); byte addr[8]; OneWire ds(4); // DS18B20 at pin 4 EthernetServer server(10050); // Zabbix port void setup() { Ethernet.begin(mac, ip); server.begin(); ds.search(addr); } void loop() { byte data[2]; float celsius; readString = ""; if (EthernetClient client = server.available()) { while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n') // end of query from zabbix server { client.print("ZBXD\x01"); // response header if (readString == "agent.ping") { byte responseBytes [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '1'}; client.write(responseBytes, 9); } else if (readString == "env.temp") { ds.reset(); ds.select(addr); ds.write(0x44); // start conversion with regular (non-parasite!) power delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); // read Scratchpad data[0] = ds.read(); data[1] = ds.read(); int16_t raw = (data[1] << 8) | data[0]; celsius = (float)raw / 16.0; byte responseBytes [] = {(byte) String(celsius).length(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; client.write(responseBytes, 8); client.print(celsius); } else { byte responseBytes [] = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; client.write(responseBytes, 8); client.print("ZBX_NOTSUPPORTED"); } break; } else if (readString.length() < 20) { readString = readString + c; } } } delay(10); client.stop(); } }
Там самая для меня интересная строка вот эта:
if (c == '\n') // end of query from zabbix server
Она позволяла обрабатывать запросы от сервера Zabbix версии 3.2. Т.е. как только встречался символ переноса строки, агент понимался что это конец запроса и нужно давать ответ.
Тут описано что Server request для zabbix 3.2 имеет вид:
<item key>\n А вот тут написано что для zabbix 4.0 Server request имеет другой вид:
<item key> т.е. потерялся перенос строки. И как теперь переписать код для агента не могу понять. Подскажите, пожалуйста.
Comment