Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
sankmv
Published © GPL3+

MQTT-chat. Using MQTT for messaging

We use a MQTT server for chat between users who enter messages on IoT devices.

IntermediateFull instructions providedOver 1 day1,957
MQTT-chat. Using MQTT for messaging

Things used in this project

Story

Read more

Custom parts and enclosures

chartMQTT.HMI - Nextion project

Code

chart.ino

Arduino
// подключение файла с константами
#include "defines.h"
// подключение библиотек
//#include <SoftwareSerial.h>
#include <WiFi.h>
#include <PubSubClient.h>

// создание объектов
//SoftwareSerial nextionSerial(14, 12, false, 256);
#define nextionSerial Serial1
WiFiClient wclient;
PubSubClient client;

// данные wiFi сети
//const char* ssid     = "Kassa1";
//const char* password = "12345678";
const char* ssid     = "Kassa1";
const char* password = "12345678";
// данные mqtt
#define mqtt_server  "m24.cloudmqtt.com"
#define mqtt_port 18532 
#define mqtt_user  "cbadnzof" 
#define mqtt_pass  "j63Z6DzKgogS" 
// данные, пришедшие из последовательного порта
int nextionData[10];
// строка пришла
boolean dataComplete = false;  
int offset=0;
// для поиска окончания
unsigned long millisGetData=0;

String tekMessage="";
String chatMessage="";
// массив для получения данных от сервера
char response[40];

void setup() {
  Serial.begin(9600);
  nextionSerial.begin(9600);
  Serial.println("\nSoftware serial test started");
  tekMessage.reserve(100);
  chatMessage.reserve(300);
  // подключение WiFi
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("WiFi.status=");
  Serial.println(WiFi.status());
  // отправка на Nextion
  delay(1000);
  nextionSerial.print("page 0");
  nextionSerial.write(0xff);
  nextionSerial.write(0xff);
  nextionSerial.write(0xff);      
  delay(10);
  // mqtt
  client.setClient(wclient);
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}



void loop() {
  //yield();
  if (!client.connected()) {
    yield();
    reconnect();
  }
  client.loop();  
  nextionSerialEvent(); 
  if (dataComplete) {
    Serial.println(); 
    parse_message();
    // очистить строку
    dataComplete = false;
    offset=0;
   }  

}

void nextionSerialEvent() {
  //
  //yield();
  if (nextionSerial.available()>0) {
    // get the new byte:
    char inChar = (char)nextionSerial.read();
    Serial.print(inChar,HEX);
    nextionData[offset]=(int)inChar;
    offset++;
    millisGetData=millis();
  }
  else {
    if(offset>0) {
       if(millis()-millisGetData>200) {
           dataComplete=true;
       }
    }
  }
}

mqtt.ino

Arduino
//   mqtt
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...$");
    Serial.println(WiFi.status());
    Serial.println(WiFi.localIP());

    // Attempt to connect
    if (client.connect("Arduino+WiFi", mqtt_user, mqtt_pass)) {
       Serial.println("Connected to MQTT server$");
       client.setCallback(callback);
       //    
       client.subscribe("/user2/user1"); 
       client.subscribe("/user3/user1"); 
       client.subscribe("/user4/user1"); 
    } 
    else {
       Serial.println("Could not connect to MQTT server"); 
       Serial.println(" try again in 5 seconds$");
       // Wait 5 seconds before retrying
       delay(5000);
    } 
  }
}
//     
void publishData() {
    String topic="/"+iam.userLogin+"/"+users[tuser].userLogin;
    client.publish(topic.c_str(), tekMessage.c_str(), true);   
}
//  
void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("from topic - ");
    Serial.print(topic);
    Serial.print("  ");
    Serial.print(length);
    Serial.print("=");
    String myString = String((char*)payload);
    Serial.println(myString);
    chatMessage=chatMessage+topic+": "; 
    chatMessage=chatMessage+myString.substring(0,length);
    Serial.println(chatMessage);
    nextionSerial.print("t0.txt=\"");
    nextionSerial.print(chatMessage);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
    delay(10);
    chatMessage=chatMessage+"\\r";
    nextionSerial.print("t0.txt+=\"\\r\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
}

nextion.ino

Arduino
void parse_message() {
   if(nextionData[0]!=0x65) {
      return;
   }
   if(nextionData[4]!=0xff && nextionData[5]!=0xff &&
      nextionData[6]!=0xff) {
      return;
   }
   // ***** 
   //    
   if(nextionData[1]==0 && nextionData[2]==3 &&
      nextionData[3]==0) {
    nextionSerial.print("page 1");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);      
    delay(10);
    // user
    nextionSerial.print("e51.txt=\"");
    nextionSerial.print(users[tuser].userName);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);      
    // message
    nextionSerial.print("e100.txt=\"");
    nextionSerial.print(tekMessage);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);      
   }   
   //    
   else if(nextionData[2]==0x1F) {
    nextionSerial.print("page ");
    nextionSerial.print(String((nextionData[1]%3+1)));
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);      
    delay(10);
    nextionSerial.print("e100.txt=\"\\r");
    nextionSerial.print(tekMessage);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
   }
   // send
   else if(nextionData[2]==0x29) { 
    Serial.println("send");
    publishData(); 
    nextionSerial.print("page 0");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);      
    delay(10); 
    //chatMessage=chatMessage+"\\r"+"\\t"; 
    chatMessage=chatMessage+"I --> "+users[tuser].userLogin+": "; 
    chatMessage=chatMessage+tekMessage;
    Serial.println(chatMessage);
    nextionSerial.print("t0.txt=\"");
    nextionSerial.print(chatMessage);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
    delay(10);
    chatMessage=chatMessage+"\\r";
    nextionSerial.print("t0.txt+=\"\\r\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
        
    tekMessage="";
    
   }   
   // back
   else if(nextionData[2]==0x2E) { 
    Serial.println("back");
    nextionSerial.print("page 0");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);      
    delay(10); 
    Serial.println(chatMessage);
    nextionSerial.print("t0.txt=\"");
    nextionSerial.print(chatMessage);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
    delay(10);
    tekMessage="";
    
   }   
   //  user
   else if(nextionData[2]==0x2C) { 
    Serial.println("previos user");      
    tuser=(tuser+nusers-1)%nusers;      
    nextionSerial.print("e51.txt=\"");
    nextionSerial.print(users[tuser].userName);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
   }   
   //  user
   else if(nextionData[2]==0x2D) { 
    Serial.println("next user");
    tuser=(tuser+1)%nusers;      
    nextionSerial.print("e51.txt=\"");
    nextionSerial.print(users[tuser].userName);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
   } 
   // 
   else if(nextionData[2]==0x1E) { 
    if(tekMessage.length()>0){
      int d=1;
      Serial.println(tekMessage.length());
      if(tekMessage.endsWith("\r")==true)
        d=2;
      tekMessage=tekMessage.substring(0,tekMessage.length()-d);
      Serial.println(tekMessage);
      Serial.println(tekMessage.length());     
      Serial.println("");      
      nextionSerial.print("e100.txt=e100.txt-1");
      nextionSerial.write(0xff);
      nextionSerial.write(0xff);
      nextionSerial.write(0xff);  
    }
   } 
   // \r\n
   else if(nextionData[2]==0x28) { 
    Serial.println("\ n");      
    tekMessage=tekMessage+"\\r";
    nextionSerial.print("e100.txt+=\"\\r\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
   } 
   //  
   else {
    tekMessage=tekMessage+nextionChars[nextionData[1]-1][nextionData[2]-1];
    Serial.println(tekMessage);
    Serial.println(tekMessage.length());
    nextionSerial.print("e100.txt=\"");
    nextionSerial.print(tekMessage);
    nextionSerial.print("\"");
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);
    nextionSerial.write(0xff);  
   }
}

defines.h

Arduino
// **********************************
// константы и переменные
// **********************************

#ifndef defines_h
#define defines_h

struct USER {
  String userLogin;
  String userName;
};

USER users[]={
  {"user2","nameUSER2"},
  {"user3","nameUSER3",},
  {"user4","nameUSER4",}  
};
int nusers=3;
int tuser=0;

USER iam={"user1","nameUSER1"};

char nextionChars[3][40]={
    {
     '1','2','3','4','5','6','7','8','9','0', 
     'q','w','e','r','t','y','u','i','o','p', 
     'a','s','d','f','g','h','j','k','l',' ', 
     ' ','z','x','c','v','b','n','m',' ','\n', 
    },
    {
     '1','2','3','4','5','6','7','8','9','0', 
     'Q','W','E','R','T','Y','U','I','O','P', 
     'A','S','D','F','G','H','J','K','L',' ', 
     ' ','Z','X','C','V','B','N','M',' ','\n',      
    },
    {
     '!','@','#','$','%','^','&','*','(',')', 
     '~','`','"','№',':','%',':','?','{','}', 
     '_','-','+','=','|','\\','[',']','|',' ', 
     ' ','<','>','.',',',' ',' ',' ',' ','\n',      
    }    
};

//
#endif

Credits

sankmv
5 projects • 8 followers
Contact

Comments

Please log in or sign up to comment.