एलईडी को चालू करने के लिए Arduino के साथ Parse JSON


18

हाय मैं अपने arduino में Webserver से JSON resposne पार्स करने की कोशिश कर रहा हूं ताकि एक एलईडी लाइट को चालू और बंद किया जा सके। मैं अपने सर्वर से अनुरोध प्राप्त करने के लिए वाईफाई क्लाइंट दोहराए जाने वाले उदाहरण का उपयोग कर रहा हूं:

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

यहाँ मैं धारावाहिक बंदरगाह से वापस मुद्रित किया जाता है

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

मैं इस प्रतिक्रिया के JSON भाग को केवल कैसे पार्स कर सकता हूं ताकि मैं इसे अपने एलईडी को नियंत्रित करने के लिए उपयोग कर सकूं?

धन्यवाद

जवाबों:


11

मैं Arduino के लिए कुछ JSON पार्सिंग पुस्तकालयों से अवगत हूं।

मैंने इनमें से किसी का भी कभी उपयोग नहीं किया है, लेकिन मैंने एक परियोजना में कुछ सरल JSON पार्सिंग की है जो मैं काम कर रहा हूं इसलिए मैं आपको दिखाऊंगा कि मैंने ऐसा कैसे किया।

नोट: मैं सॉफ्टवेयर सीरियल लाइब्रेरी का उपयोग करके सीरियल डेटा पढ़ रहा हूं। आपको अपने काम करने के लिए इस कोड को बदलना होगा। यह केवल बहुत ही सरल JSON स्ट्रिंग्स पर काम करेगा। यह बहुत सीमित है, लेकिन अगर यह सब आप पार्स कर रहे हैं तो यह काम करेगा।

सर्वर से JSON प्रतिक्रिया का उदाहरण:

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

सबसे पहले, केवल घुंघराले ब्रेस के बीच डेटा पढ़ें।

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);
}

यह कोड एक बार में एक बाइट डेटा को पढ़ता है और एक बार एक खुली ब्रेस मिलने के बाद, इसे इसमें सहेजना शुरू कर देता है response। जब इसे एक बंद कंस मिलता है, तो इसे समाप्त कर देता है। तो यहाँ एक स्पष्ट सीमा है, आप अपने तार में ब्रेसिज़ खोलने / बंद करने का केवल एक सेट कर सकते हैं।

एक बार स्ट्रिंग होने पर, मैं प्रासंगिक जानकारी निकालने indexOfऔर उपयोग substringकरने के लिए:

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

यह कोड स्ट्रिंग में + 5 वर्णों startकी शुरुआत के लिए सेट है id":"। यह +5 है क्योंकि यह कितना लंबा id":"है। तो JSON स्ट्रिंग में startइंगित TEST1करता है। मेरे सिस्टम में, ID हमेशा 5 वर्णों वाली होती है, इसलिए अंत होता है start + 5। मैं तो substringउस निकालने के लिए उपयोग करता हूं ।

दोबारा, इससे पहले कि कोई भी इस भयानक समाधान के लिए मुझे वोट देना शुरू करे: यदि आप जानते हैं कि आप वास्तव में क्या काम कर रहे हैं, और इस कोड की सीमाओं को समझते हैं, तो यह एक बुरा समाधान नहीं है। यह एक उपाय है जिससे काम पूरा हो जाता है।


JSON उदाहरण जो आपको देता है वह "अच्छा" JSON नहीं दिखता है, उदाहरण के लिए संख्यात्मक मानों को सामान्यतः स्ट्रिंग के रूप में उद्धृत नहीं किया जाना चाहिए।
jfpoilpret

JSON के लिए संभावित उपयोग योग्य पुस्तकालयों की सूची के लिए +1। मुझे आश्चर्य है कि कोई भी लाइब्रेरी कॉलबैक फ़ंक्शन के दृष्टिकोण पर आधारित नहीं है, जिसे पार्सिंग (बहुत अधिक कुशल मेमोरी-वार) के दौरान कहा जाएगा।
jfpoilpret

कम से कम आप सचेत हैं कि आपका कोड नमूना भयानक है :-) निश्चित रूप से यह काम पूरा कर लेता है, लेकिन यह पठनीय नहीं है (किसी और के द्वारा 6 महीने में भी अपने आप को qnd) और इसलिए बनाए रखने योग्य नहीं है।
jfpoilpret

@jfpoilpret मैं चिप पर मेमोरी से बाहर हूं इसलिए मुझे कुछ जगहों पर कोनों को काटना पड़ा है। कम से कम इसकी भारी टिप्पणी की गई है।
साकलेन

मै समझता हुँ; लेकिन मुझे आश्चर्य है कि अगर Stringउपयोग से मेमोरी की स्थिति खराब नहीं होती है (हाँ, StringArduino में मेरा पालतू पेशाब है)।
jfpoilpret

7

मैंने एक वर्ग को क्रमादेशित किया है जो JSON दस्तावेज़ द्वारा char प्राप्त करेगा। यह केवल एक स्टेट मशीन का उपयोग करके ज्ञात JSON संरचना और आपके लिए आवश्यक परिणामों के लिए कुछ बाइट्स मेमोरी में स्टोर करेगा। इसलिए आप अपने इच्छित परिणामों के लिए कक्षा को क्वेरी कर सकते हैं और JSON को प्रोसेस करेंगे।

अपने उद्देश्य के लिए इसका आदर्श। मैंने एक मौसम सेवा से जुड़ने के लिए उपयोग किया है जो एक रिटर्न देता है:

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;

इस ब्लॉग पोस्ट को अभी मैंने लिखा है: http://web.biicode.com/blog/big-json-on-arduino

स्रोत कोड यहाँ बायिकोड में है।


2

मैंने PIC के लिए एक पार्सर लिखा है जिसमें बहुत कम रैम का उपयोग किया गया है क्योंकि यह चार पॉइंटर्स के साथ सीधे काम करता है और एक पेड़ की संरचना का निर्माण नहीं करता है। यदि आप किसी सूची का आइटम N प्राप्त करने के लिए कहते हैं, तो यह आपको सूची के आइटम N के प्रारंभ में सीधे JSON फ़ाइल में एक वास्तविक पॉइंटर देता है। फिर आप पूछ सकते हैं कि सूचक किस प्रकार की वस्तु का प्रतिनिधित्व करता है, आदि। यह छोटी गाड़ी है और तैरने का समर्थन नहीं करता है और मुझे लगता है कि कुछ अन्य सीमाएं हैं (एक लंबे समय पहले) लेकिन यह सब github पर है: https://github.com / EternityForest / OpenFortune-fortune-like-text-जनरेटर आपको libfortune में देखना होगा जो C संस्करण का हिस्सा है।


1

मैंने एक साधारण JSON-RPC लाइब्रेरी (aJson के ऊपर) लिखी, जिसमें JSON-RPC प्रक्रिया कॉल के साथ एक लीड को चालू करने का तरीका बताया गया है:


2
क्या आप अपने उत्तर में कुछ और जानकारी जोड़ सकते हैं यदि कोड / दस्तावेज़ीकरण में बदलाव के लिए लिंक ...
sachleen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.