zoukankan      html  css  js  c++  java
  • python Mqtt 的安装及使用

    简介&安装

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛.可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

    MQTT 提供两个核心功能:

    • 三种级别的消息发布服务质量
    • 基于订阅/发布的消息转发服务。

    有三种消息发布服务质量:

    • "至多一次",消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。

    • "至少一次",确保消息到达,但消息重复可能会发生。

    • "只有一次",确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

    安装方式见官网介绍:http://mosquitto.org/download/
    Mac 安装方式非常简单
    brew install mosquitto
    在这里插入图片描述安装完成,可以见它的配置文件为地址在 /usr/local/etc/mosquitto/mosquitto.conf
    启动MQTT服务命令为
    mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf 即可开启服务
    如果提示 mosquitto 命令未找到,就添加一下环境变量

    MOSQUITTO_HOME=/usr/local/Cellar/mosquitto/1.6.9/sbin
    export MOSQUITTO_HOME
    export PATH=$PATH:$MOSQUITTO_HOME
    

    启动服务 brew services start mosquitto
    停止服务 brew services stop mosquitto

    发送消息命令
    mosquitto_pub -h 127.0.0.1 -p 1883 -t "mytopic" -m "222"
    表示向 主题为 mytopic 发送一条 内容为 222的消息

    添加订阅主题命令
    mosquitto_sub -h 127.0.0.1 -p 1883 -t "mytopic" -v
    表示向 mqtt中添加 一个主题为 mytopic 的监听
    在这里插入图片描述
    以上是命令的方式测试及验证相关功能,那么在python中代码如何调用呢

    Python 使用MQTT

    MqttClient.py

    import datetime
    import paho.mqtt.client as mqtt
    # 服务器地址
    strBroker = "localhost"
    # 通信端口
    port = 1883
    # 用户名
    username = 'username'
    # 密码
    password = 'password'
    # 订阅主题名
    topic = 'topic'
    
    def on_connect(mqttc, obj, rc):
        print("OnConnetc, rc: " + str(rc))
    
    def on_publish(mqttc, obj, mid):
        print("OnPublish, mid: " + str(mid))
    
    def on_subscribe(mqttc, obj, mid, granted_qos):
        print("Subscribed: " + str(mid) + " " + str(granted_qos))
    
    def on_log(mqttc, obj, level, string):
        print("Log:" + string)
    
    def on_message(mqttc, obj, msg):
        curtime = datetime.datetime.now()
        strcurtime = curtime.strftime("%Y-%m-%d %H:%M:%S")
        print(strcurtime + ": " + msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
        on_exec(str(msg.payload))
    
    def on_exec(strcmd):
        print
        "Exec:", strcmd
    # =====================================================
    if __name__ == '__main__':
        mqttc = mqtt.Client("test")
        mqttc.on_message = on_message
        mqttc.on_connect = on_connect
        mqttc.on_publish = on_publish
        mqttc.on_subscribe = on_subscribe
        mqttc.on_log = on_log
    
        # 设置账号密码
        # mqttc.username_pw_set(username, password=password)
    
        mqttc.connect(strBroker, port, 60)
        mqttc.subscribe(topic, 0)
        mqttc.loop_forever()
    

    MqttServer.py

    import sys
    import datetime
    import socket, sys
    import paho.mqtt.publish as publish
    
    '''
    发送消息
    '''
    def transmitMQTT(strMsg):
        strMqttBroker = "localhost"
        strMqttTopic = "topic"
        publish.single(strMqttTopic, strMsg, hostname=strMqttBroker)
    
    if __name__ == '__main__':
        msg = "Hello,MQTT 2020!"
        transmitMQTT("msg")
        print("Send msg = [", msg, "] ok.")
    

    ps :如果Homebrew 更新太慢,可以替换Homebrew 源,具体参见这个文章

  • 相关阅读:
    Redis 主从复制与哨兵
    前端面试中让你困惑的闭包、原型、原型链究竟是什么?
    Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略[转]
    nodejs 制作项目目录树代码
    nprogress页面加载进度条
    koa2 从入门到进阶之路 (一)
    原生js 封装好了的ajax 带钩子版本 可封装成对象
    JS
    Javascript面向对象编程(三):非构造函数的继承
    Java 内部类
  • 原文地址:https://www.cnblogs.com/luoman/p/12701316.html
Copyright © 2011-2022 走看看