C-V2X 网络层及适配层解析填充

5 篇文章 8 订阅

网络层及适配层解析填充


一、适配层

  适配层提供底层接入技术与上层协议栈之间的传输适配功能。其中,适配层接收上层发送的DSMP 数据包、IP 数据包或DME 数据包,区分待发送数据包所使用的底层接入技术,并将相应数据包递交到符合对应接入技术的底层进行传输;或接收来自底层的数据包,区分相应数据包所属的上层协议类型,并将数据包递交给指定的上层协议栈。
  合作式智能运输系统专用短程通信网络层业务需支持无连接无确认的LLC 操作、子网接入协议和IP 数据报传输协议。
  适配层帧格式如下图所示,适配层帧包含适配层帧头以及适配层有效载荷两部分。适配层有效载荷用于封装上层数据包。适配层帧格式中的比特顺序为高位在前(大端模式)。
适配层描述
  其中协议类型(Protocol Type),用于指示上层数据包所使用的协议类型,目前所用的为DSMP协议,即“04”,具体见下表:

取值协议类型(Protocol Type)
0IPV6
1保留
2保留
3保留
4DSMP协议
5IPV4
6~255保留

二、网络层(DSMP)

  DSMP协议即专用短程通信短消息协议,关于DSM消息的逐层定义如下图所示:
DSM逐层打包
  DSM 的数据帧格式见下表。DSM 数据帧格式中的比特顺序为高位在前(大端模式)。

字段一字段二字段三字段四字段五字段六字段七
3 bits1bit4bitsVarVar2octetsvar
DSMP VersionDSMP Option IndicatorReservedExtensionAIDLengthData
DSMP 版本DSMP 可选域指示预留扩展域应用标识数据长度数据
  注1: DSMP 版本(Version),区分不同的DSMP 版本号(0~7)。本标准中DSMP 版本取值为0。
  注2: DSMP 可选域指示(DSMP Option Indicator),取值为1 表示后面的扩展域出现,取值为0 表示后面的扩展域不出现。
  注3:预留域(Reserved),预留比特,此版本全部取0。
  注4:扩展域(Extension),预留可用于其它信息,包含其它信息标识、其它信息长度和其它信息内容三部分,其它信息标识就是Element ID,具体见5.2.3.3 节。扩展域长度、内容等信息将与标准版本相关联。
   注5:应用标识(Application ID,AID),应用服务商的应用标识,区分不同的应用。
  注6:数据长度(Length),表示应用层数据实体的字节长度。
  注7:数据(Data),是承载的应用层或管理子层数据实体。

  其中字段一至四填0x00即可,字段五AID应用标识用于区分不同的应用,详见下表:

AID应用领域或其它描述消息
17在“四跨”活动前所有的应用标识均为17-
111车车基本安全应用-普通车辆状态BSM,常规
112车车基本安全应用-普通车辆关键事件提醒BSM,事件
113车车基本安全应用-紧急车辆状态BSM,常规
114车车基本安全应用-紧急车辆关键时间提醒BSM,事件
3617车车基本安全应用-后装车载终端BSM
3618地图类应用MAP
3619信号灯类应用SPAT
3620道路信息-静态类应用RSI
3621道路信息-半静态应用RSI
3622道路信息-动态应用RSI
3623道路提醒类应用RSM

  需要注意的是,AID 采用变长字节表示形式,目前最多支持2 个字节的表示,最少采用1 个字节表示,方式见下表:

字节0的最高两位(x表示不关心)b7 b6AID长度(byte
0 x1
1 02
1 1>=3 保留

  如上表中AID区分,对于“车车基本安全应用-普通车辆状态”,即aid为111,填充aid时则填充0x6F;而对于“地图类应用”,即aid为3618,填充aid时则应填充为0x8E22,其中字节0的前两位“10”表示aid长度为2字节,剩余的14位“0xE22”表示为3618。
  字段六直接填应用层数据实体的数据长度即可,即不包含DSM报头的数据载荷长度,其大小为2字节,大端模式。
  字段七为应用层有效载荷,即经UPER编码后的应用层数据。

备注

  在上文中曾多次提及到大端模式,即对于一个多字节的数据,其高字节数据存放在低地址,而低字节数据存放在高地址,与小端模式(intel)正相反,
  假如有一个4字节的数据为 0x12 34 56 78(十进制:305419896,0x12为高字节,0x78为低字节),若将其存放于地址0x4000 8000中,则有:


  如“网络层(DSMP)”一节中我们谈到的aid为3618的地图类应用,虽然其值为0x8E22,但是若我们的计算机默认是小端模式的,当经过如下赋值

aid = 0x8e22;

  则实际DSM协议解析出来的数据却是“0x22 0x8E”,所以需要进行大端的转换,由于网络字节序一律为大端,而目前个人PC大部分都是X86的小端模式,因此网络编程中不可避免得要进行网络字节序和主机字节序之间的相互转换,下面是 socket 提供的转换函数,

#define ntohs(n)     // 16位数据类型网络字节顺序到主机字节顺序的转换  
#define htons(n)     // 16位数据类型主机字节顺序到网络字节顺序的转换  
#define ntohl(n)     // 32位数据类型网络字节顺序到主机字节顺序的转换  
#define htonl(n)     // 32位数据类型主机字节顺序到网络字节顺序的转换

  或者可以声明一个大小为2的字节数组,手动将高字节数据放置低地址中去,如:

byte aid[2];
aid[0] = 0x8e;
aid[1] = 0x22;

  更多关于大小端模式的介绍,参考此篇博客。

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值