一,服務器
雖然這個沒什么要求,實驗的話虛擬機就可以;什么淘汰筆記本,臺式機也可以。由于我是狂熱份子,就買了臺巴掌大的小電腦做為我的實驗服務器。只是個電腦,內存沒有ECC功能。不過夠我做實驗的了。
巴掌大,可以裝一塊2.5英寸機械硬盤和一塊NVME固態硬盤。8G內存,CPU是I5-6500t,當時價格1800元。里面裝的是Ubuntu 21.04服務器系統,我的Gcc編譯和服務器實驗都是上面進行。
怎么裝Ubuntu我就不詳細說了,網上教程很多,最好裝服務器版本的系統,這種系統沒有界面純命令行,穩定性非常高。
二,物聯網接入平臺
我選擇的是開源的EMQX,百萬級連接。比著商業版缺少數據固化功能,需要自己開發一套訂閱系統用于存儲數據。
網址是://www.emqx.com/zh/downloads?product=broker,記得選擇開源版的Ubuntu版本,企業版只可免費試用幾個月。
安裝也很簡單,官方給了說明,只需3行代碼。
從//你的服務器IP:18083/進入管理界面,18083是WEB管理頁面端口。運行后的界面是這樣的。
占用的接口是下面這些,我們常使用的是1883端口,既是mqtt:tcp接口。如果使用coap協議就是5683端口。
三,傳感器模擬(物聯網設備1)
傳感器模擬我使用的是樹莓派,把樹莓派的CPU溫度用python上傳到物聯網平臺。也可以訂閱自己感興趣的主題,用于控制個燈,風扇啥的。代碼如下:
# subscriber.py
import paho.mqtt.client as mqtt
import time
# 0: 連接成功
# 1: 連接失敗-不正確的協議版本
# 2: 連接失敗-無效的客戶端標識符
# 3: 連接失敗-服務器不可用
# 4: 連接失敗-錯誤的用戶名或密碼
# 5: 連接失敗-未授權
# 6-255: 未定義
# 如果是其它問題,可以檢查網絡情況,或者確認是否安裝了 `paho-mqtt`。
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("\n連接成功!\n")
elif rc==1:
print(f"\n接失敗-不正確的協議版本\n")
elif rc==2:
print(f"\n連接失敗-無效的客戶端標識符\n")
elif rc==3:
print(f"\n連接失敗-服務器不可用\n")
elif rc==4:
print(f"\n連接失敗-錯誤的用戶名或密碼\n")
elif rc==5:
print(f"\n連接失敗-未授權\n")
else:
print(f"\n連接失敗-未定義\n")
# 訂閱,需要放在 on_connect 里
# 如果與 broker 失去連接后重連,仍然會繼續訂閱 raspberry/topic 主題
client.subscribe("raspberry/topic")
# 回調函數,當收到消息時,觸發該函數
def on_message(client, userdata, msg):
print(f"{msg.topic} {msg.payload}")
def get_cpu_temp():
tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )
cpu_temp = tempFile.read()
tempFile.close()
return float(cpu_temp)/1000
client = mqtt.Client("數梅派終端")
client.username_pw_set("你的用戶名","你的密碼")
client.on_connect = on_connect
client.on_message = on_message
# 設置遺囑消息,當樹莓派斷電,或者網絡出現異常中斷時,發送遺囑消息給其他客戶端
client.will_set('raspberry/status', b'{"status": "offline!"}')
# 創建連接,三個參數分別為 broker 地址,broker 端口號,保活時間
client.connect("10.195.136.221", 1883, 60)
# 設置網絡循環堵塞,在調用 disconnect() 或程序崩潰前,不會主動結束程序
client.loop_start()
while True:
# 四個參數分別為:主題,發送內容,QoS, 是否保留消息
client.publish('raspberry/topic', payload=str(get_cpu_temp()), qos=0, retain=False)
print(f"send cpu temp to raspberry/topic")
time.sleep(5)
這段代碼每5秒鐘向服務器發送一條溫度信息。同時訂閱了一條raspberry/topic的主題。
四,訂閱設備模擬(物聯網設備2)
如果沒有樹莓派,也可以用軟件模擬,軟件叫MQTTX,免費的,和服務器平臺是一家,不用寫任何代碼,也是新手比較推薦的玩法。
和樹莓派一樣,可以發送消息和訂閱消息,從圖中可以看到訂閱了樹莓派所有過來的主題,當前溫度不到44度。
從上次升級到現在,服務器已經運行3天接收到5萬多條信息。