JSON encoding på arduino (ESP8266) (Löst med komplett kod)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
swapper
Inlägg: 1076
Blev medlem: 14 augusti 2012, 23:18:15
Ort: Helsingborg

JSON encoding på arduino (ESP8266) (Löst med komplett kod)

Inlägg 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
Senast redigerad av swapper 8 augusti 2015, 19:51:56, redigerad totalt 1 gång.
Norberg
Inlägg: 130
Blev medlem: 13 januari 2006, 19:03:39
Kontakt:

Re: JSON encoding på arduino (ESP8266)

Inlägg 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:

Kod: Markera allt

{"host":"House","key":"temp","value":"35"}
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()
Användarvisningsbild
swapper
Inlägg: 1076
Blev medlem: 14 augusti 2012, 23:18:15
Ort: Helsingborg

Re: JSON encoding på arduino (ESP8266)

Inlägg 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");
 }


Skriv svar