แยก JSON ด้วย arduino เพื่อเปิดไฟ LED


18

สวัสดีฉันพยายามแยก JSON resposne จากเว็บเซิร์ฟเวอร์ใน arduino ของฉันเพื่อเปิดและปิดไฟ LED ฉันกำลังใช้ตัวอย่างการทำซ้ำไคลเอนต์ wifi เพื่อขอรับเซิร์ฟเวอร์ของฉัน:

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 ของการตอบสนองนี้เท่านั้นเพื่อให้ฉันสามารถใช้เพื่อควบคุม LED ของฉันได้อย่างไร

ขอบคุณ

คำตอบ:


11

ฉันตระหนักถึงการแยก JSON ห้องสมุดสำหรับ Arduino

ฉันไม่เคยใช้สิ่งเหล่านี้เลย แต่ฉันได้ทำการแยก 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);

รหัสนี้ตั้งค่าstartเริ่มต้นของid":"อักขระ +5 ในสายอักขระ มันเป็น 5 เพราะเห็นว่าเป็นวิธีที่ยาวid":"เป็น ดังนั้นstartชี้ไปที่TEST1ในสตริง JSON ในระบบของฉัน ID จะถูกเสมอไปเป็น 5 start + 5ตัวอักษรเพื่อให้สิ้นสุด จากนั้นฉันก็ใช้substringเพื่อสกัด

อีกครั้งก่อนที่ทุกคนจะเริ่มลงคะแนนให้ฉันสำหรับโซลูชันที่น่ากลัวนี้: หากคุณรู้ว่าคุณกำลังทำงานอะไรอยู่และเข้าใจข้อ จำกัด ของรหัสนี้ มันเป็นทางออกที่ทำให้งานเสร็จ


ตัวอย่าง JSON ที่คุณให้ดูเหมือนว่า "ดี" JSON เช่นค่าตัวเลขไม่ควรยกมาเป็นสตริง
jfpoilpret

+1 สำหรับรายการไลบรารีที่สามารถใช้งานได้สำหรับ JSON ฉันแปลกใจที่ไม่มีไลบรารี่ใดที่ใช้ฟังก์ชั่นการโทรกลับซึ่งจะถูกเรียกในระหว่างการแยกวิเคราะห์
jfpoilpret

อย่างน้อยคุณก็ทราบว่าตัวอย่างโค้ดของคุณนั้นแย่มาก :-) แน่นอนว่ามันทำให้งานเสร็จ แต่ก็ไม่สามารถอ่านได้
jfpoilpret

@jfpoilpret ฉันจำชิปไม่ได้ดังนั้นฉันต้องตัดมุมในบางที่ อย่างน้อยก็แสดงความคิดเห็นอย่างหนัก
sachleen

ฉันเข้าใจ; แต่ฉันสงสัยว่าStringการใช้งานไม่ได้ทำให้สถานการณ์หน่วยความจำแย่ลง (ใช่Stringใน Arduino คือสัตว์เลี้ยงของฉัน)
jfpoilpret

7

ฉันได้โปรแกรมชั้นเรียนที่จะได้รับถ่านโดยเอกสาร JSON ถ่าน มันจะเก็บไว้ในหน่วยความจำเพียงไม่กี่ไบต์สำหรับโครงสร้าง JSON ที่รู้จักกันโดยใช้เครื่องสถานะและผลลัพธ์ที่คุณต้องการ ดังนั้นคุณสามารถสอบถามคลาสสำหรับผลลัพธ์ที่คุณต้องการและจะประมวลผล 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

รหัสที่มาอยู่ที่นี่ใน Biicode


2

ฉันเขียนโปรแกรมแยกวิเคราะห์สำหรับ PIC ที่มีหน่วยความจำต่ำมากเพราะใช้งานได้โดยตรงกับตัวชี้ถ่านและไม่สร้างโครงสร้างต้นไม้ หากคุณขอให้รับไอเท็ม N ของรายการมันจะให้ตัวชี้ที่แท้จริงไปยังไฟล์ JSON โดยตรงที่ด้านขวาของไอเท็มเริ่มต้นของรายการ N จากนั้นคุณสามารถถามว่าประเภทของวัตถุที่เป็นตัวชี้ ฯลฯ เป็นรถบั๊กและไม่สนับสนุนลอยและฉันคิดว่ามีข้อ จำกัด อื่น ๆ (สองครั้งที่ผ่านมานาน) แต่มันทั้งหมดใน github: https://github.com / EternityForest / OpenFortune-Fortune-like-generator-generator คุณจะต้องดูใน libfortune ซึ่งเป็นส่วนหนึ่งของเวอร์ชั่น C


1

ฉันเขียนไลบรารี JSON-RPC อย่างง่าย (ด้านบนของ aJson) พร้อมตัวอย่างของวิธีเปิดใช้งาน led ด้วยการเรียกโพรซีเดอร์ JSON-RPC:


2
คุณสามารถเพิ่มข้อมูลบางอย่างมากขึ้นในคำตอบของคุณในกรณีที่การเชื่อมโยงการเปลี่ยนแปลงรหัส / เอกสาร ...
sachleen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.