最近项目用到定位,但是又不想重新画PCB,因此打算做一个仅通过WIFI来定位的小硬件,但找了很多家,比如高德、百度这些都没有面向个人开发者的硬件网络定位接口,兜兜转转还是找到了一家做物联网全域定位的公司叫维智科技,他们的物联网定位平台是这个https://lotboard.newayz.com/,个人开发者注册的话配额还是挺充裕的,特别是每日100次请求,很适合我们这些做智能硬件的。

根据开发手册体验了一下,只需要最少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}}
}

可以看到还是挺详细的,配合第三方json库直接就可以解析得到当前地址和坐标了,对于无定位模块的设备来说简直是个福音,这样一下子能做的事情就变得多起来了,话不多说就拿这个平台做个定位硬件出来玩玩。

这个平台的注册和设备注册我另外一个帖子已经写了,这里就不写了。STM32-ESP8266WIFI定位_fbuilke的博客-CSDN博客_esp8266定位

我手上的话就是有一块ESP32-S2,如下图:

因为全程不需要其它引脚所以其它就不介绍了,直接开始。

整个流程就是:

可以看到还是非常简单的,首先引入头文件

#include <WiFi.h>

接着在setup()中添加WiFi初始化和连接函数

void setup() {Serial.begin(115200);WiFi.mode(WIFI_STA);WiFi.begin(id,psw);while(WiFi.status()!=WL_CONNECTED){    delay(500);Serial.println("正在连接...");}Serial.println("连接成功!");    delay(100);Serial.println("Setup done");
}

因为需要上传各个扫描到的WiFi 信息,所以我们定义一个结构体来装

typedef struct ap_info
{unsigned char count;String mac;signed char rssi;
}apinfo;

然后在最前面定义一个新函数用来控制WiFi扫描并赋值到刚刚创建的结构体上,也可以在最后面定义但是要声明。为了方便所以写前面,但代码多还是要写后面为妙。

void wifi_scan()
{int n = WiFi.scanNetworks();ApInfo.count =n;Serial.println("scan done");if (n == 0) {Serial.println("no networks found");} else {Serial.print(n);Serial.println(" networks found");for (int i = 0; i < n; ++i) {ApInfo.rssi = WiFi.RSSI(i);ApInfo.mac = WiFi.BSSIDstr(i);delay(10);}}
}

接下来就是进行封装Json了,首先引入头文件和初始化封装和解析用到的部分,之所以设置这么大是因为有些地方WiFi较多如果设置很小会导致上传不全,接收也是一样的道理。

#include <ArduinoJson.h>DynamicJsonDocument doc(8192);
DynamicJsonDocument rep(4096);

如果报错的话需要去下载,期间可能会因为网络波动多次失败,实在不行就科学上网或者本地安装,这个教程很多就不叙述了。

定义一个Json封装函数用来构建post请求体,这个请求体的格式可以参考全域定位平台的API手册或者根据我下面这个格式去构建:

{"timestamp": 1670987434289,"id": "1675840238995-****************","asset": {"id": "ea32ce50-9323-****************","manufacturer": "esp32-s2"},"location": {"timestamp": 1670987434289,"wifis": [{"macAddress": "9E:2B:A6:89:40:D2","signalStrength": -34},{"macAddress": "9E:2B:A6:99:40:D2","signalStrength": -34},{"macAddress": "9E:2B:A6:A9:40:D2","signalStrength": -34},{"macAddress": "40:67:9B:AD:12:5E","signalStrength": -41}]}
}

arduino这个json库跟python一样操作简单,用惯了CJson库的这个简直是福音。

String JsonSerialization()
{String message;doc["timestamp"] = tmp_ll;doc["id"] = "1675840238995-****************";doc["asset"]["id"] = "ea32ce50-9323-****************";doc["asset"]["manufacturer"] = "esp32-s2";doc["location"]["timestamp"] = tmp_ll;for(int i = 0;i < ApInfo.count;i++){doc["location"]["wifis"][i]["macAddress"] = WiFi.BSSIDstr(i);doc["location"]["wifis"][i]["signalStrength"] = WiFi.RSSI(i);}serializeJson(doc, message);  // 序列化JSON数据并导出字符串return message;
}

完成上述后,就可以开始写请求部分了,首先需要引入头文件

#include <HTTPClient.h>

ESP32的httpclient是这个

然后就是写请求,这部分还是很简单的,几行代码搞定

void get_location(String postMessage)
{HTTPClient http;http.begin("https://api.newayz.com/location/hub/v1/track_points?access_key=***********");      http.addHeader("Content-Type", "application/json");http.addHeader("Host", "api.newayz.com");http.addHeader("Connection", "keep-alive");int httpCode = http.POST(postMessage);String payload = http.getString();                                    Serial.println(httpCode);   PraseJson(payload); http.end();
}

完成上述后,就是用相同的方式去解析请求回调的数据

void PraseJson(String json)
{DeserializationError error = deserializeJson(rep, json);if (error) {Serial.print(F("prase failed: "));Serial.println(error.f_str());return;}const char * source = rep["location"]["position"]["source"];const char * spatialReference = rep["location"]["position"]["spatialReference"];double longitude = rep["location"]["position"]["point"]["longitude"];double latitude = rep["location"]["position"]["point"]["latitude"];const char * name = rep["location"]["address"]["name"];Serial.print("当前地址:\t");Serial.println(name);Serial.print("当前经纬度坐标:\t");Serial.print(longitude,6);Serial.print("\t");Serial.println(latitude,6);Serial.print("定位获取来源:\t");Serial.print(source);Serial.print("\t坐标格式:\t");Serial.println(spatialReference);
}

最后一步就是在loop调用上述的函数去实现定位效果了

void loop() {wifi_scan();postMessage = JsonSerialization();get_location(postMessage);delay(5000);// 重新连接if (WiFi.status() != WL_CONNECTED) {Serial.println("Reconnecting to WiFi...");WiFi.disconnect();WiFi.reconnect();}
}

到这里就一切准备就绪了,全程不到100行代码轻松实现WiFi定位,解析定位效果如下

来到全域定位平台,他自带了监控大屏,上面可以看到当前设备所在位置

 该平台还有电子围栏,轨迹查询等功能还需要各位自己去慢慢摸索,相应的API手册也很齐全,如果有什么问题欢迎留言,我会尽快回复。

Arduino ESP32 WiFi定位相关推荐

  1. Arduino ESP32 WIFI 蓝牙模式触控按键切换

    Arduino ESP32 WIFI &蓝牙模式触控按键切换 相关篇<Arduino ESP32自带触摸传感器功能测试> <ESP32电容式触摸传感器引脚实例> ESP ...

  2. arduino esp32 读福申甲醛传感器

    arduino esp32 读福申甲醛传感器 想法 源代码 想法 arduino库丰富,几行代码即可完成需求描述. 缺点是不能Debug. 想持续监测甲醛变化. 使用杜邦线连接,需要将传感器的输出线焊 ...

  3. Arduino ESP32 获取网络时间并同步本地RTC时钟

    Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...

  4. ESP32 Wi-Fi讲解,station连接热点案例

    零. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对 ...

  5. Arduino+esp32+blinker第一课点灯

    Arduino+esp32+blinker第一课点灯 文章目录 Arduino+esp32+blinker第一课点灯 前言 一.开发环境搭建 二.开发第一个点灯程序 1.添加设备 2.载入示例 3.代 ...

  6. Arduino ESP32 获取网络数据(HTTP POST方式)

    Arduino ESP32 获取网络数据(HTTP POST方式) 相关篇<Arduino ESP32 获取网络数据(HTTP GET方式)> <Arduino ESP32 获取网络 ...

  7. Arduino ESP32 获取网络数据(HTTP GET方式)

    Arduino ESP32 获取网络数据(HTTP GET方式) 相关篇<Arduino ESP32 获取网络数据(HTTP POST方式)> <Arduino ESP32 获取网络 ...

  8. 定位技术GPS/A-GPS/LBS/WIFI定位介绍

    定位技术GPS/A-GPS/LBS/WIFI定位介绍 来源:本站整理 作者:08LR.CN 更新时间:2013年05月03日人气:本日:9 本周:19 本月:34 总数:2134 次 生活中,我们经常 ...

  9. Arduino UNO WIFI开发板,学习必备开发套件

    Arduino Uno Wi-Fi是一款带有集成式Wi-Fi模块的新型Arduino Uno板!该板基于ATmega328P(数据手册),具有集成式ESP8266 Wi-Fi模块(数据手册).它拥有1 ...

最新文章

  1. SPOJ 694 Distinct Substrings(后缀数组)
  2. Linux-SNAT和DNAT
  3. swoole基础01
  4. Spring Cloud Security:Oauth2实现单点登录
  5. SQL Server 2005 COM+ 目录要求 (警告)
  6. 如何使用 backupninja 来备份 Debian 系统
  7. linux 线程id 进程id,在Linux上显示正在运行的进程的线程ID
  8. matlab 构建数据集实用 api
  9. c语言写的程序如何移植,完全由C语言编写,高度可移植,超级牛逼的软件定时器!...
  10. PHP可变变量的简单使用
  11. 机房巡检知识点(一)
  12. 应用MATLAB求解线性代数题目(五)——特征值与特征向量
  13. Bluetooth协议学习
  14. 单片机项目:8个发光二极管从上至下间隔一秒流动,其中每个管亮500ms,500ms,亮时蜂鸣器响,灭时蜂鸣器关闭,一直重复下去
  15. java MySQL所有语句
  16. 数采仪 环保标准 数据采集传输仪
  17. 流氓 2345.com的新动态及解决方法
  18. Idea中使用maven打包出现Cleaning up unclosed ZipFile for archive?
  19. LogLog基数估计算法学习与实现分析
  20. MYSQL 研发规范

热门文章

  1. 【STM32】定时器中断原理及操作
  2. C语言--压缩字符串
  3. 计算机辅助设计和辅助教学,计算机辅助设计教学计划
  4. 群晖开启root账户登陆
  5. MacOS安装mod_python
  6. 入门级报童问题的计算机仿真
  7. IEEE1588时钟同步服务器应用数字化变电站
  8. 政府云计算的构建选择-刘鑫(政务云 云平台)
  9. ubuntu20.04 RTX 8000 安装GPU驱动,CUDA,cuDNN,TensorRT
  10. CALayer之anchorPoint分析