Arduino ESP32 WiFi定位
最近项目用到定位,但是又不想重新画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定位相关推荐
- Arduino ESP32 WIFI 蓝牙模式触控按键切换
Arduino ESP32 WIFI &蓝牙模式触控按键切换 相关篇<Arduino ESP32自带触摸传感器功能测试> <ESP32电容式触摸传感器引脚实例> ESP ...
- arduino esp32 读福申甲醛传感器
arduino esp32 读福申甲醛传感器 想法 源代码 想法 arduino库丰富,几行代码即可完成需求描述. 缺点是不能Debug. 想持续监测甲醛变化. 使用杜邦线连接,需要将传感器的输出线焊 ...
- Arduino ESP32 获取网络时间并同步本地RTC时钟
Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...
- ESP32 Wi-Fi讲解,station连接热点案例
零. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对 ...
- Arduino+esp32+blinker第一课点灯
Arduino+esp32+blinker第一课点灯 文章目录 Arduino+esp32+blinker第一课点灯 前言 一.开发环境搭建 二.开发第一个点灯程序 1.添加设备 2.载入示例 3.代 ...
- Arduino ESP32 获取网络数据(HTTP POST方式)
Arduino ESP32 获取网络数据(HTTP POST方式) 相关篇<Arduino ESP32 获取网络数据(HTTP GET方式)> <Arduino ESP32 获取网络 ...
- Arduino ESP32 获取网络数据(HTTP GET方式)
Arduino ESP32 获取网络数据(HTTP GET方式) 相关篇<Arduino ESP32 获取网络数据(HTTP POST方式)> <Arduino ESP32 获取网络 ...
- 定位技术GPS/A-GPS/LBS/WIFI定位介绍
定位技术GPS/A-GPS/LBS/WIFI定位介绍 来源:本站整理 作者:08LR.CN 更新时间:2013年05月03日人气:本日:9 本周:19 本月:34 总数:2134 次 生活中,我们经常 ...
- Arduino UNO WIFI开发板,学习必备开发套件
Arduino Uno Wi-Fi是一款带有集成式Wi-Fi模块的新型Arduino Uno板!该板基于ATmega328P(数据手册),具有集成式ESP8266 Wi-Fi模块(数据手册).它拥有1 ...
最新文章
- SPOJ 694 Distinct Substrings(后缀数组)
- Linux-SNAT和DNAT
- swoole基础01
- Spring Cloud Security:Oauth2实现单点登录
- SQL Server 2005 COM+ 目录要求 (警告)
- 如何使用 backupninja 来备份 Debian 系统
- linux 线程id 进程id,在Linux上显示正在运行的进程的线程ID
- matlab 构建数据集实用 api
- c语言写的程序如何移植,完全由C语言编写,高度可移植,超级牛逼的软件定时器!...
- PHP可变变量的简单使用
- 机房巡检知识点(一)
- 应用MATLAB求解线性代数题目(五)——特征值与特征向量
- Bluetooth协议学习
- 单片机项目:8个发光二极管从上至下间隔一秒流动,其中每个管亮500ms,500ms,亮时蜂鸣器响,灭时蜂鸣器关闭,一直重复下去
- java MySQL所有语句
- 数采仪 环保标准 数据采集传输仪
- 流氓 2345.com的新动态及解决方法
- Idea中使用maven打包出现Cleaning up unclosed ZipFile for archive?
- LogLog基数估计算法学习与实现分析
- MYSQL 研发规范