前言
随着小汽车普及,交通部制定了一系列标准的协议,例如JTT808、JTT905、JTT1078,来定义道路运输车辆卫星定位系统终端通信协议,以及实现出租车业务逻辑。本文就介绍了JTT808协议的实现。
一、JTT808部标协议
本部标协议适用于道路运输车辆卫星定位系统车载终端和监控平台之间的通信
二、实现代码段
void jt_receive_parse(u8 *data, u16 len)
{
u16 msg_id, msg_attr, body_len, serial_num;
......
//合法检测
if((NULL == data) || (len < 15) || (0x7E != data[0]) || (0x7E != data[len - 1])) {
return;
}
//转义
real_len = jt_unescape(data + 1, len - 2); //长度已经减去7E头尾2字节
data[real_len + 1] = 0x7E; //转义之后数据可能变短,须将结尾的7E提前
if(real_len < 13) {
return;
}
//校验
xor_val = data[real_len];
if(xor_val != CheckXOR(data + 1, real_len - 1)) {
return;
}
//提取各种数据
msg_id_backup = msg_id = (data[1] << 8) | data[2];
msg_attr = (data[3] << 8) | data[4];
serial_num = (data[32] << 8) | data[33];
multi_pkg = (u8)((msg_attr >> 13) & 0x01);
body_len = msg_attr & 0x03FF;
//判断是否分包
if (multi_pkg) {
if (body_len != (real_len - 17)) {
return;
}
total_pkg = U8ArrayToU16(&data[13]);
cur_pkg = U8ArrayToU16(&data[15]);
pbody = &data[17];
} else {
if (body_len != (real_len - 38)) {
return;
}
pbody = &data[38];
}
switch(msg_id_backup)
{
case 0x8001: //通用应答
{
u16 id_reply = (pbody[2] << 8) + pbody[3];
if(body_len < 5)
{
break;
}
switch(id_reply)
{
case 0x0102://鉴权应答
{
jt_rx_authority(pbody[4]);
}break;
case 0x0003://注销应答
{
jt_rx_logout(pbody[4]);
}break;
case 0x0002://心跳
{
jt_rx_heart(pbody[4]);
}break;
case 0x0200://位置应答
{
if (CHECK_ACC())
{
is_send_position_ok = 1;
}
}break;
case 0x0201://位置信息查询应答的应答
{
break;
}
case 0x0704://盲区应答
{
}break;
case 0x0FB1:
{
break;
}
case 0x0FB2:
{
break;
}
default:
{
}break;
}
break;
}
case 0x8003://服务器重传分包请求
{
u8 rc = jt_server_retran_pack_request(pbody, body_len);
break;
}
case 0x8100: //注册应答
{
jt_rx_register(pbody, body_len);
break;
}
case 0x8102: //鉴权应答
{
u8 temp[16];
jt_rx_enc_authority(pbody, body_len);
break;
}
#if 1
//设置终端参数
case 0x8103:
{
u8 rc;
rc = jt_set_terminal_param_proc(pbody, body_len);
//回复通用应答
jt_send_general_resp(serial_num, msg_id, rc);
break;
}
//查询终端参数
case 0x8104:
{
u8 item_num = sizeof(support_params) / sizeof(u32);
jt_send_general_resp(serial_num, msg_id, 0);
jt_send_query_param_resp(serial_num, (u32 *)support_params, item_num);
break;
}
//终端控制
case 0x8105:
{
u8 rc;
rc = jt_terminal_ctrl_proc(pbody, body_len);
//回复通用应答
jt_send_general_resp(serial_num, msg_id, rc);
break;
}
//查询指定终端参数
case 0x8106:
{
u8 i, item_num;
u16 j = 0;
u32 item_id[20]; //长度根据支持的参数总数进行调试
jt_send_general_resp(serial_num, msg_id, 0);
item_num = pbody[j++];
for (i = 0; i < item_num; i++) {
item_id[i] = U8ArrayToU32(&pbody[j]);
j += 4;
}
jt_send_query_param_resp(serial_num, item_id, item_num);
break;
}
//查询终端属性
case 0x8107:
{
jt_send_general_resp(serial_num, msg_id, 0);
jt_query_attribute_resp();
break;
}
//下发终端升级指令
case 0x8108:
{
break;
}
//位置信息查询
case 0x8201:
{
jt_send_general_resp(serial_num, msg_id, 0);
jt_get_position_resp(serial_num);
break;
}
//临时位置跟踪控制
case 0x8202:
{
//回复通用应答
jt_send_general_resp(serial_num, msg_id, 0);
break;
}
case 0x8300:
{
jt_handle_tts(pbody, body_len);
//回复通用应答
jt_send_general_resp(serial_num, msg_id, 0);
break;
}
//事件设置
case 0x8301:
{
u8 rc;
rc = jt_set_event_proc(pbody, body_len);
//回复通用应答
jt_send_general_resp(serial_num, msg_id, rc);
break;
}
//安全认证下行消息
case 0x8FB0:
{
break;
}
//终端配置参数下发
case 0x8FB3:
{
u8 rc;
//回复通用应答
jt_send_general_resp(serial_num, msg_id, rc);
break;
}
//密钥更新指令
case 0x8F05:
{
s16 rc;
u8 temp[192];
#if 1
rc = jt_update_pk_command(pbody, body_len);
if (rc < 0) {
} else {
jt_send_register();
}
#endif
break;
}
#endif
default:
{
JT_TC("JT 不支持的消息ID:%04X,%u\r\n", msg_id, serial_num);
break;
}
}
}
总结
进一个了解QQ 409259564