Tidak dapat menghubungkan perangkat Arduino ClearCore ke server MQTT yang dihosting di raspberry pi
Tujuanku:
Saya mencoba berkomunikasi dengan server MQTT (saya menggunakan mosquitto) yang dihosting di raspberry pi dari perangkat ClearCore yang telah saya program menggunakan Arduino.
Masalah Saya:
Saya telah menemukan banyak contoh online yang mencapai apa yang saya inginkan dengan menggunakan perangkat dan teknik serupa. Namun saya tidak dapat membuat koneksi dari perangkat ClearCore saya menggunakan perangkat lunak Arduino saya ke broker MQTT yang dihosting di raspberry pi saya.
Setup Saya:
Saya menggunakan koneksi Ethernet dari perangkat clear core saya ke raspberry pi saya. Saya menggunakan Teknic CLCR-4-13 . Saya tidak menggunakan DHCP. Saya mengatur alamat IP dari raspberry pi setiap kali reboot jadi saya selalu tahu apa itu (lihat perintah di bawah). Saya telah membuat file mosquitto.conf (porta: 1883) dan password_file dimana saya mendefinisikan "username" dan "password".
Saya menjalankan perintah ini setiap kali saya me-reboot pi saya jadi saya tidak perlu membuat IP statis.
sudo ifconfig eth0 192.168.1.23 netmask 255.255.255.0
Apa yang telah saya coba:
- Dari PC saya - menggunakan koneksi Ethernet dan skrip python, saya dapat terhubung, berlangganan, dan menerbitkan ke server MQTT saya menggunakan alamat IP raspberry pi sebagai nama server 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(".")
- Untuk memverifikasi saya dapat mengirimkan data dari perangkat ClearCore dan raspberry pi menggunakan kabel Ethernet, saya telah berhasil mengirim paket UDP menggunakan program Arduino. Saya menggunakan mac dan alamat IP yang sama.
- Saya telah mencoba mengubah versi MQTT dengan mendefinisikannya dalam program Arduino ke versi yang lebih lama.
- Saya telah menggunakan Wireshark untuk memantau lalu lintas Ethernet ketika saya menjalankan program untuk memverifikasi bahwa upaya koneksi sedang dibuat.
Program Arduino saya:
Catatan: semua kompilasi dan program berjalan dengan sukses, tetapi tidak dapat terhubung ke server 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("");
}
Perintah dari Raspberry Pi
mosquitto_sub -d -u user -P pass -t dev/test
Saya menggunakan ini untuk melihat pesan ketika mereka masuk dari pi.
dimana gagal ...
mqttClient.setServer(server, 1883);
if (mqttClient.connect("myClientID","user","pass"))
{
//error message
}
Pemikiran tentang masalah potensial:
Sebagian besar contoh yang saya lihat dari proyek serupa - orang menggunakan "test.mosquitto.org" sebagai nama server mereka, tetapi karena saya telah mengkonfigurasi server MQTT saya sendiri di raspberry pi saya, saya malah menggunakan alamat IP raspberry pi sebagai server nama. Ini berfungsi ketika saya terhubung dari PC saya menggunakan skrip python, tetapi saya tidak tahu apakah ini masalah dalam program Arduino saya.
Saya harap saya memberikan informasi yang cukup. Beri tahu saya jika saya ada hal lain yang mungkin ingin Anda lihat yang mungkin bisa membantu - Saya menghargai semua masukan.
Jawaban
Sepertinya Anda menyetel alamat IP perangkat Anda agar sama dengan server raspberry pi Anda.
IPAddress ip(192, 168, 1, 23);
const char* server = "192.168.1.23";
Itu tidak akan berhasil. Jadikan IP perangkat berbeda, seperti IPAddress ip(192, 168, 1, 24)
.