8 MQTT
8 MQTT
- 1、相关概念
- 2、MQTT的操作过程
- 3、MQTT协议
- 3.1 固定报文
- 3.2 连接报文
- 3.3 确认连接请求
- 3.4 构造订阅报文
- 3.5 订阅确认报文
- 3.6 发布报文
- 3.7 其他报文
1、相关概念
- MQTT [1] 全名为Message Queuing Telemetry Transport,是一种基于TCP/IP协议上传输的轻量级通信协议,采用订阅、发布机制,订阅者只接收自己已经订阅的数据,非订阅数据则不接收,既保证了必要的数据的交换,又避免了无效数据造成的储存与处理

2、MQTT的操作过程
基于阿里云的MQTT数据传输,实现功能:
- STM32上报温度和灯的状态给阿里云服务器
- PC网页和手机APP从阿里云能够获取温度和灯的开关状态并显示
- 通过PC网页和手机APP能够控制STM32灯的状态
1:登录阿里云平台 - 产品 - 物联网 - 物联网平台 - 管理控制台 - 公共实例
2:创建产品 - 设备管理 - 产品 - 创建产品 -
名称 - EHOME0701
品类 - 标准品类 - 自己选
节点类型 - 直连设备
连网与数据 - 蜂窝
确认
3.创建设备 - 产品 - 管理产品 - 添加设备
Devicename - 自定义 - 英文
备注 - 无所谓
确认 - 完成
4:获取三元组:设备 - 查看 - 右上角(查看)
{"ProductKey": "a1584e1xqTg", "DeviceName": "jiajing","DeviceSecret": "17fee0bf423cd33d84b4c02c5cc10bd8"
}
5:阿里云服务器IP地址格式 ${ProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com
ip地址 - a1584e1xqTg.iot-as-mqtt.cn-shanghai.aliyuncs.com
端口号 - 1883
6:构造clientid:${DeviceName}|securemode=3,signmethod=hmacsha1|;
username:${DeviceName}&${ProductKey};
passwd :由加密对象和密钥,通过加密算法得到,生成网址:[]https://encode.chahuo.com/#google_vignette
由加密对象:clientId${DeviceName}deviceName${DeviceName}productKey${ProductKey}
密钥:${DeviceSecret}
加密算法:HMACSHA1
clientid: jiajing|securemode=3,signmethod=hmacsha1|
username: jiajing&a1584e1xqTg
passwd:加密对象 : clientIdjiajingdeviceNamejiajingproductKeya1584e1xqTg秘钥 : 17fee0bf423cd33d84b4c02c5cc10bd8加密算法 - HMACSHA1 密码 : 074be22cf90f6fd29ea7bc9ad89082ea77091e99
7.订阅主题/发布主题
订阅主题 - 客户端表达对某个特定主题的消息感兴趣
发布主题 - 客户端向某个特定主题发送消息的行为
进入物联网平台-产品 - 查看 - topic类列表 - 物模型通信topic
发布主题:/sys/a1584e1xqTg/${deviceName}/thing/event/property/post
订阅主题:/sys/a1584e1xqTg/${deviceName}/thing/service/property/set
8.功能的添加
温度/报警家庭健康设备
温度测量 + 报警
led0 / led1 / 温度传感器
步骤:
1.产品 - 查看 - 功能定义 - 编辑草稿 - 添加自定义功能
2.发布上线
3.查看
设备 - 选择目标设备 - 物模型数据
9.对设备的调试
一个标签页 - 物模型数据
另一个标签页 - 调试
步骤 - 设备管理 - 设备模拟器 - 选中产品/设备 - 启动设备模拟器 - 3.1.1
属性上报 - 卧室灯/餐厅灯/当前温度 发送指令
3、MQTT协议
- 报文格式

Fixed header 固定报头,所有控制报文都包含
Variable header 可变报头,部分控制报文包含
Payload 有效载荷,部分控制报文包含
3.1 固定报文
每个MQTT控制报文都包含一个固定报文,格式为:

控制报文的类型

标志位

剩余长度
表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。
3.2 连接报文
客户端首次向服务端发送的第一个报文。由3部分组成,由固定报头、可变报头和剩余长度组成
-
固定包头格式:10 ?

-
可变报头:00 04 4D 51 54 54 04 C2 00 64
按下列次序包含四个字段:协议名(Protocol Name),协议级别(ProtocolLevel),连接标志(Connect Flags)和保持连接(Keep Alive)。

协议级别:对于3.1.1版协议,协议级别字段的值是4(0x04)
连接标志:

保持连接:

- 有效载荷
CONNECT 报文的有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码
clientid: xx xx clientid内容 (xx xx 表示clienttid的长度)
clientid: jiajing|securemode=3,signmethod=hmacsha1|
clientid: 00 29 6A 69 61 6A 69 6E 67 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C
username: xx xx username内容 (xx xx 表示username的长度)
username: jiajing&a1584e1xqTg
username: 00 13 6A 69 61 6A 69 6E 67 26 61 31 35 38 34 65 31 78 71 54 67
passwd: xx xx passwd内容 (xx xx 表示passwd的长度)
passwd: 074be22cf90f6fd29ea7bc9ad89082ea77091e99
passwd: 00 28 30 37 34 62 65 32 32 63 66 39 30 66 36 66 64 32 39 65 61 37 62 63 39 61 64 38 39 30 38 32 65 61 37 37 30 39 31 65 39 39
所以有效载荷为:
00 29 6A 69 61 6A 69 6E 67 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 13 6A 69 61 6A 69 6E 67 26 61 31 35 38 34 65 31 78 71 54 67 00 28 30 37 34 62 65 32 32 63 66 39 30 66 36 66 64 32 39 65 61 37 62 63 39 61 64 38 39 30 38 32 65 61 37 37 30 39 31 65 39 39
- 剩余长度
剩余长度=可变报头的长度+有效载荷的长度= 116,所以固定报头为:10 74 - 连接报文为:
固定报头 可变报头 有效载荷
10 74 00 04 4D 51 54 54 04 C2 00 64 00 29 6A 69 61 6A 69 6E 67 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 13 6A 69 61 6A 69 6E 67 26 61 31 35 38 34 65 31 78 71 54 67 00 28 30 37 34 62 65 32 32 63 66 39 30 66 36 66 64 32 39 65 61 37 62 63 39 61 64 38 39 30 38 32 65 61 37 37 30 39 31 65 39 39
演示

3.3 确认连接请求
服务端发送 CONNACK 报文响应从客户端收到的 CONNECT 报文。服务端发送给客户端的第一个报文必须是 CONNACK
-
固定报头:20 02

-
可变报头:00

sp:当前会话标志,这里设置为0
连接返回码:根据实际情况返回

上文中的返回码为00,即代表成功
3.4 构造订阅报文
客户端向服务端发送 SUBSCRIBE 报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个主题。
-
固定报文: 82 ?

-
可变报文:00 0A

-
有效载荷

即
有效载荷:xx xx 订阅主题 00 (xx xx)订阅主题的长度
订阅主题:/sys/a1584e1xqTg/jiajing/thing/service/property/set
有效载荷:00 33 2F 73 79 73 2F 61 31 35 38 34 65 31 78 71 54 67 2F 6A 69 61 6A 69 6E 67 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00
- 剩余长度:有效载荷+可变报头 56 0x38
即订阅报文为
82 38 00 0A 00 33 2F 73 79 73 2F 61 31 35 38 34 65 31 78 71 54 67 2F 6A 69 61 6A 69 6E 67 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00

3.5 订阅确认报文
服务端发送 SUBACK 报文给客户端,用于确认它已收到并且正在处理 SUBSCRIBE 报文
-
固定报文:90 ?

-
可变报文:
可变报头包含等待确认的 SUBSCRIBE 报文的报文标识符,即和构造订阅报文里面的可变报文保持一致 -
有效载荷:
有效载荷包含一个返回码清单。每个返回码对应等待确认的 SUBSCRIBE 报文中的一个主题过滤器。

利用阿里物联网平台给网络调试助手客户端下发一个属性设置消息(例如:开灯),
上文中返回的确认订阅报文为:90 03 00 0A 016

回传报文:
30 9B 01 00 33 2F 73 79 73 2F 61 31 35 38 34 65 31 78 71 54 67 2F 6A 69 61 6A 69 6E 67 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 79 2E 73 65 74 22 2C 22 69 64 22 3A 22 39 36 39 31 37 34 39 31 36 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 62 65 64 5F 72 6F 6F 6D 5F 6C 65 64 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
拆分
30 9B 01 // 固定报头
00 33 // 可变报头中主题的长度
2F 73 79 73 2F 61 31 35 38 34 65 31 78 71 54 67 2F 6A 69 61 6A 69 6E 67 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 // 可变报文的主题名 /sys/a1584e1xqTg/jiajing/thing/service/property/set
7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 79 2E 73 65 74 22 2C 22 69 64 22 3A 22 39 36 39 31 37 34 39 31 36 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 62 65 64 5F 72 6F 6F 6D 5F 6C 65 64 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D // 有效载荷{"method":"thing.service.property.set","id":"969174916","params":{"bed_room_led":1},"version":"1.0.0"}
3.6 发布报文
PUBLISH 控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息。
-
固定报头:30 ?

-
可变报文
可变报头按顺序包含主题名和报文标识符
发布主题:/sys/a1584e1xqTg/jiajing/thing/event/property/post
发布主题:2F 73 79 73 2F 61 31 35 38 34 65 31 78 71 54 67 2F 6A 69 61 6A 69 6E 67 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74
可变报文:长度 发布主题
可变报文:00 32 2F 73 79 73 2F 61 31 35 38 34 65 31 78 71 54 67 2F 6A 69 61 6A 69 6E 67 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74
- 有效载荷
有效载荷:{"method":"thing.event.property.post","id":"2004893243","params":{"bed_room_led":0},"version":"1.0.0"}
有效载荷:7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 32 30 30 34 38 39 33 32 34 33 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 62 65 64 5F 72 6F 6F 6D 5F 6C 65 64 22 3A 30 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
即报文为:
剩余长度:可变报文+有效载荷 - 148 - 0x94 151
当剩余剩余长度大于127时,后面添加一个0x01
30 9A 01 00 32 2F 73 79 73 2F 61 31 35 38 34 65 31 78 71 54 67 2F 6A 69 61 6A 69 6E 67 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 32 30 30 34 38 39 33 32 34 33 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 62 65 64 5F 72 6F 6F 6D 5F 6C 65 64 22 3A 30 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D

回复内容:
30 AB 01
00 38
2F 73 79 73 2F 61 31 35 38 34 65 31 78 71 54 67 2F 6A 69 61 6A 69 6E 67 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 5F 72 65 70 6C 79 // /sys/a1584e1xqTg/jiajing/thing/event/property/post_reply
7B 22 63 6F 64 65 22 3A 32 30 30 2C 22 64 61 74 61 22 3A 7B 7D 2C 22 69 64 22 3A 22 32 30 30 34 38 39 33 32 34 33 22 2C 22 6D 65 73 73 61 67 65 22 3A 22 73 75 63 63 65 73 73 22 2C 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 22 7D //{"code":200,"data":{},"id":"2004893243","message":"success","method":"thing.event.property.post","version":"1.0"}
3.7 其他报文

相关文章:
8 MQTT
8 MQTT 1、相关概念2、MQTT的操作过程3、MQTT协议3.1 固定报文3.2 连接报文3.3 确认连接请求3.4 构造订阅报文3.5 订阅确认报文3.6 发布报文3.7 其他报文 1、相关概念 MQTT [1] 全名为Message Queuing Telemetry Transport,是一种基于TCP/IP协议上传输的轻量级通信…...
【文件系统】抽象磁盘的存储结构 CHS寻址法 | sector数组 | LAB数组
目录 1.为什么要抽象 2.逻辑抽象_版本1 2.1sector数组 2.2index转化CHS 3.逻辑抽象_版本2 3.1LBA数组 3.2LAB下标转化sector下标 文件其实就是在磁盘中占有几个扇区的问题❗文件是很多个sector的数组下标❗文件是有很多块构成的❗❗文件由很多扇区构成------>文件…...
基于python旅游推荐系统(源码+论文+部署讲解等)
博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙ÿ…...
Mysql大单表JSON优化
优化方案 MySQL 8.0.32 中,有几种方法可以优化存储 JSON 字符串的数据表。以下是一些建议,可以帮助您减少存储空间: 使用压缩: MySQL 8.0 支持表级压缩,可以通过修改表来启用压缩。 ALTER TABLE your_table ROW_FORMATCOMPRESS…...
电脑开机启动项管理小工具,绿色免安装
HiBit Startup Manager 是一款功能强大的启动项管理工具,旨在帮助用户管理和优化计算机的自动启动程序。该软件通过添加或删除应用程序、编辑它们的属性以及管理流程、服务、任务调度程序和上下文菜单来实现这一目标。 HiBit Startup Manager 提供了以下主要功能&a…...
一例AutoHotkey语言生成的文件夹病毒分析
概述 这是一个使用AutoHotkey语言编写的文件夹病毒,使用ftp服务器来当作C2,通过U盘传播,样本很古老,原理也很简单,这种语言的样本还是第一次见到,记录一下。 样本的基本信息 PE32库: AutoIt(3.XX)[-]编译…...
【机器学习第7章——贝叶斯分类器】
机器学习第7章——贝叶斯分类器 7.贝叶斯分类器7.1贝叶斯决策论7.2 朴素贝叶斯分类器条件概率的m估计 7.3 极大似然估计优点基本原理 7.4 贝叶斯网络7.5 半朴素贝叶斯分类器7.6 EM算法7.7 EM算法实现 7.贝叶斯分类器 7.1贝叶斯决策论 一个医疗判断问题 有两个可选的假设&#…...
C++ QT开发 学习笔记(3)
C QT开发 学习笔记(3) - WPS项目 标准对话框 对话框类说明静态函数函数说明QFileDialog文件对话框getOpenFileName()选择打开一个文件getOpenFileNames()选择打开多个文件getSaveFileName()选择保存一个文件getExistingDirectory()选择一个己有的目录getOpenFileUrl()选择打幵…...
【Python实战】如何优雅地实现文字 二维码检测?
前几篇,和大家分享了如何通过 Python 和相关库,自动化处理 PDF 文档,提高办公效率。 【Python实战】自动化处理 PDF 文档,完美实现 WPS 会员功能【Python实战】如何优雅地实现 PDF 去水印?【Python实战】一键生成 PDF…...
行为型设计模式3:模板方法/备忘录/解释器/迭代器
设计模式:模板方法/备忘录/解释器/迭代器 (qq.com)...
思源笔记软件的优缺点分析
在过去一年里,我用了很多款笔记,从word文档到onenote到语雀再到思源,最后坚定的选择了思源笔记 使用感受 首先是用word文档来记笔记,主要是开始时不知道笔记软件怎么好用,等到笔记越来越膨胀的时候我发现,…...
追问试面试系列:Dubbo
欢迎来到Dubbo系列,在面试中被问到Dubbo相关的问题时,大部分都是简历上写了Dubbo,或者面试官想尝试问问你对Dubbo是否了解。 本系列主要是针对面试官通过一个点就使劲儿往下问的情况。 面试官:说说你们项目亮点 好的面试官 我们这个项目的技术亮点在于采用了Spring Cloud…...
动手学深度学习V2每日笔记(卷积层)
本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1L64y1m7Nh/p2&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不…...
qcom ucsi probe
ucsi glink 注册一个ucsi 设备,和pmic glink进行通信,ucsi作为pmic glink的一个client。 lkml的patch https://lkml.org/lkml/2023/1/30/233 dtsi中一般会定义 qcom,ucsi-glink 信息,用于和驱动进行匹配 static const struct of_device_id …...
flask和redis配合
对于涉及数据提交的场景,比如更新用户信息,你可能会使用POST或PUT请求。但是,这些操作通常与直接从Redis缓存中检索数据不同,因为它们可能涉及到对后端数据库或其他存储系统的修改。并且可能需要将更新后的数据同步回Redis缓存&am…...
深度学习中的早停法
早停法(Early Stopping)是一种用于防止模型过拟合的技术,在训练过程中监视验证集(或者测试集)上的损失值。具体设立早停的限制包括两个主要参数: Patience(耐心):这是指验…...
科普文:JUC系列之多线程门闩同步器CountDownLatch的使用和源码
CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他10个线程的任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 CountDownLatch是通过一个计数器来实现…...
foreach循环和for循环在PHP中各有什么优势
在PHP中,foreach循环和for循环都是用来遍历数组的常用结构,但它们各有其优势和使用场景。 foreach循环的优势 简化代码:foreach循环提供了一种更简洁的方式来遍历数组,不需要手动控制索引或指针。易于阅读:对于简单的…...
巧用casaos共享挂载自己的外接硬盘为局域网共享
最近入手了个魔改机顶盒,已经刷好了的armbian,虽然是原生的,但是我觉得挺强大的,内置了很多 常用的docker和应用,只需要armbian-software 安装就行,缺点就是emmc太小了。 买到之后第一时间装上了casaos和1p…...
标题:解码“八股文”:助力、阻力,还是空谈?
标题:解码“八股文”:助力、阻力,还是空谈? 在程序员的面试与职场发展中,“八股文”一直是一个备受争议的话题。它既是求职者展示自己技术功底的途径,也是一些公司筛选人才的标准之一。但“八股文”在实际…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
