multiplexer protocol是GSM中比较重要的协议,在GSM 07.10中对该协议做了详细的描述。说它重要是因为它是衔接手机(TE)和模组(MS)之间的纽带,TE和MS通信,一般是通过一个串口进行,问题在于串口只有一个,而通信的数据类型却有很多种。比如AT Command、voice、 fax、 data、 SMS、CBS、 phonebook、电量状态、GPRS和USSD 等等。如果传输时一个一个来,每种类型的数据都以独占的方式传输(比如在使用GPRS上网时,就不能接收/发送短信),虽然技术上可行,但是对用户来说不太友好。

multiplexer protocol就是用来解决这个问题的:让不同类型的数据在一个串口上传输,而不至于发生紊乱。想想我们的网卡,通常也只有一个,但可以用它来传输任何数据类型,可以用HTTP协议浏览网页,用FTP协议下载/上传文件,用即时通信协议聊天,这些事情同时进行,而不会发生任何干扰,这一切都是由TCP/IP这一系列的协议来保证的。

multiplexer protocol采用的方法是把一个串口模拟成多个串口,对上层应用程序来说,每一个虚拟的串口和普通串口几乎没有差别,只是每个虚拟串口都只能传输特定类型的数据。下面moto的定义:

VOICE_CALL

"/dev/mux0"

SMS_MO

"/dev/mux1"

SMS_MT

"/dev/mux2"

PHONEBOOK

"/dev/mux3"

MISC

"/dev/mux4"

CSD

"/dev/mux5"

GPRS1

"/dev/mux6"

GPRS2

"/dev/mux7"

CSD

"/dev/mux8"

GPRS1

"/dev/mux9"

GPRS2

"/dev/mux10"

LOGGER_CMD

"/dev/mux11"

LOGGER_DATA

"/dev/mux12"

TEST_CMD

"/dev/mux13"

AGPS

"/dev/mux14"

NET_MONITOR

"/dev/mux15"

多个虚拟串口上的数据最终要在一个串口上传输,所以需要用一个标识来区分它们,这就是Data Link Connection Identifier (DLCI)。其中DLC0比较特殊,它用于在MS和TE之间传递管理和控制数据包。比如建立其它DLCI、参数协商和退出multiplexer状态等等。

multiplexer protocol的协议栈如下:

l         最上层是应用层,应用层协议与具体应用有关,比如传递AT Command、Voice和GPRS数据,不同应用的协议是不一样的。

l         最下层是物理层,即串口协议,描述了诸如起始位,校验方式和速率等等。

l         Multiplexer Layers: 传递字节流数据。

l         Convergence Layers: 传递结构化数据。

具体如下图所示:

multiplexer protocol有三种工作模式:基本模式、不带错误恢复的高级模式和带错误恢复的高级模式。

multiplexer protocol定义了下面这些类型服务:

l         Start up services 进入multiplexer模式。

l         DLC establishment services 建立DLC连接,每个连接对应一个虚拟串口。

l         Data services 传输数据。

l         Power Control services 电源管理,进入睡眠和唤醒。

l         DLC Release services 断开DLC连接。

l         Close down services退出multiplexer模式。

l         Control Services 控制服务,主要用于设置一些参数,比如超时时间,重传次数和速率等等。

基本协议数据单元(PDU)格式如下:

Flag

Address

Control

Length Indicator

Information

FCS

Flag

1 octet

1 octet

1 octet

1or2 octets

Unspecified length but integral number of octets

1 octet

1 octet

前后的flag用来标识帧的起始和结束。

Address主要是DLCI,同时还一个c/r用来标识是命令还是命令的回应。

Length是数据的长度。

Information是实际传输的数据。

FCS是校验和,不同类型的帧的FCS计算方法不一样。

control是用来描述数据包类型的。其描述如下:

Frame Type

1

2

3

4

5

6

7

8

Notes

SABM (Set Asynchronous Balanced Mode)

1

1

1

1

P/F

1

0

0

UA (Unnumbered Acknowledgement)

1

1

0

0

P/F

1

1

0

DM (Disconnected Mode)

1

1

1

1

P/F

0

0

0

DISC (Disconnect)

1

1

0

0

P/F

0

1

0

UIH (Unnumbered Information with Header check)

1

1

1

1

P/F

1

1

1

UI (Unnumbered Information)

1

1

0

0

P/F

0

0

0

Optional

上述的PDU(short address/short length)在程序中表示如下:

typedef struct{

__u8 ea:1;

__u8 cr:1;

__u8 d:1;

__u8 server_chn:5;

} __attribute__((packed)) address_field;

typedef struct{

__u8  ea:1;

__u8  len:7;

} __attribute__((packed)) short_length;

typedef struct{

address_field addr;

__u8 control;

short_length length;

} __attribute__((packed)) short_frame_head;

typedef struct{

short_frame_head h;

__u8 data[0];

} __attribute__((packed)) short_frame;

在linux下虚拟串口,主要是实现一个tty_driver,和其它驱动程序一样,要实现诸如打开、关闭、读、写、控制等函数。下面我们看看数据的发送过程,也就是write函数的实现。

函数原型:

static int mux_write(struct tty_struct * tty, int from_user,

const unsigned char *buf, int count)

检查状态:

dlci = tty2dlci[line];

if( ts0710->dlci[0].state == FLOW_STOPPED ){

TS0710_DEBUG("Flow stopped on all channels, returning zero /dev/mux%d/n", line);

return 0;

} else if( ts0710->dlci[dlci].state == FLOW_STOPPED ){

TS0710_DEBUG("Flow stopped, returning zero /dev/mux%d/n", line);

return 0;

} else if( ts0710->dlci[dlci].state == CONNECTED ){

准备数据包:

send_info->frame = d_buf;

queue_uih(send_info, c + 1, ts0710, dlci);

发送数据包:

mux_sched_send

static void queue_uih(mux_send_struct *send_info, __u16 len, ts0710_con *ts0710, __u8 dlci)

{

__u32 size;

长数据包:

if (len > SHORT_PAYLOAD_SIZE) {

long_frame *l_pkt;

size = sizeof(long_frame) + len + FCS_SIZE;

l_pkt = (long_frame *) (send_info->frame - sizeof(long_frame));

set_uih_hdr((void*)l_pkt, dlci, len, ts0710->initiator);

l_pkt->data[len] = crc_calc((__u8*) l_pkt, LONG_CRC_CHECK);

send_info->frame = ( (__u8*)l_pkt ) - 1;

} else {

短数据包:

short_frame *s_pkt;

size = sizeof(short_frame) + len + FCS_SIZE;

s_pkt = (short_frame *) (send_info->frame - sizeof(short_frame));

set_uih_hdr((void *)s_pkt, dlci, len, ts0710->initiator);

s_pkt->data[len] = crc_calc((__u8*) s_pkt, SHORT_CRC_CHECK);

send_info->frame = ( (__u8*)s_pkt ) - 1;

}

send_info->length = size;

}

static void set_uih_hdr(short_frame *uih_pkt, __u8 dlci, __u32 len, __u8 cr)

{

uih_pkt->h.addr.ea = 1;

uih_pkt->h.addr.cr = cr;

uih_pkt->h.addr.d = dlci & 0x1;

uih_pkt->h.addr.server_chn = dlci >> 1;

uih_pkt->h.control = CLR_PF(UIH); /*奇怪:为什么不是SET_PF?*/

if (len > SHORT_PAYLOAD_SIZE) {

SET_LONG_LENGTH( ((long_frame*) uih_pkt)->h.length, len );

} else {

uih_pkt->h.length.ea = 1;

uih_pkt->h.length.len = len;

}

}

Multiplexer是一个对称的协议,也就是说协议连接的双方是对等的,谁都可以发起请求,设置控制参数,或者断开连接(不过要注意应用层协议是非对等的)。

在GSM协议方面我完全是外行,花了两天时间,Multiplexer协议的基本原理差不多清楚了,但仍然有些细节不太明白,以后用的时候再说吧。欢迎大家和我交流。

注:

以上引用的代码源于Motorola的Multiplexer实现,版权归Motorola所有。

以上引用的数据源于GSM 07.10 version 7.1.0 Release 1998

~~end~~

multiplexer protocol相关推荐

  1. GSM 07.10 MUX(multiplexer protocol)

    GSM 07.10 MUX(multiplexer protocol) multiplexer protocol是GSM中比较重要的协议,在GSM 07.10中对该协议做了详细的描述.它是衔接手机(T ...

  2. multiplexer protocol研究笔记

    multiplexer protocol研究笔记 转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd 作者联系方式:Li XianJing <xianjiml ...

  3. multiplexer protocol研究

    multiplexer protocol是GSM中比较重要的协议,在GSM 07.10中对该协议做了详细的描述.说它重要是因为它是衔接手机(TE)和模组(MS)之间的纽带,TE和MS通信,一般是通过一 ...

  4. 协议数据单元I-PDU Multiplexer深入理解

    PDU的全称是Protocol Data Unit,也就是协议数据单元的意思,而在Autosar的规范中描述的是自动共享服务器基本软件模块I-PDU多路复用器I-PDU M的功能.api和配置. PD ...

  5. Oracle ORA-03137: TTC protocol internal error : [12333] 故障分析

    程序通过JDBC 连接数据库异常,报 ORA-03137[12333]的错误. 当前程序的JDBC 驱动版本:ojdbc16-11.2.0.1.0.jar 数据库版本: 11.2.0.3 一. Log ...

  6. Protocol Buffers简明教程

    随着微服务架构的流行,RPC框架渐渐地成为服务框架的一个重要部分.在很多RPC的设计中,都采用了高性能的编解码技术,Protocol Buffers就属于其中的佼佼者.Protocol Buffers ...

  7. Google Protocol Buffers介绍

    Google Protocol Buffers(简称Protobuf),是Google的一个开源项目,它是一种结构化数据存储格式,是Google公司内部的混合语言数据标准,是一个用来序列化(将对象的状 ...

  8. 【C++】Google Protocol Buffer(protobuf)详解(一)

    1.简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准, Protocol Buffers 是一种轻便高效的结构化数据存储格式 ...

  9. java报错MalformedURLException: unknown protocol: c

    java报错:MalformedURLException: unknown protocol: c 1. 报错情况: 部分代码: //打开图片path="C:/Users/MyUser/im ...

最新文章

  1. Tomcat 怎么停止服务的?
  2. android 字符串 转公式,java – 在android中将字符串转换为bigdecimal
  3. 从零开始学Java之 编写简单的工程
  4. 产品小姐姐收到这个黑科技后,开心了一整天...
  5. 谷歌 Nest 和 Fitbit 漏洞奖励翻番
  6. UVA 12300 Smallest Regular Polygon(正多边形)
  7. 【响应式布局】理解设备像素、设备独立像素和css像素
  8. javaScript,Dwr分页模拟
  9. 1000以内完数c语言程序_c语言完数(c语言输出1到1000所有完数)
  10. 科蒂斯控制器故障代码_CURTIS科蒂斯控制器故障代码大全
  11. 2023,快手仍是品牌、商家最值得投入的流量洼地
  12. 星星之火-5:数字无线通信相对模拟无线通信的优点
  13. ZZNUOJ_C语言1134:字符串转换(附完整源码)
  14. 组件封装 - steps组件
  15. BZOJ2876 [Noi2012]骑行川藏
  16. 如何做电视节目的视频直播(电视台节目直播)
  17. ElasticSearch重启脚本
  18. Fluent流体材料——NIST Real Gas模型
  19. 关于iOS中图片处理的小结
  20. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(三):scapy——网络的掌控者

热门文章

  1. 国产PLC应该学习一下国产变频器
  2. 百宝云ERP管理系统行业案例
  3. sql提取身份证号信息--省市区县,年龄分组
  4. 稳定性同位素示踪技术和放射性同位素示踪技术的研究进展
  5. 将 Kali v.2020_2 x64 GNOME 3 桌面上的Top Bar 移到底部
  6. 关于出现 Error creating bean with name 'sqlSessionFactory' defined in URL的错误
  7. 高等数学:第二章 导数与微分(6)函数的微分
  8. 为什么blender安装后无法打开_登录SAP软件系统后无法正常打开文档怎么办?
  9. Python PDF 转 TXT
  10. axios请求拦截器在请求头中添加token