MQTT Connection

Moderators: adafruit_support_bill, adafruit

Forum rules
If you're posting code, please make sure your code does not include your Adafruit IO Active Key or WiFi network credentials.
Locked
User avatar
IO_User
 
Posts: 1
Joined: Fri Dec 10, 2021 9:47 am

MQTT Connection

Post by IO_User »

Hallo @ all,

I have some problems to connect to Adafruit IO with my Arduino Uno and Fona 808 using MQTT. I want to send the data via GPRS to the Server. Fona 808 is connected to the cellular. I have no idea what I am doing wrong. I hope anyone can help me.
I post my code and the answer from the serial monitor.

Code: Select all

#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <Adafruit_MQTT_FONA.h>
#include <Adafruit_SleepyDog.h>
#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"


//GPRS Parameter für SIM-Karte
#define FONA_APN "internet.xxx" //Zugangspunkt
#define FONA_USERNAME "xxx"    //Provider-Name
#define FONA_PASSWORD "xx"          //Passwort von Provider

//Ports definieren
#define Fona_RX 2
#define Fona_TX 3
#define Fona_RST 4

SoftwareSerial fonaSS = SoftwareSerial(Fona_TX, Fona_RX);
SoftwareSerial *fonaSerial = &fonaSS;
Adafruit_FONA fona =Adafruit_FONA(Fona_RST);

//Zugangsdaten Adafruit IO
#define AIO_Server "io.adafruit.com"
#define AIO_Serverport 1883
#define AIO_Username "xxxx"
#define AIO_Password "xxxxx"

//Übertragungsfehler
uint8_t txfail = 0;
const uint8_t tx_max_fail = 3;

// Setup the FONA MQTT class by passing in the FONA class and MQTT server and login details.
Adafruit_MQTT_FONA mqtt(&fona, AIO_Server, AIO_Serverport, AIO_Username, AIO_Password);

// Container initalisieren für AIO
const char LOCATION_FEED[] PROGMEM = "IO_User/feeds/GPS/CSV";
Adafruit_MQTT_Publish location_feed = Adafruit_MQTT_Publish(&mqtt, LOCATION_FEED);
const char BATTERY_FEED[] PROGMEM = "IO_User/feeds/Akku";
Adafruit_MQTT_Publish battery_feed = Adafruit_MQTT_Publish(&mqtt, BATTERY_FEED);

void setup() {
  Watchdog.enable(30000);
  Serial.begin(115200);
  Serial.println(F("Initialisieren des FONAmoduls startet"));

  fonaSS.begin(4800);
  if(!fona.begin(*fonaSerial)){
    Serial.println(F("FONAmodul nicht vorhanden"));
    while(1);
  }else{
    Serial.println(F("Fona ist vorhanden"));
  }  
  Watchdog.reset();
  //GPRS
  fonaSS.println("AT+CMEE=2");
  Serial.println(F("FONA is OK"));
  Watchdog.reset();
  
  Serial.println(F("Netzwerküberprüfung"));

  uint8_t n;
  boolean success=false;
  do {
    delay(1000);
    n = fona.getNetworkStatus();
    Serial.print(F("Netzwerkstatus: "));
    if (n == 0) Serial.println(F("Not registered - not connected to or searching for service"));
    if (n == 1) Serial.println(F("Registered - service found and connected"));
    if (n == 2) Serial.println(F("Not registered - not connected but searching for service"));
    if (n == 3) Serial.println(F("Registration Denied - not connected to the network, could be an account or SIM card issue"));
    if (n == 4) Serial.println(F("Unknown - out of coverage range, roaming"));
    if (n == 5) Serial.println(F(" Registered Roaming - connected using another provider's network other than congstar"));
    
    if ((n == 1) || (n==5)){
      success = true;
    }
  } while(success == false);

  Watchdog.reset();
  delay(5000);  // Wartezeit für Verbindungsstabilisierung
  Watchdog.reset();
  
  fona.setGPRSNetworkSettings(F(FONA_APN), F(FONA_USERNAME), F(FONA_PASSWORD));
  delay(3000); // Wartezeit für Verbindungsstabilisierung
  Watchdog.reset();
  Serial.println(F("GPRS deaktivieren"));
  fona.enableGPRS(false);
  
  Watchdog.reset();
  delay(5000);  // wait a few seconds to stabilize connection
  Watchdog.reset();
  
  Serial.println(F("GPRS aktivieren")); 
  fona.enableGPRS(true);
  Watchdog.reset();
  Serial.println(F("Netzwerverbindung vorhanden"));
  
  //Freigabe des GPS
  if(!fona.enableGPS(true)){
    Serial.println(F("Freigabe des GPS-Moduls fehlerhaft"));
  }else{
    Serial.println(F("Freigabe des GPS-Moduls erfolgreich"));
    delay(3000); //Zeitverzögerung für GPS-Fix
  }  

  Watchdog.reset();
  Serial.println("Initalisierung abgeschlossen");
}


//GPS Datenpunkte
float latitude, longitude, speed_kph, heading, altitude;
const float maxDistance = 100; //max. Abstand von 100 Meter
float initialLatitude, initialLongitude, distance;
//Batteriespannung
uint16_t voltage, volt_percent;

void loop() {

  Watchdog.disable();
  //Batteriespannung einlesen
  if(!fona.getBattVoltage(&voltage) || !fona.getBattPercent(&volt_percent)){
    Serial.println(F("Fehler beim Einlesen des Batteriestatus"));
  }else{
    Serial.print(F("Batteriespannung: ")); Serial.print(voltage); Serial.println(F("mV"));
    Serial.print(F("Batterieladestatus: ")); Serial.print(volt_percent); Serial.println(F("%"));
  }

  //GPS-Daten über Sattelit abrufen
  bool gpsFix = fona.getGPS(&latitude, &longitude, &speed_kph, &heading, &altitude);
  delay(1000);
  if(gpsFix){
    Serial.print("Latitude: "); Serial.println(latitude, 6);
    Serial.print("Longitude: ");Serial.println(longitude, 6);
    Serial.print("GPS altitude:");Serial.println(altitude);
  }else{
    Serial.println("Warte auf GPS fix");
  }

  //Geofence
  if (gpsFix){
    distance = distanceCoordinates(latitude, longitude, initialLatitude, initialLongitude);
    Serial.print("Distance: "); Serial.print(distance, 5); Serial.println("");    
  }else{
    distance=0; //Wenn kein GPS-Fix, dann Abstand Null
  }

  //Ping hält die MQTT-Verbindung aufrecht, wenn keine Daten versendet werden
  MQTT_connect();
  if(txfail > tx_max_fail) {
    Serial.println(F("Fehler MQTT-Verbindung diagnostiziert"));    
  }else{    
    Serial.println("MQTT-Verbindung ok");
  }

  
  Watchdog.reset();
  if(gpsFix){    
    logLocation(latitude, longitude, altitude, location_feed);
  }
  logBatterie(voltage, volt_percent, battery_feed);
  /*uint32_t x=0;
  if(! battery_feed.publish(x)){
    Serial.println(F("Fehler in der Übertragung"));
    txfail++;
  }else{
    Serial.println("Übertragung erfolgreich");
    txfail=0;
  }*/
  /*if ((distance > maxDistance)){
      initialLatitude = latitude;
      initialLongitude = longitude;
      
      //Send Data to Adafruit IO

      delay(5000);
      Watchdog.reset();    
  }*/

}

//Distanzberechnung von 2 GPS Punkten mittels Haversine-Formel
float distanceCoordinates(float lat1, float lon1, float lat2, float lon2)
{
  float toRad = PI/180.0;
  float r = 6378140.0; //Radius der Erde in Meter

  float dLat = (lat2-lat1)*toRad;
  float dLon = (lon2-lon1)*toRad;

  float a = sin(dLat/2)*sin(dLat/2)+cos(lat1*toRad)*cos(lat2*toRad)*sin(dLon/2)*sin(dLon/2);
  float c=2*atan2(sqrt(a),sqrt(1-a));

  float distance = r * c;

  //Abstand in Metern
  return distance;
}

//Verbindung zum Server mittels MQTT aufbauen
void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }

  Serial.print(" MQTT-Verbindung wird hergestellt");

  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Erneuter Verbindungsversuch in 5s");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
  }
  Serial.println("MQTT Verbindung hergestellt!");
}
void MQTTconnecting(){
  int8_t i;

  //Prüfen, ob Verbindung besteht
  if(mqtt.connected()){
    Serial.println("Verbindung vorhanden");
    return;
  }

  Serial.println("Verbindung zum Server mittels MQTT wird hergestellt");
  while((i=mqtt.connect()) != 0){
    Serial.println("Fehler");
    Serial.println(mqtt.connectErrorString(i));
    Serial.println("MQTT Verbindung fehlgeschalgen - neuer Verbindungsversuch");
    mqtt.disconnect();
    delay(1000);
  }
  Serial.println("Verbindung aufgebaut");
    
}

void logLocation(float lati, float longi, float alti, Adafruit_MQTT_Publish& feed){

  char Buffer[120];
  //Feld mit 0 füllen
  memset(Buffer, 0, sizeof(Buffer));
  int i=0;

  //0 ist Platzhalter für AIO feed
  Buffer[i++]= '0';
  Buffer[i++]= ',';

  //Hinzufügen der GPS-Daten 
  dtostrf(lati, 2, 6, &Buffer[i]);
  i = i+strlen(&Buffer[i]);
  Buffer[i++] = ',';
  dtostrf(longi, 3, 6, &Buffer[i]);
  i = i+strlen(&Buffer[i]);
  Buffer[i++] = ',';
  dtostrf(alti, 2, 6, &Buffer[i]);
   
  Serial.print("Übertrage Standort: ");Serial.println(Buffer);
  if(! feed.publish(Buffer)){
    Serial.println("Standort: Übertragung fehlgeschlagen");
    txfail++;
  }else{
    Serial.println("Standort: Übertragung erfolgreich");
    txfail=0;
  }
}


void logBatterie(uint16_t volt, uint16_t volt_per, Adafruit_MQTT_Publish& feed){
  
  char Buffer[50];
  //Feld mit 0 füllen
  memset(Buffer, 0, sizeof(Buffer));
  int i=0;

  //0 ist Platzhalter für AIO feed
  Buffer[i++]= '0';
  Buffer[i++]= ',';

  //Hinzufügen der Spannung und des Ladezustands 
  itoa(volt, &Buffer[i], 10);
  i = i+strlen(&Buffer[i]);
  Buffer[i++] = ',';
  itoa(volt_per, &Buffer[i], 10);
  
  //Übertragung an AIO 
  Serial.print("Übertrage Batteriezustand: "); Serial.println(Buffer);
  if(!feed.publish(Buffer)){
    Serial.println("Batteriezustand: Übertragung fehlgeschlagen");
    txfail++;
  }else{
    Serial.println("Batteriezustand: Übertragung erfolgreich");
    txfail=0;
  }  
  
}

This is what I get in the serial monitor.

Code: Select all

Warte auf GPS fix
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: IP GPRSACT
 MQTT-Verbindung wird hergestelltConnecting to TCP
	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+CIPMUX=0
	<--- OK
	---> AT+CIPRXGET=1
	<--- OK
AT+CIPSTART="TCP","io.adafruit.com","1883"
	<--- OK
	<--- CONNECT OK
Writing packet
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: CONNECT OK
AT+CIPSEND=57
 0x10 0x37 0x0 0x4 0x4D 0x51 0x54 0x54 0x4 0xFFFFFFC2 0x1 0x2C 0x0 0x0 0x0 0x7 0x49 0x4F 0x5F 0x55 0x73 0x65 0x72 0x0 0x20 0x61 0x69 0x6F 0x5F 0x47 0x52 0x75 0x67 0x33 0x38 0x34 0x33 0x74 0x57 0x34 0x41 0x32 0x35 0x31 0x58 0x58 0x75 0x74 0x30 0x5A 0x48 0x79 0x55 0x67 0x71 0x44 0x45
	<--- > 
	<--- 
Failed to send packet.
Connection failed
Erneuter Verbindungsversuch in 5s
Writing packet
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: CONNECT OK
AT+CIPSEND=2
 0xFFFFFFE0 0x0
	<--- > 
	<--- 
Failed to send packet.
	---> AT+CIPCLOSE
	<--- CLOSE OK
Connecting to TCP
	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+CIPMUX=0
	<--- OK
	---> AT+CIPRXGET=1
	<--- OK
AT+CIPSTART="TCP","io.adafruit.com","1883"
	<--- OK
	<--- CONNECT OK
Writing packet
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: CONNECT OK
AT+CIPSEND=57
 0x10 0x37 0x0 0x4 0x4D 0x51 0x54 0x54 0x4 0xFFFFFFC2 0x1 0x2C 0x0 0x0 0x0 0x7 0x49 0x4F 0x5F 0x55 0x73 0x65 0x72 0x0 0x20 0x61 0x69 0x6F 0x5F 0x47 0x52 0x75 0x67 0x33 0x38 0x34 0x33 0x74 0x57 0x34 0x41 0x32 0x35 0x31 0x58 0x58 0x75 0x74 0x30 0x5A 0x48 0x79 0x55 0x67 0x71 0x44 0x45
	<--- > 
	<--- 
Failed to send packet.
Connection failed

Locked
Forum rules
If you're posting code, please make sure your code does not include your Adafruit IO Active Key or WiFi network credentials.

Return to “Internet of Things: Adafruit IO and Wippersnapper”