ESP-WROOM-02에서 Zabbix 서버로 Zabbix sender 프로토콜로 데이터 보내기

소개



zabbix_sender 명령에서 서버로 데이터를 전송하는 데 사용되는 프로토콜은 비교적 간단하며 네트워크에 연결할 수있는 마이크로 컴퓨터이면 충분히 구현할 수 있습니다.
이 프로토콜을 ESP-WROOM-02인 모듈과 조합하면 각종 센서의 데이터를 Zabbix 서버로 수집하는 디바이스를 손쉽게 만들 수 있을 것 같았으므로, 우선은 Zabbix sender 프로토콜의 구조로 서버에 값을 등록할 수 있는 곳까지 시도 시도했습니다.

이 문서의 예에서는 Zabbix 3.0에서 구현 된 통신 암호화를 지원하지 않습니다.
본고의 내용을 실제로 시험할 때는 충분히 신용이 있는 네트워크내에서 실행하는 것을 추천합니다.

환경


  • Zabbix 서버
  • Zabbix 3.0.4 (CentOS7.2)

  • ESP-WROOM-02 모듈
  • 스위치 과학 ESPr Developer

  • Arduino IDE
  • 버전 1.6.10


  • 소스 코드



    ESP8266_zabbix-sender
    #include <ESP8266WiFi.h>
    #include <Ticker.h>
    #include <ArduinoJson.h>
    
    const char* ssid     = "YourAccessPointName";
    const char* password = "YourAccessPointPassword";
    const char* zbx_server = "YourZabbixServerIPaddr";
    
    Ticker ticker;
    bool readyForTicker = false;
    
    void setReadyForTicker() {
      // A flag
      readyForTicker = true;
    }
    
    int value = 0;
    void doBlockingIO() {
    
      uint64_t payloadsize ;
    
      // dummy value increment
      ++value;
    
      // create "zabbix sender format" json data for sending zabbix server
      StaticJsonBuffer<200> jsonBuffer;
      JsonObject& root = jsonBuffer.createObject();
      root["request"] = "sender data";
    
      JsonArray& data = root.createNestedArray("data");
    
      JsonObject& item = jsonBuffer.createObject();
      item["host"] = "Home Network";
      item["key"] = "test";
      item["value"] = value;
      data.add(item);
    
      /*
        // zabbix sender can send more items at once
        JsonObject& item2 = jsonBuffer.createObject();
        item2["host"] = "Home Network";
        item2["key"] = "test2";
        item2["value"] = "hello";
        data.add(item2);
      */
    
      Serial.println();
      Serial.println("== request  ================");
      root.printTo(Serial);
    
      Serial.println("");
      Serial.println("============================");
      char buffer[256];
      root.printTo(buffer, sizeof(buffer));
      Serial.print("payload json size: ");
      Serial.println(strlen(buffer));
      Serial.println("============================");
    
    
      //////////////////////////////
      // connect to zabbix server
      Serial.print("connecting to ");
      Serial.println(zabbix_server);
    
      // Use WiFiClient class to create TCP connections
      WiFiClient client;
      const int zabbixPort = 10051 ;
      if (!client.connect(zabbix_server, zabbixPort)) {
        Serial.println("connection failed");
        return;
      }
    
    
      //////////////////////////////
      // send the zabbix_sender's format data to server
    
      // send fixed header to zabbix server
      client.print(String("ZBXD") );
      client.write(0x01);
    
      // send json size to zabbix server
      payloadsize = strlen(buffer);
      for (int i = 0; i < 64; i += 8) {
        client.write(lowByte(payloadsize >> i));
      }
    
      // send json to zabbix server
      client.print(buffer);
      //////////////////////////////
    
    
      unsigned long timeout = millis();
      while (client.available() == 0) {
        if (millis() - timeout > 5000) {
          Serial.println(">>> Client Timeout !");
          client.stop();
          return;
        }
      }
    
      // Read all the lines of the reply from server and print them to Serial
      while (client.available()) {
        String line = client.readStringUntil('\r');
        Serial.println("== response ================");
        Serial.print(line);
        Serial.println("");
        Serial.println("============================");
      }
    
      Serial.println();
      Serial.println("closing connection");
    
      // Drop the flag
      readyForTicker = false;
    }
    
    void setup() {
      Serial.begin(115200);
      delay(10);
    
      // We start by connecting to a WiFi network
    
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
    
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    
    
      // call setReadyForTicker() every 60 seconds
      ticker.attach(60, setReadyForTicker);
    }
    
    void loop() {
      if (readyForTicker) {
        doBlockingIO();
      }
    }
    

    서버측 설정


  • Zabbix 서버의 웹 UI에서 "Home Network"라는 호스트를 만듭니다
  • Zabbix 트래퍼 유형의 test라는 키 항목을 만듭니다

  • ※호스트명, 아이템 키는 소스 코드내에서 설정하고 있는 것에 가지런히 한다



    실제로 해본 모습



    증분되는 수치가 1분 간격으로 서버에 등록되는 곳까지 할 수 있었습니다.


    결론



    조금 전 I2C 접속의 센서를 몇개인가 포치했으므로, 그들이 도착하는 대로 위의 내용과 조합해 보고 싶습니다.

    참고


  • ESP-WROOM-02의 기본 사용법
  • htp://t 등 c. 슈 tch-s 시엔세. 코 m / ぃき / 에 sp_에서 v_
  • ぃ tp // 코 m / 아즈사 9 / ms / 264165005

  • 일정 시간마다 처리하는 방법
  • htps //w w. sg bs. jp / 에스 푸 w 로오 me 02 - 치 c 케 r /

  • ArduinoJson 라이브러리 사용법
  • http://hawksnowlog.tumblr.com/post/141582097010/arduino-%E3%81%A7-json-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9% E3%83%AA%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F

  • Zabbix sender 프로토콜 내용
  • h tp // w w. s에서 멋지다. 네 t / B ㅅ 스카이에서 c와 r / 쟈비 x - 메에 친 g - 20101218022 - 타카리 스즈키

  • WiFiClient 샘플 프로그램
  • 좋은 웹페이지 즐겨찾기