[Intel Edison] 使用 MQTT 傳遞資料

官網有一篇 MQTT 的安裝教學

Building and running Mosquitto MQTT on Intel Edison

我按照上面的步驟操作,但在編譯時卡住了

read_handle_server.c:31:25: fatal error: uuid/uuid.h: No such file or directory

於是參考網路上其他人的教學,安裝 paho-mqtt 這個套件,使用 Python 來開發


安裝 pip 套件管理工具

為了要安裝 Python 套件,我們必須先安裝好 pip 管理工具 首先新增 opkg 的 repositories

vi /etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

接著更新 package list

opkg update

安裝 pip 前,先安裝 setuptools

wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py Then run python ez_setup.py --no-check-certificate
python ez_setup.py

使用 opkg 安裝 pip

opkg install python-pip

安裝 MQTT

pip install paho-mqtt

測試 MQTT

我們先用下面的範例程式,來測試 MQTT 是否可以成功訂閱 Topic Subscriber 端 Python 測試程式

# SubscriberTest.py
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("IOT_NEAT_TOPIC01")

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("mqtt.phodal.com", 1883, 60)
client.loop_forever()
python SubscriberTest.py
Connected with result code 0
IOT_NEAT_TOPIC01 {'member':'luke','age':11}

mqtt.phodal.com 這是一個測試 Server,已經發佈一個名稱為 IOT_NEAT_TOPIC01 的 Topic,因此我們可以收到 Topic 內容

{'member':'luke','age':11}

client.connect 第 1 欄為 Server 位置,第 2 欄是 port,第 3 欄是 timeout 時間 (秒)。如果要強制離開程式,按 Ctrl+C 會繼續進入 loop,我這邊用 Ctrl+Z 讓他進入背景執行,再用 kill 把他 terminate

jobs
[1]+ Stopped(SIGTSTP) python SubscriberTest.py
kill %1

在本機進行 Subscriber 與 Publisher 測試

測試過 Subscriber 後,我們就來建立 Publisher,在本機端使用 MQTT 傳遞訊息。 這邊將 Server 都改為 localhost,Topic 名稱改為 MYTOPIC。

Subscriber 端 Python 測試程式

# Subscriber.py
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("MYTOPIC")

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost", 1883, 60)
client.loop_forever()

Publisher 端 Python 測試程式

# Publisher.py
import paho.mqtt.client as mqtt

_g_cst_ToMQTTTopicServerIP = "localhost"
_g_cst_ToMQTTTopicServerPort = 1883 #port
_g_cst_MQTTTopicName = "MYTOPIC" #TOPIC name

mqttc = mqtt.Client("python_pub")
mqttc.connect(_g_cst_ToMQTTTopicServerIP, _g_cst_ToMQTTTopicServerPort)
mqttc.publish(_g_cst_MQTTTopicName, "Hello")

執行 Publisher 後,Subscriber 就會收到一個 Hello 訊息。 測試的時候需要開兩個命令視窗,記得將 edison 連上網,使用 SSH 連線登入。如果透過 Serial Port 開兩個 Screen,會發現兩個視窗會同步動作,因為走同一條線XD

執行 Subscriber,讓他一直監聽 MYTOPIC 只要在另一個命令列執行 Publisher,Subscriber 就會接收到 Hello

python Subscriber.py
Connected with result code 0
MYTOPIC Hello

這樣就完成 MQTT 在本機的傳遞測試囉


參考資料

Jerry
Jerry

樂於分享的軟體工程師,曾在新創與大型科技公司實習,獲得黑客松競賽冠軍,擔任資安研討會講者。長期熱衷於資訊安全、雲端服務、網路行銷等領域,希望將科技知識分享給更多人。內容轉載請來信:jlee58tw@gmail.com

2 則留言

發表回應