admin管理员组

文章数量:1530987

1.前言

最近想用stm32+esp8266做一个仅通过WIFI来定位的小硬件,但找了很多家,比如高德、百度这些都没有面向个人开发者的硬件网络定位接口,但兜兜转转还是找到了一家做物联网定位的叫维智科技,他们的物联网定位平台是这个https://lotboard.newayz/,个人开发者注册的话配额还是挺充裕的,特别是免费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/这里注册个账号。

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/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/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手册也很齐全,如果有什么问题欢迎留言,我会尽快回复。

本文标签: ESP8266WiFi