hi i have a nodemcu , a sim800l and a neo 6m gps module, i run this code but when isend sms to sim800l its not read it i think please look mu code and tell me what is the problem and why when i send sms i dont see sms in serial?
```
#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>
#include <SoftwareSerial.h>
#include <PubSubClient.h>
#include <NMEAGPS.h>

// Define serial communication for SIM800L and GPS
SoftwareSerial sim800lSerial(4, 5); // RX, TX for SIM800L
SoftwareSerial gpsSerial(D7, D6);    // RX, TX for NEO-6M GPS

// SIM800L and GPRS credentials
#define APN "mcinet"
#define GPRS_USER ""
#define GPRS_PASS ""

// MQTT Broker and Topics
const char* broker = "mqtt.services.abrbit.com";
const char* mqttUser = "37_gpb1";    // Add your MQTT username
const char* mqttPassword = "skrq5kW66RL8slGYDRIIuZ6i3nztkYv73poVElOTpX6rWsRPmpvQwoHzQOihrdbO"; // Add your MQTT password
const char* modeTopic = "rezakarma/mode";
const char* alertTopic = "rezakarma/alert";
const char* liveLocTopic = "rezakarma/liveloc";

// Global variables
String ownerNumber = "";   // Owner phone number
String mode = "RIDE";      // Device mode, default is "RIDE"
bool liveLoc = false;      // Live location mode

TinyGsm modem(sim800lSerial);
TinyGsmClient gsmClient(modem);
PubSubClient mqttClient(gsmClient);

// GPS Setup
NMEAGPS gps;
gps_fix fix;
double threshold = 0.0005; // Threshold for detecting location change
double lastLat = 0, lastLng = 0;

// Function to send HTTP notification
void sendHTTPNotification() {
  // Ensure GPRS is connected
  if (!modem.isGprsConnected()) {
    Serial.println("GPRS disconnected. Cannot send HTTP request.");
    return;
  }

  String server = "http://your-api-endpoint.com";
  String url = server + "/notify?lat=" + String(fix.latitude(), 6) + "&lng=" + String(fix.longitude(), 6);

  modem.sendAT(GF("+HTTPTERM")); // Clean previous sessions
  modem.sendAT(GF("+HTTPINIT"));
  modem.sendAT(GF("+HTTPPARA=\"CID\",1"));
  modem.sendAT(GF("+HTTPPARA=\"URL\",\""), url, GF("\""));
  modem.sendAT(GF("+HTTPACTION=0")); // 0 = GET request

  // Waiting for response
  modem.waitResponse();
  modem.sendAT(GF("+HTTPTERM"));
}

// Function to send an SMS
void sendSMS(String number, String text) {
  modem.sendSMS(number.c_str(), text.c_str());
}

// Function to make a phone call
void makePhoneCall(String number) {
  modem.sendAT(GF("+CALL="), number);
  modem.waitResponse();
}

// Function to check if coordinates changed beyond threshold
bool locationChanged() {
  double latDiff = abs(fix.latitude() - lastLat);
  double lngDiff = abs(fix.longitude() - lastLng);
  return (latDiff > threshold || lngDiff > threshold);
}

// Function to handle MQTT messages
void mqttCallback(char* topic, byte* payload, unsigned int length) {
  String message;
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }

  if (String(topic) == modeTopic) {
    if (message == "MODE:PARK" && ownerNumber != "") {
      mode = "PARK";
    } else if (message == "MODE:RIDE" && ownerNumber != "") {
      mode = "RIDE";
    }
  } else if (String(topic) == liveLocTopic) {
    if (message == "LIVE_LOC:ON") {
      liveLoc = true;
    } else if (message == "LIVE_LOC:OFF") {
      liveLoc = false;
    }
  }
}

// Function to publish GPS location on MQTT
void publishLocation() {
  if (gps.available(gpsSerial)) {
    fix = gps.read();
    if (fix.valid.location) {
      String location = "LAT:" + String(fix.latitude(), 6) + ",LNG:" + String(fix.longitude(), 6);
      mqttClient.publish(liveLocTopic, location.c_str());
    } else {
      mqttClient.publish(liveLocTopic, "LOCATION: NOT AVAILABLE");
    }
  }
}

// MQTT Reconnect function with username and password
void mqttReconnect() {
  while (!mqttClient.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect to the broker with username and password
    if (mqttClient.connect("nodemcu-client", mqttUser, mqttPassword)) {
      Serial.println("connected");

      // Subscribe to topics after connection
      mqttClient.subscribe(modeTopic);
      mqttClient.subscribe(liveLocTopic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

// Setup function
void setup() {
  // Initialize serial communication
  Serial.begin(115200);
  sim800lSerial.begin(9600);
  gpsSerial.begin(9600);

  // Initialize modem and connect to GPRS
  modem.restart();
  modem.gprsConnect(APN, GPRS_USER, GPRS_PASS);

  // Set MQTT server and callback
  mqttClient.setServer(broker, 1883);
  mqttClient.setCallback(mqttCallback);

  // Connect to MQTT broker
  mqttReconnect();
}

// Function to handle incoming SMS using AT commands and added debugging
void checkForSMS() {
  // Send AT command to check for unread SMS (AT+CMGL="REC UNREAD")
  // Serial.println("Checking for unread SMS...");
  modem.sendAT(GF("+CMGL=\"REC UNREAD\""));
  
  // Wait for the modem response
  if (modem.waitResponse(10000L) == 1) {
    // Serial.println("No new SMS.");
    return;
  }

  String response = modem.stream.readStringUntil('\n');
  Serial.println("Received response: " + response);  // Debugging output

  // Parse the response to get the SMS
  if (response.indexOf("+CMGL:") != -1) {
    Serial.println("New SMS found.");
    
    // Extract the sender number and message content
    int senderStart = response.indexOf(",\"") + 2;
    int senderEnd = response.indexOf("\",\"", senderStart);
    String sender = response.substring(senderStart, senderEnd);
    Serial.println("Sender number: " + sender);  // Debugging output

    // Read the actual message in the next line
    String message = modem.stream.readStringUntil('\n');
    message.trim();  // Remove any extra spaces or newline characters
    Serial.println("Message content: " + message);  // Debugging output
    
    // Process the received SMS
    processSMS(sender, message);
  } else {
    Serial.println("No SMS found.");
  }
}

// Function to handle incoming SMS commands with debugging
void processSMS(String sender, String message) {
  Serial.println("Processing SMS from: " + sender);  // Debugging output

  if (message.startsWith("SET_OWNER_NUMBER:")) {
    ownerNumber = message.substring(17);  // Extract the number after "SET_OWNER_NUMBER:"
    Serial.println("Owner number set to: " + ownerNumber);  // Debugging output
    sendSMS(sender, "Owner number set successfully!");
  } else if (message == "MODE:PARK" && sender == ownerNumber) {
    mode = "PARK";
    Serial.println("Mode set to PARK by owner.");
    sendSMS(sender, "Mode set to PARK");
  } else if (message == "MODE:RIDE" && sender == ownerNumber) {
    mode = "RIDE";
    Serial.println("Mode set to RIDE by owner.");
    sendSMS(sender, "Mode set to RIDE");
  } else {
    Serial.println("Invalid command or unauthorized sender.");
    sendSMS(sender, "Invalid command or sender not authorized.");
  }
}

void loop() {
  // Check if the device is connected to the GPRS internet
  if (!modem.isGprsConnected()) {
    Serial.println("GPRS disconnected. Attempting to reconnect...");
    if (modem.gprsConnect(APN, GPRS_USER, GPRS_PASS)) {
      Serial.println("GPRS reconnected.");
    } else {
      Serial.println("Failed to reconnect to GPRS.");
      // Optionally, retry after a delay
      delay(5000);
      return; // Exit the loop early if reconnection fails
    }
  }

  // Reconnect to MQTT if needed
  if (!mqttClient.connected()) {
    mqttReconnect();
  }
  mqttClient.loop();

  // Check for SMS periodically
  checkForSMS();

  // Check GPS data when mode is PARK
  if (mode == "PARK" && gps.available(gpsSerial)) {
    fix = gps.read();
    if (fix.valid.location && locationChanged()) {
      // Location changed, send alert
      mqttClient.publish(alertTopic, "ALERT: LOCATION_CHANGED");
      sendHTTPNotification();
      if (ownerNumber != "") {
        makePhoneCall(ownerNumber);
      }
      // Update last known location
      lastLat = fix.latitude();
      lastLng = fix.longitude();
    }
  }

  // Publish live location if enabled
  if (liveLoc && gps.available(gpsSerial)) {
    publishLocation();
  }
}
```