RS-232串行端口有9条线路,可用于传输数据和信令。RFCOMM可模拟RS-232串行端口的串行电缆线路设置和状态。RFCOMM通过L2CAP来处理单连接上的多路复用,并提供到多个设备的连接,从而提供多个并发连接。
RFCOMM依赖蓝牙基带提供可靠的字节流序列传送。它没有任何纠正错误的能力。RFCOMM的流控也使用基带的功能。
RFCOMM数据速率将限制在涉及物理串行端口(类型2设备)的设备中。实现可以选择在虚拟串行端口(类型1设备中)上对数据进行调整。在允许范围内,RFCOMM将提供尽可能高的数据速率,尽管在存在多个连接时,最高数据速率可能是一个复杂的实现(见第18章)。

RFCOMM是一种简单、可靠的传输协议,具有帧、复用和以下附加规定:
• 调制解调器状态 RTS/CTS、DSR/DTR、DCD、铃声。
• 远程线路状态 中断、溢出、奇偶校验。
• 远程端口设置 波特率、奇偶校验、数据位数等。
• 参数协商(帧大小)。

10.1串行端口和UART

通常,串行端口发送和接收数据线连接到UART(通用异步收发器)。UART的任务是在电缆下发送的串行数据和设备使用的并行数据处理之间进行转换。uart使用缓冲区在串行和并行数据之间进行转换。这样可以减少处理器的负载。UART在电缆和缓冲区之间传输位,而不必为电缆中发送的每一个位中断处理器,那么处理器只需在有整个缓冲区需要处理时才需要参与。
来自UART的信号是连接在一起的,因此它们出现在系统地址映射中。一些处理器为I/O保留一个特殊的地址范围;其他系统可以将它们映射到正常内存的任何部分。因为UART看起来像微处理器的内存区域,所以可以通过获取内存区域并设置由UART设置的值来模拟软件中的串行端口。
蓝牙RFCOMM规范讨论了仿真RS-232串行端口的9个电路,并指定了如何住址串行数据流。但是,由于RS-232端口的串行数据流在通过UART后由微处理器查看,因此处理串行端口的软件实际上是在处理并行数据。类似地,RFCOMM软件处理由蓝牙堆栈底层交付的并行数据。
UART连接到一些硬件:导线或缓存。RFCOMM通过L2CAP连接到软件栈的底层。

10.2 RFCOMM设备类型

RFCOMM支持两种类型的设备:
• 类型1–内部模拟串行端口(或等效端口)。
• 类型2–带物理串行端口的中间设备。
!
图10-1左侧显示了1型RFCOMM设备的协议栈。端口仿真实体将系统特定的通信接口(API)映射到RFCOMM服务。这可以用于连接到如图所示的其它应用程序,也可以用于连接到专门为蓝牙编写的应用程序。类型1设备通常是通信路径的末端,例如PC或打印机。
图10-1右侧显示了2型RFCOMM设备的协议栈。端口代理将数据从RFCOMM中继到与另一个设备连接的RS-232接口。类型2设备是位于通信路径中间的中间设备。调制解调器是2型设备的一个例子。

10.3 RFCOMM帧类型

RFCOMM基于GSM TS 07.10,这是一种由GSM手机使用的一种非对称协议,可以将多个数据流复用到同一个物理串行电缆上。RFCOMM是对称的,使用TS 07.10特征帧和命令的子集通过L2CAP发送TS 07.10帧。TS 07.10的一些功能适用于蓝牙。
RFCOMM使用帧进行通信,RFCOMM帧作为L2CAP数据包中的有效负载数据。有五种不同的帧类型:
• SABM—Start Asynchronous Balanced Mode (startup command). 设置异步平衡模式
• UA—Unnumbered Acknowledgement (response when connected). 未编号的确认信息
• DISC—Disconnect (disconnect command). 断开连接
• DM—Disconnected Mode (response to a command when disconnected). 断开连接模式
• UIH—Unnumbered Information with Header check. 未编号的带校验头的信息
SABM, UA, DM和 DISC是底层的控制帧,RFCOMM使用信道,每个信道有一个数据连接链路标识(DLCI),UIH帧上的 DLCI = 0时用作发送控制信息, DLCI≠0时用作发送数据。

10.4 连接和断开连接
因为RFCOMM的帧承载于L2CAP数据包中的有效载荷中,在RFCOMM连接建立之前,L2CAP的连接必须建立
RFCOMM为L2CAP有一个保留的协议和服务多路复用器(PSM)值,这在蓝牙核心规范中定义为0x0003。任何在L2CAP接收帧的PSM字段中使用此值将被发送到RFCOMM进行处理。
在RFCOMM信道上发送的第一帧是SABM帧;这是个开始异步平衡模式命令。如果响应设备的RFCOMM已经连接,则会进入异步平衡模式(ABM),并发回一个UA帧。如果响应设备的RFCOMM没有连接,它将通过发送DM帧来拒绝连接。图10-2显示了RFCOMM信道设置拒绝的方式。

当发送RFCOMM命令后会启动一个60秒的定时器,如果定时器超时时未收到确认信息,则连接将被关闭。这与GSM 07.10不同,GSM 07.10在定时器超时时重新发送命令。在RFCOMM机制中,蓝牙基带提供了可靠的链路,因此如果第一次未被确认,第二次也不会被确认。对于SABM命令,超时时间可以延长,因为安全程序可能意味着此命令的处理时间比其他命令长。如果RFCOMM超时断开连接时,为防止另一侧认为它还处于活动状态,它必须在原来的SABM帧上发送与服务器相同的DLCI的DISC(断开连接)命令。图10-3显示了初始化超时通道被关闭。

如果连接成功,响应方用UA帧回复SABM帧,此时在初始方和响应方,开始参数协商的流程,如图10-4所示。

一旦DLCI=0的连接建立,就可以用于RFCOMM signalling信道。要传输数据,必须建立其他RFCOMM信道。图10-4所示。
建立的第二个RFCOMM信道用来传输数据。在这种情况下,信道需要身份验证,因此在SABM命令帧和UA响应帧之间,有一个暂停以进行LMP身份验证和加密,一旦收到UA帧,模式状态命令被转换成控制信号通信状态。然后可以立即传输数据并显示,也可以进行转换的PN命令和响应来配置新连接的参数。
用户数据应该包括MSCs(Modem Status Commands),用于串口控制信号的状态的通信。
要关闭RFCOMM连接,将发送DISC命令。当最后一个数据链路关闭时,应在DLCI=0上发送DISC以关闭多路复用器。
当然,无论哪个设备关闭多路复用器都要响应L2CAP信道断开连接命令。

10.5 RFCOMM帧数据结构

RFCOMM借鉴了GSM07.10标准的帧结构。图10-5显示GSM 07.10帧结构的基本选项(还有一个高级选项,缺少长度字段;RFCOMM始终使用基本选项)。


图10-6显示了RFCOMM帧的结构。这与GSM07.10基本选项框,除了RFCOMM去掉了开始和结束标志,因为L2CAP数据包的大小的限制,RFCOMM必须限制一个数据包中的字节数。

RFCOMM不需要开始和结束标志,因为每个RFCOMM帧都是在一个L2CAP包中。且无需从网络中选取RFCOMM帧数据流,因此不需要标志位来标记帧的开始和结束位置。

10.5.1 Address 字段

RFCOMM帧以地址字段开头。这标识了多个多路复用的帧所属的各自的通道。地址字段分解,如图10–7所示

EA(扩展地址)字段可用于对地址的扩展。如果EA=0,则其后有更多的地址字节;如果EA=1,则这是地址的最后一个字节。蓝牙规范规定服务器应用程序可被分配一个1到30之间的服务通道号,因此RFCOMM地址帧分配有5bit用于服务通道,因为从来不需要使用扩展寻址,所以在RFCOMM地址字段中EA位始终设置设置为1。
C/R((Command/Response)bit表示是命令帧还是响应帧。它的值不仅取决于帧是命令帧或响应帧,同时也包括是在哪个通道发送的帧。发起连接的设备(在DLCI 0上发送SABM命令)称为发起者,响应设备(在DLCI 0上发送UA响应)称为响应者。只要交互流程遵循这个基本模式,C/R bit是1,来自发起方的命令和来自响应者的响应C/R=1;将方向交换后,C/R bit为0,即来自响应者的命令和来自发起者的响应C/R=0。发送数据时,发起方设置C/R=1,响应方设置C/R=0。图10-8说明了如何设置C/R bit。

C/R位之后是数据链路连接标识符(DLCI)。在GSMTS0.10中,这是一个不可分割的字段,但是在RFCOMM中,它被分为方向位和服务通道号。启动器始终将方向位设置为1(D=1);响应者始终将方向位设置为0(D=0)。作为C/R位,发送SABM帧来启动连接的设备称为发起者,否则称为响应者。
服务通道号有5bit,其范围031,但0和31是保留的,所以只能分配130作为服务的服务通道号。通道0用于发送控制信息;通道31为TS07.10预留。蓝牙避免使用TS 07.10预留的通道,以保持与TS 07.10应用程序的兼容性。
DLCI是在建立数据链路连接之前计算一次。响应设备中的RFCOMM服务通道号用于DLCI。由于服务通道号1~30可用,因此一个设备最多有30个可使用RFCOMM的服务。

10.5.2 Control 字段

如图10-6所示,RFCOMM帧中的下一个字段是控制字段。这是用来识别帧的类型。RFCOMM帧中使用的控制字段值如表10-1所示。(与GSM TS 07.10对应帧中使用的值相匹配。)
P/F是Poll/Final位,在命令中,它被称为P (Poll)位;在响应中,它被称为F(Final)位。

当需要从链路终端设备发出一个响应或一系列响应时,使用P位设为1的命令。响应设备应将F位设为1发送回响应者。等待响应时只有一个命令帧的P位设置为1。
不管P/F位的状态如何,DM包都会被处理,如果P/F位设置为零,SABM或DISC命令和UA响应都会被丢弃。

10.5.3 长度字段

长度字段以EA位开始,如图10-9所示。如果EA=1,那么它后面是7bit的长度,所以长度字段是1字节长。如果EA=0,那么它后面是15bit的长度,所以长度字段是两个字节长。RFCOMM帧的默认长度是32字节,最大长度为32767。

10.5.4数据

数据字段只在UIH帧中出现,数据长度不超过32767字节。大小限制是由L2CAP数据包上的最大传输单元(Maximum Transmission Unit, MTU)设置的,如果系统具有较小的L2CAP MTU, RFCOMM数据的大小同样受到限制。

10.5.5帧检查顺序

计算FCS:
计数k, FCS将被计算的比特数。对于SABM、DISC、UA和DM帧,帧检查序列是根据地址控制和长度字段计算的。对于UIH帧,它是根据地址和控制字段计算的。
接着:
(a)计算Xk (X7 + X6 X5 + X4 + X3 + X2 + X1 + 1)模2除以生成多项式(X8 + X2 + X + 1)的余数。
(b)在插入任何启动和停止元素之前,以及在插入任何其他额外位之前,取FCS计算的帧内容。乘以X8并除以生成器多项式(X8 + X2 + X + 1)。
©将(a)和(b)的结果取2的模,取1的补,得到FCS。
因为UIH帧只计算地址和控制字段上的FCS,它们的数据字段不受FCS的保护。这可能是可靠数据传输的一个缺点,但它的优点是可以为所有正在使用的DLCI预先计算FCS模式。此预计算可在通道建立时进行。

10.6多路复用帧

在DLCI = 0时发送多路复用命令和响应。它们用于控制RFCOMM链路。有七种类型的命令或响应:
• PN-DLC参数协商。
• Test-Checks通信链路。
• FCon / FCoff 所有连接的总流控制。
• MSC-Modem状态,用于每个连接的流量控制。
• RPN 远程端口协商。
• RLS 远程线路状态。
• NSC不支持的命令(仅响应)。
多路复用命令和响应作为消息携带在RFCOMM UIH帧内,如图10-10所示。可以在一个RFCOMM帧中发送多个多路复用命令消息,或者将一个多路复用命令消息拆分到多个帧中。

10.6.1 PN-DLC参数协商

PN命令用于协商数据链路连接的参数。在打开新的数据链路连接之前交换PN命令,这不是强制的。如果没有发送PN命令,将为连接使用默认参数。
PN命令由图10-11所示的类型字段标识。此类型字段是UIH帧中承载PN命令的第一个信息字节(见图10–11)。EA位是1,因为类型字段占用一个字节。C/R位用于指示消息是命令还是响应。

PN消息中的长度字段总是设置为8,值字段包含8个字节,如图10-12所示。这些字节定义了将在数据链路连接上使用的参数,如下所示:

• 6个DLCI bit标识正在协商参数的数据链路连接。
• DLCI后面有2个填充位始终设置为零;插入这些参数是为了避免跨字节拆分参数。
• 4个I位表示用于在信道上传输信息的帧类型。在RFCOMM中,使用值0b1000表示UIH帧。
• 4个CL位提供了要使用的汇聚层。在1.0b之后的版本中,RFCOMM使用Type 1(非结构化的字节流)= 0b0000,这也可以设置为0x0F以启用基于信用的流控制。
• 6个P位为数据链路连接分配优先级:0为最低优先级,63为最高优先级。
• P位之后有两个始终设置为零的填充位;插入这些参数是为了避免跨字节拆分参数。
• 8个T位给出确认计时器的值,在GSM 07.10中,此被用于触发重传;在RFCOMM中,如果计时器超时,连接就会关闭。计时器的值不可协商,但固定为60秒。此字段设置为0表示计时器不可协商。
• 16个N位表示帧的最大大小。
• 8个NA位给出了最大的重传次数。由于蓝牙基带为RFCOMM提供了可靠的传输层,因此RFCOMM不会重传,该值设为零。
• 3个K位定义错误恢复模式的窗口大小。RFCOMM使用基本模式,因此RFCOMM不诠释这些位。
• 5个填充位设置为0,填充最后一个值字段的剩余部分,将值舍入为整数字节数。
所有正在协商的参数都以LSB发送第1个bit的;这是RFCOMM信息的一般规则。
值得注意的是,RFCOMM遵循GSM 07.10标准的约定,并将帧中的位以1~8从最低有效位到最高有效位进行编号。这可能会让那些习惯于看到字节中从0到7的位的人感到困惑。
一个设备发送一个PN消息,另一个设备用另一个PN消息响应。响应可能不会改变DLCI、优先级、收敛层或定时器值。响应可能返回一个不同的定时器值。在这种情况下,发送第一个PN消息的设备将仍然使用它建议的定时器,但是连接另一端的设备将使用它在消息中发送的值。
对于最大帧大小,以一个较小的值响应,但它可能不会为这个参数提出一个更大的值。
在GSM 07.10中,PN消息是可选的。在RFCOMM中,对PN消息及其响应的支持是强制的,如果默认参数令人满意,则不必发送PN消息。PN消息可以一直交换,直到发送第一个消息的设备对发回给它的参数满意为止。一旦应答中有了一组满意的参数,它就可以继续建立连接。

10.6.2测试

test命令用于检查RFCOMM的连接状态。正常情况下,长度字节给出后面的字节数。字节的数量不是固定的,它被用来保存测试模式。链路的远端返回相同的字节。
测试命令类型字段如图10-13所示。因为只使用一个字节,EA位被设置为1。C/R位用于指示消息是命令还是响应。

10.6.3 FCon / fcoffo -所有连接的总流量控制

RFCOMM有一个流控制机制,适用于两个RFCOMM实体之间的所有通道。当任何一个RFCOMM实体无法接收到RFCOMM信息时,它会发送一个流控制关闭(FCoff)命令。当它能够再次接收数据时,当它能够再次接收数据时,它会发送一个流控制开启(FCon)命令。
两个流控命令的type字段结构如图10-14所示。两者都以EA位开始,EA位是1,表示命令类型中只有一个字节。携带该命令的帧中的长度字段被设置为零,因为该帧中没有其他数据。C/R位用于指示消息是命令还是响应。

10.6.4 MSC调制解调器状态命令

RFCOMM还有一种流量控制机制,一次只能应用于一个通道。这是调制解调器状态命令(MSC),由图10-15所示的类型字段表示。EA位是1,因为类型字段占用一个字节。C/R位用于指示消息是命令还是响应。

MSC的命令字段包含虚拟的V.24控制信号,也就是说,如果RFCOMM数据是通过导线而不是通过蓝牙连接传输的,RS-232控制线将具有的设置。命令字段中的信号如下:
• EA扩展地址,设置为1表示只有1个字节的命令。
• FC流控制位,当设备无法接受任何RFCOMM帧时设置为1。当设备能够再次接收时,它发送另一个流控制位设置为0的MSC。
• RTC准备通信位,当设备准备通信时设置为1。
• RTR准备接收位,当设备无法接收数据时设置为0,当设备可以接收数据时设置为1。
• IC来电,1表示来电。
• DV数据有效,设置为1表示正在发送有效数据。
这些值在发送的包中似乎没有意义,但这是因为它们映射到RS-232接口的线路上。明显的,当一个包被发送时,它将拥有有效的数据;谁会费心去发送一个包含无效数据的包呢?然而,在处理物理串口线时,这样的信号更有意义。一个表示有效数据正在发送的信号可以用来激活电路来处理数据。MSC命令只是模拟V.24信号的值,这将用于有线RS-232接口。
来自MSC的信号映射到RS-232信号,如下所示:
• RTC映射到DSR (Data Set Ready)和DTR (Data Terminal Ready)。
• RTR映射到RTS (Request To Send)和CTS (Clear To Send)。
• IC映射到RI (Ring Indication)。
• DV映射到DCD (Data Carrier Detect)。
图10-16显示了如何在命令的控制字段中传输信号。
在发送任何数据以确定RS-232控制信号的状态之前,MSC通过连接发送。当需要改变信号时,也应该发送它。
在MSC中,发送该命令的设备信号的状态被发送。响应只携带来自命令的信号的副本。

10.6.5 RPN远程端口协商

远程端口协商(RPN)命令用于在数据链路连接的远程端设置通信设置。如果在连接过程中需要更改任何通信设置,可以重新发送RPN命令来更改。
RPN类型字段如图10-17所示。

EA位是1,因为类型字段占用一个字节。C/R位用于指示消息是命令还是响应。
RPN命令中的字节长度为1或8。如果长度为1,则有一个包含连接的DLCI的单值字节,该消息被解释为对链接参数的请求。在这种情况下,远程端使用链接上的当前参数进行应答。如果长度字节被设置为8,那么接下来是8个字节是链接参数。如果它们是在命令中发送的,那么它们就是设置链接参数的请求。
图10-18所示,长度字节设置为8时,RPN命令中的取值顺序。

参数掩码定义消息正在更改哪些参数。图10-19显示了RPN参数掩码中位的位置。

在RPN命令中,如果参数掩码位设置为1,则表示应更改的特定参数。如果设置为0,则不会更改参数,可以忽略该值。
在RPN响应中,如果参数掩码位设置为0,则表示在RLS中发送的建议未被接受。相反,参数掩码位设置为1表示新值已被接受,响应的发送方现在使用新值。
RLS命令中各个字段的值与GSM 07.10中的含义相同。

10.6.6 RLS—远程线路状态

当设备需要将错误告知链路的另一端时,它会发送远程线路状态(RLS)命令。
RLS命令由类型字段标识,如图10-20所示。EA位是1,因为类型字段占用一个字节。C/R位用于指示消息是命令还是响应。

长度字节设置为2,因为有两个字节:第一个字节携带EA位C/R位和所有多路复用器命令消息共用的数据链路连接标识符;第二个字节在其前四个位中携带错误状态,如下所示:
如图10-21所示。

线路(L)状态位可以表示三种不同的错误,如下所示:
• 0b1100溢出错误,接收到的字符覆盖了尚未读取的字符。
• 0b1010奇偶校验错误,接收字符的奇偶校验错误。
• 0b1001帧错误,字符未以停止位结束。
如果第一行状态位设置为0,那么RLS命令只是简单地报告该线路上没有错误。
当接收到RLS命令时,将返回一个响应,其中包含从该命令复制到响应中的线路状态。
RFCOMM实现必须识别并响应RLS命令,但如何处理线路状态信息则由实现者决定。

10.6.7 NSC–不支持命令(仅响应)

当设备接收到不支持的命令时,会发送不支持的命令(NSC)响应。
用于标识包含NSC的消息的类型字段如图10-22所示。EA位是1,因为类型字段占用一个字节。C/R位用于指示消息是响应。如果消息来自通过发送SABM启动连接的设备,则C/R=0。如果消息来自响应初始SABM的设备,则C/R=1。

10.7服务记录

提供RFCOMM支持服务的蓝牙设备,必须在其服务发现数据库中有一个如何通过RFCOMM连接的条目。
RFCOMM服务器通道号是动态的。也就是说,服务的通道号可以改变。虽然服务的通道号在服务使用时不会改变,但可以在服务不使用时重新分配。
通过RFCOMM连接到服务所需的最少信息是服务名称(用于标识服务类型)和传输数据的通道号。许多服务具有连接到服务所需的其他附加参数。通过查询SDP记录,设备可以找到通过RFCOMM连接到服务所需的所有信息。
表10-2显示了一个最小的服务记录,它可以用来提供通过RFCOMM连接到服务所需的信息。ServiceClassIDList提供服务的名称。ProtocolDescriptorList给出了支持的协议。由于RFCOMM依赖于L2CAP,因此每当RFCOMM存在时,L2CAP服务就一定存在。这个服务还有一个文本名称,以便在用户界面上表示它。

有关更多信息,请参阅第11章,表11–1,其中显示了如何为耳机应用程序显示RFCOMM信息。耳机应用程序还使用RFCOMM服务来设置和控制耳机连接。

10.8总结

RFCOMM提供串行端口仿真,可用于连接到传统应用程序,也可用于蓝牙配置中的一些数据传输。
RFCOMM支持两种类型的设备:类型1设备是通信路径的末端,支持RFCOMM之上的应用程序;类型2设备是中间设备,具有RFCOMM之上的物理RS-232串行端口。
要建立RFCOMM连接,必须首先建立L2CAP连接。RFCOMM帧在L2CAP包的有效载荷字段中发送。一旦建立了L2CAP连接,就会回送RFCOMM控制帧,以建立数据链路连接标识符(DLCI)设置为0的信令信道。在此基础上,建立后续传输数据的通道。最多可以设置30个数据通道,因此RFCOMM理论上可以同时支持30种不同的服务。(实际上,大多数蓝牙设备都没有足够的资源来支持30种不同的服务。)
RFCOMM基于GSM07.10标准,在蓝牙连接和GSM移动电话连接之间有一些细微的差别。

本文翻译自:
Bluetooth: Connect Without Cables
By Jennifer Bray and Charles Thurman
© 2001 by Prentice Hall PTR
Prentice-Hall, Inc.
Upper Saddle River, NJ 07458

仅供学习使用,请勿用于商业用途。

RFCOMM简单介绍相关推荐

  1. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  2. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  3. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  4. 2021年大数据ELK(二):Elasticsearch简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...

  5. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  6. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  7. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

    LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...

  8. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  9. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

  10. django中使用celery简单介绍

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本章节我们重点在于实现,如何存储任务的结果. 我们将任务函数改为: from celery_demo.celery im ...

最新文章

  1. zabbix API 删除host
  2. 用好 Java 中的枚举,真的没有那么简单!
  3. Hadoop大数据——mapreduce中的Combiner/序列化/排序初步
  4. Android之封装好的异步网络请求框架
  5. initramfs 工作原理
  6. 我的世界java内存不足_[菜鸟级]简单解决内存溢出内存不足、卡机问题(可当启动器使用)...
  7. 独立游戏开发日志:2021年2月12日 改进版反弹跳
  8. 人民币兑换、换硬币 C语言
  9. cad尺寸标注快捷键_CAD快速标注方法你知道几种?
  10. 只做正确的事情,并持续输出价值
  11. ZEMAX | 使用 ZPL 宏进行优化:ZPLM 操作数
  12. 群晖的home和homes共享文件夹介绍
  13. practical c++ metaprogramming(翻译及学习)
  14. smm mysql自增_SMM框架详解
  15. 天地图聚合 java_关于天地图的瓦片下载
  16. Python的提交表单功能
  17. 悄悄说--一个Swing界面的仿qq聊天软件
  18. lightroom安卓_安卓手机版LR预设精选54款,附v5.4.1版apk
  19. Python之pywifi模块
  20. java毕业设计网上书店管理系统源码+lw文档+mybatis+系统+mysql数据库+调试

热门文章

  1. html如何变成xls格式文件怎么打开,XLSHTML 文件扩展名: 它是什么以及如何打开它?...
  2. 抖音作品如何上热门推荐?最新抖音如何上热门攻略技巧。
  3. ceph的数据存储之路(7) -----PG 的状态机和peering过程
  4. python 经典图书排行榜_书榜 | 计算机书籍(3.30-4.5)销售排行榜
  5. 三极管共射放大电路的放大倍数怎么设计?
  6. 《MLB棒球创造营》:走近棒球运动·坦帕湾光芒队
  7. Swarm-BZZ踩坑日记之 如何在Linux下使用docker开30个bzz节点
  8. 【电子器件笔记1】电阻参数和选型
  9. CSS总结-----定位与盒子图
  10. steam无法连接至计算机,无法连接至steam网络怎么办 无法连接至steam网络解决方法【图文】...