Термометр для Забикс

ardi3434
Offline
Зарегистрирован: 16.01.2022

Здравствуйте.

https://habr.com/ru/post/405077/ сделал по этой статье. вроде все работает

но если зайти телнетом то ардуино виснет.

 

ardi3434
Offline
Зарегистрирован: 16.01.2022
#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();
  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А что она должна делать, когда заходишь телнетом?

ardi3434
Offline
Зарегистрирован: 16.01.2022

убрал строку 66 и 67 работает и через телнет

 

ardi3434
Offline
Зарегистрирован: 16.01.2022

"ZBX_NOTSUPPORTED"

ardi3434
Offline
Зарегистрирован: 16.01.2022

sadman41 пишет:

А что она должна делать, когда заходишь телнетом?

"ZBX_NOTSUPPORTED" должна ввыводить. и выводит после того как убрал строки 

sadman41
Offline
Зарегистрирован: 19.10.2016

Подозреваю, что вскоре начнет вешаться при работе без .stop()

ardi3434
Offline
Зарегистрирован: 16.01.2022

sadman41 пишет:

Подозреваю, что вскоре начнет вешаться при работе без .stop()

так точно( проблему не решило.

подскажите как решить задачу. если телнетом оправлять на 10050 порт мусор что он его фильтровал а не вешался

sadman41
Offline
Зарегистрирован: 19.10.2016

Проще взять готовое: https://github.com/zbx-sadman/zabbuino

Ставить в продакшн устройство на ENC28J60, да ещё вдобавок использующее String смысла не вижу.