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

MQTT协议:IoT通信的轻量级选手

文章总结(帮你们节约时间)

  • MQTT协议是一种轻量级的发布/订阅通信协议。
  • MQTT通信包括连接建立、订阅、发布和断开等过程。
  • MQTT基于TCP/IP,其通信过程涉及多种控制包和数据包。
  • ESP32S3可以通过MQTT协议接收消息来控制IO9引脚上的LED。

想象一下,如果互联网是一个繁忙的城市,那么MQTT就像是一个高效的快递系统。而传统HTTP通信?那就是你不得不亲自上门取包裹的情况!MQTT(Message Queuing Telemetry Transport)是物联网世界的通信明星,它轻巧、灵活,特别适合资源受限的设备。这不就像是那种即使在拥挤的小巷里也能灵活穿梭的电动车吗?

MQTT是什么?

MQTT是一种基于发布/订阅模式的轻量级消息传输协议,专为低带宽、高延迟或不稳定网络环境设计。它最初由IBM开发,现已成为物联网领域的标准协议之一。

想象MQTT就像是一个神奇的广播站。你不需要直接联系想要交流的对象,只需对着广播站(MQTT服务器,也称为Broker)说:“我要订阅’天气频道’”。之后,任何发布到"天气频道"的信息,你都能收到!这种解耦的设计使得设备之间不需要知道彼此的存在,大大简化了网络拓扑。

MQTT的核心概念

主题(Topic)

MQTT的主题就像是邮件的地址系统,但更加灵活。主题由层级组成,用斜杠分隔,例如:home/livingroom/temperature

这种层级结构有什么妙处?你可以使用通配符订阅多个主题!例如,订阅home/#就能收到家中所有传感器的数据,而不用一个个地订阅。这不比传统的点对点通信方便多了吗?

QoS(服务质量)

MQTT提供三种服务质量级别:

  • QoS 0:最多一次,“发了就发了,管它收没收到”
  • QoS 1:至少一次,“我会一直发,直到收到确认”
  • QoS 2:正好一次,“我保证消息只送达一次,不多不少”

这就像是你发送一封重要邮件,QoS决定了你会不会追踪它、催促它、确认它是否送达。

MQTT通信过程详解

连接建立过程

想知道MQTT客户端和服务器之间的第一次"握手"是怎样的吗?请看下面的详细步骤:

  1. TCP连接建立:MQTT建立在TCP/IP协议之上,首先需要完成TCP三次握手:

    • 客户端发送SYN包(序列号=x)
    • 服务器回复SYN-ACK包(序列号=y,确认号=x+1)
    • 客户端发送ACK包(确认号=y+1)
  2. CONNECT包发送:TCP连接建立后,客户端发送CONNECT包,包含:

    • 客户端ID
    • 用户名和密码(如果需要认证)
    • 保持连接的时间间隔(Keep Alive)
    • 清除会话标志(Clean Session)
    • 遗嘱信息(Will Message,在客户端异常断开时发送的消息)
  3. CONNACK响应:服务器回复CONNACK包,告知连接是否成功,包含:

    • 连接返回码(0表示成功,其他值表示各种错误)
    • 会话状态标志(指示是否有上一个会话)

想象这个过程就像是你走进一个俱乐部,先向保安出示会员卡(TCP连接),然后向接待员登记你的信息(CONNECT),最后接待员确认你可以进入并告诉你你的会员状态(CONNACK)。

发布/订阅过程

  1. 订阅过程

    • 客户端发送SUBSCRIBE包,指定要订阅的主题和QoS级别
    • 服务器回复SUBACK包,确认订阅并返回授予的QoS级别
  2. 发布过程

    • 发布者发送PUBLISH包,包含主题、消息内容和QoS级别
    • 如果QoS > 0,则需要额外的确认包(PUBACK、PUBREC、PUBREL、PUBCOMP)
  3. QoS 1的消息流

    • 发布者→PUBLISH→服务器
    • 服务器→PUBACK→发布者
    • 服务器→PUBLISH→订阅者
    • 订阅者→PUBACK→服务器
  4. QoS 2的消息流

    • 发布者→PUBLISH→服务器
    • 服务器→PUBREC→发布者
    • 发布者→PUBREL→服务器
    • 服务器→PUBCOMP→发布者
    • 服务器→PUBLISH→订阅者
    • 订阅者→PUBREC→服务器
    • 服务器→PUBREL→订阅者
    • 订阅者→PUBCOMP→服务器

看到这些确认过程,是不是觉得QoS 2有点繁琐?但这正是为了保证消息"正好一次"传递的代价!就像快递公司为了确保贵重包裹安全送达,会要求你签名、拍照、确认收货一样。

保持连接与断开

  • PINGREQ/PINGRESP:客户端定期发送心跳包,服务器回应以保持连接活跃
  • DISCONNECT:客户端发送断开连接的请求,然后关闭TCP连接

这就像是你在图书馆学习,偶尔举手让管理员知道你还在(PING),最后向管理员示意你要离开(DISCONNECT)。

MQTT底层TCP数据包分析

当MQTT协议工作时,TCP层都发生了什么呢?让我们揭开这个神秘的面纱:

  1. TCP连接建立(三次握手):

    客户端 -> [SYN] -> 服务器
    客户端 <- [SYN, ACK] <- 服务器
    客户端 -> [ACK] -> 服务器
    
  2. MQTT CONNECT包

    TCP头部:源端口: 随机端口(如43251)目标端口: 1883(标准MQTT端口)序列号: x确认号: y标志: PSH, ACKMQTT数据:包类型: CONNECT (1)剩余长度: 可变协议名: "MQTT"协议级别: 4(MQTT v3.1.1)或5(MQTT v5.0)连接标志: 用户名、密码、遗嘱等标志位保持连接: 通常为60秒客户端标识符: 如"esp32_client_001"[可选]用户名、密码等
    
  3. MQTT PUBLISH包(QoS 1)

    TCP头部:源端口: 随机端口目标端口: 1883序列号: x+n确认号: y+m标志: PSH, ACKMQTT数据:包类型: PUBLISH (3)剩余长度: 可变主题长度: 2字节长度前缀主题: 如"home/livingroom/led"包ID: 仅当QoS>0时出现有效载荷: 如"ON"或"OFF"
    

看到这些细节,你是不是更能理解MQTT的工作原理了?这些看似复杂的数据包,本质上就是设备之间传递的"便条",告诉对方"我想做什么"或"我已经做了什么"。

ESP32S3使用MQTT控制LED实践

是时候将理论付诸实践了!让我们使用ESP32S3通过MQTT协议来控制一个连接到IO9的LED。

硬件准备

  • ESP32S3开发板
  • LED(连接到IO9)
  • 220欧姆电阻
  • 连接线

软件准备

  • 安装Arduino IDE
  • 安装ESP32S3开发板支持
  • 安装PubSubClient库(用于MQTT通信)

代码实现

#include <WiFi.h>
#include <PubSubClient.h>// WiFi配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";// MQTT配置
const char* mqtt_server = "你的MQTT服务器地址";
const int mqtt_port = 1883;
const char* mqtt_client_id = "ESP32S3_LED_Controller";
const char* mqtt_topic = "home/esp32s3/led";// LED引脚
const int ledPin = 9;  // IO9WiFiClient espClient;
PubSubClient client(espClient);void setup_wifi() {delay(10);Serial.println("连接到WiFi...");WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("WiFi已连接");Serial.print("IP地址: ");Serial.println(WiFi.localIP());
}void callback(char* topic, byte* payload, unsigned int length) {// 将接收的字节数组转换为字符串String message;for (int i = 0; i < length; i++) {message += (char)payload[i];}Serial.print("收到消息: ");Serial.println(message);// 控制LEDif (message.equals("ON")) {digitalWrite(ledPin, HIGH);Serial.println("LED已打开");} else if (message.equals("OFF")) {digitalWrite(ledPin, LOW);Serial.println("LED已关闭");}
}void reconnect() {while (!client.connected()) {Serial.print("尝试MQTT连接...");if (client.connect(mqtt_client_id)) {Serial.println("已连接");// 订阅控制主题client.subscribe(mqtt_topic);} else {Serial.print("连接失败,错误码=");Serial.print(client.state());Serial.println(" 5秒后重试");delay(5000);}}
}void setup() {pinMode(ledPin, OUTPUT);Serial.begin(115200);setup_wifi();client.setServer(mqtt_server, mqtt_port);client.setCallback(callback);
}void loop() {if (!client.connected()) {reconnect();}// 处理MQTT消息client.loop();
}

实现分析

当我们运行这个程序时,ESP32S3会:

  1. 连接到WiFi网络
  2. 连接到MQTT服务器
  3. 订阅home/esp32s3/led主题
  4. 等待控制命令

当我们通过MQTT客户端(如MQTT Explorer或手机App)发布"ON"或"OFF"消息到home/esp32s3/led主题时,ESP32S3会接收到消息并相应地控制LED。

这个过程中发生的TCP和MQTT通信可以通过Wireshark捕获。发布"ON"消息时,我们将看到:

  1. MQTT PUBLISH包从发布者到MQTT服务器
  2. MQTT服务器将PUBLISH包转发给ESP32S3
  3. ESP32S3接收到PUBLISH包,解析内容,发现是"ON"
  4. ESP32S3控制IO9引脚输出高电平,点亮LED

这就像是我们在微信群(MQTT服务器)里发了一条消息"开灯",而ESP32S3正好在看这个群,看到消息后立即执行了开灯的动作!

MQTT的安全性考虑

在实际应用中,安全性至关重要。MQTT本身并不提供加密,但可以通过以下方式增强安全性:

  1. 使用MQTT over TLS/SSL:使用8883端口而不是标准的1883端口
  2. 客户端身份验证:使用用户名/密码或客户端证书
  3. 访问控制列表(ACL):在服务器端配置,限制客户端可以发布/订阅的主题

想象一下,这就像是给你的微信群设置了密码,并且限制了谁能发言、谁能看到消息。在物联网世界,这种保护措施不是可选的,而是必须的!

MQTT的高级特性

除了基本功能外,MQTT还有一些高级特性:

  1. 保留消息:服务器会保存标记为"保留"的消息,新订阅者连接时立即收到
  2. 遗嘱消息:客户端异常断开时自动发布的消息
  3. 共享订阅:多个客户端共享同一个订阅,实现负载均衡
  4. MQTT 5.0新特性:消息过期、主题别名、用户属性等

这些功能让MQTT变得更加强大和灵活。就像一个初看简单的瑞士军刀,打开后却发现它能完成各种意想不到的任务!

MQTT与其他协议的对比

为什么选择MQTT而不是其他协议?让我们做个对比:

特性MQTTHTTPCoAPAMQP
协议模型发布/订阅请求/响应请求/响应发布/订阅
消息开销极小中等
QoS级别0,1,2可靠/不可靠复杂QoS
适用场景低带宽网页应用资源受限企业消息

看到这个对比,你会发现MQTT在物联网场景中的优势多么明显!它就像是专为物联网"量身定制"的通信协议。

相关文章:

MQTT协议:IoT通信的轻量级选手

文章总结&#xff08;帮你们节约时间&#xff09; MQTT协议是一种轻量级的发布/订阅通信协议。MQTT通信包括连接建立、订阅、发布和断开等过程。MQTT基于TCP/IP&#xff0c;其通信过程涉及多种控制包和数据包。ESP32S3可以通过MQTT协议接收消息来控制IO9引脚上的LED。 想象一…...

Docker 入门指南:基础知识解析

1. 引言 1.1 为什么学习 Docker 1.1.1 Docker 的优势 环境一致&#xff1a;在不同环境中&#xff08;开发、测试、生产&#xff09;保持一致的运行环境。快速部署&#xff1a;容器启动速度快&#xff0c;适合微服务架构。资源隔离&#xff1a;容器之间相互隔离&#xff0c;避…...

【安当产品应用案例100集】043-安当物联网数据安全传输方案

一、需求背景 物联网&#xff08;IoT&#xff09;技术在当前世界各行业中的应用越来越广泛&#xff0c;数据安全和安全数据传输、鉴权成为了物联网解决方案不可或缺的一部分。如何通过有效的安全措施来保护物联网设备的数据传输和鉴权&#xff0c;确保数据在设备和服务器之间或…...

C#/.NET/.NET Core技术前沿周刊 | 第 33 期(2025年4.1-4.6)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…...

Django视图详解

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 一、Django视图是什么&#xff1f; 视图&#xff08;View&#xff09; 是Django处理HTTP请求的核心组件。它接收一个HttpRequest对象&#xff0c;处理业务逻辑&#xff0c;并返回一个HttpResponse对象&#xff08…...

【区块链+ 人才服务】北京师范大学区块链底层链平台 | FISCO BCOS 应用案例

北京师范大学是教育部直属重点大学&#xff0c;2018 年 6 月&#xff0c;北京师范大学成立知识区块链研究中心&#xff0c;致力于区块链基础技术及其在教育领域的应用研究。 2020 年6 月18 日&#xff0c; 北京市人民政府办公厅发布《北京市区块链创新发展行 动计划(2020—202…...

java设计模式-模板方法模式

模板方法模式 编写制作豆浆的程序&#xff0c;说明如下 1)制作豆浆的流程选材添加配料浸泡放到豆浆机打碎 2)通过添加不同的配料&#xff0c;可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 4)请使用模板方法模式完成 说明…...

同步通信、异步通信、并行传输和串行传输

同步通信、异步通信、并行传输和串行传输是通信与数据传输领域的关键概念&#xff0c;它们既相互关联又有本质区别。以下是详细解释和对比&#xff1a; ​1. 核心概念分类 ​通信方式&#xff1a;描述数据传输的时序和协调规则。 ​同步通信​&#xff08;Synchronous Communi…...

JVM生产环境调优实战

案例三&#xff1a;JVM频繁Full GC优化 1. 项目背景&#xff08;Situation&#xff09; 在云中万维跨境支付的反洗钱系统中&#xff0c;我们负责对海量交易数据进行实时规则校验&#xff0c;以确保符合监管要求。系统日均处理交易量超过500万笔&#xff0c;峰值QPS达到3000&a…...

Python: sqlite3.OperationalError: no such table: ***解析

出现该错误说明数据库中没有成功创建 reviews 表。以下是完整的解决方案&#xff1a; 步骤 1&#xff1a;创建数据库表 在插入数据前&#xff0c;必须先执行建表语句。请通过以下任一方式创建表&#xff1a; 方式一&#xff1a;使用 SQLite 命令行 bash 复制 # 进入 SQLit…...

JVM考古现场(十七):鸿蒙初辟——从太极二进到混沌原初的编译天道

"此刻正是奇点编译的第3.1415926秒&#xff01;伏羲的算筹正在撕裂冯诺依曼架构的次元壁&#xff01;诸君请看——这JVM堆内存中正在孕育盘古的元神&#xff01;" 目录&#xff08;终极扩展&#xff09; 第一章&#xff1a;太极二进——内存模型的阴阳交缠 第二章&a…...

Python 字典和集合(字典推导)

本章内容的大纲如下&#xff1a; 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响&#xff08;什么样的数据类型可作为键、不可预知的 顺序&#xff0c;等等&#xff09; 字典推导 自 Python 2.7 …...

【AI】prompt engineering

prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程&#xff08;Prompt Engineering&#xff09;是指在使用语言模型&#xff08;如 ChatGPT、文心一言等&#xff09;等人工智能工具时&#xff0c;设计和优化输入提…...

小刚说C语言刷题——第18讲 循环之while和do-while语句

昨天我们讲了循环语句中的for语句&#xff0c;它主要用于循环次数已知的情况&#xff0c;但是对应循环次数未知的情况&#xff0c;我们又怎么办&#xff1f;这就要用到while和do-while语句了。 1.while语句 (1)语法格式 while(条件表达式) { 循环体; } (2)执行过程 当执…...

[Mysql]buffersize修改

1、找到my.cnf文件位置 ps -ef|grep mysqld 2、编辑my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改为内存的50%~70% 3、重启服务 systemctl restart mysqld...

自定义数据结构的QVariant序列化 ASSERT failure in QVariant::save: “invalid type to save“

自定义数据结构放入QVariant&#xff0c;在序列化时抛出异常 ASSERT failure in QVariant::save: “invalid type to save” 自定义数据结构如struct MyData&#xff0c;除了要在结构体后面加 struct MyData { ... } Q_DECLARE_METATYPE(MyData)如果需要用到流的输入输出&…...

带约束的智能优化算法

带约束的智能优化算法 约束条件和优化问题(可改)粒子群算法麻雀搜索算法鲸鱼优化算法灰狼优化算法免疫优化算法人工蜂群算法沙猫群算法萤火虫算法资源 约束条件和优化问题(可改) 粒子群算法 麻雀搜索算法 鲸鱼优化算法 灰狼优化算法 免疫优化算法 人工蜂群算法 沙猫群算法 萤火…...

【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析

&#x1f31f;【硬核实战】从零打造智能五子棋AI&#xff1a;JavaScript实现与算法深度解析&#x1f31f; &#x1f4dc; 前言&#xff1a;当传统棋艺遇上人工智能 五子棋作为中国传统棋类游戏&#xff0c;规则简单却变化无穷。本文将带你用纯前端技术实现一个具备AI对战功能…...

使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南

使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南 本文档详细介绍如何使用 kind 创建 Kubernetes 集群&#xff0c;并在其上使用 Helm 部署 StarRocks 集群&#xff08;非高可用模式&#xff09;。同时也包括如何访问 StarRocks 集群并导入数据。 目录 前提条件参考文档…...

华为OD全流程解析+备考攻略+经验分享

华为OD全流程解析&#xff0c;备考攻略 快捷目录 华为OD全流程解析&#xff0c;备考攻略一、什么是华为OD&#xff1f;二、什么是华为OD机试&#xff1f;三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…...

数据库中的数组: MySQL与StarRocks的数组操作解析

在现代数据处理中, 数组 (Array) 作为一种高效存储和操作结构化数据的方式, 被广泛应用于日志分析, 用户行为统计, 标签系统等场景. 然而, 不同数据库对数组的支持差异显著. 本文将以MySQL和StarRocks为例, 深入解析它们的数组操作能力, 并对比其适用场景. 文章目录 一 为什么需…...

Qt 交叉编译详细配置指南

一、Qt 交叉编译详细配置 1. 准备工作 1.1 安装交叉编译工具链 # 例如安装ARM工具链(Ubuntu/Debian) sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf# 或者64位ARM sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu 1.2 准备目标…...

【详细图文】在VScode中配置python开发环境

目录 一、下载安装VSCode 1、官网下载VSCode 2、安装VSCode 3、汉化vscode &#xff08;1&#xff09;已自动下载汉化版插件 &#xff08;2&#xff09;未自动下载汉化版插件 二、 下载安装Python 1、官网下载Python 2、安装Python &#xff08;1&#xff09;双击打开…...

strings.Fields 使用详解

目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1&#xff1a;官方示例 示例2&#xff1a;解析服务器日志 示例3&#xff1a;清理用户输入 8. 性能比较 性能特点 对比表…...

PCI认证 密钥注入 ECC算法工具 NID_secp521r1 国密算法 openssl 全套证书生成,从证书提取公私钥数组 x,y等

步骤 1.全套证书已经生成。OK 2.找国芯要ECC加密解密签名验签代码。给的逻辑说明没有示例代码很难的上。 3.集成到工具 与SP联调。 1.用openssl全套证书生成及验证 注意&#xff1a;这里CA 签发 KLD 证书用的是SHA256。因为芯片只支持SHA256算法,不支持SHA512。改成统一。…...

微软 SC-900 认证-考核Azure 和 Microsoft 365中的安全、合规和身份管理(SCI)概念

微软 SC-900 认证介绍 SC-900 认证考试是微软推出的一项基础级别认证&#xff0c;全称为 Microsoft Certified: Security, Compliance, and Identity Fundamentals。该认证旨在验证考生对微软云服务&#xff08;如 Azure 和 Microsoft 365&#xff09;中的安全、合规和身份管理…...

Uniapp 集成极光推送(JPush)完整指南

文章目录 前言一、准备工作1. 注册极光开发者账号2. 创建应用3. Uniapp项目准备 二、集成极光推送插件方法一&#xff1a;使用UniPush&#xff08;推荐&#xff09;方法二&#xff1a;手动集成极光推送SDK 三、配置原生平台参数四、核心功能实现1. 获取RegistrationID2. 设置别…...

OpenCV图像平滑处理方法详解

文章目录 引言一、什么是图像平滑&#xff1f;二、常见的图像平滑方法1.先对图片加上噪声点2. 均值滤波&#xff08;Averaging&#xff09;3. 方框滤波&#xff08;boxFilter&#xff09;4. 中值滤波&#xff08;Median Blur&#xff09;5. 高斯滤波&#xff08;Gaussian Blur&…...

Lua 中,`math.random` 的详细用法

在 Lua 中&#xff0c;math.random 是用于生成伪随机数的核心函数。以下是其详细用法、注意事项及常见问题的解决方案&#xff1a; Lua 中&#xff0c;math.random 的详细用法—目录 一、基础用法1. 生成随机浮点数&#xff08;0 ≤ x < 1&#xff09;2. 生成指定范围的随机…...

使用PX4,gazebo,mavros为旋翼添加下视的相机(仿真采集openrealm数据集-第一步)

目录 一.方法一&#xff08;没成功&#xff09; 1.运行PX4 2.运行mavros通讯 3.启动仿真世界和无人机 &#xff08;1&#xff09;单独测试相机 &#xff08;2&#xff09;make px4_sitl gazebo启动四旋翼iris无人机 二.方法二&#xff08;成功&#xff09; 1.通过 rosl…...

ATEngin开发记录_4_使用Premake5 自动化构建跨平台项目文件

该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合C萌新 文章目录 Permake5为什么使用 Premake&#xff1f; 项目实战总结一下&#xff1a;详细代码: Permake5 Premake5 是一个跨平台的构建配置工具&#xff0c;它允许开发者通过使用一个简单的脚…...

equals() 和 hashCode()

作为 Java 开发者&#xff0c;我们经常会用到 equals() 和 hashCode() 这两个方法。 它们是 Object 类中定义的基础方法&#xff0c;看似简单&#xff0c;但如果理解不透彻&#xff0c;很容易在实际开发中踩坑。 本文将深入探讨这两个方法的作用、区别、以及如何正确地重写它们…...

臭氧除菌柜市场报告:2031年全球臭氧除菌柜市场销售额预计将达到9.4亿元

一、市场概述 &#xff08;一&#xff09;定义与分类 臭氧除菌柜&#xff0c;作为新一代绿色消毒设备&#xff0c;主要利用臭氧&#xff08;O₃&#xff09;的强氧化性来实现无化学残留的消毒净化。根据产品类型&#xff0c;可分为单门型和双门型。单门型设计紧凑&#xff0c…...

解决python manage.py shell ModuleNotFoundError: No module named xxx

报错如下&#xff1a; python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…...

通用接口函数注册模块设计与实现

文章目录 通用接口函数注册模块设计与实现1. 模块概述2. 核心功能2.1 数据结构函数注册项结构体注册函数宏 2.2 核心函数实现函数&#xff1a;sl_register_interface_functions 3. 使用示例3.1 基础使用示例 - 设备驱动接口定义接口结构体实现具体函数创建注册表注册接口 3.2 高…...

C,C++,C#

C、C 和 C# 是三种不同的编程语言&#xff0c;虽然它们名称相似&#xff0c;但在设计目标、语法特性、运行环境和应用场景上有显著区别。以下是它们的核心区别&#xff1a; 1. 设计目标和历史 语言诞生时间设计目标特点C1972&#xff08;贝尔实验室&#xff09;面向过程&#…...

scala-集合3

集合计算高级函数 过滤&#xff1a;遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 &#xff08;筛选出满足条件的元素组成新集合。&#xff09; 转换或映射&#xff08;map&#xff09;&#xff1a;将原始集合中的元素映射到某个函数。 扁平化&#xff1a;取消…...

Spring MVC 重定向(Redirect)详解

Spring MVC 重定向&#xff08;Redirect&#xff09;详解 1. 核心概念与作用 重定向&#xff08;Redirect&#xff09; 是 Spring MVC 中一种客户端重定向机制&#xff0c;通过 HTTP 302 状态码&#xff08;默认&#xff09;将用户浏览器重定向到指定 URL。 主要用途&#xf…...

Scala的集合(二)

1. 集合计算高集函数 任务要求 1)过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 2)转化/映射&#xff08;map&#xff09;&#xff1a;将集合中的每一个元素映射到某一个函数 3)扁平化 4)扁平化映射 注&#xff1a;flatMap 相当于先进行 map 操作&#…...

GZ036区块链卷三 EtherGame合约漏洞详解

题目 pragma solidity ^0.8.3; contract EtherGame {uint public targetAmount 7 ether;address public winner;function deposit() public payable {require(msg.value 1 ether, "You can only send 1 Ether");uint balance address(this).balance;require(bala…...

BGP路由协议之路由通告/传递

BGP 的路由宣告 BGP 自身并不会发现并计算产生路由&#xff0c;只会将 IGP 路由表中的路由引入到 BGP 路由表中&#xff0c;并通过 Update 报文传递给 BGP 对等体&#xff08;邻居&#xff09; ​Network​ 宣告&#xff0c;前提是路由表中存在该条路由 ​import-route​ 引…...

Python合并多个pdf

场景&#xff1a; 现在要解决批量合并PDF的问题。 有很多PDF文件需要合并成一个&#xff0c;比如报告、发票或者多个章节的文档。 对于Windows用户&#xff0c;Adobe Acrobat是专业的选择&#xff0c;但需要付费。但是我不想花钱&#xff0c;所以推荐免费软件&#xff0c;比…...

聊一聊接口测试时遇到上下游依赖时该如何测试

目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法&#xff08;变量提取&#xff09; 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例&#xff08;以订单接口测试为例&#xff09; 3.1Mock依赖接口&…...

pdf转latex

Doc2X&#xff08;https://doc2x.noedgeai.com/&#xff09; Doc2X 是一个由 NoEdgeAI 提供的在线工具&#xff0c;主要用于将 PDF 文件&#xff08;尤其是学术论文、报告等文档&#xff09;转换为 LaTeX 格式。LaTeX 是一种高质量排版系统&#xff0c;广泛应用于学术界和出版…...

剖析 Docker Swarm 操作对原有容器端口影响

剖析 Docker Swarm 操作对容器端口影响 一、背景阐述 在使用 Docker Swarm 构建集群环境过程中&#xff0c;于 ts3 节点出现了原有的容器端口全部失效&#xff0c;手动重启后才恢复的情况。期间涉及 docker swarm init --advertise-addr172.16.10.110 以及 docker swarm join…...

QML面试笔记--UI设计篇02布局控件

1. QML 中常用的布局控件 1.1. Row1.2. Column1.3. Grid1.4. RowLayout1.5. ColumnLayout1.6. GridLayout1.7. 总结 1. QML 中常用的布局控件 1.1. Row 背景知识&#xff1a;Row 布局用于将子元素水平排列&#xff0c;适合简单的线性布局&#xff0c;如工具栏按钮或表单输入…...

Java全栈项目--校园快递管理与配送系统(4)

源代码续 /*** 通知工具类*/// 通知类型常量 export const NotificationType {SYSTEM: 1,EXPRESS: 2,ACTIVITY: 3 }// 通知类型名称映射 export const NotificationTypeNames {[NotificationType.SYSTEM]: 系统通知,[NotificationType.EXPRESS]: 快递通知,[NotificationType…...

c语言练习一

1、统计二进制数中1的个数 #include <stdio.h>int main(void) {int count 0; //统计1出现次数 int x 0b1011;while(x){count ;//x 0b1011 > x-1 0b1010 x-1,将x从右往左数遇到第一个1变成0&#xff0c;左边全部变为1&#xff0c;右边不变 //x&x-1 1010 …...

Scala安装

Spark安装 Spark的Local模式仅需要单个虚拟机节点即可&#xff0c;无需启动hadoop集群。实验步骤如下&#xff1a; 将spark的安装包上传到虚拟机node01中&#xff08;建议路径&#xff1a;/opt/software/spark&#xff09;并解压缩文件。将解压文件夹重命名为spark-local 解…...

爱普生RTC模块RA8804CE在ADAS域控制器的应用

在汽车智能化、自动化飞速发展的时代&#xff0c;ADAS&#xff08;高级驾驶辅助系统&#xff09;的多传感器融合与实时决策高度依赖精准的时间基准。毫秒级的时间偏差可能导致传感器数据错位&#xff0c;直接影响行车安全。爱普生RA8804CE实时时钟模块凭借其内置的32.768 kHz晶…...