无法使用ipify从ESP8266获取公共IP地址

时间:2018-01-24 02:12:36

标签: arduino ip-address esp8266 arduino-esp8266

我正在使用NodeMCU来使用ESP8266,我想使用ipify来获取公共IP地址。 但我在httpCode得到-1。那是为什么?

如果我输入api.ipify.org,它会正确获取我的公共IP地址。

void loop() {
  Serial.println(WiFi.status());
  if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
    Serial.println("az");
    HTTPClient http;  //Declare an object of class HTTPClient
    http.begin("https://api.ipify.org/?format=json");  //Specify request destination
    int httpCode = http.GET();                                                                  //Send the request
    Serial.println(httpCode);  //<<---- Here I get -1
    if (httpCode > 0) { //Check the returning code
      String payload = http.getString();   //Get the request response payload
      Serial.println(payload);                     //Print the response payload
    }
    http.end();   //Close connection
  }
  delay(10000);    //Send a request every 30 seconds
}

2 个答案:

答案 0 :(得分:1)

http.begin("https://api.ipify.org/?format=json");  

您正在使用HTTPClient浏览HTTPS网站(HTTP + SSL / TLS隧道),但您使用了错误的.begin()电话。 begin(String url来电需要http://网址,而不是https://。如果您想使用HTTPS安全地浏览网站,则需要使用函数begin(String url, String httpsFingerprint)docs)。您可以按照link找到所需的httpsFingerprint。但是,使用HTTPS会导致大量的内存开销和处理时间。对于浏览“我的公共IP是什么”网站的情况,我建议改为浏览http://版本,因为回复不是机密信息。

所以,你可以做到

http.begin("http://api.ipify.org/?format=json");  

答案 1 :(得分:0)

您可以尝试:

String getIp()
{
  WiFiClient client;
  if (client.connect("api.ipify.org", 80)) 
  {
      Serial.println("connected");
      client.println("GET / HTTP/1.0");
      client.println("Host: api.ipify.org");
      client.println();
  } else {
      Serial.println("Connection to ipify.org failed");
      return String();
  }
  delay(5000);
  String line;
  while(client.available())
  {
    line = client.readStringUntil('\n');
    Serial.println(line);
  }
  return line;
}