ไม่สามารถเชื่อมต่ออุปกรณ์ Arduino ClearCore กับเซิร์ฟเวอร์ MQTT ที่โฮสต์บน raspberry pi

Aug 19 2020

เป้าหมายของฉัน:

ฉันพยายามสื่อสารกับเซิร์ฟเวอร์ MQTT (ฉันใช้ mosquitto) ที่โฮสต์บน raspberry pi จากอุปกรณ์ ClearCore ซึ่งฉันได้ตั้งโปรแกรมโดยใช้ Arduino

ปัญหาของฉัน:

ฉันพบตัวอย่างมากมายทางออนไลน์ซึ่งบรรลุสิ่งที่ฉันต้องการโดยใช้อุปกรณ์และเทคนิคที่คล้ายกัน อย่างไรก็ตามฉันไม่สามารถทำการเชื่อมต่อจากอุปกรณ์ ClearCore ของฉันโดยใช้ซอฟต์แวร์ Arduino ของฉันไปยังโบรกเกอร์ MQTT ที่โฮสต์บนราสเบอร์รี่ pi ของฉัน

การตั้งค่าของฉัน:

ฉันใช้การเชื่อมต่ออีเธอร์เน็ตจากอุปกรณ์หลักที่ชัดเจนไปยังราสเบอร์รี่ pi ฉันใช้Teknic CLCR-4-13 ฉันไม่ได้ใช้ DHCP ฉันกำลังตั้งค่าที่อยู่ IP ของ raspberry pi ทุกครั้งที่รีบูตดังนั้นฉันจึงรู้อยู่เสมอว่ามันคืออะไร (ดูคำสั่งด้านล่าง) ฉันได้สร้างไฟล์ mosquitto.conf (พอร์ต: 1883) และ password_file ที่ฉันกำหนด "ชื่อผู้ใช้" และ "รหัสผ่าน"

ฉันเรียกใช้คำสั่งนี้ทุกครั้งที่รีบูต pi ดังนั้นฉันจึงไม่ต้องสร้าง IP แบบคงที่

sudo ifconfig eth0 192.168.1.23 netmask 255.255.255.0

สิ่งที่ฉันได้ลอง:

  • จากพีซีของฉัน - โดยใช้การเชื่อมต่ออีเธอร์เน็ตและสคริปต์ python ฉันสามารถเชื่อมต่อสมัครสมาชิกและเผยแพร่ไปยังเซิร์ฟเวอร์ MQTT ของฉันโดยใช้ที่อยู่ IP ของราสเบอร์รี่ 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 และราสเบอร์รี่ pi โดยใช้สายอีเธอร์เน็ตฉันได้ส่งแพ็คเกจ UDP โดยใช้โปรแกรม Arduino สำเร็จแล้ว ฉันใช้ mac และที่อยู่ IP เดียวกัน
  • ฉันได้ลองเปลี่ยนเวอร์ชัน MQTT โดยกำหนดในโปรแกรม Arduino เป็นเวอร์ชันเก่า
  • ฉันใช้ Wireshark เพื่อตรวจสอบการรับส่งข้อมูลอีเธอร์เน็ตเมื่อฉันเรียกใช้โปรแกรมเพื่อตรวจสอบว่ามีการพยายามเชื่อมต่อ

โปรแกรม 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

ฉันใช้สิ่งนี้เพื่อดูข้อความเมื่อพวกเขาเข้ามาจาก pi

ที่มันล้มเหลว ...

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)บางสิ่งบางอย่างที่แตกต่างกันเช่น