---
tags: Jetson Nano, Basic, NVIDIA, 基礎, 教學, 環境安裝, 設定, Mac, 勇哥, Yungger
---
參考:https://zhuanlan.zhihu.com/p/80809006
# Jetson Nano - MQTT Broker (Mosquitto)
## 安裝
- 更新 Ubuntu 的套件清單
$ sudo apt update
- 安裝 Mosquitto MQTT Broker
$ sudo apt install -y mosquitto
- 安裝 Mosquitto Client
$ sudo apt install -y mosquitto-clients
## 測試
:::info
- MQTT 基本概念

- 訊息訂閱者 (Subscriber) 向 Mosquitto MQTT Broker 訂閱 Sensor/Temperature/Room1 的 主題 (Topic),
- 訊息發佈者 (Publisher) 上傳一個 hello world 的訊息到 Mosquitto MQTT Broker, 主題為 Sensor/Temperature/Room1
:::
訂閱並監聽訊息的測試程式碼:
```python=
# ex_MQTT_Subscribe.py
import paho.mqtt.client as mqtt
MQTT_SERVER = "192.168.0.119" # localhost="127.0.0.1"
MQTT_PORT = 1883
MQTT_TOPIC = "ai_car"
MQTT_CLIENT = ""
# 連線 MQTT 伺服器
def on_connect(client, userdata, flags, rc):
rcList = {
0: "Connection successful",
1: "Connection refused - incorrect protocol version",
2: "Connection refused - invalid client identifier",
3: "Connection refused - server unavailable",
4: "Connection refused - bad username or password",
5: "Connection refused",
}
print("Connection result code {} : {}".format(rc, rcList[rc]))
# 將訂閱主題寫在 onConnectCBK 中, 如果失去連線或再重新連線時, 將會重新被訂閱
client.subscribe(MQTT_TOPIC)
# 當接收到從伺服器發送的訊息時要進行的動作
def on_message(client, userdata, msg):
print("Topic:{}, Payload:{}".format(msg.topic, msg.payload.decode('utf-8'))) # 轉換編碼utf-8才看得懂中文
# Declare a mqtt object
client = mqtt.Client(client_id=MQTT_CLIENT)
# 設定連線時的 Callback 函式動作
client.on_connect = on_connect
# 設定接收到訊息的 Callback 函式動作
client.on_message = on_message
# 設定連線(IP, Port, 連線時間)
client.connect(MQTT_SERVER, MQTT_PORT, 60)
# listen message published forever
client.loop_forever()
```

發佈訊息的測試程式碼:
```python=
# ex_MQTT_Publish.py
import paho.mqtt.client as mqtt
import random
import json
import datetime
import time
MQTT_SERVER = "192.168.0.119" # localhost="127.0.0.1"
MQTT_PORT = 1883
MQTT_TOPIC = "ai_car"
MQTT_CLIENT = ""
# 設置日期時間的格式
ISOTIMEFORMAT = '%m/%d %H:%M:%S'
# 連線設定
# 初始化地端程式
client = mqtt.Client(client_id=MQTT_CLIENT)
# 設定連線資訊(IP, Port, 連線時間)
client.connect(MQTT_SERVER, MQTT_PORT, 60)
while True:
# 要發佈的測試資料
t0 = random.randint(0, 30)
t = datetime.datetime.now().strftime(ISOTIMEFORMAT)
payload = {'Temperature' : t0 , 'Time' : t}
print(json.dumps(payload))
# 將測試資料發佈到指定的主題, 每隔 5 秒發佈一次
client.publish(MQTT_TOPIC, json.dumps(payload))
time.sleep(5)
```
