如果你想做一个不依赖Wi-Fi,能实时把位置信息上传到服务器的 DIY 设备,可以试试这个项目。它结合了 ESP32 + SIM800L GSM 模块 + NEO-6M GPS,能在移动场景下持续获取坐标,并通过移动网络上传,实现一个可部署、可移动、可扩展的简易 GPS 追踪器。
项目功能概览
✔ 获取实时 GPS 定位
NEO-6M 模块负责定位,输出经纬度、卫星状态、信号质量等。
✔ 使用 SIM800L 通过 HTTP 上传数据
设备会把采集到的位置数据周期性上传到服务器,SIM800L 负责移动网络连接,并通过简单的 HTTP 请求上报信息。
✔ 自动运行
上电后会自动开始定位 → 获取数据 → 通过网络发送。
硬件组成
-
ESP32 开发板
-
SIM800L GSM 模块
-
NEO-6M GPS 模块(带天线)
-
2个LED灯
-
2个470Ω电阻
-
面包板
-
若干杜邦线
-
SIM卡一张
-
一个 5V 电源(根据搭建方式可由 USB 或独立供电)
SIM800L 需稳定供电,否则容易因瞬时电流不足而重启或无法注册网络。
系统如何工作
项目的整体逻辑非常直接:
-
NEO-6M 获取 GPS 数据
ESP32 通过串口读取 NMEA 字符串,再从中提取 lat、lng、speed 等字段。 -
ESP32 构建 HTTP GET 请求
作者在代码中将 GPS 数据拼接为 URL 参数。 -
SIM800L 通过 GPRS 将数据传到服务器
通过 AT 指令: -
激活 GPRS
-
配置 APN
-
打开 TCP 连接
-
发送 HTTP 请求
-
PHP 接收并写入 MySQL
服务器端脚本将纬度、经度、IMEI、时间等字段写入数据库。 -
网页端调用 Google Maps API 显示位置点
页面会从数据库读取最新坐标并在地图上展示。
电路连接方式
作者给出了明确的连接结构:
ESP32 → SIM800L
-
TX 与 RX 交叉连接
-
供电通过外部稳定电源(SIM800L 对电流较敏感)
ESP32 → NEO-6M GPS
-
GPS 的 TX → ESP32 的 RX
-
GPS 的 GND 与系统共地
-
GPS 的 VCC 接 3.3V
软件与代码介绍
作者给出的程序使用 Arduino IDE,可以快速编译上传。功能模块包括:
1. 初始化 GSM & GPS
程序先启动 SIM800L,随后启动 GPS 模块。
2. 从 GPS 读取数据
代码循环读取串口输出,解析 NMEA 字符串获得经纬度。
3. 通过 SIM800L 执行 HTTP 请求
程序构建 HTTP 包,将位置上传到指定服务器。
4. 循环执行
持续采集 → 上传 → 等待下一次周期。
// GPS ConfigurationHardwareSerial gpsSerial(1);// GSM ConfigurationHardwareSerial gsmSerial(2);// Network credentialsconst char* apn = "yourAPN"; // Replace with your carrier's APNconst char* gsmUser = nullptr;const char* gsmPass = nullptr;// GeoLinker settingsconst char* apiKey = "xxxxxxxxxxxx"; // Replace with your API keyconst char* deviceID = "ESP32_Sim800l";const uint16_t updateInterval = 30;const bool enableOfflineStorage = true;const uint8_t offlineBufferLimit = 20;const bool enableAutoReconnect = true;const int8_t timeOffsetHours = 5;const int8_t timeOffsetMinutes = 30;// LED pinsconst int DataSent_LED = 32;const int GPSFix_LED = 23;GeoLinker geo;void setup() {Serial.begin(115200);gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_RX, GPS_TX);gsmSerial.begin(GSM_BAUD, SERIAL_8N1, GSM_RX, GSM_TX);pinMode(DataSent_LED, OUTPUT);pinMode(GPSFix_LED, OUTPUT);geo.begin(gpsSerial);geo.setApiKey(apiKey);geo.setDeviceID(deviceID);geo.setUpdateInterval_seconds(updateInterval);geo.setDebugLevel(DEBUG_BASIC);geo.enableOfflineStorage(enableOfflineStorage);geo.enableAutoReconnect(enableAutoReconnect);geo.setOfflineBufferLimit(offlineBufferLimit);geo.setTimeOffset(timeOffsetHours, timeOffsetMinutes);geo.setNetworkMode(GEOLINKER_CELLULAR);geo.setModemCredentials(apn, gsmUser, gsmPass);geo.beginModem(gsmSerial, GSM_PWR_PIN, GSM_RST_PIN, true);geo.setModemTimeouts(5000, 15000);}void loop() {uint8_t status = geo.loop();switch (status) {case STATUS_SENT:Serial.println("Data sent successfully!");break;case STATUS_GPS_ERROR:Serial.println("GPS connection error!");break;case STATUS_NETWORK_ERROR:Serial.println("Network error (buffered).");break;case STATUS_BAD_REQUEST_ERROR:Serial.println("Bad request error!");break;case STATUS_PARSE_ERROR:Serial.println("GPS data format error!");break;case STATUS_CELLULAR_NOT_REGISTERED:Serial.println("GSM: Not registered to network!");break;}if ((status != STATUS_GPS_ERROR) && (status != STATUS_PARSE_ERROR)) {digitalWrite(GPSFix_LED, HIGH);} else {digitalWrite(GPSFix_LED, LOW);}if (status == STATUS_SENT) {digitalWrite(DataSent_LED, HIGH);delay(1000);digitalWrite(DataSent_LED, LOW);}}
项目实测
状态指示:
SIM800L NETLIGHT 指示灯状态:
-
每 1 秒闪一次: 模块已启动,但尚未连接到网络
-
每 2 秒闪一次: GPRS 数据连接已激活
-
每 3 秒闪一次: 已成功连接到蜂窝网络
-
快速闪烁: 正在进行数据传输
NEO-6M GPS 指示灯:
-
常灭: 尚未获得卫星定位
-
开始闪烁: 已成功定位(GPS fix)
作者在项目里展示了多张实测结果,包括:
-
GPS 获取到正确经纬度
-
SIM800L 成功发送 HTTP 数据
-
谷歌地图上正确出现定位点
-
数据库成功写入上传记录
可扩展方向
虽然原文没有加入额外功能,但从其结构可以看出非常适合扩展:
-
记录更多 GPS 字段(速度、卫星数)
-
增加设备状态上报
-
Web 端加入历史轨迹折线
-
增加电池与低功耗逻辑
-
加入地理围栏报警(服务器端扩展即可)
这个项目提供了一个非常清晰的参考:
用最简单的组合模块,就能做出一个可用的实时定位设备。它不依赖复杂服务器,不需要大型框架,也没有多余功能。如果你想入手“GPS + GSM + IoT”领域,可以尝试下这个入门项目。
点击阅读原文查看原项目