DSRC协议数据链路层的研究与实现
田奇峰
北京邮电大学计算机科学与技术学院,北京(100876)
摘 要:DSRC专用短程通信协议是智能运输系统(ITS)领域内用于车路间高速无线通信的重
要基础通信协议。本文分析了 DSRC 通信系统及其协议栈结构,并着重论述了数据链路层
的的主要功能及其服务类型,以 LLC 子层的协议进程为重点,画出了相应的有限状态机,
给出了一种基于 PowerPC处理器和嵌入式 Linux的数据链路层的实现,为 DSRC协议应用
层的开发、ITS相关领域的研究和其他扩展应用提供了重要的实践基础。
关键词:介质存取控制;逻辑链路控制;专用短程通信;智能交通系统;Linux
中图分类号:
1. 引 言
随着全球经济和科学技术的发展,尤其是通信技术的迅猛发展,现有的交通设施已经足
不了人们对交通效率、安全性及舒适性的要求,智能运输系统 ITS(Intelligent Transport System)
就在这种背景下诞生了。专用短程通信(Dedicated Short Range Communication,简称 DSRC)
是智能运输系统领域内针对车辆和道路基础设施间的信息交换而开发的一种专用无线通信
技术,是 ITS最重要的基础通信协议之一。利用它可以方便地实现车载单元(On-Board Unit,
简称 OBU)与路侧单元(Road-Side Unit,简称 RSU)之间的高速、点对点或广播通信,从而将移
动中的车辆与道路基础设施连接成一个网络。DSRC协议在不停车电子收费(E1ectronic Toll
Collect,简称 ETC)、交通信息服务、车辆自动识别(Automatic Vehicle Identification,简称 AVI)
及行车安全等 ITS 应用领域内有着广阔的市场和应用前景。之前国际上已形成以欧洲
CEN/TC278、美国 ASTM/IEEE 和日本 ISO/TC204 为核心的 DSRC 标准化体系。2007 年 5
月,我国正式颁布了《电子收费 专用短程通信》系列国家标准(GB/T20851-2007),进一步
使其成为国内厂商和研究机构竞相研究和开发的热点。本文以 DSRC国家标准为基础。
2. DSRC通信系统
按照《电子收费 专用短程通信》系列国家标准,DSRC 通信系统主要包括三个部分:
车载单元 OBU、路侧单元 RSU以及专用短程通信协议,如图 1所示(车道控制系统、IC卡
存储支付系统、后台数据库系统不是本文重点)。
车载单元 OBU
组合式电子收费系统中,车载单元采用两片式电子标签,由车载电子标签和双界面 CPU
卡两部分组成。双片式 ETC电子标签和双界面 CPU卡同时存储包括车主、车型、车辆物理
参数等固定信息,双界面 CPU 卡存储帐号、余额、交易记录、入口出口编号等信息,双界
面 CPU卡内存储的信息能以接触式和非接触式两种方式进行读写访问。
路侧单元 RSU
路侧单元又称为路边单元、车道单元、车道设备,主要包括路侧天线、车道控制系统和
后台数据库系统。路侧天线主要用来与 OBU通信,其参数有发射频率和功率、调制方式、
编码方式等,能够覆盖的通信区域大约为 3m-100m。
-1-
中国科技论文在线
图 1 DSRC通信系统核心架构
DSRC协议
DSRC 国家标准的主要思路是参照国际上主流的自动识别和短程实时通信技术架构体
系,提出了一种基于开放系统互连模型(OSI)的精简通信协议,该协议基于实时性系统普遍
采用的OSI三层架构,涉及到OSI体系中的三层:物理层(Physical Layer)、数据链路层(Data
Link Layer)和应用层(Application Layer)。该技术标准系列所规定的DSRC通信系统的主要技
术特征是车载单元(OBU)主动式、频分双工(FDD)、小区分割、异步时分多址(Async TDMA)
和同步通信(SDLC)[1]。
(1)物理层。规范无线通信使用的传输介质及上行与下行链路传输介质的物理特性参数。
(2)数据链路层。规定数据链路层的关键参数、通信帧格式、帧封装方式、差错检验与
控制、数据流控制、MAC子层和 LLC子层服务原语等。
(3)应用层。包括传送内核T-KE、初始化内核I-KE和广播内核B-KE,T-KE规定一系列服
务原语和T-ASDU的编码、分段、八位位组对齐、多路复用及其相反过程;I-KE通过信息交
换,实现OBU和RSU之间的通信初始化;B-KE实现广播服务[1]。
3. 数据链路层及 LLC子层状态机
数据链路层位于 DSRC协议栈的第二层,由MAC子层和 LLC子层组成。因为 RSU需
通过其广播与 OBU 建立专用通信链路,所以 DSRC 协议第二层帧的 MAC 控制域在 OBU
端和 RSU端有不同的含义,因而 MAC子层对 DSRC协议而言是特定的,这样也保证了实
时性;LLC子层则是 ISO/IEC 8802-2:1998标准的一个子集。本文的论述是面向 OBU端的。
MAC子层
DSRC国标中,MAC子层的主要功能包括专用通信链路的建立、CRC计算与校验、生成
第二层帧、帧发送、帧接收、帧起始/结束标志的添加和去除、拆帧和服务原语的规定等[1]。
LLC子层
LLC子层产生用于传输的命令 PDU和响应 PDU,并解释接收的命令 PDU和响应 PDU。
LLC规定的功能有:控制信息的初始化;组织数据流;解释接收到的命令 PDU并生成适当
的响应 PDU;LLC子层的差错控制与差错恢复。LLC子层规定对等实体间信息和控制传输
-2-
中国科技论文在线
的协议进程,其逻辑链路控制操作包括两种类型。
类型 1操作(LLC1):规定一个具有最小协议复杂度的不确认无连接方式的服务。在上层
提供了基本数据恢复和顺序功能时使用此类型操作。该数据传输服务提供一组方法,使数据
链路用户实体可采取不确认的方式交换 LSDU,而无需在数据链路层上建立连接,也不需要
任何流控制和差错恢复功能。该数据传输可以是点对点、组播或广播。
类型 3操作(LLC3):规定一个确认无连接方式的数据单元交换服务,它允许一个站点在
传送数据的同时又请求回传数据。该数据单元交换服务提供一组方法,使数据链路用户实体
可以在不建立数据链路连接的情况下交换 LSDU,并在LLC子层进行确认。该数据交换是点
对点的。详情及服务原语见参考文献[1]。
LLC状态机
LPDU(LLC Protocol Data Unit)是指MAC子层从LLC子层接收到的或投递给LLC子层的
逻辑链路控制协议数据单元,它由控制域和信息域组成。 控制域由一个八位位组构成,根
据第 5比特来区分ACn命令和Acn响应。信息域由N(0≤N≤120)个八位位组构成。上层传递的
SDU就包含在其中。控制域控制着PDU的收发及什么时候该产生响应。其编码规则如表 1
所示。在控制域中,还有三个参数对协议通信起着相当重要的作用,它们是:发送序列状态
变量V(SI)、接收序列状态变量V(RI)和接收成败状态变量V(RB)[1]。
表 1 LPDU控制域编码
MSB 7 6 5 4 3 2 1 0 LSB 命令及响应类型
0 0 0 P 0 0 1 1 UI命令(类型 1)
0 1 1 P 0 1 1 1 AC0命令(类型 3)
1 1 1 P 0 1 1 1 AC1命令(类型 3)
0 1 1 F 0 1 1 1 AC0响应(类型 3)
1 1 1 F 0 1 1 1 AC1响应(类型 3)
LLC1状态机
LLC1信息传送通过发送 P比特置 0的 UI命令 PDU实现。MAC控制域的 C/R比特用
于确定 PDU 是否包含命令。第二层的 LLC 无需对接收到的 UI 命令 PDU 进行确认,因此
LLC1的状态转换图比较简单,它只包含一个 READDY状态。LLC1状态转换图如图 2所示。
在 READY状态下,SAP可以接收或发送 LLC1类型的命令 PDU。当MAC子层向 LLC
子层传递一个包含 UI命令 PDU 的 原语,则产生传递给数据链路层用户
一个包含 LSDU 的 原语。该 LSDU 等于接收到的命令 PDU 的信
息域。当数据链路用户传递一个 原语给 LLC子层,则发送一个包含
UI命令 PDU的原语给MAC子层。
Rcv_UI/
Unitdata_Ind
READY
Send_UI/
Unitdata_Req
图 2 LLC1组件状态装换图
-3-
中国科技论文在线
LLC3状态机
LLC3 分为发送组件和接收组件。LLC3 接收组件负责接收远端 LLC 的 ACn 命令并返
回正确的ACn响应,所有的状态信息包含在状态变量中,其状态转换图结构和图 2中的LLC1
相似,这里不再作介绍。LLC3、发送组件相对 LLC1来说,较为复杂,状态有三种:IDLE
状态下可以处理来自数据链路层用户的请求,发送一个新的命令 PDU;WAIT_A和WAIT_R
状态下,组件只能从远端 LLC 接收响应或在超时的情况下进行重发。WAIT_A 状态用于期
望收到不带数据的确认响应情况,WAIT_R状态用于期望收到携带数据的应答响应情况。事
件有 6种,动作有 9种,其状态转换如表 3所示。图中的参数 N3(本设计中规定为 N3=3)表
示最大的重传次数。
事件描述:
1) DATA_ACK_REQUEST:数据链路层用户传递一个 原语给
LLC。
2) REPLY_REQUEST:数据链路层用户传递一个 原语给 LLC。
3) RECEIVE_ACn_RSP(SQR,R,LSDU):MAC子层传递给 LLC子层一个包含 AC0或
AC 1响应 PDU的原语,其中的响应序列比特 SQR(LLC控制域码字的第
8比特)对 AC0响应为 0,对 AC1响应为 1。该事件存在以下参数值:
—SQR=V(SI):响应序列比特与发送组件的 V(SI)状态变量相等。
—SQR<>V(SI):响应序列比特与发送组件的 V(SI)状态变量不相等。
—R=OK:已接收的响应 PDU 状态子域的 RRRR 部分显示为“OK”状态(指示包含一个
LSDU)。
—R<>OK:已接收的响应 PDU状态子域的 RRRR部分显示为除“OK”外的其他状态(指
示不包含一个 LSDU)。
4) ACK_TIMER_EXPIRED:与发送组件相关(该定时器对应特定的专用链路地址)的
确认定时器超时。
5) RETRY_COUNT<N3:发送组件的重传次数小于逻辑链路参数 N3。
6) RETRY COUNT>=N3:发送组件的重发次数大于或等于逻辑链路参数 N3。
2 LLC3发送组件状态转换表
当前状态 事件 动作 下一状态
RECEIVE_ACn_RSP 无 IDLE
DATA_ACK_REQUEST Actionl;Action3;Action9 WAIT_A
IDLE
REPLY_REQUEST Actionl;Action3;Action9 WAIT_R
RECEIVE_ACn_RSP(SQR<>V(SI),
R<>OK)
Action5(STATUS=STATUS_SUBFIELD);
Action4;Action7;Action8
IDLE
RECEIVE_ACn_RSP(SQR<>V(SI),
R=OK)
Action5(STATUS= PE);
Action4;Action7 Action8
IDLE
RECEIVE_ACn_RSP(SQR=V(SI)) 无 WAIT_A
ACK_TIMER_EXPIRED
RETRY_COUNT<N3
Action2;Action3;Action9 WAIT_A
WAIT_A
ACK_TIMER_EXPIRED
RETRY_COUNT>=N3
Action5(STATUS=UNSUCCESSFUL);Actio
n8
IDLE
RECEIVE_ACn_RSP(SQR<>V(SI),
R<>OK)
Action6(STATUS= STATUS_SUBFIELD,
LSDU=NULL);Action4;Action7;Action8
IDLE WAIT_R
RECEIVE_ACn_RSP(SQR<>V(SI), Action6(STATUS=STATUS_SUBFIELD,LS IDLE
-4-
中国科技论文在线
R=OK) DU=GIVEN_LSDU);Action4,7,8
RECEIVE_ACn_RSP(SQR=V(SI)) 无 WAIT_R
ACK_TIMER_EXPIRED
RETRY_COUNT<N3
Action2;Action3;Action9 WAIT_R
ACK_TIMER_EXPIRED
RETRY_COUNT>=N3
Action6(STATUS=
UNSUCCESSFUL);Action8
IDLE
动作描述:
Actionl:SEND_ACn_CMD(SQC,P),传递一个包含 AC0 或 AC1 命令 PDU 的
原语给MAC子层。本动作存在下列参数值:
—SQC=V(SI)将命令序列比特(LLC 控制域码字的第 8 比特)置成与该发送组件 V(SI)状
态变量相等的值。如果 V(SI)状态变量不存在,创建一个值为 0的 V(SI);否则就使用当前值。
—P=0:响应的 P比特置 0。
—P=1:响应的 P比特置 1。
Action2:RE-SEND_OLD_CMD,传递一个最近刚由该发送组件发送的包含 ACn 命令
PDU的原语给MAC子层。
Action3:START_ACK_TIMER,启动发送组件的确认定时器。
Action4:CANCEL-ACK_TIMER,取消发送组件的确认定时器。
Action5:DATA_ACK_STATUS_INDICATION(STATUS)传递给数据链路层用户一个
原语。本动作存在以下参数值:
—STATUS=UNSUCCESSFUL,状态参数被置成确认接收失败。
—STATUS=STATUS_SUBFIELD,状态参数根据接收的响应 PDU的返回状态来设置。
Action6:REPLY_STATUS_INDICATION(STATUS,LSDU)传递给数据链路层用户一个
原语。本动作存在以下参数值:
—STATUS =UNSUCCESSFUL,状态参数被置为确认接收失败。
—STATUS =STATUS_SUBFIELD,状态参数根据接收的响应 PDU的返回状态来设置。
—STATUS =PE,状态参数设置成 PE状态(协议错误)。
—LSDU=NULL,数据参数为空。
—LSDU =GIVEN_LSDU,相关原语给出的数据参数包含 LSDU。
Action7:V(SI)=1-V(SI),将发送组件的 V(SI)状态变量取反。
Action8:RETRY_COUNT=0,发送组件的重发计数器置 0。
Action9:RETRY_COUNT=RETRY_COUNT+1,发送组件的重发计数器值加 1。
4. 数据链路层的具体实现
DSRC协议数据链路层的实现主要包括MAC子层模块的实现和 LLC子层模块的实现。
为了保证协议的实时性和代码效率,本文使用 C语言实现。
-5-
中国科技论文在线
物理层 BUFFER
M_Mac_request
Lpdu
GetCrc16
bit_stuff
send_frame receive_frame
bit_remove
IsCrc16Good
M_Mac_indication
Lpdu
图 3 MAC子层流程图
MAC子层的实现
MAC子层的主要功能和服务原语如 节所述,MAC子层实现以此为基础,其流程图
如图 3 所示。LLC 子层的 LPDU 通过 M_Mac_request 函数进入 MAC 子层,经过给 LPDU
加上MAC地址、MAC控制域、计算 CRC校验、位填充和添加起始结束标记生成第二层帧。
由于本实现不涉及物理层,但为了便于测试,于是通过 malloc 申请了一个 BUFFER,将生
成的帧通过 send_frame函数发送到该 BUFFER。然后通过 receive_frame去轮询该 BUFFER,
如果有一个帧,则将该帧取出,经过去除起始结束标记及填充的零、CRC检验、去除MAC
地址及控制域,生成一个 LPDU,通过 M_Mac_indication 原语以消息的形式将该 LPDU 投
递到 LLC子层的传输控制消息队列。
LLC子层的实现
LLC子层负责调用相应的类型 1或类型 3操作的请求原语把应用层传下来的 LSDU 封
装成 LPDU,并通过MAC子层提供的服务把它们发送出去。同样地,LLC子层也负责接收
MAC子层传上来的 LPDU,并分析起其控制域,以决定调用相应的类型 1或类型 3操作的
indication原语,投递给应用层。
为了实现 LLC子层的状态机,本文使用了 Linux下的多线程库和 POSIX消息队列库,
定时器使用 setitimer与信号和条件变量两种方法实现。整个数据链路层的系统图如图4所示。
T_C_T为传输控制线程,分别负责从应用层和MAC子层接收 LSDU和 LPDU,然后根据其消息
类型将其转发给 LLC1_T线程、LLC3s_T线程、LLC3r_T线程;LLC1_T为类型 1操作线程,
负责类型 1命令的发送与接收;LLC3s_T为类型 3操作发送线程,负责类型 3命令的发送和
其发送状态向应用层的报告;LLC3r_T 为类型 3 操作接收线程,负责命令的接收与投递及
其响应的生成。每个线程有一个以_M结尾的消息队列,并且每个线程只能操作自己的消息
队列,然后根据接收到得消息去驱动 节中的状态机。箭头线表示消息的流动方向。蓝色
箭头虚线为从上层或下层接收的主要消息流。红色箭头粗实线为传输控制线程转发到其他三
-6-
中国科技论文在线
个线程的消息流。
BUFFER
应用层消息队列
MAC-SUBLAYER
LLC1_T
LLC1_M
传输控制
T_C_T
T_C_M
LLC3s_T
LLC3s_M
LLC3r_T
LLC3r_M
M_Mac_request M_Mac_indication
物理层
图 4 链路层系统结构图
LLC子层各消息队列中的消息数据结构如下:
typedef struct
{
byte lid[4]; /*mac addr=link identifier*/
byte type; /*1-11的每个整数代表 LLC子层的一条服务原语*/
byte lpsdu[122]; /*lpdu or lsdu*/
byte len; /*message length*/
byte flag; /*0 means lsdu ; 1 means lpdu*/
byte c_r; /*0 means command ; 1 means response*/
}msg;
5. 测试结果
由于本人没有涉及物理层的工作以及实验室的条件的限制,DSRC协议的链路层无法在
真实的环境中进行验证。但是为了测试结果的正确性,本文采用如下方式进行测试:模拟从
应用层消息队列获得数据,调用 LLC 子层的服务原语,再调用 MAC 子层的服务原语把数
据传到物理层,物理层是通过一个 BUFFER 模拟的,让后再进行相反的过程。测试环境为
嵌入式 Linux和 Freescale的基于 PowerPC的ADS512101评估板。程序测试结果如图 5所示。
有三帧数据,分别是:0x7a 58 b3 f2 c0 3 9c 5e 48 7a bf 74 1、0x7a 58 b3 f2 c0 67 bf 7a 48 5e 9c
41 41和 0x7a 58 b3 f2 c0 f7 ff 5e e8 7a cf 54 11,其中MAC地址域和MAC控制域内容相同,
不同的是 LPDU,主要原因是为了测试类型 1操作和类型 3操作。两个冒号左边的是函数名,
-7-
中国科技论文在线
主要是为了定位数据流动情况。因为类型 1操作和类型 3操作是可以并发进行的,所以第 2
行和第 3行对应于头两帧,由于MAC子层的操作是可重入的,所以第一帧先被处理,第 6
行显示了该帧为类型 1命令帧,第 7行为第二帧的真实内容,第 8和第 9行说明接收线程接
收到了一个类型 3命令帧,第 10至第 12行为对该命令帧的确认帧,第 13行是向应用层报
告该命令帧的发送情况,第 14行为第三帧经过位填充后的显示内容,第 15、16和 17行显
示接收到了该命令帧,第 18行是对该帧的确认帧,最后三行表明收到该命令帧的发送情况
报告和它请求的 LSDU的不可获得。
图 5 系统测试结果图
6. 结论
本文对国标 DSRC 协议的数据链路层做了总体的分析、设计和实现。虽然由于此协议
与硬件密切相关及条件的限制,作者没有在真正的实际环境中测试,但经过在评估板上的模
拟测试,所得结果完全正确,具有较好的性能,且满足时间精度要求,为以后相关领域的研
究和其他扩展应用提供了重要的实践基础。
参考文献
[1] GB/T 20851-2007.电子收费 专用短程通信[S].北京:中国国家标准化管理委员会,2007
[2] 宋茂强.通信软件设计基础[M].北京:北京邮电大学出版社,2008.
[3] IEEE Std -1998 Edition(R2003).Part 2:Logical Link Control[S].NewYork:IEEE,2003
[4] 陈凌旭.DSRC协议数据链路层研究与部分实现[D].成都:西南交通大学,2005.
[5] Stevens.APUE[M].NewYork:Addison Wesley,2005.
[6] Stevens.UNIX Network Programming V2,Second Edition[M].NewYork:PHPTR,2000.
Research and Implementation of Data Link Layer of DSRC
Protocol
Tian Qifeng
School of Computer Science and Technology, BeiJing University of Posts and
Telecommunications, BeiJing (100876)
Abstract
DSRC is a basic communication protocol used for wireless communication between vehicle and road in
the ITS. This paper analyzes DSRC protocol stack and DSRC communication system, states main
functions and service types of data link layer with LLC sublayer as a key point, presents the FSM of
LLC, and gives a implementation of data link layer based on PowerPC processor and embedded Linux
operating system, which lays the foundation for the development of application layer of DSRC protocol,
research of ITS field and other extended application.
Keywords: MAC; LLC; DSRC; ITS; Linux
-8-
中国科技论文在线