#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* mqtt_server = "mqtt.flespi.io";
const char* mqtt_topic = "FAKEGPS_DCP/coords";
const char* mqtt_token = "l3VDhmTWtzu6Dbu8kh1POdvVqKMOljAn9MLkQ1KxATR3seK8gYyhHUKezHtnNX15";
WiFiClient espClient;
PubSubClient client(espClient);
HardwareSerial gpsSerial(2);
// 🔹 Ruta de Google Maps (ejemplo con coordenadas reales)
const float route[][2] = {
{32.491500800, -116.903438900},
{32.491440000, -116.903660000},
{32.491390000, -116.903860000},
{32.491270000, -116.904310000},
{32.491230000, -116.904470000},
{32.491210000, -116.904580000},
{32.491190000, -116.904680000},
{32.491180000, -116.904780000},
{32.491110000, -116.905220000},
{32.491100000, -116.905310000},
{32.491090000, -116.905400000},
{32.491080000, -116.905590000},
{32.491082300, -116.905587500},
{32.491220000, -116.905600000},
{32.491270000, -116.905600000},
{32.491630000, -116.905640000},
{32.492200000, -116.905700000},
{32.492200800, -116.905697600},
{32.492150000, -116.906270000},
{32.492100000, -116.906820000},
{32.492050000, -116.907380000},
{32.492000000, -116.907910000},
{32.491960000, -116.908460000},
{32.491910000, -116.909000000},
{32.491860000, -116.909560000},
{32.491800000, -116.910130000},
{32.491740000, -116.910840000},
{32.491690000, -116.911450000},
{32.491620000, -116.912250000},
{32.491600000, -116.912470000},
{32.491580000, -116.912680000},
{32.491580000, -116.912730000},
{32.491570000, -116.912890000},
{32.491570000, -116.912990000},
{32.491580000, -116.913160000},
{32.491600000, -116.913340000},
{32.491620000, -116.913530000},
{32.491670000, -116.913780000},
{32.491720000, -116.914000000},
{32.491750000, -116.914160000},
{32.491770000, -116.914350000},
{32.491772600, -116.914353100},
{32.491730000, -116.914510000},
{32.491700000, -116.914630000},
{32.491630000, -116.914870000},
{32.491560000, -116.915010000},
{32.491540000, -116.915030000},
{32.491510000, -116.915080000},
{32.491480000, -116.915100000},
{32.491410000, -116.915160000},
{32.491210000, -116.915320000},
{32.490840000, -116.915660000},
{32.490730000, -116.915800000},
{32.490540000, -116.916020000},
{32.490360000, -116.916240000},
{32.490180000, -116.916460000},
{32.490070000, -116.916610000},
{32.489950000, -116.916760000},
{32.489510000, -116.917240000},
{32.489020000, -116.917720000},
{32.488560000, -116.918190000},
{32.488210000, -116.918560000},
{32.488190000, -116.918580000},
{32.488130000, -116.918640000},
{32.487680000, -116.919090000},
{32.487650000, -116.919120000},
{32.487610000, -116.919150000},
{32.487550000, -116.919210000},
{32.487480000, -116.919290000},
{32.487420000, -116.919350000},
{32.487330000, -116.919460000},
{32.487270000, -116.919520000},
{32.487080000, -116.919750000},
{32.487050000, -116.919790000},
{32.486930000, -116.919940000},
{32.486870000, -116.920020000},
{32.486790000, -116.920130000},
{32.486710000, -116.920250000},
{32.486660000, -116.920350000},
{32.486620000, -116.920460000},
{32.486550000, -116.920660000},
{32.486370000, -116.921550000},
{32.486370000, -116.921640000},
{32.486350000, -116.921750000},
{32.486330000, -116.921940000},
{32.486310000, -116.922240000},
{32.486320000, -116.922370000},
{32.486320000, -116.922550000},
{32.486320000, -116.922580000},
{32.486330000, -116.922720000},
{32.486320000, -116.922800000},
{32.486320000, -116.922920000},
{32.486320000, -116.923010000},
{32.486320000, -116.923080000},
{32.486300000, -116.923210000},
{32.486280000, -116.923290000},
{32.486260000, -116.923350000},
{32.486260000, -116.923410000},
{32.486240000, -116.923530000},
{32.486150000, -116.923660000},
{32.486090000, -116.923740000},
{32.486070000, -116.923790000},
{32.486060000, -116.923820000},
{32.486040000, -116.923840000},
{32.486010000, -116.923900000},
{32.485990000, -116.923970000},
{32.485990000, -116.924010000},
{32.485990000, -116.924140000},
{32.485990000, -116.924200000},
{32.485990000, -116.924260000},
{32.486000000, -116.924380000},
{32.486000000, -116.924500000},
{32.485990000, -116.924520000},
{32.485980000, -116.924570000},
{32.485960000, -116.924680000},
{32.485940000, -116.924890000},
{32.485930000, -116.924980000},
{32.485920000, -116.925180000},
{32.485900000, -116.925570000},
{32.485910000, -116.925840000},
{32.485910000, -116.925990000},
{32.485910000, -116.926380000},
{32.485880000, -116.926830000},
{32.485840000, -116.927100000},
{32.485790000, -116.927260000},
{32.485770000, -116.927340000},
{32.485710000, -116.927480000},
{32.485580000, -116.927720000},
{32.485480000, -116.927870000},
{32.485340000, -116.928030000},
{32.484640000, -116.928920000},
{32.484560000, -116.929040000},
{32.484430000, -116.929200000},
{32.484160000, -116.929550000},
{32.484070000, -116.929670000},
{32.483410000, -116.930450000},
{32.483370000, -116.930500000},
{32.483090000, -116.930940000},
{32.483030000, -116.931060000},
{32.483020000, -116.931230000},
{32.483010000, -116.931310000},
{32.483020000, -116.931380000},
{32.483040000, -116.931470000},
{32.483043100, -116.931473400},
{32.483080000, -116.931500000},
{32.483100000, -116.931520000},
{32.483720000, -116.932020000},
{32.483718200, -116.932018800},
{32.483770000, -116.932060000},
{32.483820000, -116.932100000},
{32.483850000, -116.932130000},
{32.483940000, -116.932200000},
{32.484090000, -116.932330000},
{32.484380000, -116.932580000},
{32.484380000, -116.932582900},
{32.484400000, -116.932660000},
{32.484510000, -116.932770000},
{32.484570000, -116.932820000},
{32.484590000, -116.932930000},
{32.485420000, -116.933630000},
{32.485850000, -116.933990000},
{32.485940000, -116.934050000},
{32.486490000, -116.934430000},
{32.486840000, -116.934640000},
{32.487150000, -116.934810000},
{32.487310000, -116.934900000},
{32.487470000, -116.935000000},
{32.487780000, -116.935170000},
{32.487950000, -116.935270000},
{32.488400000, -116.935520000},
{32.488770000, -116.935740000},
{32.489110000, -116.935940000},
{32.489550000, -116.936180000},
{32.489700000, -116.936270000},
{32.490310000, -116.936620000},
{32.490560000, -116.936760000},
{32.490740000, -116.936870000},
{32.491280000, -116.937190000},
{32.491500000, -116.937320000},
{32.491660000, -116.937410000},
{32.491830000, -116.937520000},
{32.491940000, -116.937600000},
{32.492160000, -116.937760000},
{32.492240000, -116.937820000},
{32.492340000, -116.937910000},
{32.492500000, -116.938040000},
{32.492610000, -116.938150000},
{32.492760000, -116.938310000},
{32.492920000, -116.938480000},
{32.493070000, -116.938640000},
{32.493230000, -116.938800000},
{32.493370000, -116.938970000},
{32.493550000, -116.939180000},
{32.495160000, -116.941150000},
{32.495790000, -116.941920000},
{32.495980000, -116.942160000},
{32.496350000, -116.942630000},
{32.496720000, -116.943110000},
{32.496990000, -116.943450000},
{32.497080000, -116.943550000},
{32.497210000, -116.943730000},
{32.497290000, -116.943860000},
{32.497390000, -116.944010000},
{32.497410000, -116.944040000},
{32.497440000, -116.944090000},
{32.498250000, -116.945470000},
{32.498700000, -116.946210000},
{32.499140000, -116.946960000},
{32.499420000, -116.947420000},
{32.499520000, -116.947590000},
{32.499570000, -116.947660000},
{32.499830000, -116.948100000},
{32.500170000, -116.948660000},
{32.500550000, -116.949200000},
{32.501080000, -116.949930000},
{32.501120000, -116.949990000},
{32.501790000, -116.950910000},
{32.501950000, -116.951120000},
{32.502170000, -116.951440000},
{32.502360000, -116.951700000},
{32.502470000, -116.951830000},
{32.502830000, -116.952340000},
{32.502860000, -116.952370000},
{32.503450000, -116.953200000},
{32.504780000, -116.955010000},
{32.505230000, -116.955630000},
{32.505260000, -116.955680000},
{32.505850000, -116.956490000},
{32.505960000, -116.956640000},
{32.506180000, -116.956980000},
{32.506220000, -116.957040000},
{32.506460000, -116.957410000},
{32.506680000, -116.957730000},
{32.506700000, -116.957760000},
{32.506790000, -116.957900000},
{32.507000000, -116.958250000},
{32.507410000, -116.958920000},
{32.507850000, -116.959550000},
{32.507970000, -116.959720000},
{32.508110000, -116.959930000},
{32.508330000, -116.960230000},
{32.508340000, -116.960260000},
{32.508410000, -116.960350000},
{32.508410000, -116.960360000},
{32.508710000, -116.960780000},
{32.509190000, -116.961430000},
{32.509580000, -116.961970000},
{32.511070000, -116.964030000},
{32.511350000, -116.964440000},
{32.511480000, -116.964640000},
{32.511910000, -116.965230000},
{32.512280000, -116.965730000},
{32.513470000, -116.967400000},
{32.513670000, -116.967690000},
{32.513850000, -116.967940000},
{32.514260000, -116.968550000},
{32.514330000, -116.968660000},
{32.514510000, -116.968950000},
{32.514610000, -116.969120000},
{32.514670000, -116.969210000},
{32.514940000, -116.969660000},
{32.514950000, -116.969680000},
{32.515400000, -116.970450000},
{32.515540000, -116.970750000},
{32.515600000, -116.970890000},
{32.515620000, -116.970940000},
{32.515700000, -116.971180000},
{32.515800000, -116.971480000},
{32.515840000, -116.971630000},
{32.515880000, -116.971840000},
{32.515900000, -116.972000000},
{32.515930000, -116.972210000},
{32.516010000, -116.973000000},
{32.516060000, -116.973460000},
{32.516140000, -116.974440000},
{32.516330000, -116.976370000},
{32.516450000, -116.977870000},
{32.516520000, -116.978730000},
{32.516610000, -116.980030000},
{32.516690000, -116.981250000},
{32.516770000, -116.982250000},
{32.516780000, -116.982350000},
{32.516860000, -116.983420000},
{32.516870000, -116.983480000},
{32.516867700, -116.983484000},
{32.517020000, -116.984120000},
{32.517030000, -116.984260000},
{32.517040000, -116.984330000},
{32.517050000, -116.984490000},
{32.517045200, -116.984493200},
{32.517280000, -116.984510000},
{32.517780000, -116.984550000},
{32.517820000, -116.984560000},
{32.518410000, -116.984620000},
{32.519070000, -116.984610000},
{32.519800000, -116.984580000},
{32.520510000, -116.984550000},
{32.521190000, -116.984530000},
{32.521860000, -116.984510000},
{32.521863500, -116.984508600},
{32.522070000, -116.984500000},
{32.522080000, -116.984500000},
{32.522090000, -116.984500000},
{32.522100000, -116.984510000},
{32.522110000, -116.984510000},
{32.522170000, -116.984560000},
{32.522200000, -116.984560000},
{32.522220000, -116.984570000},
{32.522250000, -116.984580000},
{32.522310000, -116.984610000},
{32.522350000, -116.984650000},
{32.522400000, -116.984690000},
{32.522880000, -116.984980000},
{32.522890000, -116.984990000},
{32.523210000, -116.985150000},
{32.523450000, -116.985270000},
{32.523580000, -116.985310000},
{32.523650000, -116.985330000},
{32.523710000, -116.985330000},
{32.523780000, -116.985330000},
{32.523850000, -116.985340000},
{32.523950000, -116.985330000},
{32.524040000, -116.985320000},
{32.524090000, -116.985310000},
{32.524220000, -116.985280000},
{32.524360000, -116.985240000},
{32.524820000, -116.985110000},
{32.525090000, -116.985060000},
{32.525130000, -116.985050000},
{32.525380000, -116.985020000},
{32.525510000, -116.985030000},
{32.525670000, -116.985060000},
{32.525810000, -116.985080000},
{32.525970000, -116.985100000},
{32.526100000, -116.985120000},
{32.526210000, -116.985130000},
{32.526340000, -116.985120000},
{32.526420000, -116.985100000},
{32.526580000, -116.985050000},
{32.526990000, -116.984950000},
{32.527040000, -116.984940000},
{32.527350000, -116.984870000},
{32.527348700, -116.984867600},
{32.527580000, -116.984760000},
{32.527910000, -116.984600000},
{32.528620000, -116.984220000},
{32.528930000, -116.984050000},
{32.528933500, -116.984052700},
{32.529010000, -116.984030000},
{32.528940000, -116.984930000},
{32.528920000, -116.985290000},
{32.528870000, -116.985860000},
{32.528810000, -116.986580000},
{32.528800000, -116.986800000},
{32.528798700, -116.986801400},
{32.528840000, -116.986780000},
{32.529470000, -116.986420000},
{32.529474700, -116.986417100},
{32.529510000, -116.986510000},
{32.529540000, -116.986590000},
{32.529535800, -116.986591000},
{32.529690000, -116.986510000},
{32.529692200, -116.986506000},
{32.529692200, -116.986506000},
{32.529692200, -116.986506000}
};
const int routeSize = sizeof(route) / sizeof(route[0]);
int currentPoint = 0;
void setup() {
Serial.begin(115200);
gpsSerial.begin(9600, SERIAL_8N1, 16, 17);
WiFi.begin(ssid, "", 6);
Serial.println("Conectando a WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ WiFi conectado!");
client.setServer(mqtt_server, 1883);
reconnectMQTT();
}
void loop() {
if (!client.connected()) reconnectMQTT();
// 🔹 Obtener la coordenada actual de la ruta
float lat = route[currentPoint][0];
float lon = route[currentPoint][1];
// 🔹 Crear el JSON
StaticJsonDocument<200> doc;
doc["ident"] = "GPS_pos";
doc["position.latitude"] = lat;
doc["position.longitude"] = lon;
doc["speed"] = 10.0; // Simulación de movimiento
doc["time"] = "12:00:00";
char jsonMessage[256];
serializeJson(doc, jsonMessage);
gpsSerial.println(jsonMessage);
Serial.println(jsonMessage);
client.publish(mqtt_topic, jsonMessage);
// 🔹 Moverse al siguiente punto de la ruta
currentPoint++;
if (currentPoint >= routeSize) currentPoint = 0; // Reinicia la ruta si llega al final
delay(2000);
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.println("Conectando a MQTT...");
if (client.connect("ESP32Client", mqtt_token, "")) {
Serial.print("✅ Conectado a MQTT!");
} else {
Serial.println("❌ Fallo MQTT, rc=");
Serial.println(client.state());
delay(2000);
}
}
}