multiplexer protocol研究
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研究相关推荐
- GSM 07.10 MUX(multiplexer protocol)
GSM 07.10 MUX(multiplexer protocol) multiplexer protocol是GSM中比较重要的协议,在GSM 07.10中对该协议做了详细的描述.它是衔接手机(T ...
- multiplexer protocol研究笔记
multiplexer protocol研究笔记 转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd 作者联系方式:Li XianJing <xianjiml ...
- multiplexer protocol
multiplexer protocol是GSM中比较重要的协议,在GSM 07.10中对该协议做了详细的描述.说它重要是因为它是衔接手机(TE)和模组(MS)之间的纽带,TE和MS通信,一般是通过一 ...
- oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...
天萃荷净 深入研究Oracle坏块obj$导致exp/expdp不能执行导出的原因 上篇(案例:Oracle出现obj$坏块exp/expdp导出不能导出的解决办法ORA-01578 ORA-0111 ...
- signal一次一密原理研究(Signal protocol开源协议)
目录 1. Signal protocol概述 2. Signal protocol逐层研究 2.1 迪菲-赫尔曼密钥交换协议 2.1.1 关键点 2.1.2 举例 2.1.3 优点 2.1.4 缺点 ...
- 协议数据单元I-PDU Multiplexer深入理解
PDU的全称是Protocol Data Unit,也就是协议数据单元的意思,而在Autosar的规范中描述的是自动共享服务器基本软件模块I-PDU多路复用器I-PDU M的功能.api和配置. PD ...
- javascript_治愈JavaScript疲劳的研究计划
javascript by Sacha Greif 由Sacha Greif 治愈JavaScript疲劳的研究计划 (A Study Plan To Cure JavaScript Fatigue) ...
- class没有发布到tomcat_基于Tomcat的Websocket范例及permessage-deflate扩展特性的研究
0x00 前言 当前已经成为和空气水食物并列的生存必需品的互联网,其典型的应用大多采用基于HTTP协议的B/S这一基础架构.作为自1994网景发布第一款浏览器以来就存在的这一技术体系,尽管20多年来不 ...
- 智慧城市建设的关键技术研究
目前我国正处在快速的城市化进程中,城市规模不断扩大,在促进经济.社会.人文发展和拉动国家整体发展水平上都起到非常重要的作用.然而,随着城市环保.节能.交通.产业转型等压力上的日益增加,亟需新的城市发展 ...
最新文章
- 75 Zabbix中文乱码问题
- 编程语言中的Lambda 函数是如何产生的 它究竟有什么用
- 夏季十一款降温饮料的制作方法
- ES5-7 立即执行函数、闭包深入、逗号运算符
- C++ 堆、栈、自由存储区、全局静态存储区和常量存储区
- Build the backend services needed for a WebRTC app
- ApacheCN PHP 译文集 20211101 更新
- netty java_GitHub - leihuazhe/Java11-Netty-Demo: 基于Java11 构建的 netty 服务端客户端 模块化例子...
- Mybatis-Plus注解自定义sql分页查询
- 计算机的主要元器件介绍,计算机基础电子元器件介绍
- JavaScript随机生成信用卡卡号的方法
- 邱昭良:“碎片化”学习真是“一场骗局”吗?
- 如何设置自定义任务栏图标_如何在Windows中自定义和调整系统任务栏图标
- Python高级-前端-01-HTML和CSS
- Matlab——向量及其运算
- html静态网页制作的博客,[推荐]初学制作静态网页HTML推荐标准_
- C++产生随机数的几种方法
- Race_Condition_Vulnerability
- 税控服务器信息维护,税控服务器管理系统操作介绍(IE6版).ppt
- 【Xasset谷歌分包】打包AAB并上传谷歌商店操作流程分享
热门文章
- 可怕!简直了! 无人机竟然“操控”了机场!
- [Java]_[初级]_[如何调用外部命令获取输出并设置它的超时退出]
- visual studio2019创建解决方案,并在一个解决方案中包含多个项目
- 翻译要忠实于原文吗?
- Hadoop MapReduce编程模型
- 高速球滑环在监控方面的应用
- 安卓数据转移到iphone老是中断_iPhone数据备份、转移太麻烦?一根数据线就能轻松搞定...
- 2019-2020-1 20175227 《信息安全系统设计基础》第三周学习总结
- powerbi餐饮行业案例智能报表制作
- 基于JAVA学生协会管理系统计算机毕业设计源码+数据库+lw文档+系统+部署