📡 Portable GPS/GSM Tracker with Q250 Module – Part 2: The Software (Full 2026 Guide)
Hey makers! Electro here. In Part 1 we built the hardware around the tiny Wavecom Q250 module — GPS receiver, GSM core and battery management on one compact board. Now comes the brain: the software that reads satellite fixes, decides when to transmit, and lets you configure the tracker remotely by SMS. Let's open the code!
🔄 Updated for 2026: NMEA parsing explained line by line, the full AT-command flow, remote configuration, network mapping — plus a modern ESP32 port of the same logic (because 2G networks are shutting down!).
🧠 Software Architecture: Three Jobs, One MCU
The Q250 embeds its own microcontroller, so the tracking application runs directly on the module (OpenAT-style). The firmware has three main tasks:
- Read the GPS: collect NMEA sentences from the receiver at 4800–9600 baud.
- Decide when to transmit: on a timer, on motion, or on request.
- Manage the GSM link: send positions by SMS/GPRS and answer configuration commands.
🛰️ Step 1 – Parsing NMEA Frames
The GPS outputs standard sentences. The most useful is $GPRMC, which carries fix validity, latitude, longitude, speed and time in one line:
$GPRMC,083559.00,A,4717.11437,N,00833.91522,E,0.004,77.52,091202,,,A*57
The parser must verify the checksum, check the validity flag (A = valid, V = void), then convert degrees+minutes into decimal degrees:
// Minimal $GPRMC parser - Electro (TechFix Hub)
bool parseGPRMC(const char* f, float &lat, float &lon) {
if (strncmp(f, "$GPRMC", 6)) return false;
uint8_t sum = 0; const char* p = f + 1;
while (*p && *p != '*') sum ^= *p++; // checksum
if (*p == '*' && strtol(p+1, NULL, 16) != sum) return false;
if (f[18] != 'A') return false; // no fix
float rawLat = atof(f + 20), rawLon = atof(f + 32);
lat = (int)(rawLat/100) + fmod(rawLat,100)/60.0;
lon = (int)(rawLon/100) + fmod(rawLon,100)/60.0;
if (f[30] == 'S') lat = -lat;
if (f[42] == 'W') lon = -lon;
return true;
}
📶 Step 2 – Sending the Position over GSM
Once a valid fix is parsed, the firmware wakes the GSM stack and sends the position. In text mode the AT-command flow is beautifully simple:
// AT command sequence to send a position SMS
AT+CMGF=1 // SMS text mode
AT+CMGS="+33612345678" // destination number
> POS: 47.28524N 8.56525E
> SPD: 0.0km/h BAT: 3.9V
> [Ctrl+Z = 0x1A] // send!
Even better: send a Google Maps link instead of raw coordinates — https://maps.google.com/?q=47.28524,8.56525 — so one tap on your phone shows the tracker on the map.
🎛️ Step 3 – Remote Configuration by SMS
The onboard MCU constantly monitors incoming SMS for command keywords, which makes the tracker fully configurable in the field:
- TRACK ON / TRACK OFF – enable or disable periodic reporting.
- INTERVAL 60 – set the reporting period in seconds.
- NUM +33… – change the destination phone number.
- WHERE – request an immediate position reply.
🌐 Step 4 – From SMS to Map (APRS & PC Networking)
The original series also covered APRS and PC-side networking: positions forwarded to a computer are plotted on a map in real time. Today the same job is done by a web dashboard, Home Assistant, or a free tracking frontend that consumes your SMS/GPRS feed.
🤖 The Modern Twist 2026: Same Logic on ESP32
With 2G networks shutting down worldwide, the Q250 is now a collector's item — but the logic ports perfectly to an ESP32 + LTE-M (A7670) or LoRa (Meshtastic) for off-grid tracking:
// ESP32 port of the tracker logic - Electro (TechFix Hub)
#include <TinyGPS++.h>
#include <TinyGsmModem.h>
TinyGPSPlus gps;
void loop() {
while (Serial2.available()) gps.encode(Serial2.read());
if (gps.location.isUpdated() && millis() - lastSend > interval) {
String link = "https://maps.google.com/?q=" +
String(gps.location.lat(), 6) + "," +
String(gps.location.lng(), 6);
modem.sendSMS(destination, link.c_str());
lastSend = millis();
}
}
💡 Pro Tips (by Electro)
- Checksum everything: never trust an NMEA sentence without verifying its XOR checksum — RF noise corrupts frames.
- Watchdog on: GSM stacks hang; a hardware watchdog resets the tracker automatically.
- Battery math: a GSM transmission burst can draw 2 A. Size your Li-Po and add a 1000 µF low-ESR capacitor close to the module.
- Motion trigger: add a simple vibration switch to transmit only when the asset moves — autonomy ×10.
❓ FAQ
Does a Q250-based tracker still work in 2026?
Only where 2G/GPRS networks still exist. In most countries 2G is retired — port the firmware to LTE-M/NB-IoT (A7670, SIM7080) or LoRa for off-grid use. The parsing and SMS logic stays identical.
How often should the tracker transmit?
Every 30–60 s for vehicles, every 5–10 min for static assets. Transmission is 90% of the power budget — interval is your autonomy lever.
Can I use it as a car anti-theft device?
Yes: combine a motion/vibration trigger with the GSM alert, exactly like our Smart Anti-Theft System guide.
🎯 Conclusion
The Q250 tracker's software is a masterclass in embedded design: parse, decide, transmit — with remote configuration over the air. Whether you restore the original 2008 firmware or port it to a modern ESP32 + LTE-M board, the architecture survives 20 years later. That's what good engineering looks like.
Built a tracker or ported it to LoRa? Share your range and battery numbers in the comments — I read every single one!