Sida 1 av 1
JSON encoding på arduino (ESP8266) (Löst med komplett kod)
Postat: 8 augusti 2015, 15:03:50
av swapper
Hej!
skulle behöva lite hjälp med JSON encoding på arduino
använder detta library för att encoda json
https://github.com/bblanchon/ArduinoJson
https://github.com/bblanchon/ArduinoJson/wiki/Examples
outputen skall vara anpassad som indata till zabbix
de tester jag gjort med zabbix-send ger att enklaste OK utdata skall se ut så här
Kod: Markera allt
{"request":"sender data","data":[{"host":"House","key":"temp","value":"35"}]}
https://www.zabbix.com/documentation/1. ... cols/agent
den kod jag lyckats göra är denna:
Kod: Markera allt
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["request"] = "sender data";
JsonObject& data = root.createNestedObject("data");
data["host"] = "House";
data["key"] = "temp";
data["value"] = temp;
dock ger den en output som inte stämmer helt, troligen då jag inte förstått JSON konceptet helt (därav jag frågar här om hjälp)
Kod: Markera allt
{"request":"sender data","data":{"host":"House","key":"temp","value":25.12}}
som ni ser fattas jag [] tecknen.
någon som har tid och ork att ge lite feedback så skulle det vara mycket uppskattat.
projektet är till ESP8266 templogger > zabbix
Re: JSON encoding på arduino (ESP8266)
Postat: 8 augusti 2015, 16:02:00
av Norberg
[] är syntax för en array i JSON.
Så det
Kod: Markera allt
"data":[{"host":"House","key":"temp","value":"35"}]
betyder är att värdet för nycklen "data" är en array av object av typen:
Kollade lite snabbt på exmplen för JSON bibliotektet du använder och en array verkar man skapa på följande sätt:
Kod: Markera allt
JsonArray& data = root.createNestedArray("data");
Sedan borde du kunna lägga till det objektet du vill ha i din array med data.createNestedObject()
Re: JSON encoding på arduino (ESP8266)
Postat: 8 augusti 2015, 19:51:00
av swapper
Tack!
Det fick mig att kolla på rätt ställen, var inne på array men fick inte rätt på hur man skulle få till namnen på värdena.
Har nu lyckats få den att generera JSON och trycka in dessa till min zabbix server.
Kanske någon annan är intresserad av koden, allt som behövs är 1st ESP8266 och 1st DS18b20 på pin 2.
Har inte långtidstestat detta så inget ansvar för funktionen
Kod: Markera allt
/*
To try it out: In zabbix configure a host named "House" with an item called "temp" and key "temp"
Set Type to Numeric (float)
Units = C
*/
#include <ESP8266WiFi.h>
#include <Base64.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ArduinoJson.h>
//AP definitions
#define AP_SSID "ssid"
#define AP_PASSWORD "pass"
// EasyIoT server definitions
#define ZABBIX_IP_ADDRESS "192.168.1.101" //IPadress to zabbix server
#define ZABBIX_PORT 10051 //default zabbix port=10051
#define ZABBIX_KEY "temp" //Key in zabbix
#define REPORT_INTERVAL 10 // in sec
#define ONE_WIRE_BUS 2 // DS18B20 pin on the ESP8266
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
char host[] = "House"; // hostname in zabbix
char key1[] = "temp"; // item key in zabbix
float oldTemp;
float temp;
char tozabbix[400];
void setup() {
Serial.begin(115200);
wifiConnect();
}
void loop() {
float temp;
do {
DS18B20.requestTemperatures();
temp = DS18B20.getTempCByIndex(0);
Serial.print("Temperature: ");
Serial.println(temp);
} while (temp == 85.0 || temp == (-127.0));
if (temp != oldTemp)
{
sendTeperature(temp);
oldTemp = temp;
}
int cnt = REPORT_INTERVAL;
while(cnt--)
delay(1000);
}
void wifiConnect()
{
Serial.print("Connecting to AP");
WiFi.begin(AP_SSID, AP_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void sendTeperature(float temp)
{
WiFiClient client;
while(!client.connect(ZABBIX_IP_ADDRESS, ZABBIX_PORT)) {
Serial.println("zabbix connection failed");
wifiConnect();
}
StaticJsonBuffer<400> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["request"]="sender data";
JsonArray& data = root.createNestedArray("data");
{
JsonObject& zabbix = data.createNestedObject();
zabbix.add("host") = "House";
zabbix.add("key") = "temp";
zabbix.add("value", temp);
}
Serial.println("Connected with zabbix , sending info");
Serial.println();
root.printTo(Serial);
root.printTo(tozabbix, sizeof(tozabbix)); //JSON library messes with zabbix so need to send all in 1 go.
client.print(tozabbix); //JSON lib messes with zabbix so need to send all in 1 go.
delay(1);
delay(100);
while(client.available()){
String line = client.readStringUntil('\r');
Serial.println();
Serial.println("Response from server:");
Serial.print(line);
delay(100);
client.stop();
}
Serial.println();
Serial.println("Connection closed");
}