树莓派通信协议——MQTT的安装及使用

2023-11-04

MQTT是一种基于TCP/IP协议栈构建的异步通信协议,是一种轻量级的发布/订阅信息传输协议,基于topic订阅关系的发布和推送;在实践中可空间上,将消息发送者和接受者分离,可以再不可靠的网络环境中进行扩展,适用于设备硬件存储空间有限或网络带宽有限的场景。

上面是比较官方的解释,那么我们用我们听得懂的话来解释,现在的抖音很火,那我们就用抖音举个栗子:
抖音是一个短视频平台,任何人都可以发布自己拍的视频,也可以看别人的视频,那么我们假设有用户A和用户B;
用户A  ------关注------> 用户B
用户B  ---没有关注---> 用户A
那么就会出现下面的情况:
用户A发送视频  ----不会推送---->  用户B
用户B发送视频  -------推送------->  用户A

也就是说,用户B没有关注用户A,所以当用户A发布视频后,用户B是不会接收到用户A的视频的;
反之,用户B发布视频后,用户A会第一时间接收到;

那么,用户A为什么会第一时间接受到呢?
这是因为有抖音的服务器作为中间人,当存在订阅(关注)关系后,当用户B发送数据后,服务器会将数据推送给所有订阅(关注)的用户;MQTT就是这样基于topic订阅关系进行发布和推送的

一、MQTT协议的元素

  1. MQTT协议的角色:在MQTT中,就有三个角色,发布者、服务器和订阅者;

  2. MQTT协议的主题:在MQTT中,主题可以理解成是发布者,即一个主题我可以发送多条信息,所有订阅了这个主题的用户,都可以接收到该主题信息;

  3. MQTT协议的消息:在MQTT中,就可以理解成发布者发布的内容,当订阅者接收到信息后,就可以对信息进行处理;

  4. 那么服务器在哪里体现呢?
    首先,每台主机都可以当做服务端和客户端,即都可以发布信息和接受信息;
    其次,一台主机可以发布或订阅多个主题的信息;

二、树莓派上安装Mosquitto

# 安装mosquitto服务
apt-get install mosquitto

# 安装mosquitto工具
apt-get install mosquitto-clients

三、启动Mosquitto服务

mosquitto -v


出现上面的信息,那就证明mosquitto服务已经安装成功,并且服务已经启动了,端口为1883;

四、订阅消息

mosquitto_sub -v -t test -h 10.168.1.193
# mosquitto_sub -v -t 主题 -h 地址

五、发布消息

mosquitto_pub -t test -h 10.168.1.193 -m "hello"
# mosquitto_pub -t 主题 -h 地址 -m 消息内容


六、使用Python来接受并处理数据

  1. 安装Python MQTT库
    pip install paho-mqtt
  2. 框架代码解释
    # -*- coding: utf-8 -*-  
    import paho.mqtt.client as mqtt    # 导入mqtt库
            
    # 连接成功回调函数
    def on_connect(client, userdata, flags, rc):
        print("Connected with result code " + str(rc))
        client.subscribe("mqtt_ttt")    # 这里即为订阅的主题
        # client.subscribe("mqtt_ttt")    这里可以订阅多个主题
     
    # 消息推送回调函数
    def on_message(client, userdata, msg):
        print(str(msg.topic),str(msg.payload))
        # 这里需要注意的是,如果想要对接收到的数据进行处理,那么要转换成str类型
        # msg.topic    主题名
        # msg.payload  接收的信息
     
    if __name__ == '__main__':
        client = mqtt.Client()            # 创建mqtt对象
        client.on_connect = on_connect    # 设置连接成功的回调函数
        client.on_message = on_message    # 设置接收到信息后的回调函数
        
        try:
            client.connect("10.168.1.193", 1883, 60)    # 创建连接
            client.loop_forever()    # 保持监测状态
        except KeyboardInterrupt:
            client.disconnect()    # 断开连接
    
    
  3. 使用MQTT控制树莓派GPIO
    # -*- coding: utf-8 -*-  
    import paho.mqtt.client as mqtt
    import json
    import RPi.GPIO as GPIO
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(16,GPIO.OUT)
            
    def on_connect(client, userdata, flags, rc):
        print("Connected with result code " + str(rc))
        client.subscribe("mqtt_ttt")
     
    # 消息推送回调函数
    def on_message(client, userdata, msg):
        st = json.loads(msg.payload)    # 这里用json对数据进行处理,方便后面对数据的解析
                                        # 还有一个原因是,我直接对数据进行判断,会出现问题,至今没有解决
        print(st)    # 输出解析后的数据
        # 对数据进行判断和处理
        if st['dt'] == 1:
            GPIO.output(16,GPIO.HIGH)
        elif st['dt'] == 0:
            GPIO.output(16,GPIO.LOW)
        else:
            print('err')
     
    if __name__ == '__main__':
        client = mqtt.Client()
        client.on_connect = on_connect
        client.on_message = on_message
        
        try:
            client.connect("10.168.1.193", 1883, 60)
            client.loop_forever()
        except KeyboardInterrupt:
            client.disconnect()
            GPIO.output(16,GPIO.LOW)
            GPIO.cleanup()

     

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派通信协议——MQTT的安装及使用 的相关文章

  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 【Mac】Mac安装telnet

    1 美图 2 安装 Homebrew 安装 Homebrew 3 安装 base lcc lcc github brew install telnet Updating Homebrew gt Downloading https homeb
  • linux tr命令用法详解

    tr命令用法详解 转自 https www cnblogs com bingguoguo articles 9188703 html tr命令可以对来自标准输入的字符进行替换 压缩和删除 它可以将一组字符变成另一组字符 经常用来编写优美的单
  • 系统架构演变历史及集群、分布式、微服务、SOA的概念区别

    文章目录 1 系统架构演变历史 1 单一应用架构 ORM 2 垂直应用架构 MVC 3 面向服务框架 SOA 4 微服务架构 1 微服务的特点 2 微服务主要解决的问题与场景 3 微服务的缺点 2 集群和分布式 微服务和soa概念和区别理解
  • 创业有哪些忠告?创业赚钱有哪些思维需要掌握?

    1 做买卖 要接到钱再干活儿 除非是你是在做自个的事 并且你确定将来会出现大收益 2 别做回款长的买卖 它对人的本性的考验太大 大部分人们在钱上的阻碍是挺大的 很多钱你是收不回家的 3 没想搞清楚运营模式 就不必自主创业 不然你将公司的铁架
  • 限制<textarea>文本框的字数长度以及设置右下角动态的字数显示

    平时无论在移动端还是PC端都会经常用到文本框 最常碰到的就是要对文本框里面的字数进行限制还有相对应的把剩余可输入的字数显示在右下角 要实现它并不是很难 直接上代码套用一下就ok了 HTML 因为我这里只用到了一小块地方 所以就直接把文本框C
  • 泛型是什么,为什么要用泛型

    泛型 泛型概述及优势 泛型 是JDK5 中引入的特性 可以在编译阶段约束操作的数据类型 并进行检查 泛型只能支持引用数据类型 集合体系的全部接口和实现类都是支持泛型的使用的 好处 统一数据类型 把运行时期的问题提前到了编译期间 避免了强制类
  • TensorFlow在MNIST中的应用-Softmax回归分类

    参考 TensorFlow技术解析与实战 http wiki jikexueyuan com project tensorflow zh tutorials mnist beginners html http www jianshu com
  • 7-2 一元多项式的乘法与加法运算 JAVA_MAP方案

    7 2 一元多项式的乘法与加法运算 30 分 题目要求 设计函数分别求两个一元多项式的乘积与和 输入格式 输入分2行 每行分别先给出多项式非零项的个数 再以指数递降方式输入一个多项式非零项系数和指数 绝对值均为不超过1000的整数 数字间以
  • PCB layout 注意事项

    过孔方面的注意事项 放置过孔时 放置过孔时 2个过孔之间的能走过一根信号线 注意美观横平竖直 过孔与焊盘的间距 PCB layout 时过孔与焊盘的间距 最好在6mil 1 524mm 以上 因为过孔一般不开阻焊 离焊盘太近会导致过孔露铜
  • BigDecimal中divide方法详解

    1 首先说一下用法 BigDecimal中的divide主要就是用来做除法的运算 其中有这么一个方法 public BigDecimal divide BigDecimal divisor int scale int roundingMod
  • 「Python 基础」异步 I/O 编程

    I O 密集型应用程序大大提升系统多任务处理能力 异步 I O 模型 一个消息循环 主线程在消息循环中不断重复 读取消息 处理消息 获取线程池 loop get event loop while True 接收事件消息 event loop
  • R语言实现个人信用风险评估(数据科学导引)

    1 案例背景 在很多国家 政府机构会密切监控贷款业务银行需要明确解释申请者的贷款申请被拒绝或者批准的原因 这种可解释性对于贷款申请者也是很重要的 在贷款申请被银行拒绝时 申请者需要知道为什么自己的信用级别不符合银行的要求 通过构建自动化的信
  • es脚本 实现字段之间进行比对

    script script source ctx source extra test lang painless query term user kimchy java BoolQueryBuilder boolQueryBuilder Q
  • 详解比较古怪的字符串拆分函数:strtok函数

    对于字符串中的标点符号 字符呀 如何能够当作分隔符来对原字符串进行分割呢 分割出来的为一段一段的字符 因此 在这里面就用到了 本文 比较古怪的字符串拆分函数 strtok函数 假设 对于这个字符串 woaini wangyijun com
  • 3.4 三级指针

    char p NULL 注 1 可以通过三级指针间接的改变二级指针的指向 2 p表示 三级指针指向的二级指针中保存的内存地址 3 三级指针做函数参数时 主调函数需要传2级指针的地址 4 n级指针可以间接修改n 1级指针的指向 下面的例子通过
  • @Component注解的作用

    Spring自带的 Component注解及扩展 Component 定义Spring管理Bean 也就是将标注 Component注解的类交由spring管理 AspectJ风格的切面可以通过 Compenent注解标识其为Spring管
  • VMware10上新建虚拟机步骤图解 + 安装Centos 7(64位) 系统

    原文 https blog csdn net hometing218 article details 79486172
  • RTKlib单点定位-部分思考

    塔奇克敲代码 博主的博客 RTKLIB源码解析 单点定位 将单点定位部分整理成函数小卡片 为我理解RTKlib提供了很大的帮助 他在单点定位部分列出了一些疑惑 在此我记录下我对部分疑惑的理解 文章目录 1 pntpos函数 2 satpos
  • vcs+verdi,以及Makefile注意点

    Makefile 命令行之前是以Tab开头的不然会报错 gvim里面强制输入tab 使用Ctr v i 直接使用tab键可能输入不成功 注释用 下面是makefile内容 L8 可选debug debug pp debug pp 使能ucl
  • 树莓派通信协议——MQTT的安装及使用

    MQTT是一种基于TCP IP协议栈构建的异步通信协议 是一种轻量级的发布 订阅信息传输协议 基于topic订阅关系的发布和推送 在实践中可空间上 将消息发送者和接受者分离 可以再不可靠的网络环境中进行扩展 适用于设备硬件存储空间有限或网络