首先看libgbdsrc/src中的dbdsrc.c文件
_gbdsrc_thread_func 开头函数 完成了用函数_connect_rsu连接天线,并且使用select 监听套接字 ,当接受到包时,使用trans_obj.c的函数gbdsrc_recv接收,然后调用protocol.c 中的gbdsrc_protocol_process 开始对接受到的包进行分析。
pkg_size = _package_decode(buf + 2, &pkg_p, buf_len - 4); 去掉包头的STX和包尾的BCC和ETX
然后流程如下:
1.先看如果是b2 b3 b4 指令,如果pkg[6]errorcode == 0x08 发送c2停止交易的指令
2.如果是b0(设备状态信息帧) 忽略
3如果是b1 (地感状态信息帧) 则会送c1指令
4 如果是b2 (vst)
memcpy(&v, pkg + 2, 4);
if (v == 0) {
_gbdsrc_send_c2_package(svc, pkg[0]);
break;
}
如果如法获取OBUID号,则发送c2指令
if ((pkg[32] >> 7) != 0) {
_gbdsrc_send_c2_package(svc, pkg[0]);
gbdsrc_on_trans_failed(svc, ERR_NO_ICCARD, ERR_NO_ICCARD_STR);
break;
}
如果通过判断OBUID发现无IC卡存在,发送c2指令
当pkg[6] errorcode ==0 时,记录 obuID 和obu状态 然后发送c1指令
5 如果是B3 (OBU信息帧)
判断svc->obu_id中存储的OBUID和B3信息帧中存储的ID是否相同,如果不同则发送C2指令
如果相同的话则首先查询黑名单,如果此OBUID在黑名单中,则终止交易,发送C1指令
如果此OBU正常则发送c1指令,并记录OBU记载的车牌号到svc->veh_num中
记录OBU存储的车辆类型到svc->veh_type 中
6 如果是B4 IC卡信息帧
先验证errorcode
然后是一个数据结构
typedef struct {
lane_type_t lane_type;
trans_type_t trans_type;
/* 交易开始和终止时间 */
struct timeval trans_begin;
struct timeval trans_end;
time_t last_trans_time;
unsigned char psam[6]; /* PSAM卡号 */
unsigned int obu_id; /* OBU序列号 */
char veh_num[12]; /* 车牌号码 */
char card_veh_num[12]; /* 卡内车牌号码 */
unsigned int veh_type; /* 车型 */
unsigned int card_balance; /* 交易后余额 */