[Wi-Fi/蓝牙/Zigbee…] 在Arduino获取公网IP的方法

[复制链接]
1369|2
 楼主| gaoyang9992006 发表于 2025-6-12 08:52 | 显示全部楼层 |阅读模式

最开始 我使用的是http://api.ipify.org 提供 的API接口,
因为是http访问,实现非常容易。最近发现这个接口无法访问了,可能官方停止这个接口了。
  1. void getPublicIP()
  2. {
  3.   http.begin(client, "http://api.ipify.org");
  4.   Serial.print("[HTTP] GET...\n");
  5.   int httpCode = http.GET();

  6.   if (httpCode > 0) {
  7.     // HTTP header has been send and Server response header has been handled
  8.     Serial.printf("[HTTP] GET... code: %d\n", httpCode);

  9.     // file found at server
  10.     if (httpCode == HTTP_CODE_OK)
  11.     {
  12.       publicIP = http.getString();
  13.       Serial.print("Your public IP address is: ");
  14.       Serial.println(publicIP);
  15.       
  16.       // Optionally, use this IP address for further processing
  17.       // For example, you can use this IP with a geolocation API to get your city name
  18.     }
  19.   }
  20.   else
  21.   {
  22.     Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
  23.   }
  24.   http.end();
  25. }
然后我又找到了一个新的本地网络的外网IP获取网址 https://iplark.com/ipapi/public/ip
这个地址是https开头的,直接替换无法访问的。
修改如下,解决了访问https问题,我自己做的网络天气日历又可以自动获取地理位置信息了。
  1. void getPublicIP()
  2. {
  3.   WiFiClientSecure client_s;
  4.   // 跳过证书验证(仅用于测试,生产环境建议配置根证书)
  5.   client_s.setInsecure();

  6.   // 发起HTTPS请求
  7.   if (http.begin(client_s, "https://iplark.com/ipapi/public/ip"))
  8.   {
  9.     Serial.print("[HTTP] GET...\n");
  10.     int httpCode = http.GET();

  11.     if (httpCode > 0)
  12.     {
  13.       Serial.printf("[HTTP] GET... code: %d\n", httpCode);
  14.       if (httpCode == HTTP_CODE_OK) {
  15.         publicIP = http.getString();
  16.         Serial.print("Your public IP address is: ");
  17.         Serial.println(publicIP);
  18.       }
  19.     } else
  20.     {
  21.       Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
  22.     }
  23.     http.end();
  24.   } else
  25.   {
  26.     Serial.println("[HTTP] Unable to connect");
  27.   }
  28. }








少女诗篇 发表于 2025-9-26 16:00 | 显示全部楼层
在 Arduino 上获取公网 IP,可通过连接网络后访问公网 IP 查询接口(如icanhazip.com、ipify.org)。用 ESP8266/ESP32 等带 WiFi 功能的板卡,通过 HTTP 客户端发送请求,解析返回的文本数据即得公网 IP,需确保网络通畅并处理可能的请求超时。
643757107 发表于 2025-9-28 20:37 | 显示全部楼层
这个思路很不错,是如何想到的呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部