STM32-ESP8266WIFI定位

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 = "{\r\n    \"timestamp\": 1670494607373,\r\n    "
            "\"id\": \"21ac9d80-76cc-11ed-a08e-b3b116d640e2\",\r\n    "
            "\"asset\": {\r\n        "
            "\"id\": \"21ac9d80-76cc-11ed-a08e-b3b116d640e2\",\r\n        "
            "\"manufacturer\": \"esp8266\",\r\n        "
            "\"model\": \"Note\",\r\n        "
            "\"imeiMd5\": \"234567890\",\r\n        "
            "\"macAddress\": \"18:fe:35:98:d3:7b\",\r\n        "
            "\"uniqueId\": \"xxxxxxxx\",\r\n        "
            "\"os\": {\r\n            "
            "\"type\": \"mcu\",\r\n            "
            "\"version\": \"esp-12f\"\r\n        }\r\n    },\r\n    "
            "\"location\": {\r\n        "
            "\"timestamp\": 1670494607373,\r\n        "
            "\"wifis\": [\r\n            {\r\n                "
            "\"signalStrength\": -69,\r\n                "
            "\"ssid\": \"ChinaNet-UZda\",\r\n                "
            "\"macAddress\": \"bc:f4:5f:a9:68:c4\"\r\n            },\r\n            "
            "{\r\n                "
            "\"signalStrength\": -64,\r\n                "
            "\"ssid\": \"2.4g@myai.tech\",\r\n                "
            "\"macAddress\": \"74:50:4e:8a:de:c8\"\r\n            },\r\n            "
            "{\r\n                "
            "\"signalStrength\": -72,\r\n                "
            "\"ssid\": \"2.4g@myai.tech\",\r\n                "
            "\"macAddress\": \"60:db:15:fa:e9:11\"\r\n            },\r\n            "
            "{\r\n                "
            "\"signalStrength\": -79,\r\n                "
            "\"ssid\": \"W888\",\r\n                "
            "\"macAddress\": \"9e:2b:a6:89:36:32\"\r\n            },\r\n            "
            "{\r\n                "
            "\"signalStrength\": -58,\r\n                "
            "\"ssid\": \"Office\",\r\n                "
            "\"macAddress\": \"9e:2b:a6:99:40:d2\"\r\n            },\r\n            "
            "{\r\n                "
                        "\"signalStrength\": -67,\r\n                "
                        "\"ssid\": \"CU_9SR2\",\r\n                "
                        "\"macAddress\": \"5c:64:7a:32:d3:28\"\r\n            },\r\n            "
            "{\r\n                "
                        "\"signalStrength\": -60,\r\n                "
                        "\"ssid\": \"CU_ryt6\",\r\n                "
                        "\"macAddress\": \"40:67:9b:ad:12:5e\"\r\n            },\r\n            "
            "{\r\n                "
                        "\"signalStrength\": -84,\r\n                "
                        "\"ssid\": \"DIRECT-14-HP M132 LaserJet\",\r\n                "
                        "\"macAddress\": \"b6:b5:b6:5f:63:14\"\r\n            },\r\n            "
            "{\r\n                "
                        "\"signalStrength\": -78,\r\n                "
                        "\"ssid\": \"DIRECT-ca-HP M227f LaserJet\",\r\n                "
                        "\"macAddress\": \"4e:d5:77:69:19:ca\"\r\n            },\r\n            "
            "{\r\n                "
                        "\"signalStrength\": -48,\r\n                "
                        "\"ssid\": \"Z Guest\",\r\n                "
                        "\"macAddress\": \"9e:2b:a6:a9:36:be\"\r\n            },\r\n            "
            "{\r\n                "
            "\"signalStrength\": -59,\r\n                "
            "\"ssid\": \"Z Office\",\r\n                "
            "\"macAddress\": \"9e:2b:a6:99:41:22\"\r\n            }\r\n        ]\r\n    }\r\n}";
    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手册也很齐全,如果有什么问题欢迎留言,我会尽快回复。

对于STM32WiFi定位,你可以使用维智科技的物联网定位平台来实现。你可以在该平台上注册个人开发者账号,每日可以有100次请求的配额,非常适合做智能硬件的个人开发者。\[1\] 在代码中,你可以定义一个结构体来存储扫描到的WiFi信息。你可以在最前面或最后面定义一个函数来控制WiFi扫描,并将扫描到的信息赋值给结构体。例如,你可以定义一个名为wifi_scan的函数,该函数使用WiFi库的scanNetworks函数来扫描WiFi网络,并将扫描到的网络数量、MAC地址和信号强度存储在结构体中。\[2\] 为了方便,你可以在代码的前面定义该函数,但如果代码较多,将其放在后面也是一个好的选择。同时,你还需要定义一个结构体来存储WiFi信息,可以使用typedef struct来定义一个名为ap_info的结构体,该结构体包含了网络数量、MAC地址和信号强度等信息。\[3\] 通过使用维智科技的物联网定位平台和上述代码,你可以实现STM32WiFi定位功能。 #### 引用[.reference_title] - *1* *2* *3* [Arduino ESP32 WiFi定位](https://blog.csdn.net/m0_50846041/article/details/128955571)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fbuilke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值