设为首页 收藏本站
查看: 1301|回复: 0

[经验分享] MQTT学习笔记——树莓派MQTT客户端 使用Mosquitto和paho-python

[复制链接]

尚未签到

发表于 2015-12-15 12:50:52 | 显示全部楼层 |阅读模式
原文地址:http://blog.csdn.net/xukai871105/article/details/39255089
0 前言



    本文说明如何在树莓派上安装Mosquitto。本文通过两个简单的例子说明树莓派中如何使用MQTT协议实现消息订阅,这些例子包括Mosquitto_sub指令实现消息订阅和paho-python扩展库实现GPIO端口的远程控制。本文中使用了两个工具——Mosquitto paho-python,其中Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的消息通信简单易用;另外,paho-python是一个符合MQTT v3.1协议的客户端,paho-python可连接MQTT代理服务器、发布消息、订阅消息和获得推送消息。
    【相关博文】
    【MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用】
    【树莓派学习笔记——索引博文】

    【树莓派学习笔记——GPIO功能学习】
    【树莓派学习笔记——RPi.GPIO 流水灯】


1 在树莓派上安装Mosquitto

    在树莓派上安装Mosquitto和其他平台类似,如果在树莓派平台直接编译时间可能会稍长些。Mosquitto源代包不大,所以编译时间尚可忍受。
1.1 安装


    截止2014年9月,最新版本为mosquitto-1.3.4。在树莓派中新建一个目录,例如software。

# 下载源代码包wget http://mosquitto.org/files/source/mosquitto-1.3.4.tar.gz

# 解压


tar zxfv mosquitto-1.3.4.tar.gz
# 进入目录

cd mosquitto-1.3.4

# 编译
make
# 安装

sudo make install


1.2 安装注意点






【1】编译找不到openssl/ssl.h

    【解决方法】——安装openssl
sudo apt-get install libssl-dev

【2】编译过程找不到ares.h
    【解决方法】——修改config.mk中的WITH_SRV:=yes,改为WITH_SRV:=yes
【3】使用过程中找不到libmosquitto.so.1
error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory

    【解决方法】——修改libmosquitto.so位置

# 创建链接

sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
# 更新动态链接库
sudo ldconfig
【4】make: g++:命令未找到  
    【解决方法】
    安装g++编译器
sudo apt-get install g++


2 简单的例子
    设计一个简单的测试案例,在PC机上运行MQTT代理服务器,而树莓派订阅主题为gpio的消息,PC机发布同主题消息,消息的内容为JSON数据包,数据包格式为{“index”:17,“value”:0},index代表树莓派GPIO的编号,value代表打开或关闭状态。
DSC0000.jpg


图1 示例
    本例中PC机IP地址为 192.168.1.110,树莓派的IP地址为192.168.1.106
2.1 在PC机中开启MQTT服务
    mosquitto -v


2.2 在树莓派中订阅消息
    mosquitto_sub -v -t gpio -h 192.168.1.110
    【-h】指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110


2.3 在PC机中发布消息

    mosquitto_pub -t gpio -h 192.168.1.110 -m "{\"pin\":17,\"value\":0}"
    【-h】指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110


2.4 消息被推送到树莓派中    
    最后在树莓派中输出以下内容:
gpio {"index":17,"value":0}


    在PC机MQTT服务器控制台中输出
1410600001: mosquitto version 1.3.4 (build date 2014-09-13 15:55:06+0800) starting
1410600001: Using default config.
1410600001: Opening ipv4 listen socket on port 1883.
1410600001: Opening ipv6 listen socket on port 1883.
1410600062: New connection from 192.168.1.106 on port 1883.
1410600062: New client connected from 192.168.1.106 as mosqsub/3063-raspberryp (c1, k60).
1410600062: Sending CONNACK to mosqsub/3063-raspberryp (0)
1410600062: Received SUBSCRIBE from mosqsub/3063-raspberryp
1410600062: gpio (QoS 0)
1410600062: mosqsub/3063-raspberryp 0 gpio
1410600062: Sending SUBACK to mosqsub/3063-raspberryp
1410600122: Received PINGREQ from mosqsub/3063-raspberryp
1410600122: Sending PINGRESP to mosqsub/3063-raspberryp
1410600152: New connection from 192.168.1.110 on port 1883.
1410600152: New client connected from 192.168.1.110 as mosqpub/9793-EasyARM (c1, k60).
1410600152: Sending CONNACK to mosqpub/9793-EasyARM (0)
1410600152: Received PUBLISH from mosqpub/9793-EasyARM (d0, q0, r0, m0, 'gpio', ... (22 bytes))
1410600152: Sending PUBLISH to mosqsub/3063-raspberryp (d0, q0, r0, m0, 'gpio', ... (22 bytes))
1410600152: Received DISCONNECT from mosqpub/9793-EasyARM
1410600182: Received PINGREQ from mosqsub/3063-raspberryp
1410600182: Sending PINGRESP to mosqsub/3063-raspberryp



3 使用MQTT远程控制GPIO
    下面借助python-gpio扩展库,通过消息推送的方式实现GPIO端口的远程控制。
3.1 安装paho-mqtt
    使用pip工具安装paho-mqtt,输入以下指令即可:
sudo pip install paho-mqtt



3.2 树莓派订阅代码——simple.py



[python] view plaincopy

  • # -*- coding: utf-8 -*-    
  • import paho.mqtt.client as mqtt  
  • import RPi.GPIO as GPIO  
  • import json  
  •   
  • # BCM GPIO编号  
  • pins = [17,18,27,22,23,24,25,4]  
  • def gpio_setup():  
  •     # 采用BCM编号  
  •     GPIO.setmode(GPIO.BCM)  
  •     # 设置所有GPIO为输出状态,且输出低电平  
  •     for pin in pins:  
  •         GPIO.setup(pin, GPIO.OUT)  
  •         GPIO.output(pin, GPIO.LOW)  
  •          
  • def gpio_destroy():  
  •     for pin in pins:  
  •         GPIO.output(pin, GPIO.LOW)  
  •         GPIO.setup(pin, GPIO.IN)  
  •          
  • # 连接成功回调函数  
  • def on_connect(client, userdata, flags, rc):  
  •     print("Connected with result code " + str(rc))  
  •     # 连接完成之后订阅gpio主题  
  •     client.subscribe("gpio")  
  •   
  • # 消息推送回调函数  
  • def on_message(client, userdata, msg):  
  •     print(msg.topic+" "+str(msg.payload))  
  •     # 获得负载中的pin 和 value  
  •     gpio = json.loads(str(msg.payload))  
  •   
  •     if gpio['pin'] in pins:  
  •         if gpio['value'] == 0:  
  •             GPIO.output(gpio['pin'], GPIO.LOW)  
  •         else:  
  •             GPIO.output(gpio['pin'], GPIO.HIGH)  
  •   
  • if __name__ == '__main__':  
  •     client = mqtt.Client()  
  •     client.on_connect = on_connect  
  •     client.on_message = on_message  
  •     gpio_setup()  
  •       
  •     try:  
  •         # 请根据实际情况改变MQTT代理服务器的IP地址  
  •         client.connect("192.168.1.110", 1883, 60)  
  •         client.loop_forever()  
  •     except KeyboardInterrupt:  
  •         client.disconnect()  
  •         gpio_destroy()  





3.3 启动服务并发布消息
【在PC机中启动MQTT代理服务】
    mosquitto -v
【在树莓派中运行脚本】
    sudo python simple.py
【在PC机中发布消息】
# 打开GPIO17
mosquitto_pub -h 192.168.1.110 -t gpio -m "{\"pin\":17,\"value\":1}"
# 关闭GPIO17
mosquitto_pub -h 192.168.1.110 -t gpio -m "{\"pin\":17,\"value\":0}"


【运行结果】
    树莓派GPIO17根据PC机推送的消息点亮或熄灭。


4 总结
    本文说明了如何在树莓派中使用MQTT客户端,通过paho-mqtt实现GPIO的远程控制。本例在局域网中运行并能不能体现出MQTT协议在远程控制中的优越性。后期还将花更多的时间实践和分析MQTT协议。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151534-1-1.html 上篇帖子: python时间转换 下篇帖子: python解析xml的方法总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表