LED'i açmak için arduino ile JSON'u ayrıştırın


18

Merhaba ben bir LED ışık açmak ve kapatmak için arduino web sunucusundan JSON resposne ayrıştırmak çalışıyorum. Sunucuma bir get isteği yapmak için örnek yinelenen wifi istemci kullanıyorum:

http://arduino.cc/en/Tutorial/WiFiWebClientRepeating

Seri bağlantı noktasından geri yazdırdığım şey

connecting...
HTTP/1.1 200 OK
Date: Sun, 06 Apr 2014 01:14:37 GMT
Server: Apache
X-Powered-By: PHP/5.5.10
Cache-Control: no-cache
X-Frame-Options: SAMEORIGIN
Set-Cookie: expires=Sun, 06-Apr-2014 03:14:37 GMT; Max-Age=7200; path=/; httponly
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

19
{"lightstatus":"on"}
0

Bu yanıtı JSON bölümünü yalnızca LED'imi kontrol etmek için kullanabilmem için nasıl ayrıştırırım?

Teşekkürler

Yanıtlar:


11

Arduino için birkaç JSON ayrıştırma kütüphanesinin farkındayım.

Bunlardan hiçbirini hiç kullanmadım ama üzerinde çalıştığım bir projede basit JSON ayrıştırma yaptım, bu yüzden bunu nasıl yaptığımı göstereceğim.

NOT: Yazılım seri kitaplığını kullanarak seri verileri okuyorum. Sizin için çalışmak için bu kodu değiştirmeniz gerekir. Bu yalnızca çok basit JSON dizelerinde çalışır. O var çok sınırlı ama hepsi daha sonra ayrıştırma konum eğer o çalışacağız.

Sunucudan gelen JSON yanıtı örneği:

{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}

İlk olarak, sadece süslü ayraçlar arasındaki verileri okuyun.

String response = "";
bool begin = false;
while (SIM900.available() || !begin) {

    char in = SIM900.read();

    if (in == '{') {
        begin = true;
    }

    if (begin) response += (in);

    if (in == '}') {
        break;
    }

    delay(1);
}

Bu kod, verileri her seferinde bir bayt okur ve açık bir ayraç aldığında, bunu kaydetmeye başlar response. Bir kapanış ayracı aldığında bitirir. İşte açık bir sınırlama, dizenizde sadece bir set açma / kapama parantezi olabilir.

Bir kez dize var, ben indexOfve substringilgili bilgileri ayıklamak için kullanın ve :

start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);

Bu kod dizede + 5 karakterin startbaşına ayarlanır id":". +5 çünkü bu ne kadar sürüyor id":". Yani startiçin puan TEST1JSON dizesinde. Sistemimde, kimlik her zaman 5 karakter uzunluğunda olacak, böylece sonu start + 5. Sonra substringonu çıkarmak için kullanıyorum.

Yine, kimse bu korkunç çözüm için oy vermeye başlamadan önce: ne ile çalıştığınızı tam olarak biliyorsanız ve bu kodun sınırlarını anlarsanız, bu kötü bir çözüm değildir. Bu işi yapan bir çözüm.


Verdiğiniz JSON örneği "iyi" JSON gibi görünmüyor, örn. Sayısal değerler normalde dize olarak gösterilmemelidir.
jfpoilpret

JSON için potansiyel olarak kullanılabilir kitaplıkların listesi için +1. Hiçbir kütüphanenin ayrıştırma sırasında çağrılacak bir geri çağırma işlevi yaklaşımına (çok daha verimli bellek açısından) dayanmadığına şaşırdım.
jfpoilpret

En azından kod örneğinizin korkunç olduğunun bilincindesiniz :-) Tabii ki işi bitiriyor, ancak okunabilir değil (başka biri tarafından 6 ay içinde kendiniz bile) ve bu nedenle bakımı mümkün değil.
jfpoilpret

@jfpoilpret Çipte hafızam bitti, bu yüzden bazı yerlerde köşeler kesmek zorunda kaldım. En azından ağır yorumladı.
sachleen

Anlıyorum; ama Stringkullanımın hafıza durumunu daha da kötüleştirmediğini merak ediyorum (evet, StringArduino'da evcil hayvanım huysuzum).
jfpoilpret

7

Ben char tarafından JSON belgesi char alacak bir sınıf programladım. Bir durum makinesi ve ihtiyacınız olan sonuçları kullanarak bilinen JSON yapısı için sadece birkaç bayt bellekte depolar. Böylece istediğiniz sonuçları sınıfta sorgulayabilirsiniz ve JSON işleyecektir.

Amacınız için idealdir. Bir json döndüren bir hava durumu hizmetine bağlanmak için kullandım:

static const char* queries[] = { "list.0.deg", "list.0.weather.0.main"};
StreamJsonReader jsonreader(queries, 2); // 2 queries    
while(char c  =  read()){
      jsonreader.process_char(c);
}

cout << jsonreader.results[0] << endl;
cout << jsonreader.results[1] << endl;

Az önce yazdığım bu blog gönderisini kontrol edin: http://web.biicode.com/blog/big-json-on-arduino .

Kaynak kodu burada Biicode içinde.


2

Doğrudan char işaretçileriyle çalıştığı ve bir ağaç yapısı oluşturmadığı için çok düşük ram kullanımı olan PIC için bir ayrıştırıcı yazdım. Bir listenin N öğesini almanızı isterseniz, doğrudan JSON dosyasına listenin N öğesinin hemen başında gerçek bir işaretçi verir. Sonra işaretçinin temsil ettiği nesne türünü sorabilirsiniz, vb. Buggy ve şamandıraları desteklemiyor ve bence birkaç başka sınırlama var (uzun zaman önce twas) ama hepsi github'da: https://github.com / EternityForest / OpenFortune-fortune benzeri metin üreteci C sürümünün bir parçası olan libfortune bakmanız gerekecek.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.