📝 Step 3: Complete LTE MQTT Sketch
#include <TinyGsmClient.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
HardwareSerial SerialLTE(1);
const int LTE_RX_PIN = 16;
const int LTE_TX_PIN = 17;
const char* APN = "airtelgprs.com";
const char* MQTT_BROKER = "your-broker-domain.com";
const int MQTT_PORT = 1883;
const char* DEVICE_ID = "lte-001";
const char* MQTT_USER = "";
const char* MQTT_PASSWORD = "";
const char* TOPIC_CMD = "lte/" DEVICE_ID "/command";
const char* TOPIC_STATUS = "lte/" DEVICE_ID "/status";
const char* TOPIC_TELEMETRY = "lte/" DEVICE_ID "/telemetry";
const int RELAY_PIN = 26;
const int LED_PIN = 2;
TinyGsm modem(SerialLTE);
TinyGsmClient gsmClient(modem);
PubSubClient mqttClient(gsmClient);
bool relayState = false;
bool networkConnected = false;
bool mqttConnected = false;
unsigned long lastTelemetry = 0;
const int TELEMETRY_INTERVAL = 60000;
void setup() {
Serial.begin(115200);
SerialLTE.begin(115200, SERIAL_8N1, LTE_RX_PIN, LTE_TX_PIN);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Serial.println("🚀 LTE MQTT Client Starting...");
initModem();
mqttClient.setServer(MQTT_BROKER, MQTT_PORT);
mqttClient.setCallback(mqttCallback);
Serial.println("✅ Setup Complete!");
}
void loop() {
if (!modem.isNetworkConnected()) {
Serial.println("⚠️ Network disconnected!");
networkConnected = false;
digitalWrite(LED_PIN, LOW);
connectNetwork();
} else {
networkConnected = true;
digitalWrite(LED_PIN, HIGH);
}
if (networkConnected && !mqttClient.connected()) {
Serial.println("⚠️ MQTT disconnected! Reconnecting...");
connectMQTT();
}
mqttClient.loop();
if (mqttConnected && millis() - lastTelemetry > TELEMETRY_INTERVAL) {
sendTelemetry();
lastTelemetry = millis();
}
delay(100);
}
void initModem() {
Serial.println("🔄 Initializing modem...");
modem.restart();
delay(3000);
String modemName = modem.getModemName();
Serial.printf("📱 Modem: %s\n", modemName.c_str());
connectNetwork();
}
void connectNetwork() {
Serial.println("📶 Connecting to network...");
int attempts = 0;
while (!modem.waitForNetwork() && attempts < 30) {
Serial.print(".");
delay(1000);
attempts++;
}
if (modem.isNetworkConnected()) {
Serial.println();
Serial.println("✅ Network connected!");
connectGPRS();
} else {
Serial.println();
Serial.println("❌ Network failed!");
}
}
void connectGPRS() {
Serial.print("🌐 Connecting GPRS with APN: ");
Serial.println(APN);
modem.setNetworkMode(38);
modem.setPreferredMode(1);
bool success = modem.gprsConnect(APN, USER, PWD);
if (success) {
Serial.println("✅ GPRS connected!");
int rssi = modem.getSignalQuality();
Serial.printf("📶 Signal quality: %d\n", rssi);
Serial.printf("🌍 IP: %s\n", modem.getLocalIP().c_str());
} else {
Serial.println("❌ GPRS failed!");
}
}
void connectMQTT() {
Serial.print("🔌 Connecting to MQTT broker: ");
Serial.println(MQTT_BROKER);
char clientID[50];
snprintf(clientID, sizeof(clientID), "%s-%lu", DEVICE_ID, millis());
bool success;
if (strlen(MQTT_USER) > 0) {
success = mqttClient.connect(clientID, MQTT_USER, MQTT_PASSWORD);
} else {
success = mqttClient.connect(clientID);
}
if (success) {
Serial.println("✅ MQTT connected!");
mqttConnected = true;
mqttClient.subscribe(TOPIC_CMD);
Serial.printf("📥 Subscribed: %s\n", TOPIC_CMD);
publishStatus("online");
} else {
Serial.printf("❌ MQTT failed, rc=%d\n", mqttClient.state());
mqttConnected = false;
}
}
void mqttCallback(char* topic, byte* payload, unsigned int length) {
char msg[length + 1];
memcpy(msg, payload, length);
msg[length] = '\0';
Serial.printf("📩 [%s]: %s\n", topic, msg);
if (strcmp(msg, "ON") == 0) {
relayState = true;
digitalWrite(RELAY_PIN, HIGH);
publishStatus("ON");
}
else if (strcmp(msg, "OFF") == 0) {
relayState = false;
digitalWrite(RELAY_PIN, LOW);
publishStatus("OFF");
}
else if (strcmp(msg, "STATUS") == 0) {
publishStatus(relayState ? "ON" : "OFF");
}
}
void publishStatus(const char* state) {
char payload[200];
snprintf(payload, sizeof(payload),
"{\"device\":\"%s\",\"state\":\"%s\",\"rssi\":%d,\"ip\":\"%s\",\"uptime\":%lu}",
DEVICE_ID, state,
modem.getSignalQuality(),
modem.getLocalIP().c_str(),
millis()/1000
);
mqttClient.publish(TOPIC_STATUS, payload, true);
Serial.printf("📤 Status: %s\n", payload);
}
void sendTelemetry() {
char payload[200];
snprintf(payload, sizeof(payload),
"{\"device\":\"%s\",\"temperature\":%.1f,\"battery\":%.2f,\"rssi\":%d,\"uptime\":%lu}",
DEVICE_ID,
temperatureRead(),
3.7,
modem.getSignalQuality(),
millis()/1000
);
mqttClient.publish(TOPIC_TELEMETRY, payload);
Serial.printf("📤 Telemetry: %s\n", payload);
}
⚠️
APN Configuration: APN settings carrier-specific hain. Apne carrier ka APN website se check karo ya customer care se poocho. Wrong APN se GPRS connect nahi hoga.