ESP-WROOM-02에서 Zabbix 서버로 Zabbix sender 프로토콜로 데이터 보내기
18276 단어 ArduinozabbixESP8266ESP-WROOM-02
소개
zabbix_sender 명령에서 서버로 데이터를 전송하는 데 사용되는 프로토콜은 비교적 간단하며 네트워크에 연결할 수있는 마이크로 컴퓨터이면 충분히 구현할 수 있습니다.
이 프로토콜을 ESP-WROOM-02인 모듈과 조합하면 각종 센서의 데이터를 Zabbix 서버로 수집하는 디바이스를 손쉽게 만들 수 있을 것 같았으므로, 우선은 Zabbix sender 프로토콜의 구조로 서버에 값을 등록할 수 있는 곳까지 시도 시도했습니다.
이 문서의 예에서는 Zabbix 3.0에서 구현 된 통신 암호화를 지원하지 않습니다.
본고의 내용을 실제로 시험할 때는 충분히 신용이 있는 네트워크내에서 실행하는 것을 추천합니다.
환경
소스 코드
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();
}
}
서버측 설정
#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();
}
}
※호스트명, 아이템 키는 소스 코드내에서 설정하고 있는 것에 가지런히 한다
실제로 해본 모습
증분되는 수치가 1분 간격으로 서버에 등록되는 곳까지 할 수 있었습니다.
결론
조금 전 I2C 접속의 센서를 몇개인가 포치했으므로, 그들이 도착하는 대로 위의 내용과 조합해 보고 싶습니다.
참고
조금 전 I2C 접속의 센서를 몇개인가 포치했으므로, 그들이 도착하는 대로 위의 내용과 조합해 보고 싶습니다.
참고
Reference
이 문제에 관하여(ESP-WROOM-02에서 Zabbix 서버로 Zabbix sender 프로토콜로 데이터 보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mutz0623/items/2c7eae0f762d760875bb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)