嵌入式设备如何显示IP属地?

简介: 嵌入式设备如何显示IP属地?

1.获取API接口

IP定位需要使用公网IP,比如123.105.127.111,而不能是局域网IP,比如192.169.1.100。常用的IP定位接口有两种:


  • 一种是不需要知道当前设备的IP地址,直接访问接口,接口会返回设备的IP地址。
  • 一种是已知设备的IP地址,在访问接口时传入IP地址参数,接口会返回传入IP地址的经纬度、时区、国家、省份、城市等信息。


还有的是将以上两种接口整合为一个,无需事先知道设备的IP地址,直接使用设备访问接口,就会返回公网IP、经纬度、时区、国家、城市等信息。


这里推荐一个免费的API接口:

远程服务器地址: 103.205.5.249
远程服务器端口号: 80
API接口: 
http://api.k780.com/?app=ip.local&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json


返回的JSON数据:

{
    "success": "1",
    "result": {
        "ip": "102.212.134.15",
        "proxy": "1",
        "att": "中国,北京",
        "operators": "联通"
    }
}

先用网络调试助手测试一下:

640.jpg


API接口没问题,下一步使用嵌入式设备来完成自动获取IP地址。


2.嵌入式访问接口

联网模块主要有WiFi或移动网络4G模块,这里以比较常用的ESP8266 WiFi模块+STM32为例,来演示通过串口AT指令来访问IP定位接口,下面是我使用STM32配置ESP8266的过程:

640.jpg


3.JSON数据解析

嵌入式设备可以使用的JSON解析库,常用的JSON解析库有cJSON和Jansson等。


我之前也写过几篇关于JSON数据格式和JSON解析的文章,本文就不详细介绍了。


如果你觉得使用解析库会额外的增加程序大小,你也可以使用字符串操作的一些函数,从返回的JSON字符串中提取出你想要的数据,这样会节省一部分微控制器的ROM空间。


下面直接给出基于cJSON库,对以上IP定位接口返回数据进行解析的函数:

#include "cJSON.h"
uint8_t parse_api_data(char *jsonstr)
{
    cJSON *root;
    cJSON *result;
    char *ip;
    char *loc;
    char *net;
//    printf("recv data: %d-%s\r\r\n", strlen((const char*)jsonstr), jsonstr);    //JSON原始数据
    root = cJSON_Parse((const char*)USART2_RX_BUF);
    if (root != 0)
    {
        printf("---JSON format ok---\r\n");
        result = cJSON_GetObjectItem(root, "result");
        ip = cJSON_GetObjectItem(result, "ip")->valuestring;        //164.123.44.15
        loc = cJSON_GetObjectItem(result, "att")->valuestring;      //中国,北京
        net = cJSON_GetObjectItem(result, "operators")->valuestring;//联通
        printf("ip:%s\r\nloc:%s\r\nnet:%s\r\n", ip, loc, net);
    }
    else
    {
        printf("JSON format error:%s\r\n", cJSON_GetErrorPtr()); //输出json格式错误信息
        return 1;
    }
    cJSON_Delete(root);
    return 0;
}


4.商用API接口


还有一些其他的免费接口:

/* 返回IP地址,地区、时序、国家等信息,默认是英文的 */
http://ip-api.com/json/
/* 可选中文 */
http://ip-api.com/json/?lang=zh-CN
/* SOHU接口,非标准JSON */
http://pv.sohu.com/cityjson
/* 国内的PCOnline提供的接口,定位不准确 */
http://whois.pconline.com.cn/ipJson.jsp?json=true&ip=14.16.139.216
/* 国外geoplugin公司提供的接口,包括经纬度、时区、货币单位、对美元汇率等信息 */
http://www.geoplugin.net/json.gp


以上免费接口都有随时关停的可能,如果用于商业用途,建议还是选择第三方商业公司提供的接口,或者自己开发API接口。


本文推荐使用三大地图提供商的IP定位服务,一般支持自动定位,或查询指定IP地址对应的地址,返回信息一般包括国家,省份/城市,行政区划代码,经纬度等信息,数据格式一般支持JSON或XML,请求方式为GET或POST,可以进入官方网站查看详细的API文档,根据需求来选择:


  • 腾讯位置服务

https://lbs.qq.com/service/webService/webServiceGuide/webServiceIp

  • 百度地图开放平台

百度地图接口分为两个:普通IP定位和智能硬件定位,可以利用蓝牙、WI-FI、基站、GPS等信息,获取定位信息。https://lbsyun.baidu.com/index.php?title=webapi/intel-hardware-apihttps://lbsyun.baidu.com/index.php?title=webapi/ip-api

  • 高德开放平台

https://lbs.amap.com/api/webservice/guide/api/ipconfig


如果对于访问次数和访问流量要求不高的话,只需要认证个人开发者/企业用户,就可以免费使用。

640.jpg


IP属地的上线,让人在美国,刚下飞机,这类的社交谎言不攻自破,功能上线的真正目的还是为了维护真实的网络环境,减少恶意造谣、蹭流量的不良行为。也希望大家在社交网络,展现自己真实的一面!

不出意外的话,本篇文章会显示发表于哪里。

目录
相关文章
|
程序员 C语言 C++
35.【C/C++ 枚举(bool)类型和宏定义 (超详细)】(二)
35.【C/C++ 枚举(bool)类型和宏定义 (超详细)】
276 0
成功解决AttributeError: module 'numpy' has no attribute 'integer'
成功解决AttributeError: module 'numpy' has no attribute 'integer'
成功解决AttributeError: module 'numpy' has no attribute 'integer'
|
人工智能 API 决策智能
MetaGPT( The Multi-Agent Framework):颠覆AI开发的革命性多智能体元编程框架
MetaGPT( The Multi-Agent Framework):颠覆AI开发的革命性多智能体元编程框架
MetaGPT( The Multi-Agent Framework):颠覆AI开发的革命性多智能体元编程框架
|
10月前
|
Web App开发 JavaScript 前端开发
插件实现12306网站“按预填信息”自动抢票
年底抢票回家过年,12306的“按预填信息购票”功能却隐藏按钮,导致抢票困难。程序员发现按钮被CSS隐藏后尝试手动修改,但遇到自动恢复和确认窗口的问题。最终决定开发Chrome插件,通过监听页面按钮自动点击,实现一键抢票。该插件结构简单,包含manifest.json、popup.html等文件,能有效节省抢票时间。代码已开源至GitHub,供有需要的人参考使用。
|
Web App开发 JavaScript 前端开发
Qt(QtWebEngine)加载本地网页跨域问题的总结
Qt(QtWebEngine)加载本地网页跨域问题的总结
392 0
|
网络协议 安全
TCP连接和断连夺命6连问
这篇文章详细解答了TCP协议中三次握手建立连接和四次挥手断开连接过程中的六个常见疑问,包括为什么需要三次而不是二次握手、初始化序列号为何每次都要不一样、为何断开连接需要四次而不是三次握手、TIME_WAIT状态的原因和作用,以及TIME_WAIT等待2MSL时间的原因。
264 1
|
缓存 测试技术 API
告别加班!Django/Flask高级技巧,让你的Web开发效率翻倍再翻倍!
【7月更文挑战第15天】探索Django与Flask高效秘籍:**利用模板继承减少重复代码,自动化测试确保质量,缓存提升性能。通过模板继承实现DRY原则,自动化测试框架如Django的`TestCase`和Flask的`pytest`加快调试,缓存机制(Django的低级别缓存API或Flask-Caching)优化页面加载。掌握这些技巧,告别加班,提升开发体验!
452 3
|
编解码 人工智能 自然语言处理
扩散模型的多元化应用:药物发现、文本生成、时间序列预测等
AlphaFold3是DeepMind的蛋白质结构预测软件,它引入扩散模型以提升预测准确性。扩散模型通过逐步添加和去除噪声来理解和生成数据,应用广泛,包括图像、音频、文本和时间序列数据的处理。在图像领域,它们擅长合成、编辑和超分辨率;在文本处理中,扩散模型在代码合成和问答任务中表现出色;在音频和视频生成方面也有重要应用;同时,它们在时间序列预测和增强模型鲁棒性方面也展现出潜力。随着技术发展,扩散模型将在更多领域发挥作用。
655 0
|
存储 缓存 前端开发
【React】Hooks面试题集锦
本文集合一些React的Hooks面试题,方便读者以后面试查漏补缺。作者给出自认为可以让面试官满意的简易答案,如果想要了解更深刻,可以点击链接查看对应的详细博文。在此对链接中的博文作者非常感谢🙏。
525 1
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示
MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示
267 0