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

48e24b7f61e18f6ca5f2db5cb010ca4f.jpeg

潮水退去,才知道谁在裸泳。

5fb13248b985a5d0deb89d1fdc51d856.jpeg

最近这两天,微博、微信、抖音、知乎等网络平台都上线了IP属地功能,用户的个人主页,或者在发表视频、博文、评论、投票时,会显示用户当前的IP属地,国内用户显示省份/地区,国外用户显示国家/地区。

IP属地的上线让很多国外、本地博主现出了原形,出现了IP属地和资料地址不符的情况。

fe683bdfe4252e95c67e87475ecd0bec.jpeg

IP属地来了,不让物联网设备“裸泳”,给你的设备加个自动获取IP属地的功能吧!

a3c69ed8b2e233d5ba35676d91975da7.jpeg

对于嵌入式物联网设备,除了一些特殊场合,比如环境监测、路径规划、定位追踪等,需要通过GPS模块获取精确的地理位置,对于一些天气预报、疫情数据相关的设备来说,地理位置要求没那么精确,只需要基本的时区、国家、城市/省份信息即可。

本文介绍,如何基于已有的WiFi/4G/5G联网功能,添加一个自动获取IP属地功能。

共分为以下三个步骤:

  • 接口获取

  • 接口访问

  • JSON数据解析

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": "联通"
    }
}

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

41a9c1911cd886fa783d89c970db8284.jpeg

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

2.嵌入式访问接口

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

735d35d8d1ff6e86e33acb7c16bf3339.jpeg

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-api

https://lbsyun.baidu.com/index.php?title=webapi/ip-api

  • 高德开放平台

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

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

f6d880f4b364fa7a46a8b37915c2cc0f.jpeg

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

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

8de194b657bb97b232b097ff2802389c.jpeg

d6f12cb19deea9875095aad226ef047a.jpeg

1.SylixOS,这款嵌入式RTOS值得学习!

2.芯片短缺或将结束?数据来说话。。。

3.代码调着调着就失联了,你碰到过吗?

4.图文并茂详解STM32时钟配置

5.电力物联网与嵌入式系统,关系几何?

6.RT-Thread携手北航出版社共办人工智能师资培训

3b534d9cbfb23f7ea255eb17ad3c04b2.gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值