如何理解mqtt用到的101交换协议?

浏览器中wss请求状态码101是成功了吗 如果 WebSocket 是通过 Nginx 代理的,确保配置了正确的。在 WebSocket 连接过程中,客户端(浏览器)发送一个。接下来可以通过 socket.onopen。,要求服务器将连接从。确认是否能正常通信。 阅读详情

在这里插入图片描述

使用过mqtt的同学都知道,mqtt连接时,在Network面板中的status是101。

NameStatusTime
mqtt101(Switching Protocols)Pending

那么101(Switching Protocols)到底是什么意思呢?
这篇文章将带你理解101交换协议是什么,以及101交换协议运用的协议升级机制。

  • 101交换协议
  • 协议升级机制

101交换协议

HTTP的101交换协议意味着client向server发送的消息中包含了Upgrade请求头,server会根据client发送的这个请求头切换协议。

server会在response中添加一个Upgrade响应头,来指示server切换到的协议。

用一句话来说就是:client通过在请求头中添加Upgrade告诉server切换协议,server在响应头中添加upgrade说明切换后的协议。

再简单一点就是:客户端告诉服务端去切换协议。

General
Request URL: wss://foo.bar
Request Method: GET
Status Code: 101 Switching Protocols
Request Headers
Connection: Upgrade 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: xxx
Sec-WebSocket-Protocol: mqtt
Sec-WebSocket-Version: 13
Upgrade: websocket // client告诉server使用websocket协议
...
Response Headers
connection: Upgrade
sec-websocket-accept: fNs9ByuvC+rD75+tj2GMQAzbJms= // server基于client发出的Sec-WebSocket-Key:xxx计算得出,计算过程文章末尾有介绍
sec-websocket-protocol: mqtt
Upgrade: websocket // server告诉client,我们(client,server)使用的是websocket协议
...

其中这些请求头是什么意思呢?Connection,Sec-WebSocket-Extensions,Sec-WebSocket-Key,Sec-WebSocket-Protocol,Sec-WebSocket-Version等等。
响应头呢?sec-websocket-accept,sec-websocket-protocol。

看了下面的协议升级机制就明白了。

协议升级机制

HTTP1.1版本的协议有一个特殊的机制:升级一个已经建立的连接为另外一个协议,一般是通过Upgrade头来实现。

这个机制是可选的,它不能强制协议改变。虽然实现支持新协议,但是也可以选择不升级。在实际应用中,通常这个机制用于引导WebSocket进行连接。

注意,HTTP2.0版本明确禁止使用这个机制。只能用于HTTP1.1。

升级HTTP/1.1连接

client可以使用Upgrade头去邀请服务器去切换为协议列表中的某一项,按照降序。

因为Upgrade是一个逐跳头,因此它需要一个Connection头。
这也就意味着一个典型的包含Upgrade报文头的请求为:

GET /index.html HTTP/1.1
Host: www.example.com
Connection: upgrade
Upgrade: example/1, foo/2

其他的头一般是依赖请求协议的;例如,WebSocket升级允许额外的头去配置WebSocket连接,并在打开时就有一定的安全性。

如果服务器决定去升级连接,分为升级成功和升级失败两种情况:

  • 升级成功:它会返回一个101 Switching Protocols响应状态,并且Upgrade头中指明它切换后的协议。
  • 升级失败:如果服务端不能升级连接,它会忽略Upgrade头,然后返回一个常规的响应(例如 200 OK)

服务器发送完101状态码之后,它可以立即开始使用新协议,并且进行与其他协议的handshake。一旦连接建立完成,连接就变为双向管道,初始化升级的请求可以再协议之上初始化。

协议升级机制的常规用法

Upgrade这个头会用在哪些场景呢?而且与WebSocket连接有关的请求头都有哪些呢?

  • 升级为WebSocket连接
  • 与WebSocket连接有关的请求头
    • Sec-WebSocket-Extensions
    • Sec-WebSocket-Key
    • Sec-WebSocket-Protocol
    • Sec-WebSocket-Version
    • Sec-WebSocket-Accept(只读)
升级为WebSocket连接

最常见的升级HTTP连接的场景,就是使用WebSockets的场景,通常是通过升级HTTP或者HTTPS连接的方式来实现。如果你使用WebSocket API去开启一个连接,或者任何WebSockets的库,大多数或者说所有的事情都已经为你做好了。

例如:建立一个WebSocket连接非常简单,只需要这样既可:

webSocket = new WebSocket("ws://destination.server.ext", "optionalProtocol")

WebSockek()构造函数为开发者在内部做了所有创建一个HTTP/1.1连接,握手和升级的事情。

可以用"wss://" 去建立一个安全的WebSocket连接。

如果你想自己手动建立一个WebSocket连接的话,你需要自己去处理握手过程。在创建完HTTP/1.1会话之后,你需要在请求上添加Upgrade和Connection这两个请求头。

Connection: Upgrade
Upgrade: websocket
与WebSocket连接有关的请求头

下面这些请求头是WebSocket升级过程中包含的请求头。与Upgrade和Connection头不同,下面这些请求头

Sec-WebSocket-Extensions

声明一个或者多个协议级的WebSocket扩展区告诉服务器使用。在一个请求里使用一个或者多个Sec-WebSocket-Extension头是可以的;放在一起用分号隔开也可以。

Sec-WebSocket-Extensions: extensions

extensions需要用分号分开。需要从插件列表里选择。

例如:Sec-WebSocket-Extensions: superspeed, colormode; depth=16

我们上面例子中的permessage-deflate也在其中。

permessage-deflate | WebSocket Per-Message Deflate | [RFC7692] | None | [RFC7692]

Sec-WebSocket-Key

向服务端提供客户端有权升级为WebSocket的信息。这个头可用于不安全的HTTP想要升级时,为了提供某种程度的保护,防止滥用。key的值使用在WebSocket规范中定义的算法生成,所以这并不保证安全性。

这个key是为了放置非WebSocket的客户端无意中进行websocket连接或者滥用。
本质上,这个key代表着:“是的,我确实是要开启一个WebSocket连接的。”

这个头会自动被使用它的客户端添加,不能被XMLHttpRequest.setRequestHeader() 添加

Sec-WebSocket-Key: key

基于这个key,服务器会在响应的Sec-WebSocket-Accept头中加一个基于这个key的计算数据。

Sec-WebSocket-Protocol

这个头会声明一个或者多个你想要使用的WebSocket协议。
请求头发送Sec-WebSocket-Protocol,响应头也会返回Sec-WebSocket-Protocol。

Sec-WebSocket-Protocol: subprotocols

subprotocols包括以下这些协议:https://www.iana.org/assignments/websocket/websocket.xml#subprotocol-name

上面示例中的mqtt也在其中:mqtt | mqtt | [MQTT Version 5.0]

Sec-WebSocket-Version

作为请求头:
声明客户端使用的WebSocket协议版本。

Sec-WebSocket-Version: version

服务器与客户端通信的WebSocket协议版本:https://www.iana.org/assignments/websocket/websocket.xml#version-number

最常用的是13。
image

作为响应头:
如果服务器不支持WebSocket协议,会返回类似426(Upgrade Required)并且在Sec-WebSocket-Version头中返回支持的WebSocket版本列表。如果不支持,不返回Sec-WebSocket-Version头。

Sec-WebSocket-Version: supportedVersions
Sec-WebSocket-Accept

服务器与客户端建立握手过程中的响应头。至多出现一次:

Sec-WebSocket-Accept: hash

如果有Sec-WebSocket-Key,将字符串“ 258EAFA5-E914-47DA-95CA-C5AB0DC85B11”连接到该字符串,并且取SHA-1的20位 hash值。最后进行base64编码。

在我们的例子中:

Sec-WebSocket-Key: xxx
Sec-WebSocket-Accept: fNs9ByuvC+rD75+tj2GMQAzbJms=

通过Sec-WebSocket-Key生成Sec-WebSocket-Accept的编码过程如下:

const SecWebSocketKey = "xxx"
const helper = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
const result = SecWebSocketKey + helper

const crypto = require('crypto')
const shasum = crypto.createHash('sha1')
shasum.update(result)
const SecWebSocketAccept = shasum.digest('base64');
console.log(SecWebSocketAccept) // fNs9ByuvC+rD75+tj2GMQAzbJms=

在线demo:https://www.jdoodle.com/ia/e3G

既然key到accept的算法已经很明晰了,那么可以通过accept反向求解出key吗?
答案是否定的。这是因为用到了sha1加密。

密码强哈希函数有两个特点:其中一个很重要的特点就是不可逆。不可逆性意味着原始数据无法从其散列中重建,所以不能通过accept反向求解出key。

参考资料:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/101
https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism
https://stackoverflow.com/questions/6984139/how-can-i-get-the-sha1-hash-of-a-string-in-node-js
https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
https://stackoverflow.com/questions/10918983/how-can-decode-sha1-code

文章首发于前端公众号:大大大前端

努力成为优秀的前端开发工程师!

IEC60870-5-101协议解析 IEC 60870-5-101(IEC101)是电力系统监测、控制和相关通信的标准,用于电力系统的远程控制、远程保护和相关通信。这与 iec60870-5-1 至 iec60870-5-5 标准完全兼容,并在 DTE 和 DCE 之间使用标准异步串行远程控制信道接口。该标准适用于点对点、星形、多点等多种配置。 阅读详情

相关推荐

智能变电站协议系列-4、IEC 101、IEC 104协议(IEC 60870)

IEC 101和IEC 104对于智能变电站来说已经属于旧的协议了,其属于IEC 60870,但目前在电力自动化中仍然流行,对于IEC 61850和IEC 60870混用的场景也存在,目前官方赞助商似乎在推一些转换网关来将对应的协议做转换以此解决这种协议兼容问题,国内似乎也有在做这块的网关的企业。IEC 101为串行模式,而IEC 104走TCP/IP。对比一下IEC 60870相较于IEC 61850确实感觉会功能相对少一些,扩展性稍微差一些,但理解上相对简单一些。

逍遥游的博客 9623

web开发服务器状态码,HTTP状态码之101

定义HTTP 101 Switching Protocol(协议切换)状态码表示服务器应客户端升级协议的请求对协议进行切换。实现协议切换的原理Connection: Upgrade该Connection头被设置为"Upgrade"以表示的升级要求。Upgrade: protocols所述Upgrade标头指定的一个或多个以逗号分隔的协议名称。检查服务器是否支持客户端所需要的协议。- 服务器可拒绝...

weixin_39671964的博客 3720

车辆TBOX科普 第50次 车载以太网到云端通信:SOME/IP、MQTT、HTTP/HTTPS协议栈深度解析与实战指南

现代嵌入式系统正经历从轮询查询到实时双向通信的变革,传统HTTP模式已无法满足物联网和工业自动化对低延迟实时数据流的需求。本文深入探讨嵌入式系统的三大核心技术:WebSocket实现全双工实时通信、JSON作为通用数据交换格式、Protobuf提供高效二进制序列化方案。重点解析了WebSocket协议原理,包括握手过程和数据帧结构,并展示了一个轻量级嵌入式WebSocket客户端的完整实现,涵盖连接建立、帧处理、回调机制等关键环节,为开发者提供实时通信与高效数据交换的完整解决方案。

IT深耕十余载,大道之简 1164

网络状态码

网络状态码

m0_50742275的博客 1812

基于STM32与FreeRTOS构建开源联网PLC:从硬件选型到物联网协议集成

可编程逻辑控制器(PLC)是工业自动化的核心,负责执行确定性的逻辑控制。其工作原理基于循环扫描输入、执行用户程序、更新输出的过程。随着工业物联网(IIoT)的发展,传统PLC的“信息孤岛”问题凸显,其技术价值在于通过集成网络能力实现数据上云与远程控制,从而在智能工厂、设备远程运维等场景中发挥关键作用。本文聚焦于利用STM32微控制器与FreeRTOS实时操作系统,构建一个支持MQTT、HTTP等标准协议的联网PLC。通过双核软件架构设计,分离实时控制与网络通信任务,并借助共享内存与信号量确保数据安全交换。项

weixin_34110749的博客 581

智能楼宇协议转换实战:BACnet、Modbus TCP和KNX的5种典型组网方案

本文深入探讨智能楼宇中BACnet、Modbus TCP和KNX三大协议的5种典型组网方案,重点解析协议转换在商业综合体、数据中心等场景的实际应用。内容涵盖从基础架构设计到高级组网技术,包括物理层兼容性考量、核心组网方案实施要点及常见故障排查方法,为工程师提供实用的混合组网指导。

weixin_29268385的博客 168

IoT—MQTT协议:02-MQTT协议通信过程

一、MQTT控制报文 1、MQTT控制报文的结构 Structure of an MQTT Control Packet MQTT协议通过交换预定义的MQTT控制报文来通信。这一节描述这些报文的格式。 MQTT控制报文由三部分组成,分别是固定报头(fixed header)、可变报头(variable header)、有效荷载(数据区域 payload)。 固定报头,所有的MQTT控制报文都包含:可变报头与有效载荷是部分MQTT控制报文包含。 下图为MQTT控制报文的结构 Fixed header

PuddingHou的博客 619

卓岚5143D网关与Modbus Slave的JSON通信实战

本文详细介绍了如何使用卓岚5143D网关实现Modbus设备数据到JSON格式的转换与MQTT发布。通过硬件连接、软件配置及联调测试的全流程实战,重点解析了JSON与Modbus寄存器映射的核心配置步骤,帮助用户快速打通工业设备与IT系统间的数据链路,提升数据采集与集成的效率。

weixin_29189373的博客 185

AutoGPT与MQTT协议结合:物联网设备控制中枢

本文探讨如何将AutoGPT与MQTT协议结合,构建物联网设备控制中枢。通过自然语言理解与任务分解,AutoGPT动态规划操作流程,借助MQTT实现高效、可靠的设备通信,实现智能家居等场景下的自主决策与设备协同控制,推动万物智联发展。

weixin_34162851的博客 468

头歌 JAVA 桥接模式实验

这样,通过客户端代码配置不同的 FileConvertor 子类和 DataHandler 子类(如 OracleHandler 或 SQLServerHandle),即可实现从不同数据库读取数据并转换成不同格式的功能,而无需修改已有代码。

m0_74091276的博客 3191

Autosar开发实战:DaVinci Configurator Pro新建工程保姆级教程(附目录结构解析)

本文详细介绍了使用DaVinci Configurator Pro创建Autosar工程的完整流程,包括环境准备、工程配置、目录结构解析及常见问题排查。通过实战演示和深度解读,帮助开发者快速掌握工具使用技巧,优化工程管理,提升开发效率。特别适合需要理解Autosar开发中DaVinci Config工具链的工程师。

weixin_30872157的博客 456

iOS手机通过MQTT控制ESP32 LED的完整实现

MQTT是一种轻量级发布/订阅模式的消息传输协议,广泛应用于物联网设备远程通信场景。其核心原理基于主题(Topic)路由与客户端角色分离(Publisher/Subscriber),具备低带宽占用、高可靠性及松耦合等技术优势,特别适合资源受限的嵌入式终端如ESP32。在局域网环境下,通过配置iOS端iot on off应用与ESP32固件协同工作,可构建命令下发(ledctl)与状态反馈(led/status)双通道闭环控制链路。该方案无需公网部署,规避了NAT穿透复杂性,是验证MQTT嵌入式集成能力的基础

weixin_35671843的博客 330

量化回测框架三选一:Backtrader、Zipline、PyAlgoTrade,新手到底该跟谁学?

本文对比分析了三大量化回测框架Backtrader、Zipline和PyAlgoTrade,帮助新手选择最适合的入门工具。从安装配置、策略编写到文档查阅,详细解析各框架的特点和适用场景,为量化交易初学者提供实用指南。

weixin_28745309的博客 268

HTTP 协议升级(HTTP Upgrade)机制

HTTP协议升级摘要(148字) HTTP协议升级机制允许将HTTP连接切换为其他协议(如WebSocket),实现从短连接到长连接的转变。其工作原理是:客户端通过请求头"Upgrade"发起协议切换请求,若服务器支持则返回101状态码确认升级。典型应用场景是WebSocket握手过程,通过随机密钥交换建立持久化的双向通信通道。该机制解决了HTTP短连接在实时通信中的局限性,适用于需要高频交互的场景(如智能音箱连续对话),避免了重复建立连接的开销,同时保持了HTTP的兼容性优势。实际开发

qq_39642740的博客 1192

LayaNative源码编译

修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。

末之 1359

2、通过mos管构成的逻辑门电路

一、总结 mos管 是构成 逻辑门电路 的最基本单元。 各个逻辑门电路的真值表如下: 二、各种门 1、非门 NOT 2、与门 AND 3、与非门 把上面与门电路 右边的 非门电路 去掉 NAND 4、或门 OR 5、或非门 NOR 把或门右边的非门电路去掉 6、异或门 XOR 两个输入相异为1,相同为0。 7、同或门 XNOR 两个输入相同为1,相异为0。 ...

engineer0的博客 4万+

MQTT已连接但语音助手不发声?音频链路与协议选型才是关键

在物联网开发中,MQTT作为轻量级消息协议,常用于设备状态上报与控制指令下发,其发布/订阅模型非常适合低频、小数据量的通信场景。然而在语音交互设备中,MQTT仅承担“控制面”角色,真正决定设备能否“开口说话”的,是音频信号的采集、编码、传输与播放链路。ESP32-S3等AI语音开发板通常依赖I2S总线与Codec芯片实现音频数据的双向流转,并借助WebSocket等全双工协议完成实时媒体流传输。理解控制流与媒体流分离的设计原则,掌握音频链路的初始化顺序与故障排查方法,是构建稳定语音助手的核心能力。当遇到“M

weixin_29174141的博客 280

TSMC 65nm PDK衬底文件转换避坑记:从.itf到.itd,解决ADS导入乱码与金属层缺失

本文详细解析了TSMC 65nm PDK衬底文件从.itf到.itd转换过程中的常见问题及解决方案,包括ADS导入乱码与金属层缺失的修复方法。通过环境准备、文件定位、转换操作和问题诊断的完整流程,帮助工程师高效完成衬底文件转换,确保电磁仿真精度。

weixin_30855099的博客 301

Dockerholics家庭自动化:Home Assistant与Zigbee设备集成实战

Dockerholics项目提供了丰富的Docker应用示例,其中Home Assistant与Zigbee设备的集成方案让普通用户也能轻松搭建专业级智能家居系统。本文将详细介绍如何利用Dockerholics提供的compose配置,快速实现Home Assistant与Zigbee设备的无缝对接,打造个性化的家庭自动化体验。 ## 为什么选择Dockerholics的Home Assista

gitblog_00211的博客 1041

AutoSAR配置视频讲解:简介

AutoSAR实验视频讲解:闪烁一颗LED实验【简介】 大家好,欢迎来到雪云飞星的《AutoSAR实验课的视频讲解》专栏。看过《AutoSAR入门到精通系列讲解》的朋友们应该对博主不陌生,有很多朋友加了博主的微信成为了好友,还有朋友约过线下见面,博主很高兴大家能从我的博客中获得一些收获。在专栏里博主挖了很多坑,当时也说过想要录制一个AutoSAR的配置视频教程,素材在20年初就已经录好,中间各种原因足足鸽了一年。当时因为一些技术原因只能通过博客的图文形式展示出来,现在我们剪辑了视频,请了专业的配音,希望以视

雪云飞星的博客 9653

SAP-ABAP:SAP中的用户确认对话框:深入理解与实践POPUP_TO_CONFIRM

本文深入介绍了SAP中的用户确认对话框函数POPUP_TO_CONFIRM,包括其核心参数配置、返回值处理、应用场景和最佳实践。该函数是SAP二次开发中重要的交互工具,用于关键操作前获取用户确认,防止误操作。文章详细解析了参数设置技巧,强调必须全面处理所有可能的返回值,并提供了删除数据、批量操作等典型应用场景的代码示例。同时对比了其他类似弹出函数,帮助开发者选择合适工具。正确使用该函数可提升系统安全性、改善用户体验并符合SAP设计规范。

baidu_35680696的博客 970

现代Web开发必备:HTTP与WebSocket协议深度解析

网络协议是Web开发的底层基础,从HTTP/1.1到HTTP/3的演进解决了队头阻塞、多路复用等核心问题。WebSocket协议则实现了全双工实时通信,在IM、在线协作等场景中发挥关键作用。理解这些协议原理不仅能优化性能(如通过HTTP/2提升40%加载速度),还能解决大文件传输、物联网设备连接等工程难题。随着Web应用复杂度提升,协议知识已成为区分初级和资深前端工程师的重要标准,特别是在实时通信、GraphQL数据查询等前沿领域。

weixin_33428613的博客 254

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

校园物联网建设实战:协议碎片化、数据孤岛与安全边界解析

物联网技术正加速渗透校园、园区等局域场景,但设备联网只是起点。真正棘手的问题往往藏在协议碎片化、数据孤岛与安全边界之中:不同厂商设备采用Modbus、MQTT、CAN乃至私有协议,数据语义与计量口径难以统一,网络边界更因开放环境而面临暴露风险。理解这些基础概念,需要从网关收敛异构协议、以物模型统一数据描述,再通过VLAN隔离与设备级安全加固构筑防线。无论是高校信息中心运维,还是智能化系统集成商,掌握这些原理与工程方法,都能有效降低项目中的试错成本。本文结合真实项目经验,剖析校园物联网从接入、治理到安全防护的

weixin_33812433的博客 294

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

揭秘Python机器人远程控制难题:3步实现稳定低延迟通信

解决Python机器人远程控制延迟高难题,本文详解基于Socket与多线程的Python机器人网络通信方案,适用于远程监控、自动化控制等场景。三步实现稳定低延迟通信,提升响应效率,值得收藏。

ProceChat的博客 596

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Agent-to-Agent协议:破解核能数字化合规瓶颈的工程实践

在高度监管的行业,如金融、医疗和核能领域,复杂系统的合规性验证常面临巨大挑战。传统基于文档和事后审计的方法难以应对动态、实时的智能系统,导致创新成本高昂、周期漫长。其核心原理在于将外部监管要求内化为系统设计的一部分,通过定义智能体间的标准化交互协议,使系统能在运行中自动、实时地证明其行为符合安全规则。这种协议化方法的技术价值在于实现了从“黑箱”到“白箱”的转变,通过强制记录每一次交互的合规依据,为系统提供了可审计、可追溯、可解释的能力。在应用场景上,它不仅适用于核能设施的传感器网络与智能控制,也为金融科技、

weixin_30797199的博客 380

Modbus协议在物联网边缘计算中的新角色:从串行总线到云边协同的智能转型

本文探讨了Modbus协议在物联网边缘计算中的新角色,从传统串行总线转型为云边协同的智能桥梁。通过协议转换、数据预处理和并发优化,Modbus在工业物联网中实现高效数据采集与处理,提升系统性能和安全性,支持智能工厂的现代化升级。

data3的博客 634
上一篇: 如何理解vue中的key?
下一篇: 一份工作4年前端的Git备忘指南
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趁你还年轻233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值