当前位置: 首页 > news >正文

重温Mqtt

几点说明

MQTT over TCP:
监听端口:1883
用于传统的 MQTT 客户端,通过 TCP 进行通信。
配置了基本的代理参数,如超时和缓冲区大小。

MQTT over SSL/TLS:
监听端口:8883
用于需要加密通信的 MQTT 客户端。
配置了 SSL 证书和私钥路径。

MQTT over WebSocket:
监听端口:80
用于通过 WebSocket 进行通信的 MQTT 客户端,适用于需要穿越防火墙或在浏览器中使用的场景。
配置了 WebSocket 协议的升级头。

MQTT over Secure WebSocket (WSS):
监听端口:443
用于通过加密的 WebSocket 进行通信的 MQTT 客户端。
配置了 SSL 证书和私钥路径,并启用了加密协议。

安装mosquitto

  • 结合nginx使用
version: '3'

services:
  my-python-app:
    image: helloproj_my-python-app
    expose:
      - "5000"  # 暴露给同一网络中的其他容器
    networks:
      - app-network

  nginx:
    image: nginx:latest
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf  # 挂载配置文件
      - ./key:/etc/nginx/ssl  # 挂载 SSL 证书
    ports:
      - "80:80"  # 将容器的80端口映射到主机的80端口
      - "443:443"  # HTTPS
      - "1883:1883"
    depends_on:
      - my-python-app  # 确保 Flask 容器启动后再启动 Nginx
      - mosquitto
    networks:
      - app-network

  mosquitto:
    image: eclipse-mosquitto:latest
    container_name: mosquitto
    expose:
      - "1883"
    volumes:
      - ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log    
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

配置nginx

stream {
    upstream mqtt_backend {
        server mosquitto:1883;
    }

    server {
        listen 1883;
        proxy_pass mqtt_backend;
    }
}

编写代码

  • 订阅
import paho.mqtt.client as mqtt

# 收到消息时调用
def on_message(client, userdata, msg):
    print(f"Received message: {msg.payload.decode()} on topic: {msg.topic}")

# 连接成功时调用
def on_connect(client, userdata, flags, rc, properties=None):
    print(f"Connected with result code {rc}")
    # 订阅特定主题
    client.subscribe("test/topic")

# 创建 MQTT 客户端实例
client = mqtt.Client()

# 设置回调函数
client.on_connect = on_connect
client.on_message = on_message

# 连接到 MQTT Broker
client.connect("x.x.x.x", 1883, 60)

# 开始网络循环
client.loop_forever()
  • 发布者
import paho.mqtt.client as mqtt

# 连接成功时调用
def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")
    # 发布消息
    client.publish("test/topic", "Hello MQTT!")

# 创建 MQTT 客户端实例
client = mqtt.Client()
client.on_connect = on_connect

# 连接到 MQTT Broker
client.connect("x.x.x.x", 1883, 60)

# 开始网络循环,处理所有网络流量
client.loop_start()

# 发布频率(秒)
import time
time.sleep(1)

# 停止网络循环
client.loop_stop()

增加权限控制

  • 修改mosquitto.conf
persistence true
persistence_location /mosquitto/data
log_dest file /mosquitto/log/mosquitto.log
# 增加以下两个文件
password_file /mosquitto/config/pwdfile
acl_file /mosquitto/config/aclfile

# 修改这里
allow_anonymous false
listener 1883
  • 进到容器内部添加password_file和acl_file
docker exec -it mosquitto /bin/sh

touch pwdfile
mosquitto_passwd -b pwdfile chenph 123456

chmod 0700 pwdfile


#### aclfile文件 ####
user chenph
topic read topic/#
topic write topic/#

chmod 0700 aclfile

# 重启一下
docker-compose restart mosquitto

# docker-compose.yml 也调整一下,重构一下容器
volumes:
    - ./mosquitto/config:/mosquitto/config  # 改成这样
    - ./mosquitto/data:/mosquitto/data
    - ./mosquitto/log:/mosquitto/log
  • 代码调整
# 在连接之前,增加这个代码,成功的话会返回code 0,权限异常的话会返回5
client.username_pw_set("chenph", "123456")

# 别忘了把主题名字改了,在acl中配置了只允许topic/#
client.publish("topic/test", "Hello MQTT!")

相关文章:

  • Java试题
  • 关于金碟K3,禁用和启用需要流程审批后执行
  • 利用GitHub Pages快速部署前端框架静态网页
  • Chrome(Google) 浏览器安装Vue2、Vue3 Devtools插件方法
  • 工作记录 2017-03-07
  • java泛型的协变、逆变和不变
  • 3、pytest实现参数化
  • 架构设计-springboot和springcloud的使用场景与区别
  • 【数组】螺旋矩阵
  • 图解AI对话系统架构:一次讲透核心技术
  • 【读点论文】Object Storage on CRAQ
  • 2025最新-智慧小区物业管理系统
  • Excel多级联动下拉菜单的自动化设置(使用Python中的openpyxl模块)
  • 汤臣倍健业绩倒车:2024年利润下滑超六成,三大核心品牌销量失守
  • acwing112:三种排序方法解决组合排序问题
  • 【杂记三】Cython加速模块cython_nms未编译
  • 无人机数据处理系统设计要点与难点!
  • Linux输入系统应用编程
  • 短信验证码安全需求设计
  • 游戏引擎学习第182天
  • 怎样做网站管理/网络营销中心
  • 15 企业网站优化方案有哪些内容/seo职位具体做什么
  • 中山网站制作专业/百度人工服务热线电话
  • 建站公司网站建设/英文网站seo
  • wordpress企业站模板下载/新站seo优化快速上排名
  • 做网站导航按钮怎么猛/引擎搜索大全