Arduino ClearCore cihazı, ahududu pi üzerinde barındırılan MQTT sunucusuna bağlanamıyor
Amacım:
Arduino kullanarak programladığım bir ClearCore cihazından bir ahududu pi üzerinde barındırılan bir MQTT sunucusu (mosquitto kullanıyorum) ile iletişim kurmaya çalışıyorum.
Sorunum:
Benzer cihazlar ve teknikler kullanarak istediğimi elde eden çok sayıda çevrimiçi örnek buldum. Ancak ClearCore cihazımdan Arduino yazılımımı kullanarak ahududu pi'mde barındırılan MQTT aracısına bağlantı kuramıyorum.
Kurulumum:
Clear core cihazımdan ahududu pi'ime bir Ethernet bağlantısı kullanıyorum. Ben kullanıyorum Teknic CLcr-4-13 . DHCP kullanmıyorum. Ahududu pi'nin IP adresini her yeniden başlatıldığında ayarlıyorum, böylece her zaman ne olduğunu biliyorum (aşağıdaki komuta bakın). Mosquitto.conf dosyasını (port: 1883) ve "kullanıcı adı" ve "şifre" tanımladığım password_file dosyasını oluşturdum.
Pi'mi her yeniden başlattığımda bu komutu çalıştırıyorum, böylece statik bir IP yapmam gerekmiyor.
sudo ifconfig eth0 192.168.1.23 netmask 255.255.255.0
Ne denedim:
- Bilgisayarımdan - bir Ethernet bağlantısı ve bir python komut dosyası kullanarak, MQTT sunucusunun adı olarak ahududu pi'nin IP adresini kullanarak MQTT sunucuma bağlanabilir, abone olabilir ve yayınlayabilirim.
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 cihazından ve ahududu pi'den Ethernet kablosu kullanarak veri aktarabildiğimi doğrulamak için bir Arduino programı kullanarak UDP paketlerini başarıyla gönderdim. Aynı mac ve IP adresini kullanıyorum.
- Arduino programında eski sürümlere tanımlayarak MQTT sürümünü değiştirmeyi denedim.
- Bir bağlantı girişiminde bulunulduğunu doğrulamak için programı çalıştırdığımda Ethernet trafiğini izlemek için Wireshark'ı kullandım.
Arduino Programım:
Not: her şey derlenir ve program başarıyla çalışır, ancak MQTT sunucusuna bağlanamaz.
#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'den komut
mosquitto_sub -d -u user -P pass -t dev/test
Bunu pi'den gelen mesajları görmek için kullanıyorum.
nerede başarısız olursa ...
mqttClient.setServer(server, 1883);
if (mqttClient.connect("myClientID","user","pass"))
{
//error message
}
Olası sorunların düşünceleri:
Benzer projelerde gördüğüm çoğu örnek - insanlar sunucu adı olarak "test.mosquitto.org" kullanıyor, ancak ahududu pi'mde kendi MQTT sunucumu yapılandırdığım için bunun yerine sunucu olarak ahududu pi'nin IP adresini kullanıyorum isim. Bu, bilgisayarımdan bir python komut dosyası kullanarak bağlandığımda çalıştı, ancak bunun Arduino programımda bir sorun olup olmadığını bilmiyorum.
Umarım yeterince bilgi vermişimdir. Yardımcı olabilecek başka bir şey olursa lütfen bize bildirin. Tüm geri bildirimler için minnettarım.
Yanıtlar
Görünüşe göre cihazınızın IP adresini ahududu pi sunucunuzla aynı olacak şekilde ayarlıyorsunuz.
IPAddress ip(192, 168, 1, 23);
const char* server = "192.168.1.23";
Bu işe yaramayacak. Cihaz IP'sini farklı bir şey yapın, örneğin IPAddress ip(192, 168, 1, 24)
.