数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发

3GPP TS 27.007-560 3rd generation partnership project;technical specification group terminals;AT commandd set for UE(User Equipment)  release 51. The document has these clauses below: ScopeReferencesAT command syntaxGeneral commandsCall control commands and methodsNetwork se 阅读详情

摘要: 介绍 3GPP提出的一种终端设备和移动台串行通信的复用协议及嵌入式 Linux系统下串行通信模块的结构和功能划分,在此基础上,提出一种实现这一复用协议的方案。目前,这一设计方案已经开发成功并广泛应用于所开发的车载移动终端产品中。

关键词: TS27.010 串行链路复用 GPRS移动终端 嵌入式 Linux

随 着移动通信技术的迅速发展,具备无线通信功能的移动终端也迅速发展起来。这些移动终端支 持普通的话音、短消息等业务,随着GPRS网络覆盖的迅速扩大,越来越多的手持/车载移动终端也开始支持GPRS上网业务。如何在一个终端设备上整合这些 业务,这是许多移动终端设备开发者面对的问题。笔者在开发一款车载移动终端过程中,采用了3GPP的TS 27.010协议,成功地整合了这些业务。



1.                       TS27.010协议介绍

在常用的GSM/GPRS通信模块中(如Siemens的MC35、WaveCom的 Q2400等),只能通过一个普通9针的异步串口 与终端设备TE(Terminal Equipment)进行通信。TE和MS ?穴Mobile Station ?雪需要通过这个串口交换各种类型的数据 ,例如:语音、传真、数据、SMS、CBS、电话号码本的维护、电池状态、GPRS、USSD等。 如何在一个串口上同时支持这么多的业务?例如,在数据通信过程中,怎样发送或接收SMS?为了解决这些问题,3GPP提出了一个协议 ——TS27.010 协议(Terminal Equipment to Mobile Station Multiplexer Protocol)。有了Multiplexer,即使在数据连接过程中,也可以发送SMS。其它业务组合也可以同时进行。例如,数字语音和SMS同时发 送。Multiplexer的存在使得一个完整的系统能够根据需要进行划分。

3GPP 的Multiplexer设计非常灵活,并且独立于MS/TE平台,已有的应用程序不需要改动即可工作。在设计Multiplexer时,特别考虑到采用 电池供电的设备的需求,所以包含了省电模式控制等很重要的功能,并且Multiplexer本身在运行时也尽量使用最小的功耗和内存。

 



   

Multiplexer 基于ISO的HDLC标准设计 , 工作于有多种选项的单模式下。但是Basic Option并不遵从HDLC。在基本选项模式下,Multiplexer没有透明机制,也没有错误恢复功能。但是在高级选项(Advanced Option)模式下,使用HDLC的透明机制,且Multiplexer有一个方便的再同步机制,能够在DC1/DC3(XON/XOFF)流控打开的 链路上工作,且包含了错误恢复功能。

3GPP的Multiplexer依赖于一个控制信道。在这个控制信道上,TE和MS交换控制信息,例如参数协商、节电控制信息、流控信息等。Multiplexer是一个可选项,如果支持这个功能,就应使用AT+CMUX命令激活它。

 

Multiplexer为TE和MS在一个起始/停止模式的、具有分帧功能的串行链路上传 输数据流提供了一套机制。图1给出了不同的协议层及其功能示意。Multiplexer层负责将数据按字节流的方式传输 ,不再进行进一步的组帧;如果数据 需要按一定结构传输,就需要增加一个会聚层来完成这些功能。

Multiplexer为TE上的进程和MS上相对应的进程提供了一条虚连接,这样TE和MS上的进程就可以通过这条虚连接通信。例如,TE上的SMS应用程序可以通过一条Multiplexer通道与MS上的SMS处理程序连接起来。

TS27.010规范使用8bit字符的start-stop传输模式,两个 Mulitplexer实体间的通信使用了规定的帧格式。TE和MS之间的每个信道称为一条数据链路连接DLC(Data Link Connection) ,这些DLC被依次独立地建立起来。每个DLC都可以有自己的流控机制。


Multiplexer有三种工作模式:Basic、Advanced without error recovery和Advanced with error recovery 。这三种模式特点如下:

 

·Basic:长度标识代替HDLC的透明机制;使用与HDLC不同的标志字;不能用于具有XON/XOFF流控的链路;从同步丢失状态中恢复需要更长的时间。

·Advanced without error recovery:遵从ISO/IEC13239的异步HDLC过程;可以用于具备XON/XOFF流控的链路上;可以更快地从失同步状态恢复。

·Advanced with error recovery:使用了HDLC的错误恢复过程。

 

2.                       Wavecom GSM/GPRS模块Multiplexing协议介绍

 

笔者选用了Wavecom的Q2403A,这是一款E-GSM/GPRS 900/1800的双频模块。这个模块支持大部分常用的AT命令,但不支持标准的TS27.010协议。为了能够数据/命令复用,Wavecom定义了自己的multiplex协议。

Wavecom的复用协议允许一条串行链路上同时进行两个会话(即虚连接):一个AT命令的会话和一个数据通信的会话。AT+WMUX=1将激活模块的复用模式。在这种模式下,AT命令和数据都被封装成数据包。通过包头,可以区分是数据包还是AT命令包。

 

2.1.            AT命令包格式

 

AT命令包帧格式如图2所示。第一个字节(0xAA)用于标识这是一个命令包,第二个字节 是AT命令长度的低八位。第三个字节由两部分组成:低3位是AT命令长度的高3位;高3位用于标识一个AT命令。AT命令的最大长度可以为2047字节。 校验和 ?穴checksum ?雪是包中所有字节(包括头和AT命令)之和对256取模。


2.2.            数据包格式

 

数据包各个字段(除packet type外)意义与AT命令包相同,其帧格式如图3所示。数据包有以下几种类型:

·Type=0 ——DATA 包:这个包是发送到无线链路上或者从无线链路上接收到的数据

·Type=1 ——STATUS包:这个包给出了SA、SB、X和中断条件编码的信息。

状态包的长度总为1字节。任何一个状态(除了break)改变时,所有的状态位都要发送出去。缺省情况下,所有的状态位都是关闭的(因此DTR、RTS都是关闭的),所以在打开复用开关准备传送数据之前,一定要发送一个状态包。

·Type=2 ——READY包:这个包表示发送READY包的一方可以接收数据了。包中没有数据,所以长度字段为0。

·Type=3 ——BUSY 包:这个包表示发送READY包的一方忙,无法接收数据。包中没有数据。

 

 

3.                       Linux下串口通信系统的组成

要在Linux系统上实现TS27.010协议,就必须了解Linux下串口驱动软件模块的结构。

图4不但给出了 Linux kernel中串口通信模块的组成结构,还形象地表示出了数据是如何在用户和硬件接口之间流动的(笔者使用Linux 2.4.19的内核)。从图4可以看到串口通信模块可在逻辑上分为三层:TTY层、line discipline层和底层驱动层。TTY层是用户空间和内核空间的桥梁,用户程序和内核需要通过tty层交换数据;Low-level driver则负责硬件的交互,它对硬件进行控制和读写操作;line discipline层是整个串行通信模块中最灵活、设计最巧妙的一层,它要为一个串行口的使用定下数据交互的 “规程 ”, 在Linux内核中已经存在了许 多line discipline,例如PPP、SLIP、TTY等。缺省使用TTY line discipline。可以根据需要将line discipline替换成Linux已经定义的line discipline结构,甚至替换为自己的line discipline结构。

在图4中,向硬 件接口写数据的过程是显而易见的。但是,用户程序从硬件读取数据的过程却要 复杂一些,这是因为硬件与用户空间之间没有直接的联系。解决的办法就是使用缓冲技术,硬件接收数据存储于kernel buffer中,等待用户程序请求这些数据;如果用户程序请求数据时,这个buffer是空的,那么用户程序就会被挂起,直到buffer中有数据时,它 才被唤醒。实际上,TTY相关的缓冲是由两级构成的:一个 “常规 ”buffer(数据等待着line discpline取走,缺省情况下传到用户空间)和一个 “flip ”buffer(硬件驱动函数将底层进来的数据尽可能快地存入这个缓冲,而不必考虑并 发存取问题,因为这个buffer是每个硬件驱动专有的)。flip buffer由两个物理的缓冲实现,并被交替地写入,这样中断处理函数就会总有一个缓冲可用。

Linux下串 口软件的这种分层结构虽然增加了复杂性,但是它带来的好处是多方面的。第 一,串口模块更加灵活,在为新的串口硬件编写驱动程序时,只需修改和增加最底层的软件即可;第二,上层应用程序可以根据需要改变line discipline的处理软件,在使用PPP、SLIP等协议进行拨号连接时,都需要将原有的line discipline替换为PPP或者SLIP协议本身的line discipline ?鸦第三,可以根据需要,在层与层之间加入一层自己的处理软件。事实上,笔者在实现Multiplex协议时正是这样做的。




 

4.                       Multiplexing协议的实现

 

4.1.            协议实现时的考虑

在实现 TS27.010协议时,基于以下考虑:第一,使用串口的上层应用程序不需要改动。 这一点很重要,因为系统中有许多用户程序使用串口进行通信。如果需要对它们进行改动,那么由此付出的代价显然是不值得的。在这一点上,尤其需要特别考虑 PPP软件,因为在Linux下通过GPRS上网必须使用PPP协议进行拨号。PPP存在于用户空间和内核空间两个地方,用户空间的pppd应用程序完成 拨号连接的管理功能;内核空间的ppp协议软件实现PPP包的组帧/分帧等核心功能。PPP定义了自己的line discipline模块,且到此为止,往下就不再有PPP相关的软件模块(参看图4的分层结构)。第二,尽可能多地实现TS27.010协议。虽然这个 协议的内容很丰富,但是由于Wavecom通信模块只支持有限的几种格式,并且帧头部分还略有不同。这样实现起来就存在许多困难,只能在保证实现 Wavecom复用协议并可靠工作的前提下,尽量实现TS27.010协议,以便于以后硬件和软件的升级。

 

 

4.2.            mux driver的实现方案

 

正是基于以上两点考虑,决定将这个协议的实现放在Line discipline和Low-level driver两层之间,参看图5。这样,不需要对Linux的TCP/IP协议栈软件和PPP软件作任何修改,就可以在复用模式下实现原有的无线上网功能。

图5给出了MUX模块的函数调用和数据流程。TTY Layer、line discipline和serial driver是Linux tty设备文件系统在内核中已有的三层,在前一节已经介绍。

正如笔者在实现 TS27.010协议时所考虑的,为了不影响上层应用程序,MUX必须支持 标准的Linux系统调用,如write()、read()、ioctl()等。write()如果成功,则返回发送的字节数;如果失败则返回-1,并将 errno(Linux系统下一个全局变量,用户接口可以根据这个值判断错误类型)置为合适的值。正如图5所示,write ?穴 ?雪并不是将数据直接发送 出去,要发送的数据首先按照TS27.010协议的要求(笔者使用Wavecom模块,它有自己的协议要求)组成MUX帧 ?熏然后根据数据的优先级排队, 优先级高的数据首先被发送。

同样,对设备 /dev/muxN(0<N<M)的标准的Linux调用read()也不是 由MUX直接支持的。MUX不会知道一个用户应用程序何时读设备/dev/muxN(0<N<M)。read()功能由MUX的上层(主要是TTY层)支 持。MUX根据TS27.010协议(或者Wavecom协议)将物理链路上接收到的MUX包解封装,然后将纯数据发送到设备/dev/muxN(0<N <M)的读缓冲区中。如果设备/dev/muxN(0<N<M)没有足够的读缓冲空间,MUX就会将数据放到自己的接收缓冲区中。

 

 

4.3.            Wavecom复用协议特殊情况的处理

 

 

在实现 TS27.010协议时,考虑到Wavecom协议的特殊情况,在完全实现 Wavecom复用功能的同时,尽可能多地实现TS27.010协议。由于Wavecom只能同时支持两个虚连接,所以这里的M=2。其中, /dev/mux0用于AT命令,作为控制信息通道;/dev/mux1用于PPP连接,作为数据通道。作为Wavecom复用协议的一个严重缺陷,从图 2、图3的帧结构可以看到,从串行链路提交来的数据只能区分出是AT command数据还是DATA数据,而无法确定链路的信息,即无法确定数据是mux0接收,还是mux1接收。为了解决这个问题,笔者在实现时,将底层 提交的数据同时送给mux0和mux1(如果这两个设备都已经打开)。但是考虑到软件的效率和数据的可靠性,在向上层提交数据时,有以下两点例外:第一, mux1是PPP专用的,在PPP没起来之前,mux1可以作为AT命令通道,但是PPP连接成功后(PPP的line discipline已经替换掉了缺省的TTY line discipline),它将不再接收AT命令,所以此时底层提交的AT命令帧不会送给mux1 ?鸦第二,mux0作为AT命令通道,将不接收PPP数 据,所以在PPP连接成功后,不会把0x7E开始和0x7E结束(PPP的帧同步标志字节)的DATA帧发送到mux1。

GPRS网络作 为一种过渡性质的2.5G网络,覆盖日益广泛。由于它的速率高、实时性好、 费用低廉等诸多优势,日益被手持/车载等移动终端设备采用。在使用GPRS网络传输数据的同时,这些设备也必须能支持普通的无线业务,如语音、短消息等。 TS 27.010协议很好地解决了这些业务的复用问题。笔者开发的这套Linux上的multiplexing软件实现了这些功能,使得移动终端能够在PPP 连接不断开的情况下,可以打出/接听电话、发送/接收短消息。

3GPP TS 27.007 version 15.3.0 Release 15英文原版.pdf 3GPP TS 27.007 version 15.3.0 Release 15英文原版.pdf 外网找来的 立即下载

相关推荐

3gpp 27.010

3GPP TS 27.010 V8.0.0 multiplexer protocol (Release 8)

Mesh_provisioning流程整理

Mesh_provisioning流程整理 Provisioning Provisioning(配网过程)是配网器把一个未配网设备加入到mesh网络的过程。配网器会提供配网数据给未配网设备,使它成为一个节点。配网数据包括:netkey,当前的IV Index,和每个元素的单播地址。 配网器通常是手机或者其他移动电脑设备。一个网络需要一个配网器,也可以多个配网器,方法是多个配网器通过分享缓存数据和协调多重配网器来实现。 配网承载层必须稳定的建立在配网器和设备之间。一个设备通过提供它的UUID或者其他信息给配网

weixin_47582534的博客 3251

gsmmux源代码串口多路复用

1.交叉编译后,拿到使用环境。 2.执行命令 gsm0710muxd_bp -s /dev/ttyS0 -b 115200 -n 3 & 3. 打开/dev/chn,打开看到3个端口,通AT命令

(三)数据链路--图解TCP/IP

数据链路的作用指OSI参考模型中的数据链路层,有时也指以太网、无线局域网 等通信手段。TCP/IP中对于OSI参考模型的数据链路层及以下部分(物理层)未作定义。因为TCP/IP以这两层的功能是透明的为前提。数据链路层的协议定义了通过通信媒介互连的设备之间传输的规范。通信媒介包括双绞线电缆、同轴光缆、光纤、电波以及红外线等介质。此外,每个设备至今有时会通过交换机、网桥、中继器等中转数据。实际上,各个

sinat_37138973的博客 1万+

linux gsm0710 CMUX串口多路复用源码

GSM0710 CMUX源码,实现串口多路复用,实测可用 我用在gprs模块端口复用上,linux 下交叉编译后,拷入使用环境,运行gsm0710muxd_bp -s /dev/ttyS0 -b 115200 -n 3 &,成功后可以看到 /dev/下出现 /chn文件夹,打开看到1、2、3 3个端口,3个口都可以通AT命令

从零开始理解二极管限幅:5种典型电路设计及实际应用场景解析

本文系统解析了二极管限幅电路的五大经典拓扑,包括串联与并联型上下限幅及双向限幅。通过剖析其核心原理与二极管的单向导电性、正向压降特性,结合ADC输入保护、电源管理、音频处理等实际应用场景,提供了从器件选型到设计陷阱规避的完整实战指南,帮助工程师为信号构建可靠的“安全笼”。

2y3u4i5o6p的博客 1034

linux串口编程 gsm,linux 中用n_gsm实现3gpp MUX协议

n_gsm 是一种tty设备上的线路规程(line discipline),来实现3gpp MUX协议n_gsm 实现方法如下:1. kernel配置文件中 打开 CONFIG_N_GSM=y 编译内核2. cat /proc/device | grep gsmtty 查看gsmtty主节点号3. 建立虚拟串口例如:(例子中主节点号为251)busybox mknod /dev/ttygsm0 ...

weixin_35203962的博客 696

一分钟学会MATLAB-数据清洗(含完整代码)

数据清洗是数据分析过程中的一个重要步骤,目的是提高数据的质量,以便进行更有效的分析。% 删除超出阈值的行。% 用线性插值填充缺失值。% 删除包含缺失值的行。% 找到缺失值的位置。% 可视化数据,识别异常值。缺失值是数据清洗中常见的问题。通过以上步骤,你可以有效地清洗数据,使其准备好进行后续的分析和建模。

2402_87132195的博客 3316

CMUX帧结构以及开启

帧事例一:             Flag Address Control Length Indicator FCS Flag 1B 1B 1B 1B/2B 1B 1B F9 03 3F 01

luowei568567784的专栏 4219

从零开始用飞牛fnas搭建集成DeepSeek-R1的远程AI工作台

从零开始用飞牛fnas搭建集成DeepSeek-R1的远程AI工作台

AI+全栈,AI+应用,实操落地,前沿技术 3807

高德地图-获取定位-失败原因-浏览器定位异常场景

提示:也能实现,但是需要https协议,而且请求时间很长,要么你用梯子,还是不太合适.

shi15926lei的博客 4206

数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发【转】...

转自:http://blog.csdn.net/hellolwl/article/details/6164449 目录(?)[-] 协议介绍 模块协议介绍 1            命令包格式 2            数据包格式 下串口通信系统的组成 协议的实现 1            协议实现时的考虑 2            的实现方案...

weixin_33725126的博客 199

用OpenCV+ROS实现焊接机器人智能纠偏:线激光视觉的算法调参全流程

本文详细介绍了基于OpenCV和ROS的焊接机器人智能纠偏系统全流程。通过线激光视觉系统实时感知焊缝,重点解析了抗干扰图像预处理、改进的Steger算法提取激光条纹中心线,以及从2D像素到机器人基坐标系的完整坐标变换。该系统为应对焊接飞溅、弧光等复杂工况,实现高精度实时路径纠偏提供了从算法优化到工程集成的完整解决方案。

vodka的博客 158

假如操作系统不用中断,只用队列

假如操作系统不用中断,只用队列 这个就要看下操作系统的定时器的实现------- CMUX最多支持80多个串口通道, 操作系统对中断bai信号的处理实际是对硬件du中断的一种模拟, CPU在zhiINTR引脚上接到一个中断请dao求信号,如果此时IF=1,CPU就会在当前指令执行完以后开始响应外部的中断请求,这时,CPU在INTA引脚连续发两个负脉冲,外设在接到第二个负脉冲以后,在数据线上发送中断类型码,接到这个中断类型码后,CPU做如下动作: 1)将中断类型码放入暂存器保存; 2)将标志寄存器内容压入堆栈

wzm_c1386666的博客 271

SAP生产订单技术性完成(TECO)操作指南与实战应用

生产订单技术关闭操作指南主要包括单笔和批量关闭两种方式,通过CO02/COHV事务码完成。

m0_47402127的博客 1932

视觉SLAM十四讲slambook2示例代码所有依赖库的编译安装教程(VTK、OpenCV3、ceres、Sophus、g2o、Eigen、Pangolin、googletest等)

这是2021年的最后一篇博客~ 新年快乐! 0 准备工作   首先需要先安装cmake编译器: sudo apt-get install cmake   以及,将十四讲的示例代码克隆下来(十四讲的源码地址点击这里): git clone --recursive https://github.com/gaoxiang12/slambook2.git   由于里面的3rdparty文件夹内所有内容都来自于其他github仓库,所以需要加上--recursive参数,不然克隆下来的内容不完整。   如果你.

zeeq的博客 7839

如何定义协议-简单

一般的通信协议:数据包= 包头(命令码(1字节)+数据长度(2字节) ) + 数据(n字节) 包含的信息有:指令、源地址、目的地址、数据、校验等部分。 链路层协议:帧头 + 地址 + 命令字 + 数据 + 校验位(帧尾) “ 不要使用结构体,因为结构体必须定义足够的字符串的长度,这个长度当然是要适应最坏的情况,比如文件名为MAX_PATH的长度,但事实上,在很多情况下,我们实际传输的文件名长度并不需要这么多,这就加剧了网络传输的负担,降低了效率。 最好的通讯方式应该是: 定义数据包头+.

奥丁的博客 723

SAP 替代关系完全替代简介

这里产生了成品物料的计划订单,我们查看计划订单中BOM的变化,如下图可以看到物料的需求仍然落在了优先级为1的这个302300005555这个物料上面,并没有考虑到302300006666的这个库存,和我们理解的MRP的完全替代不一样,按我们的理解需求应该是要落在302300006666这个物料料,但是MRP计算后并没有这样进行分配。最近用户在对长周期物料进行备料的时候又提出替代料的问题,主料库存不足的时候需要考虑替代料的在途库存,经常会忘了SAP标准的替代料逻辑,这次一次性把这个逻辑写清楚。

我小时候很黑的博客 1741

ARM Linux 开启 CMUX 功能以及测试代码

CMUX,即串口多路复用,是一种用于在串行通信中实现多路复用的协议。它允许在单个串行连接上同时传输多个数据流,从而解决了多个数据流同时发送的问题。具体来说,CMUX协议利用一个底层物理串口,向上层系统提供多个逻辑串口,每个逻辑串口对应着一个数据链路连接(DLC)。这样,就可以在一条串行接口上同时存在多个会话,如语音、FAX、数据、SMS、GPRS、USSD等。

weixin_46158019的博客 2984

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

GSM 07.10 MUX(multiplexer protocol)

GSM 07.10 MUX(multiplexer protocol) multiplexer protocol是GSM中比较重要的协议,在GSM 07.10中对该协议做了详细的描述。它是衔接手机(TE(Terminal Equipment))和模组(MS(Mobile Station))之间的纽带,TE和MS通信,一般是通过一个串口进行,问题在于串口只有一个,而通信的数据类型却有很多种。比如AT Command、voice、 fax、 data、 SMS、CBS、 phonebook、电量状态、GPRS

BeginnerMind 2656

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

multiplexer protocol研究笔记

multiplexer protocol研究笔记 转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd作者联系方式:Li XianJing 更新时间:2006-12-19 multiplexer protocol是GSM中比较重要的协议,在GSM 07.10中对该协议做了详细的描述。说它重要是因为它是衔接手机(TE)和模组(MS)之间的

国产开源 GUI 引擎 AWTK 6387

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

adb 查看 android usb,Android-adb devices获得的设备标识

在命令行执行adbdevices,你会得到连接上的设备,结果里面有每个设备的标识(serial number)。在adb的其他命令中,你可以用adb–s 来指定用某一个设备来执行命令,但是每个设备的serialnumber都不一样,adb是如何得到的呢?查看adb的源码后,发现其获取serial number的代码如下://D:\project\android\android-1.5\develo...

weixin_29827279的博客 3498
上一篇: Android的垃圾回收机制(android refbase类(sp wp))
下一篇: Android内核源码阅读---ashmem.c
hellolwl
博客等级 码龄24年 16粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值