概述
1.前言
最近想用stm32+esp8266做一个仅通过WIFI来定位的小硬件,但找了很多家,比如高德、百度这些都没有面向个人开发者的硬件网络定位接口,但兜兜转转还是找到了一家做物联网定位的叫维智科技,他们的物联网定位平台是这个https://lotboard.newayz.com/,个人开发者注册的话配额还是挺充裕的,特别是免费3的QPS,特别适合我们这些做智能硬件的。
根据开发手册体验了一下,只需要最少4个WiFi信息或者通过定位模块解析的坐标就可以返回详细的信息了,返回的数据是这样的。
{
"id": "38efe26e-************************",
"asset": "d1c09200-9254-11ed-*******************",
"location": {
"timestamp": 1673513233302,
"address": {
"name": "湖北省武汉市*************************************",
"context": [
{
"type": "Country",
"name": "中国",
"code": "CN"
},
{
"type": "Province",
"name": "湖北省",
"code": "420000"
},
{
"type": "City",
"name": "武汉市",
"code": "420100"
},
{
"type": "District",
"name": "****",
"code": "42****"
},
{
"type": "Township",
"name": "****",
"code": "42****"
},
{
"type": "Road",
"name": "****"
},
{
"type": "Building",
"name": "*********"
},
{
"type": "Floor",
"name": "*********"
}
],
"level": 14
},
"place": {
"type": "Food",
"name": "***********",
"categories": [
{
"id": 30200,
"name": "*****"
}
],
"distance": {
"line": 15.863497
}
},
"position": {
"timestamp": 1673513234166,
"source": "wifi",
"point": {
"longitude": 114.4*******,
"latitude": 30.5******
},
"spatialReference": "gcj02",
"accuracy": 29
}
}
}
可以看到还是挺详细的,配合cjson或者其他第三方json库直接就可以解析得到当前地址和坐标了,对于无定位模块的设备来说简直是个福音(比如ESP8266、ESP32等),这样一下子能做的事情就变得多起来了,话不多说就拿这个平台做个网络定位硬件出来玩玩。
2.前期准备
在开始写之前先去https://lotboard.newayz.com/这里注册个账号。
step 1 在注册界面选择个人版,然后把能填的填了,最下面的推荐人手机号不用填。
step 2 注册完成后在应用管理-我的应用中申请新应用。
可以看到,在免费版下功能还是非常多的,把上面应用名称和描述填写完毕就可以提交申请了,我使用下来审核还是非常快的,基本在十分钟内就可以审核下来,完成这些步骤就可以等待一会,审核通过就可以得到key了,这个是获取定位的前提。
接着打开设备管理-设备管理点击注册
只需要填写设备ID(旁边可以随机生成)和设备名称就可以,其它留空。
3.硬件平台
刚好手头上有一块小熊派开发板,也带了ESP8266模块,就使用这个开发板来开发这个网络定位Demo。
这个板子板载ST-link,所以不需要额外的烧录器,因为采用WAN接口,WIFI扩展板对着插上就可以,主控是STM32L431RCT6,用来开发这个Demo绰绰有余,废话不多说,直接开始。
4.编程代码
为快速开发使用,这里使用RT-Thread实时操作系统来开发。
step 1 打开RT-Thread Studio进入文件–新建–RT-Thread 项目选择基于芯片在下拉菜单中选择添加更多,并填上相应信息
step 2 点击完成即可自动生成工程(这个过程算是比较久的,时间不固定,主要根据电脑配置的不同而定)。
工程生成完成后点击头部菜单栏中的开始编译,一般是没什么问题的,然后点击
这个图标下载即可,打开studio自带的串口助手即可看到shell打印出来的信息
step 3 接下来开始添加软件包(这个是RT-Thread最大的亮点),首先添加ESP8266的驱动包,在项目资源管理器-你的项目名称-RT-Thread Settings中添加软件包。
输入
at_device
添加RT-Thread官方移植的AT驱动包
然后在该界面对着该软件包按右键选择配置项
找到ESP8266并将其使能
底下WIFI账号和密码就填能够上网的路由器或者热点的,在选择AT客户端设备时,需要将开发板顶端的开关拨到ATMCU档位,然后根据原理图将串口改为LPUSART1。
在项目资源管理器-derives-derives.h文件中添加以下定义。
#define BSP_USING_LPUART1
#define BSP_LPUART1_TX_PIN
"PC1"
#define BSP_LPUART1_RX_PIN
"PC0"
然后重新编译工程,下载到开发板,在串口返回的信息就可以看到各项数据初始化完成
再输入ifconfig就可以看到获取到的ip,此时MCU这边已经可以通过ESP8266联网了。
ifconfig
安装上述方法将cJSON、webclient这两个软件包添加进入即可,其中需要配置的地方是webclient的配置项
然后在main.c中添加下述代码,在线程中调用该函数即可,之所以直接打出是因为AT_Device软件包没有扫描WIFI的接口,所以只能使用静态的。在RT-Thread的软件包中,维智官方也发布过一款SDK,叫wayz-iot https://github.com/wayz-iot/wayz_iotkit,但是这款SDK使用的是wlan框架,这里使用AT客户端所以没办法使用这个包,但如果手上有AP6181这种模块,可以自己移植wlan框架,然后就可以使用该包了,需要注意的是该包使用的webclient软件包是老版本的,对于新版本需要更改部分参数才可以使用
#include "cJSON.h"
#include <webclient.h>
char * res;
/* HTTP client upload data to server by POST request */
int webclient_post_data(void)
{
unsigned char *buffer = RT_NULL;
int length = 0;
const char *data = "{rn
"timestamp": 1670494607373,rn
"
""id": "21ac9d80-76cc-11ed-a08e-b3b116d640e2",rn
"
""asset": {rn
"
""id": "21ac9d80-76cc-11ed-a08e-b3b116d640e2",rn
"
""manufacturer": "esp8266",rn
"
""model": "Note",rn
"
""imeiMd5": "234567890",rn
"
""macAddress": "18:fe:35:98:d3:7b",rn
"
""uniqueId": "xxxxxxxx",rn
"
""os": {rn
"
""type": "mcu",rn
"
""version": "esp-12f"rn
}rn
},rn
"
""location": {rn
"
""timestamp": 1670494607373,rn
"
""wifis": [rn
{rn
"
""signalStrength": -69,rn
"
""ssid": "ChinaNet-UZda",rn
"
""macAddress": "bc:f4:5f:a9:68:c4"rn
},rn
"
"{rn
"
""signalStrength": -64,rn
"
""ssid": "2.4g@myai.tech",rn
"
""macAddress": "74:50:4e:8a:de:c8"rn
},rn
"
"{rn
"
""signalStrength": -72,rn
"
""ssid": "2.4g@myai.tech",rn
"
""macAddress": "60:db:15:fa:e9:11"rn
},rn
"
"{rn
"
""signalStrength": -79,rn
"
""ssid": "W888",rn
"
""macAddress": "9e:2b:a6:89:36:32"rn
},rn
"
"{rn
"
""signalStrength": -58,rn
"
""ssid": "Office",rn
"
""macAddress": "9e:2b:a6:99:40:d2"rn
},rn
"
"{rn
"
""signalStrength": -67,rn
"
""ssid": "CU_9SR2",rn
"
""macAddress": "5c:64:7a:32:d3:28"rn
},rn
"
"{rn
"
""signalStrength": -60,rn
"
""ssid": "CU_ryt6",rn
"
""macAddress": "40:67:9b:ad:12:5e"rn
},rn
"
"{rn
"
""signalStrength": -84,rn
"
""ssid": "DIRECT-14-HP M132 LaserJet",rn
"
""macAddress": "b6:b5:b6:5f:63:14"rn
},rn
"
"{rn
"
""signalStrength": -78,rn
"
""ssid": "DIRECT-ca-HP M227f LaserJet",rn
"
""macAddress": "4e:d5:77:69:19:ca"rn
},rn
"
"{rn
"
""signalStrength": -48,rn
"
""ssid": "Z Guest",rn
"
""macAddress": "9e:2b:a6:a9:36:be"rn
},rn
"
"{rn
"
""signalStrength": -59,rn
"
""ssid": "Z Office",rn
"
""macAddress": "9e:2b:a6:99:41:22"rn
}rn
]rn
}rn}";
length = webclient_request("http://api.newayz.com/location/hub/v1/track_points?access_key=你应用的key&field_masks=location.position", RT_NULL, data,strlen(data), &buffer,strlen(buffer));
if (length < 0)
{
LOG_E("webclient POST request response data error.");
return -RT_ERROR;
}
LOG_D("webclient POST request response data :");
//JSON提取值
cJSON* cjson_test = NULL;
cJSON * item = NULL;
cJSON * Plasma = NULL;
cJSON * Negative = NULL;
cJSON * Ultraviolet = NULL;
cjson_test = cJSON_Parse((char *)buffer);
web_free(buffer);
if(cjson_test == NULL)
{
rt_kprintf("parse fail.n");
return;
}
item = cJSON_GetObjectItem(cjson_test, "location");
Plasma = cJSON_GetObjectItem(item, "position");
rt_kprintf("%s", cJSON_Print(item));
return RT_EOK;
}
编译后下载到开发板上,可以看到返回的数据(最主要是坐标)
{
"timestamp": 1674987395158,
"source": "wifi",
"point": {
"longitude": 114.410000,
"latitude": 30.500000
},
"spatialReference": "gcj02",
"accuracy": 29
}
相应的平台上的监控大屏中的设备监控也会显示定位
该平台还有电子围栏,轨迹查询等功能还需要各位自己去慢慢摸索,相应的API手册也很齐全,如果有什么问题欢迎留言,我会尽快回复。
最后
以上就是敏感摩托为你收集整理的STM32-ESP8266WIFI定位的全部内容,希望文章能够帮你解决STM32-ESP8266WIFI定位所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复