Não é possível conectar o dispositivo Arduino ClearCore ao servidor MQTT hospedado no raspberry pi

Aug 19 2020

Meu gol:

Estou tentando me comunicar com um servidor MQTT (estou usando mosquitto) hospedado em um raspberry pi de um dispositivo ClearCore que programei usando Arduino.

Meu problema:

Encontrei vários exemplos on-line que alcançam o que desejo usando dispositivos e técnicas semelhantes. No entanto, não consigo fazer uma conexão do meu dispositivo ClearCore usando meu software Arduino para o corretor MQTT hospedado no meu raspberry pi.

Minha configuração:

Estou usando uma conexão Ethernet do meu dispositivo clear core para o meu raspberry pi. Estou usando um Teknic CLCR-4-13 . Não estou usando DHCP. Estou definindo o endereço IP do raspberry pi cada vez que ele reinicia, então sempre sei o que é (veja o comando abaixo). Criei o arquivo mosquitto.conf (porta: 1883) e o password_file onde defino um "username" e uma "password".

Eu executo este comando sempre que reinicio meu pi, para não precisar criar um IP estático.

sudo ifconfig eth0 192.168.1.23 netmask 255.255.255.0

O que eu tentei:

  • Do meu PC - usando uma conexão Ethernet e um script python, consigo conectar, assinar e publicar no meu servidor MQTT usando o endereço IP do raspberry pi como o nome do servidor MQTT.
import paho.mqtt.publish as pub

MQTT_SERVER = "192.168.1.23"
MQTT_PATH = "dev/test"
credentials = {'username':"user",'password':"pass"}
import time
while True:
    pub.single(MQTT_PATH, "Hello Pi!", hostname = MQTT_SERVER, auth = credentials)
    time.sleep(3)
    print(".")
  • Para verificar se posso transmitir dados do dispositivo ClearCore e raspberry pi usando um cabo Ethernet, enviei com sucesso pacotes UDP usando um programa Arduino. Eu uso o mesmo mac e endereço IP.
  • Eu tentei mudar a versão do MQTT definindo-a no programa Arduino para versões mais antigas.
  • Eu usei o Wireshark para monitorar o tráfego Ethernet quando executo o programa para verificar se uma tentativa de conexão está sendo feita.

Meu programa Arduino:

Nota: tudo compila e o programa roda com sucesso, mas não consegue se conectar ao servidor MQTT

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

//#define MQTT_VERSION MQTT_VERSION_3_1
//#define MQTT_VERSION MQTT_VERSION_3_1_1
//#define MQTT_VERSION MQTT_VERSION_5_0

// Function prototypes
void subscribeReceive(char* topic, byte* payload, unsigned int length);
 
// Set your MAC address and IP address here
byte mac[] = {0x24, 0x15, 0x10, 0xb0, 0x00, 0x3f};
IPAddress ip(192, 168, 1, 23);
 
const char* server = "192.168.1.23";
 
// Ethernet and MQTT related objects
EthernetClient ethClient;
PubSubClient mqttClient(ethClient);

void setup() {
  // Useful for debugging purposes
  Serial.begin(9600);
  
  // Start the ethernet connection
  Ethernet.begin(mac, ip);              
  
  // Ethernet takes some time to boot!
  delay(3000);                          
 
  // Set the MQTT server to the server stated above ^
  mqttClient.setServer(server, 1883);   
 
  // Attempt to connect to the server with the ID "myClientID"
  if (mqttClient.connect("myClientID","user","pass")) 
  {
    Serial.println("Connection has been established, well done");
 
    // Establish the subscribe event
    mqttClient.setCallback(subscribeReceive);
  } 
  else 
  {
    Serial.println("Looks like the server connection failed...");
  }
}

void loop() {
  mqttClient.loop();
 
  mqttClient.subscribe("dev/test");
 
  if(mqttClient.publish("dev/test", "Hello World"))
  {
    Serial.println("Publish message success");
  }
  else
  {
    Serial.println("Could not send message :(");
  } 
  // Dont overload the server!
  delay(4000);
}

void subscribeReceive(char* topic, byte* payload, unsigned int length)
{
  // Print the topic
  Serial.print("Topic: ");
  Serial.println(topic);
 
  // Print the message
  Serial.print("Message: ");
  for(int i = 0; i < length; i ++)
  {
    Serial.print(char(payload[i]));
  } 
  // Print a newline
  Serial.println("");
}

Comando do Raspberry Pi

mosquitto_sub -d -u user -P pass -t dev/test

Eu uso isso para ver as mensagens quando elas chegam do pi.

onde falha...

mqttClient.setServer(server, 1883); 

if (mqttClient.connect("myClientID","user","pass"))
{
    //error message
}

Pensamentos sobre possíveis problemas:

A maioria dos exemplos que vi de projetos semelhantes - as pessoas estão usando "test.mosquitto.org" como nome do servidor, mas como configurei meu próprio servidor MQTT no meu raspberry pi, uso o endereço IP do raspberry pi como o servidor nome. Isso funcionou quando me conectei do meu PC usando um script python, mas não sei se isso é um problema no meu programa Arduino.

Espero ter fornecido informações suficientes. Informe-me se houver algo mais que você queira ver que possa ajudar - agradeço todos os comentários.

Respostas

3 CB_Ron Aug 19 2020 at 00:47

Parece que você está definindo o endereço IP do seu dispositivo para ser o mesmo do seu servidor raspberry pi.

IPAddress ip(192, 168, 1, 23);
 
const char* server = "192.168.1.23";

Isso não vai funcionar. Torne o IP do dispositivo algo diferente, como IPAddress ip(192, 168, 1, 24).