मेरे पास निम्न कोड है:

if (net.connect(host, port)) {
  String req = "GET /curTemp?temp=" + String(temperatureFahrenheit) + " HTTP/1.1\r\n" + 
               "Host: " + host + "\r\n" +
               "Authorization: Basic xxxxxxxxxxxxxxxxx\r\n" +
               "Connection: close\r\n\r\n";
  net.print(req);

  // Get headers
  while (net.connected()) {
    String line = net.readStringUntil('\r');
    if (line == "\r") {
      break;
    }
  }

  // Get temperature
  StaticJsonBuffer<50> jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(net.readStringUntil('\r'));
  const char* temp = root["temp"];
  Serial.print("Temp:");
  Serial.println(temp);
} else {      
  Serial.println("connection failed");
}

इसे पूरा होने में 15 सेकंड का समय लग रहा है और मुझे पता नहीं क्यों। मैं वेब ब्राउज़र में उसी अनुरोध का उपयोग कर सकता हूं और यह तुरंत वापस आ जाता है। यह विशेष रूप से net.readStringUntil है जो समय ले रहा है।

अद्यतन: मुझे सेटटाइमआउट (1000) सेट करके वर्कअराउंड मिला लेकिन मुझे समझ में नहीं आ रहा है कि यह क्यों जरूरी है। क्या अनुरोध कनेक्शन को बंद नहीं करना चाहिए और पूरा होने पर readStringUntil() समाप्त हो जाना चाहिए? शायद मुझे WiFiClientSecure समझ में नहीं आ रहा है?

अद्यतन 2: मुझे समस्या मिली। उत्तर नीचे देखें।

0
John Smith 12 अप्रैल 2018, 20:31

1 उत्तर

सबसे बढ़िया उत्तर

ठीक है, मैं इसे स्पष्ट करने के लिए डाल रहा हूँ। प्रत्येक उदाहरण readStringUntil() के लिए '\r' दिखाता है जो भ्रमित हो सकता है। तो क्या होता है यदि आप '\ r' का उपयोग करते हैं तो अगला पठन '\ n' से शुरू होगा, इसलिए यदि आप शीर्षलेखों के अंत की तलाश में हैं, तो यह वास्तव में '\ n \ r \ n' होगा क्योंकि ले जाने के कारण पहले पढ़ी गई लाइन से। तो क्या होता है कि आपका डेटा crlfs के साथ सिंक से बाहर है। मैंने पाया कि टर्मिनेटर के लिए '\n' का उपयोग करना बेहतर काम करता है क्योंकि हेडर के लिए मानक प्रारूप '\r\n' के साथ समाप्त होता है। फिर आप केवल '\ r' (\ n टर्मिनेटर readStringUntil () द्वारा खाया जाता है) की तलाश में हेडर के अंत के लिए परीक्षण कर सकते हैं। फिर आप अपना डेटा प्राप्त करने के लिए एक और लूप शुरू कर सकते हैं। फिर सब कुछ ठीक काम करता है बिना सेटटाइमआउट की आवश्यकता के।

उदाहरण:

if (net.connect(host, port)) {
  String req = "GET /curTemp?temp=" + String(temperatureFahrenheit) + " HTTP/1.1\r\n" + 
               "Host: " + host + "\r\n" +
               "Authorization: Basic dXNlcjpkYWYxMjM0\r\n" +
               "Connection: close\r\n\r\n";
  net.print(req);

  delay(1000);

  // Get headers
  while (net.available()) {

    // Note \n for terminator
    String line = net.readStringUntil('\n');

    // Only \r because \n is eaten by readStringUntil()
    if (line == "\r") {
      break;
    }
  }

  // Now look for data (in my case only one line of JSON)

  // No \r\n on this one.
  String line = net.readStringUntil('}');

  // Put back the character eaten by readStringUntil()
  line = line + "}";

  Serial.println(line);
0
John Smith 12 अप्रैल 2018, 22:01