MQTT และการใช้งานสำหรับ Linux (ตอนที่ 2)#


การทดลองใช้งาน Public MQTT Broker#

Eclipse Mosquitto เป็นซอฟต์แวร์ Open Source MQTT Broker และมีโปรแกรมที่ทำหน้าที่เป็น MQTT Clients สำหรับการเผยแพร่และสมัครรับข้อความกับโบรกเกอร์

รูป: Mosquitto MQTT Broker & MQTT Logos

การติดตั้งโปรแกรมเพื่อใช้คำสั่งของ Mosquitto Client เช่น mosquitto_pub และ mosquitto_sub สำหรับระบบปฏบิติการ Linux (ใช้ Ubuntu 22.04 LTS) ทำได้ดังนี้

$ sudo apt update
$ sudo apt install mosquitto-clients -y

ในกรณีที่ต้องการเขียนโปรแกรมภาษา C จะต้องทำคำสั่งเพื่อติดตั้งไลบรารี Mosquitto Client C Libraryดังนี้

$ sudo apt install build-essential libmosquitto-dev -y

 

เมื่อได้ติดตั้งแพ็กเกจแล้ว ทดลองเรียกใช้คำสั่ง mosquitto_pub และ mosquitto_sub (ในข้อความเอาต์พุตที่เป็นตัวอย่าง จะแสดงเวอร์ชัน 2.0.11)

$ mosquitto_pub --version
mosquitto_pub version 2.0.11 running on libmosquitto 2.0.11.

$ mosquitto_sub --version
mosquitto_sub version 2.0.11 running on libmosquitto 2.0.11.

 

ให้ทำคำสั่งต่อไปนี้ ในหน้าต่าง Terminal เพื่อเชื่อมต่อและสมัครรับข้อความตามหัวข้อ เช่น 'test/1234/#' และคอยรับข้อความจาก test.mosquitto.org (ถ้าต้องการจบการทำงานของคำสั่ง ให้กด Ctrl+c)

# command to subscribe to a specific topic 
$ mosquitto_sub -h test.mosquitto.org -p 1883 -t 'test/1234/#'

ในอีกหน้าต่าง Terminal (เปิดหน้าต่าง Terminal ใหม่ เพื่อทำคำสั่งใน Bash Shell) ให้ทำคำสั่งต่อไปนี้ เพื่อเชื่อมต่อกับ test.mosquitto.org และส่งข้อความไปยังโบรกเกอร์ โดยใช้หัวข้อ test/1234/msg ลองส่งข้อความหลาย ๆ ครั้ง แล้วสังเกตดูว่า ได้รับข้อความกลับมาหรือไม่ ซึ่งจะแสดงผลในอีก Terminal ที่ได้เปิดไว้ก่อนหน้านั้น

# command to publish a message to a specific topic 
$ mosquitto_pub -h test.mosquitto.org -p 1883 -t 'test/1234/msg' -m 'hello'

ถ้าเพิ่ม -d ในบรรทัดคำสั่ง mosquitto_pub ก็จะมีข้อความเอาต์พุตที่แสดงสถานะขั้นตอนการทำงานของโปรแกรม และช่วยในการดีบัก หรือ Debug Messages

$ mosquitto_pub -h test.mosquitto.org -p 1883 -t 'test/1234/msg' -m 'hello' -d
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'test/1234/msg', ... (5 bytes))
Client (null) sending DISCONNECT

การทำคำสั่ง mosquitto_pub สามารถระบุค่าตัวเลือกได้ เช่น

  • -h host ชื่อหรือหมายเลขไอพีของเครื่องแม่ข่ายที่ทำหน้าที่เป็นโบรกเกอร์ที่ต้องการเชื่อมต่อ
  • -p port หมายเลขพอร์ตของโบรกเกอร์
  • -t topic ชื่อหัวข้อในการเผยแพร่ข้อความ
  • -m message ข้อความที่ต้องการส่งไปยังโบรกเกอร์
  • -q qos ระดับ QoS {0,1,2} เพื่อกำหนดระดับคุณภาพของการบริการส่งข้อมูล
  • -d ให้แสดงข้อความดีบักเมื่อโปรแกรมทำขั้นตอนต่าง ๆ
  • -u user -P password ชื่อบัญชีผู้ใช้และรหัสผ่านเพื่อขอใช้บริการกับโบรกเกอร์
  • -i client-id ตัวระบุชื่อสำหรับ MQTT client
  • -k keepalive ระยะเวลา (วินาที) สำหรับ Clean Session Lifetime (default: 60)
  • -c เชื่อมต่อแบบ Persistent Session
  • -V protocol-version ระบุเวอร์ชันของโพรโทคอลที่จะใช้งาน {mqttv5, mqttv311, mqttv31} (default = mqttv311)

 

รูป: ตัวอย่างการทำคำสั่ง mosquitto_sub และ mosquitto_pub เชื่อมต่อกับ test.mosquitto.org:1883

 

ถ้าจะลองใช้ Public EMQX Broker ก็ให้เปลี่ยนเป็น -h broker.emqx.io -p 1883

 


การส่งข้อความที่มีการเข้ารหัสข้อมูลและยืนยันตัวตน#

ถัดไปเป็นการทดลองเชื่อมต่อและส่งข้อความไปยังโบรกเกอร์ test.mosquitto.org โดยเลือกใช้พอร์ต เช่น 8884 ในกรณีนี้ จะต้องมีการเตรียมไฟล์ TLS Client Certificate เอาไว้ใช้งาน

ขั้นตอนการสร้างไฟล์ดังนี้ (อ้างอิงจาก: TLS Client Certificate) เริ่มต้นด้วยการสร้างไฟล์ CSR (Certificate Signing Request) และบันทึกไว้ในรูปแบบที่เรียกว่า PEM Format โดยใช้คำสั่ง openssl และในการสร้างไฟล์ CSR จะต้องใส่ชุดข้อมูลที่เรียกว่า Distinguished Name (DN) ซึ่งประกอบด้วย

  • Common Name (CN) / FQDN (required) เช่น ใช้ชื่อ iot-kmutnb.github.io
  • Organization Name (O) (optional)
  • Organization Unit (OU) (optional)
  • City or Locality (L) (optional)
  • State or Province (ST) (optional)
  • Two-letter Country Code (C) (optional)
  • Email Address (optional)
  • Challenge Password (optional)
# Install the openssl utility
$ sudo apt install openssl -y

# Generate the RSA 2048-bit key pair stored in a file (client.key)
# and generate the CSR file (client.csr)

$ CN="iot-kmutnb.github.io"

$ SUBJECT_CLIENT="/C=TH/ST=Bangkok/L=Bangsue/O=IoT/OU=Client/CN=$CN"

$ openssl req -new -nodes -sha256 -subj "$SUBJECT_CLIENT" \
  -keyout client.key -out client.csr 

# Download the CA-signed Certificate of Mosquitto.org
$ wget http://test.mosquitto.org/ssl/mosquitto.org.crt

เมื่อทำคำสั่ง openssl แล้ว จะได้ไฟล์ client.key ซึ่งต้องเก็บรักษาไว้เป็นความลับ และอีกไฟล์หนึ่งคือ client.csr จากนั้นให้นำข้อความในไฟล์ client.csr ไปกรอกใส่ในฟอร์มบนหน้าเว็บของ Mosquitto ซึ่งทำหน้าที่เป็น Online Client Certificate Generator https://test.mosquitto.org/ssl/ แล้วกดปุ่ม Submit เพื่อตรวจสอบและลงนามโดยใช้ Mosquitto CA (Certificate Authority) แล้วจะได้ไฟล์ client.crt ซึ่งเป็น ** TLS Client Certificate** มาใช้งานและมีอายุการใช้งานได้ 90 วัน

รูป: หน้าเว็บของ Mosquitto สำหรับกรอกข้อมูล CSR ของไคลเอนต์ เพื่อให้ตรวจสอบและสร้างไฟล์ client.crt (Client Certificate)

รูป: ข้อความภายในไฟล์ client.crt

รูป: ข้อความภายในไฟล์ mosquitto.org.crt

ลองทำคำสั่งต่อไปนี้ เพื่อดูรายละเอียดเกี่ยวกับไฟล์ mosquitto.org.crt (X.509 v3 Certificate)

$ openssl x509 -in mosquitto.org.crt -text -noout

ซึ่งจะเห็นข้อมูลเกี่ยวกับหัวข้อต่าง ๆ เช่น

  • Signature Algorithm
  • Issuer
  • Validity (Not Before / Not After)
  • Subject Public Key Info - Public Key Algorithm / RSA Public-Key)
  • X509v3 extensions - X509v3 Basic Constraints - CA (TRUE or FALSE)

 

ถัดไปเป็นการลองใช้คำสั่ง mosquitto_sub และ mosquitto_pub เพื่อเชื่อมต่อกับพอร์ต 8884 ใช้ QoS 2 และโพรโทคอล MQTT v5.0 และให้สังเกตว่า จะต้องมีการใช้ไฟล์ต่อไปนี้ (เก็บอยู่ในไดเรกทอรีเดียวกัน)

  • mosquitto.org.crt (CA Certificate for Mosquitto)
  • client.crt (Client Cerficate)
  • client.key (Client Private Key)

ทำคำสั่งบรรทัดเดียว เพื่อสมัครและรอรับข้อความ

$ mosquitto_sub -h test.mosquitto.org -p 8883 -d \
   --cafile mosquitto.org.crt -t 'test/1234/#' -V mqttv5 -q 2
$ mosquitto_sub -h test.mosquitto.org -p 8884 -d \
 --cafile mosquitto.org.crt --cert client.crt --key client.key \
 -t 'test/1234/#' -V mqttv5 -q 2

ทำคำสั่งบรรทัดเดียว เพื่อส่งข้อความ

$ mosquitto_pub -h test.mosquitto.org -p 8884 -d \
  --cafile mosquitto.org.crt --cert client.crt --key client.key \
  -t 'test/1234/msg' -m 'hello' -V mqttv5 -q 2

รูป: ตัวอย่างการทำคำสั่ง mosquitto_sub และ mosquitto_pub เชื่อมต่อกับ test.mosquitto.org:8884

แต่ถ้าจะลองใช้พอร์ต 8885 จะต้องระบุชื่อบัญชีผู้ใช้และรหัสผ่านด้วย ดังนี้

$ mosquitto_pub -h test.mosquitto.org -p 8885 -d \
 --cafile mosquitto.org.crt --cert client.crt --key client.key \
 -t 'test/1234/msg' -m 'hello' -V mqttv5 -q 2 \
 -u 'rw' -P 'readwrite'

 

ถ้าต้องการทดสอบกับ EMQX MQTT Broker ให้ลองใช้พอร์ต 8883 ซึ่งจะมีการเข้ารหัสข้อมูลเท่านั้น ดังนั้นจึงไม่ต้องใช้ไฟล์ ** TLS Client Certificate** เพื่อยืนยันตัวตนกับโบรกเกอร์ (อ้างอิงจาก: "Public MQTT Broker for IoT Testing")

จากนั้นให้ลองทำคำสั่ง mosquitto_sub และ mosquitto_pub เพื่อเชื่อมต่อกับพอร์ต 8883 ใช้ QoS 2 และโพรโทคอล MQTT v5.0

ทำคำสั่งเพื่อสมัครรอรับข้อความ

$ mosquitto_sub -h broker.emqx.io -p 8883 -d \
 --capath /etc/ssl/certs/ -t 'test/1234/#' -V mqttv5 -q 2

ทำคำสั่งเพื่อเผยแพร่ข้อความ

$ mosquitto_pub -h broker.emqx.io -p 8883 -d \
  --capath /etc/ssl/certs/ -t 'test/1234/msg' -m 'hello' -V mqttv5 -q 2

รูป: การเชื่อมต่อกับ broker.emqx.io:8883

 


กล่าวสรุป#

บทความนี้ได้สาธิตการเชื่อมต่อไปยังโบรกเกอร์สาธารณะ เช่น Mosquitto Broker และ EMQX Broker สำหรับการลองใช้งาน MQTT โดยใช้คำสั่งของ Mosquitto Pub/Sub Client ใน Linux


อ่านเนื้อหา ตอนที่ 1 | ตอนที่ 3


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Created: 2022-09-10 | Last Updated: 2022-09-22