এলইডি চালু করতে আরডুইনো সহ পার্সে জেএসএন


18

হাই, আমি একটি এলইডি লাইট চালু এবং বন্ধ করতে আমার আরডুইনোতে ওয়েবএসভার থেকে জেএসএন রেসোপনটি পার্স করার চেষ্টা করছি। আমি আমার সার্ভারে একটি অনুরোধ পাওয়ার জন্য ওয়াইফাই ক্লায়েন্টটির পুনরাবৃত্তি উদাহরণ ব্যবহার করছি:

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

আমি আরডুইনোর কয়েকটি JSON পার্সিং গ্রন্থাগার সম্পর্কে অবগত aware

আমি এর কোনটিই ব্যবহার করি নি তবে আমি যে প্রকল্পে কাজ করছি তাতে কিছু সাধারণ জেএসএন পার্সিং করেছি তাই আমি কীভাবে এটি করেছি তা আপনাকে দেখাব।

দ্রষ্টব্য: আমি সফ্টওয়্যার সিরিয়াল লাইব্রেরি ব্যবহার করে সিরিয়াল ডেটা পড়ছি। আপনার জন্য কাজ করার জন্য আপনাকে এই কোডটি পরিবর্তন করতে হবে। এটি কেবল খুব সাধারণ 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। আমার সিস্টেমে আইডিটি সর্বদা 5 টি অক্ষর হতে চলেছে তাই শেষ হয় start + 5। আমি তারপর substringএটি নিষ্কাশন করতে ব্যবহার ।

আবার, কেউ এই ভয়াবহ সমাধানের জন্য আমাকে ভোট দেওয়া শুরু করার আগে: আপনি কী নিয়ে কাজ করছেন তা যদি আপনি সঠিকভাবে জানেন এবং এই কোডটির সীমাবদ্ধতাগুলি বুঝতে পারেন তবে এটি কোনও খারাপ সমাধান নয়। এটি একটি সমাধান যা কাজটি সম্পন্ন করে।


আপনার দেওয়া জেএসওএন উদাহরণটি "ভাল" জেএসওনের মতো দেখায় না, উদাহরণস্বরূপ সংখ্যাগুলির মানগুলি সাধারণত স্ট্রিং হিসাবে উদ্ধৃত করা উচিত নয়।
jfpoil ব্যাখ্যা

JSON এর জন্য সম্ভাব্য ব্যবহারযোগ্য লাইব্রেরির তালিকার জন্য +1। আমি অবাক হয়েছি যে কোনও লাইব্রেরি কলব্যাক ফাংশন পদ্ধতির ভিত্তিতে নয়, যা পার্সিংয়ের সময় ডাকা হবে (অনেক বেশি দক্ষ স্মৃতিযুক্ত)।
jfpoil ব্যাখ্যা

কমপক্ষে আপনি সচেতন যে আপনার কোডের নমুনাটি ভয়াবহ :-) অবশ্যই এটি কাজটি সম্পন্ন করে, তবে এটি পঠনযোগ্য নয় (এমনকি 6 মাসের মধ্যেও অন্য কারও দ্বারা গৃহীত হয়) এবং তাই এটি রক্ষণযোগ্য নয়।
jfpoil ব্যাখ্যা

@ jfpoil ব্যাখ্যায় আমি চিপের স্মৃতি থেকে বেরিয়ে এসেছি যাতে আমাকে কিছু জায়গায় কোণা কাটাতে হয়েছিল। কমপক্ষে এটি ভারী মন্তব্য করেছে।
স্যাচলীন

আমি বুঝেছি; তবে আমি ভাবছি যদি Stringব্যবহারের ফলে মেমরির পরিস্থিতি আরও খারাপ না হয় (হ্যাঁ, Stringআরডিনোতে আমার পোষা প্রাণবন্ত হয়)।
jfpoil ব্যাখ্যা

7

আমি এমন একটি ক্লাস প্রোগ্রাম করেছি যা জেএসওএন ডকুমেন্টটি চর দ্বারা গৃহীত হবে। এটি কেবলমাত্র স্টেট মেশিন এবং আপনার প্রয়োজনীয় ফলাফলগুলি ব্যবহার করে জানা জেএসএন কাঠামোর জন্য কয়েকটি বাইট স্মৃতিতে সঞ্চয় করবে। সুতরাং আপনি যে ফলাফল চান তার জন্য ক্লাসটি জিজ্ঞাসা করতে পারেন এবং জেএসওএন প্রক্রিয়া করবেন।

আপনার উদ্দেশ্য জন্য এটি আদর্শ। আমি একটি আবহাওয়া পরিষেবা সংযোগের জন্য ব্যবহার করেছি যা কোনও জসনকে ফেরত দেয়:

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

আমি পিআইসির জন্য একটি পার্সার লিখেছিলাম যা খুব কম র‌্যাম ব্যবহার করে কারণ এটি সরাসরি চর পয়েন্টারগুলির সাথে কাজ করে এবং গাছের কাঠামো তৈরি করে না। আপনি যদি তালিকার আইটেম এন পেতে জিজ্ঞাসা করেন তবে এটি আপনাকে তালিকার এন আইটেমের শুরুতে সরাসরি জেএসওএন ফাইলের মধ্যে একটি আসল পয়েন্টার দেয়। তারপরে আপনি জিজ্ঞাসা করতে পারেন যে পয়েন্টারটি কোন ধরণের অবজেক্টের প্রতিনিধিত্ব করে ইত্যাদি ইত্যাদি। এটি বাগিটি এবং ভাসমানদের সমর্থন করে না এবং আমার মনে হয় আরও কয়েকটি সীমাবদ্ধতা রয়েছে (দীর্ঘ কয়েক বছর আগে) তবে এটি সমস্ত গিথুবে রয়েছে: https://github.com / এটারনিটিফোরস্ট / ওপেনফোর্টিউন-ভাগ্যের মতো-পাঠ্য-জেনারেটর আপনাকে সি ভার্সনটির অংশ হিসাবে লাইবফরচুনে সন্ধান করতে হবে।


1

আমি কীভাবে JSON-RPC পদ্ধতি কল দিয়ে নেতৃত্ব চালু করতে পারি তার উদাহরণ সহ একটি সাধারণ JSON-RPC গ্রন্থাগার (এজেসনের শীর্ষে) লিখেছি:


2
কোড / ডকুমেন্টেশনের লিঙ্ক পরিবর্তিত হলে আপনি নিজের উত্তরে আরও কিছু তথ্য যুক্ত করতে পারেন ...
sachleen
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.