Невозможно подключить устройство Arduino ClearCore к серверу MQTT, размещенному на raspberry pi

Aug 19 2020

Моя цель:

Я пытаюсь связаться с сервером MQTT (я использую mosquitto), размещенным на raspberry pi, с устройства ClearCore, которое я запрограммировал с помощью Arduino.

Моя проблема:

Я нашел в Интернете множество примеров, которые позволяют добиться желаемого, используя аналогичные устройства и методы. Однако я не могу подключиться со своего устройства ClearCore с помощью программного обеспечения Arduino к брокеру MQTT, размещенному на моем raspberry pi.

Моя установка:

Я использую Ethernet-соединение от моего устройства с чистым ядром к моему Raspberry Pi. Я использую Teknic CLCR-4-13 . Я не использую DHCP. Я устанавливаю IP-адрес raspberry pi при каждой перезагрузке, поэтому я всегда знаю, что это такое (см. Команду ниже). Я создал файл mosquitto.conf (порт: 1883) и файл password_file, в котором я определяю «имя пользователя» и «пароль».

Я запускаю эту команду всякий раз, когда перезагружаю свой пи, поэтому мне не нужно создавать статический IP-адрес.

sudo ifconfig eth0 192.168.1.23 netmask 255.255.255.0

Что я пробовал:

  • С моего ПК - используя соединение Ethernet и скрипт python, я могу подключаться, подписываться и публиковать на моем сервере MQTT, используя IP-адрес raspberry pi в качестве имени сервера 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(".")
  • Чтобы убедиться, что я могу передавать данные с устройства ClearCore и raspberry pi с помощью кабеля Ethernet, я успешно отправил пакеты UDP с помощью программы Arduino. Я использую тот же Mac и IP-адрес.
  • Я попытался изменить версию MQTT, определив ее в программе Arduino на более старые версии.
  • Я использовал Wireshark для мониторинга трафика Ethernet, когда я запускаю программу, чтобы убедиться, что предпринимается попытка подключения.

Моя программа Arduino:

Примечание: все компилируется и программа работает успешно, но не может подключиться к серверу 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("");
}

Команда от Raspberry Pi

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

Я использую это, чтобы видеть сообщения, когда они приходят от пи.

где не получается ...

mqttClient.setServer(server, 1883); 

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

Мысли о потенциальных проблемах:

Большинство примеров похожих проектов, которые я видел, - люди используют "test.mosquitto.org" в качестве имени своего сервера, но поскольку я настроил свой собственный сервер MQTT на моем raspberry pi, я вместо этого использую IP-адрес raspberry pi в качестве сервера. название. Это сработало, когда я подключился со своего ПК с помощью скрипта Python, но я не знаю, является ли это проблемой в моей программе Arduino.

Надеюсь, я предоставил достаточно информации. Пожалуйста, дайте мне знать, если вы хотите увидеть что-нибудь еще, что могло бы помочь - я ценю все отзывы.

Ответы

3 CB_Ron Aug 19 2020 at 00:47

Похоже, вы устанавливаете IP-адрес своего устройства таким же, как у вашего сервера Raspberry Pi.

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

Это не сработает. Сделайте IP-адрес устройства чем-нибудь другим, например IPAddress ip(192, 168, 1, 24).