multiplexer protocol(以下简称MUX) 简单一点就是多路复用,将原有的一条物理通道虚拟成几条可并发的逻辑通道,同网络协议中的物理链路,逻辑链路有点类似.实现上也类似,将逻辑通道上的数据打包,加上包头包尾,再发到物理通道上.

sample picture

上图为建立逻辑通道,发送数据的例子.其中AT+CMUX=0是物理通道上的数据,告诉GSM MODEM(以下简称猫)我要进到MUX模式了,猫响应OK.主机依次发送SAMB0,1,2,3,建立编号为0~3的逻辑通道.猫响应UA表示同意.然后主机就可以使用逻辑通道发命令了,如上图的UIH(1,"ATrn"),猫也在该通道(地址为1)上响应UIH包,数据同物理通道上响应一致,也就是OKrn. 原理上很简单,剩下的问题就是有多少种包,包的格式... 规范07-10里一共定义了6种包(不保括Error Recovery Mode) Set Asynchronous Balanced Mode (SABM) command Disconnect (DISC) command 这两个包是命令包,用来建立,取消逻辑通道 Unnumbered Acknowledgement (UA) response Disconnected Mode (DM) response 这两个是响应包,分别用来回应正确和错误 Unnumbered information with header check (UIH) Unnumbered Information (UI) 这两个可以是命令包,也可以是状态包,区别就是前者不对包的数据部分生成校验码. 再来看看包的格式.07-10支持三种模式,分别是Basic,Advanced,Advance with error recovery. 其中前两种不支持错误纠正,这里我们也只讨论这两种模式. Basic模式包格式为 Flag(1B) Adderss (1B) Control(1B) Length(1~2B) Info(Length指定长度,可变) FCS(1B) Flag(1B) 各项含义如下 Flag固定为0xF9 Adderss 逻辑通道编号,类似于MAC地址.bit1 为 E/A,bit2 为 C/R,bit3~8为逻辑通道号. E/A 为1表示当前字节是否是该项的最后一个字节,这里只能为1 C/R用来指示命令发送方是否是通道发起方,是则为1 如主机建立的逻辑通道1,往该通道上发命令包时,Adderss为0x7,猫响应Adderss也是0x7 Control 为上面说的包类型,其中bit5为P/F,大致可以这么理解,SAMB,DISC包及其响应时,P/F为1(响应为DM时,该位可以是0或1) Length 为Info项长度,bit定义依次为 E/A,L1,L2,...,L7,(L8,...,L15),长度小于128时,E/A为1,不编码第二个字节 Info 类容取决域包类型 FCS 为校验码,UIH,UI包的区别就在这里,UIH不对Info项编码,只编码Adderss,Control,Length Advanced模式包格式为 Flag(1B) Adderss (1B) Control(1B) Info(不定长) FCS(1B) Flag(1B) 其中Flag固定为0x7E 两种模式的区别就是Advanced模式没有Length一项,而是采取了特定格式编码,来决定包何时结束. 具体实现就是发包方对Flag除外其他项编码,碰到0x7E,0x7D等字符则在其前插入0x7D,接受方去掉相应0x7D.这样碰到单独的0x7E则表示包的结束和开始.