• 物联网AI MicroPython学习之语法 umqtt客户端


    学物联网,来万物简单IoT物联网!!在这里插入图片描述

    umqtt 介绍

    • 模块功能:
      MQTT客户端功能 - 连线、断线、发布消息、订阅主题、KeepAlive等功能。

    MQTT协议采用订阅者/发布者模式,协议中定义了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性。 MQTT协议设计了QoS0、QoS1和QoS2 3个QoS的级别。

    • QoS0 - 最多传输一次,如果当时客户端不可用,则会丢失该消息,适用于不重要的消息传输
    • QoS1 - 最少传输一次, 适用于对可靠性有要求,但对重复度没有要求的消息传输
    • QoS2 - 只传输一次, 适用于有可靠性要求,也不允许发生重复的消息传输

    关于MQTT协议详细的介绍参考

    接口说明

    MQTTClient - 构建MQTT连接对象

    • 函数原型:MQTTClient(client_id, server, port=0, user=None, password=None, keepalive=0, ssl=False, ssl_params={},reconn=True,version=4)
    • 参数说明:
    参数类型必选参数?说明
    client_idstringY客户端ID,客户端唯一标识
    serverstringY服务器地址,IP地址或域名
    portintN服务器端口,默认是1883
    userstringN登录服务器上所用用户名
    passwordstringN用户密码
    keepaliveintNMQTT客户端keepalive超时时间,单位:秒。 默认为0,范围:[60, 1200]
    sslboolN是否使能 SSL/TLS
    ssl_paramsstringNSSL/TLS连线配置参数
    reconnboolN是否允许MQTT库自动重连,默认值:True,开启自动重连
    versionintN要使用的mqtt版本,version=3代表使用MQTTv3.1,默认version=4,使用MQTTv3.1.1
    • 返回值:
      构建的MQTT客户端对象。

    MQTTClient.set_callback - 设置MQTT消息回调函数

    • 函数原型:MQTTClient.set_callback(callback)
    • 参数说明:
    参数类型必选参数?说明
    callback函数指针在收到服务端发送的MQTT消息时候由MQTT库回调用户设置的callback函数

    callback函数说明

    • 函数原型:function(topic, message)
    • 函数参数:
    参数类型必选参数?说明
    topicstring该消息所属的Topic
    messagestringMQTT Broker发布的消息内容
    • 返回值:

    MQTTClient.set_last_will - 设置要发送给服务器的遗嘱

    • 函数原型:MQTTClient.set_last_will(topic, message, retain=False, qos=0)
    • 参数说明:
    参数类型必选参数?说明
    topicstring遗嘱消息的目标主题
    messagestring遗嘱消息的内容
    retainboolBroker是否一直保留该消息,默认False
    qosint消息的QoS类型,有效类型:0或1,默认为0
    • 返回值:

    MQTTClient.connect - 连接服务器

    • 函数原型:MQTTClient.connect(clean_session=True)
    • 参数说明:
    参数类型必选参数?说明
    clean_sessionbool客户端类型标志,默认为False !
    如果为True,MQTT Broker会在客户端断开连接时删除该客户端相关的所有信息;
    如果为False,客户端断开连接时,订阅信息和排队消息都会被MQTT Broker保留。
    • 返回值:
      成功返回0,失败则抛出异常

    MQTTClient.ping - 发送ping包

    • 函数原型:MQTTClient.ping()
    • 返回值:

    当keepalive不为0且在一定时间内核MQTT Broker没有消息交互,MQTT会主动向服务器发送ping包,检测和MQTT Broker的连连线状态。

    MQTTClient.publish - 发布消息

    • 函数原型:MQTTClient.publish(topic, msg, retain=False, qos=0)
    • 参数说明:
    参数类型必选参数?说明
    topicstring遗嘱消息的目标主题
    messagestring遗嘱消息的内容
    retainboolBroker是否一直保留该消息,默认False!
    MQTT服务器只会为每一个Topic保存, MQTT Client发送的最后一条retain为True的消息。
    qosint消息的QoS类型,有效类型:0或1,默认为0
    • 返回值:

    MQTTClient.subscribe - 订阅MQTT主题

    • 函数原型:MQTTClient.subscribe(topic, qos)
    • 参数说明:
    参数类型必选参数?说明
    topicstring遗嘱消息的目标主题
    qosint消息的QoS类型,有效类型:0或1,默认为0
    • 返回值:

    MQTTClient.wait_msg - 等待服务器的消息

    • 函数原型:MQTTClient.wait_msg()
    • 参数说明:
    • 返回值:

    服务器向已注册主题发送的消息将会被发送到通过set_callback设置的回调函数;其它类型的消息则在MQTT模块内部处理。

    MQTTClient.check_msg - 检查服务器是否有待处理消息

    • 函数原型:MQTTClient.check_msg()
    • 参数说明:
    • 返回值:

    check_msg和wait_msg的差别在于,check_msg是非阻塞模式,调用之后立即返回;而wait_msg为阻塞模式,直到有消息才返回。

    MQTTClient.disconnect - 和服务器断开连接

    • 函数原型:MQTTClient.disconnect()
    • 参数说明:
    • 返回值 无
    
    # ESP32平台umqtt案例
    
    import utime
    from umqtt.simple import MQTTClient    # MQTT库
    import network                         # Wi-Fi功能所在库
    
    # Wi-Fi SSID和Password设置
    
    wifiSsid = "请填写您的路由器名称"
    wifiPassword = "请填写您的路由器密码"
    
    wlan = None          # 网络连接对象
    client = None        # MQTT客户端对象
    
    # 等待Wi-Fi成功连接到路由器
    def wait_for_wifi_connection():
        global wlan
        wifi_connected = False
    
        wlan = network.WLAN(network.STA_IF)    #创建WLAN对象,STA模式
        wifi_connected = wlan.isconnected()    # 获取Wi-Fi连接路由器的状态信息
        if not wifi_connected: 
            wlan.active(True)        #激活界面
            wlan.scan()              #扫描接入点
            #print("start to connect ", wifiSsid)
            wlan.connect(wifiSsid, wifiPassword)       # 连接到指定的路由器(路由器名称为wifiSsid, 密码为:wifiPassword)
    
        while True:
            wifi_connected = wlan.isconnected()    # 获取Wi-Fi连接路由器的状态信息
            if wifi_connected:                     # Wi-Fi连接成功则退出while循环
                break
            else:
                utime.sleep(0.5)
                print("wifi_connected:", wifi_connected)
    
        ifconfig = wlan.ifconfig()     #获取接口的IP/netmask/gw/DNS地址
        print(ifconfig)
        utime.sleep(0.5)
    
    # 处理来自MQTT Broker的MQTT消息
    def sub_cb(topic, msg):
        global client
        print("From Topic:", topic, " Message:", msg)           # 打印来自MQTT Broker的消息
        if topic == b'ETTTopic':                            # 如果来自名为“ETTTopic”的Topic,则发布消息给名为“ETTUser”的Topic
            client.publish("ETTUser", "Nice to meet you, ETT Python User")
    
        if topic == b'ETTUser':                                # 如果来自名为“HaaSUser”的Topic,则发布消息给名为“HaaSRegister”的Topic
            client.publish("ETTRegister", "Hi, ETT Python, I am coming")
    
    if __name__ == '__main__':
    
        wait_for_wifi_connection()                                    # 等待Wi-Fi连接成功
    
        client = MQTTClient("ETTPython", "broker-cn.emqx.io", 1883)  # 创建MQTT对象
    
        client.set_callback(sub_cb)                                   # 设置MQTT callback
        client.connect()                                              # 连接MQTT Broker
    
        client.subscribe("ETTRegister")                              # 订阅来自"ETTRegister"的消息
        client.subscribe("ETTUser")                                  # 订阅来自"ETTUser"的消息
    
        client.publish("ETTRegister", "Hi, ETT Python")             # 向"ETTRegister"发送消息
    
        while True:
            client.check_msg()                                        # 检查是否有来自MQTT Broker的消息
            utime.sleep(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 示例输出:
    ...
    wifi_connected: False
    wifi_connected: False
    wifi_connected: False
    ('192.168.0.118', '255.255.255.0', '192.168.0.1', '192.168.0.1')
    Topic: b'ETTRegister'  Message: b'Hi, ETT Python!'
    Topic: b'ETTUser'  Message: b'Nice to meet you, ETT Python User!'
    Topic: b'ETTRegister'  Message: b'Hi, ETT Python, I am coming!'
    Topic: b'ETTUser'  Message: b'Nice to meet you, ETT Python User!'
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    [Redis]-四种部署方式
    Java远程操作Linux服务器命令
    2023-09-12力扣每日一题
    命令模式(command)
    Stable Diffusion模型介绍
    【Android知识笔记】UI体系(五)
    MySql 数据库【数据库概述及数据准备】
    实现element 下拉选择分页加载
    Nginx安装与虚拟主机配置shell脚本
    洛谷 P1075 [NOIP2012 普及组] 质因数分解
  • 原文地址:https://blog.csdn.net/weixin_39363464/article/details/134404906