MQTT學習筆記——樹莓派MQTT客戶端 使用Mosquitto和paho-python


MQTT學習筆記——樹莓派MQTT客戶端 使用Mosquitto和paho-python

參考路徑:https://blog.csdn.net/xukai871105/article/details/39255089

  1 0 前言
  2     本文說明如何在樹莓派上安裝Mosquitto。本文通過兩個簡單的例子說明樹莓派中如何使用MQTT協議實現消息訂閱,這些例子包括Mosquitto_sub指令實現消息訂閱和paho-python擴展庫實現GPIO端口的遠程控制。本文中使用了兩個工具——Mosquitto paho-python,其中Mosquitto是一款實現了 MQTT v3.1 協議的開源消息代理軟件,提供輕量級的,支持發布/訂閱的的消息推送模式,使設備對設備之間的消息通信簡單易用;另外,paho-python是一個符合MQTT v3.1協議的客戶端,paho-python可連接MQTT代理服務器、發布消息、訂閱消息和獲得推送消息。
  3     【相關博文】
  4     【MQTT學習筆記——MQTT協議體驗 Mosquitto安裝和使用】
  5     【樹莓派學習筆記——索引博文】
  6     【樹莓派學習筆記——GPIO功能學習】
  7     【樹莓派學習筆記——RPi.GPIO 流水燈】
  8 
  9 1 在樹莓派上安裝Mosquitto
 10     在樹莓派上安裝Mosquitto和其他平台類似,如果在樹莓派平台直接編譯時間可能會稍長些。Mosquitto源代包不大,所以編譯時間尚可忍受。
 11 1.1 安裝
 12     截止2014年9月,最新版本為mosquitto-1.3.4。在樹莓派中新建一個目錄,例如software。
 13 # 下載源代碼包
 14 wget http://mosquitto.org/files/source/mosquitto-1.3.4.tar.gz
 15 # 解壓
 16 tar zxfv mosquitto-1.3.4.tar.gz
 17 # 進入目錄
 18 cd mosquitto-1.3.4
 19 # 編譯
 20 make
 21 # 安裝
 22 sudo make install
 23 
 24 1.2 安裝注意點
 251】編譯找不到openssl/ssl.h
 26     【解決方法】——安裝openssl
 27 sudo apt-get install libssl-dev
 282】編譯過程找不到ares.h
 29     【解決方法】——修改config.mk中的WITH_SRV:=yes,改為WITH_SRV:=yes
 303】使用過程中找不到libmosquitto.so.1
 31 error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
 32     【解決方法】——修改libmosquitto.so位置
 33 # 創建鏈接
 34 sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
 35 # 更新動態鏈接庫
 36 sudo ldconfig
 374】make: g++:命令未找到  
 38     【解決方法】
 39     安裝g++編譯器
 40 sudo apt-get install g++
 41 
 42 2 簡單的例子
 43     設計一個簡單的測試案例,在PC機上運行MQTT代理服務器,而樹莓派訂閱主題為gpio的消息,PC機發布同主題消息,消息的內容為JSON數據包,數據包格式為{“index”:17,“value”:0},index代表樹莓派GPIO的編號,value代表打開或關閉狀態。
 44 
 45 圖1 示例
 46     本例中PC機IP地址為 192.168.1.110,樹莓派的IP地址為192.168.1.106
 47 2.1 在PC機中開啟MQTT服務
 48     mosquitto -v
 49 
 50 2.2 在樹莓派中訂閱消息
 51     mosquitto_sub -v -t gpio -h 192.168.1.110
 52     【-h】指定MQTT代理服務器主機,指向PC機IP地址192.168.1.110
 53 
 54 2.3 在PC機中發布消息
 55     mosquitto_pub -t gpio -h 192.168.1.110 -m "{\"pin\":17,\"value\":0}"
 56     【-h】指定MQTT代理服務器主機,指向PC機IP地址192.168.1.110
 57 
 58 2.4 消息被推送到樹莓派中    
 59     最后在樹莓派中輸出以下內容:
 60 gpio {"index":17,"value":0 61     在PC機MQTT服務器控制台中輸出
 62 1410600001: mosquitto version 1.3.4 (build date 2014-09-13 15:55:06+0800) starting
 63 1410600001: Using default config.
 64 1410600001: Opening ipv4 listen socket on port 1883.
 65 1410600001: Opening ipv6 listen socket on port 1883.
 66 1410600062: New connection from 192.168.1.106 on port 1883.
 67 1410600062: New client connected from 192.168.1.106 as mosqsub/3063-raspberryp (c1, k60).
 68 1410600062: Sending CONNACK to mosqsub/3063-raspberryp (0)
 69 1410600062: Received SUBSCRIBE from mosqsub/3063-raspberryp
 70 1410600062: gpio (QoS 0)
 71 1410600062: mosqsub/3063-raspberryp 0 gpio
 72 1410600062: Sending SUBACK to mosqsub/3063-raspberryp
 73 1410600122: Received PINGREQ from mosqsub/3063-raspberryp
 74 1410600122: Sending PINGRESP to mosqsub/3063-raspberryp
 75 1410600152: New connection from 192.168.1.110 on port 1883.
 76 1410600152: New client connected from 192.168.1.110 as mosqpub/9793-EasyARM (c1, k60).
 77 1410600152: Sending CONNACK to mosqpub/9793-EasyARM (0)
 78 1410600152: Received PUBLISH from mosqpub/9793-EasyARM (d0, q0, r0, m0, 'gpio', ... (22 bytes))
 79 1410600152: Sending PUBLISH to mosqsub/3063-raspberryp (d0, q0, r0, m0, 'gpio', ... (22 bytes))
 80 1410600152: Received DISCONNECT from mosqpub/9793-EasyARM
 81 1410600182: Received PINGREQ from mosqsub/3063-raspberryp
 82 1410600182: Sending PINGRESP to mosqsub/3063-raspberryp
 83 
 84 3 使用MQTT遠程控制GPIO
 85     下面借助python-gpio擴展庫,通過消息推送的方式實現GPIO端口的遠程控制。
 86 3.1 安裝paho-mqtt
 87     使用pip工具安裝paho-mqtt,輸入以下指令即可:
 88 sudo pip install paho-mqtt
 89 
 90 3.2 樹莓派訂閱代碼——simple.py
 91 # -*- coding: utf-8 -*-  
 92 import paho.mqtt.client as mqtt
 93 import RPi.GPIO as GPIO
 94 import json
 95  
 96 # BCM GPIO編號
 97 pins = [17,18,27,22,23,24,25,4]
 98 def gpio_setup():
 99     # 采用BCM編號
100     GPIO.setmode(GPIO.BCM)
101     # 設置所有GPIO為輸出狀態,且輸出低電平
102     for pin in pins:
103         GPIO.setup(pin, GPIO.OUT)
104         GPIO.output(pin, GPIO.LOW)
105         
106 def gpio_destroy():
107     for pin in pins:
108         GPIO.output(pin, GPIO.LOW)
109         GPIO.setup(pin, GPIO.IN)
110         
111 # 連接成功回調函數
112 def on_connect(client, userdata, flags, rc):
113     print("Connected with result code " + str(rc))
114     # 連接完成之后訂閱gpio主題
115     client.subscribe("gpio")
116  
117 # 消息推送回調函數
118 def on_message(client, userdata, msg):
119     print(msg.topic+" "+str(msg.payload))
120     # 獲得負載中的pin 和 value
121     gpio = json.loads(str(msg.payload))
122  
123     if gpio['pin'] in pins:
124         if gpio['value'] == 0:
125             GPIO.output(gpio['pin'], GPIO.LOW)
126         else:
127             GPIO.output(gpio['pin'], GPIO.HIGH)
128  
129 if __name__ == '__main__':
130     client = mqtt.Client()
131     client.on_connect = on_connect
132     client.on_message = on_message
133     gpio_setup()
134     
135     try:
136         # 請根據實際情況改變MQTT代理服務器的IP地址
137         client.connect("192.168.1.110", 1883, 60)
138         client.loop_forever()
139     except KeyboardInterrupt:
140         client.disconnect()
141         gpio_destroy()
142 
143 3.3 啟動服務並發布消息
144 【在PC機中啟動MQTT代理服務】
145     mosquitto -v
146 【在樹莓派中運行腳本】
147     sudo python simple.py
148 【在PC機中發布消息】
149 # 打開GPIO17
150 mosquitto_pub -h 192.168.1.110 -t gpio -m "{\"pin\":17,\"value\":1}"
151 # 關閉GPIO17
152 mosquitto_pub -h 192.168.1.110 -t gpio -m "{\"pin\":17,\"value\":0}"
153 【運行結果】
154     樹莓派GPIO17根據PC機推送的消息點亮或熄滅。
155 
156 4 總結
157     本文說明了如何在樹莓派中使用MQTT客戶端,通過paho-mqtt實現GPIO的遠程控制。本例在局域網中運行並能不能體現出MQTT協議在遠程控制中的優越性。后期還將花更多的時間實踐和分析MQTT協議。
158 --------------------- 
159 作者:xukai871105 
160 來源:CSDN 
161 原文:https://blog.csdn.net/xukai871105/article/details/39255089 
162 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM