查看: 4728|回复: 0

[教程] 教你如何在树莓派上安装 Mosquitto 实现 MQTT

[复制链接]
  • TA的每日心情

    2020-3-6 09:52
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2018-9-18 16:59:06 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 风之物语 于 2018-9-18 16:59 编辑

    MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。

    若初次接触MQTT协议,可先理解以下概念:
    MQTT协议特点——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。
    MQTT协议角色——在RESTful架构的物联网系统,包含两个角色客户端和服务器端,而在MQTT协议中包括发布者,代理器(服务器)和订阅者。
    MQTT协议消息——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使用。
    MQTT协议主题——MQTT中的主题可理解为相同类型或相似类型的消息集合。

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

    1.jpg

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

    1.1 安装
    截止2014年9月,最新版本为mosquitto-1.3.4。在树莓派中新建一个目录,例如software。
    1. # 下载源代码包
    2. wget http://mosquitto.org/files/source/mosquitto-1.3.4.tar.gz
    3. # 解压
    4. tar zxfv mosquitto-1.3.4.tar.gz
    5. # 进入目录
    6. cd mosquitto-1.3.4
    7. # 编译
    8. make
    9. # 安装
    10. sudo make install
    复制代码

    1.2 安装注意点
    编译找不到openssl/ssl.h
    解决方法:安装openssl
    1. sudo apt-get install libssl-dev
    复制代码

    编译过程找不到ares.h
    解决方法:修改config.mk中的WITH_SRV:=yes,改为WITH_SRV:=yes

    使用过程中找不到libmosquitto.so.1
    error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
    解决方法:修改libmosquitto.so位置
    1. # 创建链接
    2. sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
    3. # 更新动态链接库
    4. sudo ldconfig
    复制代码

    make: g++:命令未找到
    解决方法:安装g++编译器
    1. sudo apt-get install g++
    复制代码

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

    2.1 在PC机中开启MQTT服务
    1. mosquitto -v
    复制代码

    2.2 在树莓派中订阅消息

    1. mosquitto_sub -v -t gpio -h 192.168.1.110
    复制代码
    -h指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110

    2.3 在PC机中发布消息
    1. mosquitto_pub -t gpio -h 192.168.1.110 -m "{"pin":17,"value":0}"
    复制代码
    -h指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110

    2.4 消息被推送到树莓派中
    最后在树莓派中输出以下内容:
    1. gpio {"index":17,"value":0}
    复制代码
    在PC机MQTT服务器控制台中输出
    1. 1410600001: mosquitto version 1.3.4 (build date 2014-09-13 15:55:06+0800) starting
    2. 1410600001: Using default config.
    3. 1410600001: Opening ipv4 listen socket on port 1883.
    4. 1410600001: Opening ipv6 listen socket on port 1883.
    5. 1410600062: New connection from 192.168.1.106 on port 1883.
    6. 1410600062: New client connected from 192.168.1.106 as mosqsub/3063-raspberryp (c1, k60).
    7. 1410600062: Sending CONNACK to mosqsub/3063-raspberryp (0)
    8. 1410600062: Received SUBSCRIBE from mosqsub/3063-raspberryp
    9. 1410600062: gpio (QoS 0)
    10. 1410600062: mosqsub/3063-raspberryp 0 gpio
    11. 1410600062: Sending SUBACK to mosqsub/3063-raspberryp
    12. 1410600122: Received PINGREQ from mosqsub/3063-raspberryp
    13. 1410600122: Sending PINGRESP to mosqsub/3063-raspberryp
    14. 1410600152: New connection from 192.168.1.110 on port 1883.
    15. 1410600152: New client connected from 192.168.1.110 as mosqpub/9793-EasyARM (c1, k60).
    16. 1410600152: Sending CONNACK to mosqpub/9793-EasyARM (0)
    17. 1410600152: Received PUBLISH from mosqpub/9793-EasyARM (d0, q0, r0, m0, 'gpio', ... (22 bytes))
    18. 1410600152: Sending PUBLISH to mosqsub/3063-raspberryp (d0, q0, r0, m0, 'gpio', ... (22 bytes))
    19. 1410600152: Received DISCONNECT from mosqpub/9793-EasyARM
    20. 1410600182: Received PINGREQ from mosqsub/3063-raspberryp
    21. 1410600182: Sending PINGRESP to mosqsub/3063-raspberryp
    复制代码

    3 使用MQTT远程控制GPIO
    下面借助python-gpio扩展库,通过消息推送的方式实现GPIO端口的远程控制。

    3.1 安装paho-mqtt
    使用pip工具安装paho-mqtt,输入以下指令即可:
    1. sudo pip install paho-mqtt
    复制代码

    3
    .2 树莓派订阅代码 simple.py
    1. # -*- coding: utf-8 -*-  
    2. import paho.mqtt.client as mqtt
    3. import RPi.GPIO as GPIO
    4. import json
    5.   
    6. # BCM GPIO编号
    7. pins = [17,18,27,22,23,24,25,4]
    8. def gpio_setup():
    9.     # 采用BCM编号
    10.     GPIO.setmode(GPIO.BCM)
    11.     # 设置所有GPIO为输出状态,且输出低电平
    12.     for pin in pins:
    13.         GPIO.setup(pin, GPIO.OUT)
    14.         GPIO.output(pin, GPIO.LOW)
    15.          
    16. def gpio_destroy():
    17.     for pin in pins:
    18.         GPIO.output(pin, GPIO.LOW)
    19.         GPIO.setup(pin, GPIO.IN)
    20.          
    21. # 连接成功回调函数
    22. def on_connect(client, userdata, flags, rc):
    23.     print("Connected with result code " + str(rc))
    24.     # 连接完成之后订阅gpio主题
    25.     client.subscribe("gpio")
    26.   
    27. # 消息推送回调函数
    28. def on_message(client, userdata, msg):
    29.     print(msg.topic+" "+str(msg.payload))
    30.     # 获得负载中的pin 和 value
    31.     gpio = json.loads(str(msg.payload))
    32.   
    33.     if gpio['pin'] in pins:
    34.         if gpio['value'] == 0:
    35.             GPIO.output(gpio['pin'], GPIO.LOW)
    36.         else:
    37.             GPIO.output(gpio['pin'], GPIO.HIGH)
    38.   
    39. if __name__ == '__main__':
    40.     client = mqtt.Client()
    41.     client.on_connect = on_connect
    42.     client.on_message = on_message
    43.     gpio_setup()
    44.      
    45.     try:
    46.         # 请根据实际情况改变MQTT代理服务器的IP地址
    47.         client.connect("192.168.1.110", 1883, 60)
    48.         client.loop_forever()
    49.     except KeyboardInterrupt:
    50.         client.disconnect()
    51.         gpio_destroy()
    复制代码

    3.3 启动服务并发布消息
    在PC机中启动MQTT代理服务
    1. mosquitto -v
    复制代码
    在树莓派中运行脚本
    1. sudo python simple.py
    复制代码
    在PC机中发布消息
    1. # 打开GPIO17
    2. mosquitto_pub -h 192.168.1.110 -t gpio -m "{"pin":17,"value":1}"
    3. # 关闭GPIO17
    4. mosquitto_pub -h 192.168.1.110 -t gpio -m "{"pin":17,"value":0}"
    复制代码
    运行结果
    树莓派GPIO17根据PC机推送的消息点亮或熄灭。

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

    转自:https://blog.csdn.net/xukai871105/article/details/39255089

    相关资料:
    1、https://blog.csdn.net/xukai871105/article/details/39252653
    2、http://blog.csdn.net/shagoo/article/details/7910598
    3、https://www.jianshu.com/p/f8d824afbe3d





    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则



    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 14:53 , Processed in 0.117499 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.