物联网之MQTT

news2024/9/22 8:30:30

一,MQTT 及其在物联网中的应用

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,设计用于低带宽、延迟高、不稳定的网络环境,特别适合物联网(IoT)应用。它采用了发布/订阅(Pub/Sub)模型,以简化设备之间的消息交换,是物联网领域广泛采用的通信协议之一。

MQTT 的核心概念:

  1. Broker(消息代理):MQTT Broker 是 MQTT 通信的核心,负责接收、存储并分发消息。所有客户端通过 Broker 进行通信,客户端之间不会直接相互通信。
  2. Publisher(发布者):客户端可以作为发布者,向某个主题(Topic)发布消息。
  3. Subscriber(订阅者):客户端可以订阅一个或多个主题,Broker 会将对应主题的消息推送给订阅者。
  4. Topic(主题):消息通过主题组织,Publisher 发布消息时会指定主题,Subscriber 订阅相应主题来接收消息。
  5. QoS(服务质量):MQTT 提供三种消息传递服务质量:
    QoS 0:消息最多传递一次,不保证消息会被成功接收。
    QoS 1:消息至少传递一次,保证消息至少会被接收到一次。
    QoS 2:消息传递一次且仅一次,保证消息不会重复或丢失。

MQTT 专为物联网(IoT)设备和低带宽、高延迟或不可靠的网络设计。它的主要特点包括:

  • 轻量级: 协议简单,消息开销小,适合资源受限的设备。
  • 发布/订阅模式: 允许一对多的消息分发和应用程序解耦。
  • 可靠性: 提供三种服务质量级别(QoS),确保消息传递。
  • 安全性: 支持TLS加密和用户名/密码认证。
  • 保留消息: 可以存储最后一条消息,新订阅者可立即获得最新状态。

由于其轻量级的特性,MQTT 广泛应用于物联网中,适用于以下场景:

  • 远程监控与管理:通过 MQTT 协议,物联网设备(如传感器、智能家居设备等)可以定期向服务器上传数据,实现远程监控。服务器也可以通过 MQTT 向设备发送控制命令,进行远程管理。
  • 实时数据传输:MQTT 支持低延迟的消息传输,适合需要实时数据更新的场景,如工业自动化、智能电网、车联网等。
  • 低功耗设备通信:由于 MQTT 协议的低带宽和低开销,适合电池供电的物联网设备,通过节省功耗延长设备的使用寿命。
  • 智能家居:MQTT 协议广泛应用于智能家居系统中,例如控制灯光、恒温器、安防设备等,用户可以通过手机或其他终端远程控制家中的设备。
  • 车联网(V2X):在车联网中,MQTT 可以用于车辆与后台服务器之间的数据传输,如状态监控、远程控制、紧急事件处理等。

在典型的物联网架构中,MQTT 作为一种协议桥接了物联网设备与云平台之间的数据传输,架构通常包括以下主要部分:

  • 物联网设备(IoT Devices):如传感器、智能家居设备等,设备通过 MQTT 协议将数据发布到 MQTT Broker,也可以订阅主题接收命令。
  • MQTT Broker:位于物联网系统的核心位置,负责管理客户端的连接和消息的传输。所有设备和服务器的通信都通过 Broker 进行,Broker 根据主题分发消息。
  • 云平台(Cloud Platform):云平台通常订阅设备的数据主题,接收到设备上传的数据进行存储和处理。云平台也可以通过 Broker 向设备发布控制命令。
  • 用户终端(User Interface):通过手机应用、网页等形式,用户可以远程查看设备状态和数据,并发送控制命令,控制物联网设备的运行。
         +--------------------+         +--------------------+
         |                    |         |                    |
         |  User Interface    |         |    Cloud Platform  |
         |      (Mobile)      |         |(Web App, Analytics)|
         +--------------------+         +--------------------+
                   ^                                ^
                   |                                |
                   |        Subscribe/Publish       |
                   |                                |
                   v                                v
         +----------------------------------------------+
         |               MQTT Broker                    |
         |    (Mosquitto, EMQX, HiveMQ, etc.)           |
         +----------------------------------------------+
                   ^                                ^
                   |                                |
            Publish|                                |Subscribe
                   |                                |
                   v                                v
       +--------------------+              +--------------------+
       |  IoT Device 1       |              |  IoT Device 2       |
       | (Sensors, Actuators)|              | (Sensors, Actuators)|
       +--------------------+              +--------------------+
  1. 物联网设备(如 IoT Device 1 和 IoT Device 2)通过 MQTT 协议连接到 Broker,并且分别发布数据或订阅控制命令的主题。
  2. MQTT Broker 是中心节点,负责接收物联网设备发布的消息,并将消息推送给订阅者(如云平台或用户终端)。
  3. 云平台 订阅设备的数据,并通过处理这些数据实现监控、分析或控制操作。云平台也可以通过发布控制命令,控制物联网设备的行为。
  4. 用户终端(如移动应用或 Web 界面)允许用户查看设备的状态和数据,并发送控制命令到云平台,云平台再通过 MQTT Broker 传递给相应的物联网设备。

二,在 Windows 10 中安装与测试 MQTT broker

  1. 下载 Mosquitto:
    - 访问 https://mosquitto.org/download/
    - 下载最新版本的 Windows 安装程序 (64-bit)

  2. 安装 Mosquitto:
    - 运行下载的安装程序
    - 按照安装向导的提示进行操作

  3. 添加 添加 Mosquitto 安装路径到系统路径。

  4. 配置 Mosquitto:
    - 打开记事本,以管理员身份运行
    - 打开安装路径的文件: mosquitto.conf
    - 添加或修改以下行:

     listener 1883 # MQTT默认端口
     allow_anonymous true # 允许匿名连接(仅用于测试)
     persistence true # 开启持久化,重启后保留消息
     persistence_location G:\mosquitto\data # 持久化文件存储路径
    
  5. 启动 Mosquitto 服务:

    • 打开命令提示符(以管理员身份运行)
    • 输入以下命令:
       net start mosquitto
      
  6. 设置 Mosquitto 为自动启动:
    - 打开 “Services” (服务)
    - 找到 “Mosquitto Broker” 服务
    - 右击并选择 “Properties”
    - 将 “Startup type” 设置为 “Automatic”
    - 点击 “Apply” 然后 “OK”

  7. 测试 Mosquitto:
    - 打开两个命令提示符窗口
    - 在第一个窗口中,输入订阅命令: mosquitto_sub -t test/topic
    - 在第二个窗口中,输入发布命令: mosquitto_pub -t test/topic -m “Hello MQTT”
    - 如果在第一个窗口中看到 “Hello MQTT”,则说明 Mosquitto 运行正常

  8. 安全配置(生产环境)——启用用户认证:
    - 添加用户: mosquitto_passwd -c G:\mosquitto\passwd username
    - 在配置文件中启用认证: password_file G:\mosquitto\password.txt

  9. 监控和日志
    - 查看Mosquitto日志文件: G:\mosquitto\log\mosquitto.log
    - 使用工具如Prometheus+Grafana对Mosquitto进行监控

三,物联网设备通过 MQTT 发布与订阅数据

(一)模拟

由于手边暂时没有设备,这里就用python写一个程序来模拟。

1,首先开一个命令行窗口启动 MQTT:

G:\mosquitto>mosquitto -v
1725282189: mosquitto version 2.0.18 starting
1725282189: Using default config.
1725282189: Starting in local only mode. Connections will only be possible from clients running on this machine.
1725282189: Create a configuration file which defines a listener to allow remote access.
1725282189: For more details see https://mosquitto.org/documentation/authentication-methods/
1725282189: Opening ipv4 listen socket on port 1883.
1725282189: Opening ipv6 listen socket on port 1883.
1725282189: mosquitto version 2.0.18 running
  • 此命令会启动 Mosquitto 并以详细模式输出日志。

2,编写模拟物联网设备的 Python 客户端。
用 paho-mqtt Python 库,它是一个流行的 MQTT 客户端库,可以方便地发布和订阅消息。

import json
import random
import time

import paho.mqtt.client as mqtt

# MQTT Broker 的地址和端口
broker_address = "localhost"  # 本地服务器
broker_port = 1883

# 设备 ID
device_id = "device_001"
data_topic = f"devices/{device_id}/data"
control_topic = f"devices/{device_id}/control"

# MQTT 客户端
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1, device_id)


# 连接回调函数
def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")
    # 连接成功后,订阅控制命令主题
    client.subscribe(control_topic)


# 消息回调函数
def on_message(client, userdata, msg):
    print(f"Message received from {msg.topic}: {msg.payload.decode()}")


# 连接 MQTT 服务器
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker_address, broker_port, 60)

# 启动 MQTT 客户端的网络循环
client.loop_start()

# 模拟设备定期发送数据
try:
    while True:
        # 模拟传感器数据
        sensor_data = {
            "temperature": round(random.uniform(20.0, 30.0), 2),
            "humidity": round(random.uniform(30.0, 70.0), 2),
            "timestamp": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        }

        # 将数据发布到 data_topic
        client.publish(data_topic, json.dumps(sensor_data))
        print(f"Published data: {sensor_data}")

        # 每隔 5 秒发送一次数据
        time.sleep(5)

except KeyboardInterrupt:
    print("Simulation stopped.")

# 停止 MQTT 客户端
client.loop_stop()
client.disconnect()
  • 运行 Python 脚本,模拟设备会定期向 devices/device_001/data 主题发布传感器数据

3,测试设备与 MQTT Broker 的通信。
开一个命令行窗口监听设备数据:

mosquitto_sub -h localhost -t "devices/device_001/data"

在这里插入图片描述
开一个命令行窗口发送控制命令:

mosquitto_pub -h localhost -t "devices/device_001/control" -m '{"command": "turn_on", "target": "fan"}'

在这里插入图片描述

(二)使用 ESP8266 + DHT11 + MicroPython

使用ESP8266外接一个DHT11温湿度传感器,用MicroPython编程,让ESP8266采集温湿度数据,并通过MQTT发送到部署在电脑上的MQTTbroker。

1,硬件:
- ESP8266 板子(如 NodeMCU 或 Wemos D1 Mini)
- DHT11 温湿度传感器

2,接线:
- DHT11 VCC → ESP8266 3.3V
- DHT11 GND → ESP8266 GND
- DHT11 数据引脚 → ESP8266 GPIO 引脚(如 GPIO 2/D4)

3,下载并将 MicroPython 固件刷入 ESP8266 板子上:

  • 安装 esptool.py:pip install esptool
  • 刷入固件:
    esptool.py --port /dev/ttyUSB0 erase_flash
    esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-<version>.bin
    

4,连接到 ESP8266:
通过串口工具(如 PuTTY 或 Thonny),连接到 ESP8266,使用 REPL 进行调试和执行 MicroPython 代码。

5,安装 MQTT 和 DHT11 驱动:
MicroPython 中已经有内置的 umqtt 和 dht 模块,用于 MQTT 通信和 DHT11 传感器数据采集。

6,编写 MicroPython 代码:

import network
import time
import dht
import machine
from umqtt.simple import MQTTClient

# Wi-Fi 配置
SSID = 'your_ssid'
PASSWORD = 'your_password'

# MQTT Broker 配置
MQTT_BROKER = '192.168.1.100'  # 电脑上的 MQTT Broker IP
MQTT_TOPIC = 'home/temperature'
CLIENT_ID = 'esp8266_dht11'

# 连接 Wi-Fi
def connect_wifi(ssid, password):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('Connecting to network...')
        wlan.connect(ssid, password)
        while not wlan.isconnected():
            pass
    print('Network connected:', wlan.ifconfig())

# 初始化 DHT11 传感器
dht_pin = machine.Pin(2)  # DHT11 数据引脚接到 GPIO2/D4
sensor = dht.DHT11(dht_pin)

# 连接 Wi-Fi
connect_wifi(SSID, PASSWORD)

# 连接 MQTT
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.connect()

try:
    while True:
        # 采集数据
        sensor.measure()
        temperature = sensor.temperature()
        humidity = sensor.humidity()
        
        # 创建消息
        msg = f'{{"temperature": {temperature}, "humidity": {humidity}}}'
        print('Publishing:', msg)
        
        # 发布到 MQTT 服务器:消息会发布到 home/temperature 主题上。
        client.publish(MQTT_TOPIC, msg)
        
        # 每隔10秒发送一次数据
        time.sleep(10)
        
except KeyboardInterrupt:
    print("Stopping...")
    client.disconnect()
  • 连接到 Wi-Fi。
  • 使用 DHT11 传感器采集温湿度数据。
  • 将数据通过 MQTT 协议发送到本地的 MQTT Broker。

四,云平台通过 MQTT 订阅数据与发布命令

云平台要做的就是:

  • 接收 MQTT 消息:Django 应用需要订阅 MQTT Broker 的温度数据。
  • 分析数据并作出决策:当接收到的温度数据超过 50°C 时,发送命令打开风扇,否则关闭风扇。
  • 通过 MQTT 发送控制命令:使用 Django 应用中的 MQTT 客户端发送控制命令(如 fan/on 或 fan/off)到 MQTT Broker,控制风扇。

1,接收温度数据并分析。
创建一个管理命令(management command)来启动 MQTT 客户端并订阅主题。

# myapp/
#  management/
#    commands/
#      mqtt_subscriber.py


import json
import paho.mqtt.client as mqtt
from django.core.management.base import BaseCommand

MQTT_BROKER = 'localhost'  # MQTT Broker 地址
TEMPERATURE_TOPIC = 'home/temperature'  # 订阅的温度主题
FAN_CONTROL_TOPIC = 'home/fan/control'  # 风扇控制命令主题
CLIENT_ID = 'django_subscriber'

# 温度阈值
TEMP_THRESHOLD = 50  # 摄氏度

# 定义 MQTT 客户端回调函数
def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")
    client.subscribe(TEMPERATURE_TOPIC)

def on_message(client, userdata, msg):
    print(f"Message received from {msg.topic}: {msg.payload.decode()}")
    try:
        # 解析消息并提取温度数据
        data = json.loads(msg.payload.decode())
        temperature = data.get('temperature')

        # 检查温度是否超过阈值,并发送控制命令
        if temperature is not None:
            if temperature > TEMP_THRESHOLD:
                print("Temperature is above 50°C. Turning on the fan.")
                client.publish(FAN_CONTROL_TOPIC, 'on')
            else:
                print("Temperature is below 50°C. Turning off the fan.")
                client.publish(FAN_CONTROL_TOPIC, 'off')
        else:
            print("No temperature data found.")
    except Exception as e:
        print(f"Error processing message: {e}")

class Command(BaseCommand):
    help = 'Start MQTT subscriber and control fan based on temperature'

    def handle(self, *args, **kwargs):
        # 创建 MQTT 客户端并设置回调
        client = mqtt.Client(CLIENT_ID)
        client.on_connect = on_connect
        client.on_message = on_message

        # 连接 MQTT Broker
        client.connect(MQTT_BROKER, 1883, 60)

        # 开始 MQTT 客户端的循环
        try:
            client.loop_forever()
        except KeyboardInterrupt:
            client.disconnect()
            print("MQTT client disconnected.")

在项目根目录下运行以下命令启动 MQTT 订阅服务:

python manage.py mqtt_subscriber

2,ESP8266 接收风扇控制命令并控制风扇。
在 ESP8266 上编写代码,订阅 home/fan/control 主题,并根据接收到的消息来控制电机(模拟风扇)。

import machine
import network
import time
from umqtt.simple import MQTTClient

# Wi-Fi 配置
SSID = 'your_ssid'
PASSWORD = 'your_password'

# MQTT 配置
MQTT_BROKER = '192.168.1.100'  # 电脑上的 MQTT Broker IP
FAN_CONTROL_TOPIC = 'home/fan/control'
CLIENT_ID = 'esp8266_fan_controller'

# 定义 GPIO 引脚来控制电机(风扇)
fan_pin = machine.Pin(5, machine.Pin.OUT)  # GPIO5/D1

# 连接 Wi-Fi
def connect_wifi(ssid, password):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('Connecting to network...')
        wlan.connect(ssid, password)
        while not wlan.isconnected():
            pass
    print('Network connected:', wlan.ifconfig())

# MQTT 回调函数
def on_message(topic, msg):
    print(f"Message received on topic {topic}: {msg}")
    if msg == b'on':
        fan_pin.on()  # 打开风扇
        print("Fan turned on")
    elif msg == b'off':
        fan_pin.off()  # 关闭风扇
        print("Fan turned off")

# 连接 Wi-Fi
connect_wifi(SSID, PASSWORD)

# 连接 MQTT Broker 并订阅主题
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.set_callback(on_message)
client.connect()
client.subscribe(FAN_CONTROL_TOPIC)

try:
    while True:
        client.check_msg()  # 检查是否有新消息
        time.sleep(1)
        
except KeyboardInterrupt:
    print("Disconnecting from broker.")
    client.disconnect()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

案例 | 稳石机器人赋能日化企业内部物流提质增效

近年来&#xff0c;日化产业高速发展&#xff0c;以“清洁类”及“化妆品类”为主的日化品在人们生活中扮演着不可或缺的角色。然而在发展过程中&#xff0c;诸多难点也开始显头&#xff0c;招工难用工贵、生产速度受到掣肘等难题&#xff0c;都对日化企业可持续发展构成挑战。…

智慧安防EasyCVR视频监控汇聚管理平台云端录像时间轴拖动不跳转,是什么原因?

视频汇聚EasyCVR视频智能管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力&#xff0c;为各行各业的视频监控需求提供了优秀的解决方案。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、…

国产SaaS的挑战与未来:探索用户增长的新路径

在数字化转型的浪潮中&#xff0c;SaaS&#xff08;软件即服务&#xff09;行业扮演着至关重要的角色&#xff0c;为企业提供了灵活、高效的数字化解决方案。然而&#xff0c;国产SaaS行业在快速发展的同时&#xff0c;也面临着诸多挑战&#xff0c;包括客户定制化需求高、市场…

上门家政系统源码开发详解

引言 随着现代生活节奏的加快&#xff0c;越来越多的家庭选择聘请家政服务人员来解决日常生活中诸如清洁、烹饪等琐事。面对这一市场需求&#xff0c;开发一个高效的上门家政服务系统显得尤为重要。本文旨在探讨如何构建这样一个系统&#xff0c;并分享一些开发过程中需要注意的…

五、代理模式

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代理以控制对这个对象的访问。代理对象通常会对真实对象的请求进行一些处理&#xff08;例如延迟初始化、访问控制、日志记录等&#xff09;&#xff0c;它能够在不改变目标…

K8s搭建过程,新手闭眼入!!!超详细教程

一、k8s搭建harbor仓库 前提&#xff1a;在另一台主机已搭建好harbor私人仓库&#xff0c;之前博客中有详细记录 环境&#xff1a;准备三台主机&#xff0c;一台master&#xff0c;一台node1&#xff0c;一台noed2 1.本地解析 将harbor镜像仓库所在的主机的域名写在所有主机…

Redis String 类型详解:操作命令、底层编码与使用案例

文章目录 一 . 常见命令1.1 set1.2 get1.3 mset、mget1.4 setnx、setex、psetex1.5 incr、incrby1.6 decr、decrby、incrbyfloat1.7 append1.8 getrange1.9 setrange1.10 strlen小结 二 . string 的编码方式三 . 应用场景3.1 缓存3.2 计数器3.3 共享会话3.4 手机验证码 Hello ,…

# 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket -- 2

利刃出鞘_Tomcat 核心原理解析&#xff08;十一&#xff09;-- Tomcat 附加功能 WebSocket – 2 一、Tomcat专题 - WebSocket - 案例 - 登录功能 1、在项目 dzs168_chat_room 中&#xff0c;导入 tomcat 项目依赖&#xff08; dzs168_chat_room/web/lib/ &#xff09; idea -…

花生壳的登录及获取二级域名

1、下载花生壳客户端 2、安装完毕 3、扫码登录 4、微信登录花生壳管理后台 5、二级域名的注册 已经帮我们自动生成了一个免费的二级域名。 我们可以用这个二级域名快速的建立网站了。

[YM]课设-C#-WebApi-Vue-员工管理系统 (七)员工统计表

前端&#xff1a; 注&#xff1a;这里主要解释下echarts组件&#xff0c;需要一定的Vue基础 emmmmm 明显能看到上面写“对不起暂未开发” 是的 这个是博主自己加上去的 but 这个统计表也是类似于Element UI的小组件 Element&#xff1a;Element - 网站快速成型工具 &am…

Quartz.Net_依赖注入

简述 有时会遇到需要在IJob实现类中依赖注入其他类或接口的情况&#xff0c;但Quartz的默认JobFactory并不能识别具有有参构造函数的IJob实现类&#xff0c;也就无法进行依赖注入 需要被依赖注入的类&#xff1a; public class TestClass {public TestClass(Type jobType, s…

Python 从入门到实战5(列表的其它操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 之前的文章我们通过举例学习了python 中列表的简单操作&#xff0…

虚拟机输入ip addr不显示IP地址

本机配置 Window10 VMware Workstation 17 CentOS 7 虚拟机输入ip addr查询不到ip地址&#xff08;下图&#xff09; 解决办法&#xff1a; 查看配置文件&#xff0c;输入下面命令(用于编辑文件) vi /etc/sysconfig/network-scripts/ifcfg-ens33进入配置配置文件&#xf…

交叉编译 gmp

文章目录 交叉编译 gmp1 概述2 源码下载2.1 官网下载2.2 使用 apt source 下载 3 交叉编译4 关于 DESTDIR 的说明 交叉编译 gmp 1 概述 GMP (GNU Multiple Precision Arithmetic Library) 是一个用于任意精度计算设计的数学库&#xff0c;它的主要目标应用是密码学应用和研究…

ARP协议和DNS的工作原理

ARP协议 ARP协议的工作原理&#xff1a; 首先主机向自己的网络广播发送一个arp请求&#xff0c;请求报文包括目的端的ip地址和目的端的以太网地址。网络上的其他机器收到这个请求&#xff0c;但只有被请求的才会回应一个应答报文&#xff0c;报文中有自己的物理地址。 arp维护了…

【python因果推断库1】协方差分析(ANCOVA)用于处理前/后非等效组设计

目录 生成合成数据 分析 这是一个基于合成数据的初步示例。希望不久之后能用真实研究的数据进行更新。 在只有一次预处理测量和一次后处理测量的情况下&#xff0c;我们可以使用类似于协方差分析(ANCOVA)的方法来分析非等效组设计(NEGD)实验的数据。基本模型是&#xff1a; i指…

Vue(五). 安装脚手架及一些基本配置

文章目录 vue脚手架前言1. 安装脚手架1. 安装nvm2. 使用nvm安装node3. 配置node的全局路径和缓存路径4. 配置npm默认镜像源5. 安装脚手架全局路径和缓存测试 2. 文件结构及项目配置2.1 文件结构2.2 项目基本配置补充. vue项目安装依赖的一个问题 vue脚手架前言 脚手架也叫Vue …

敏捷需求管理,推动敏捷项目成功——Leangoo领歌敏捷工具

在敏捷项目管理中&#xff0c;需求管理是决定项目成功的关键环节。准确捕捉和高效管理需求&#xff0c;不仅能避免项目偏航&#xff0c;还能确保最终交付的产品与客户预期高度契合。Leangoo领歌敏捷工具&#xff0c;正是为此而生&#xff0c;助力团队轻松实现需求管理的每一步。…

vue中使用原生的video播放flv和mp4格式的视频

安装 npm i flv.js html <video v-if"videoId"controls id"videoElement"preload"metadata"controlslist"nodownload noremoteplayback" ><source :type"video/${videoType}" />您的浏览器不支持HTML5视频播…

Ansible一键安装Harbor服务

环境说明 企业内网环境,使用docker-compose的方式安装Harbor服务,需要先安装docker、docker-compose两个服务,将以二进制的方式安装docker和docker-compose,以适配各种安装环境。 docker版本:20.10.21,建议使用20.10以上的版本,低版本的会出现安装异常;Docker-compose版…