4G_module/custom/jt808/src/jt808_set_TermParam.c

295 lines
12 KiB
C
Raw Normal View History

#include "jt808_set_TermParam.h"
#include "gps_config.h"
#include "jt808_msg_pkg.h"
#include "jt808_msg_parse.h"
#include "jt808_pkg_transmit.h"
#include "cm_sys.h"
#include "cm_sim.h"
Term_Param_item_t jt808_term_param_item; // 终端参数项
// 控制车辆状态
void jt808_Set_CarStatus(uint8_t status){
// (void)status;
// TODO: 车辆控制状态
}
// 获取车辆状态
uint8_t jt808_Get_CarStatus(void){
// TODO: 车辆控制状态
return 0;
}
// 设置终端参数
int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_len){
switch(param_id){
case HeartBeatInterval:{
jt808_term_param_item.set_term_param.HeartBeatInterval =Swap32(*(uint32_t*)param);
break;
}
case MainServerAddr:{
memcpy(jt808_term_param_item.set_term_param.MainServerAddr,param,50<param_len?param_len:50);
break;
}
case ServerPort:{
jt808_term_param_item.set_term_param.ServerPort =Swap32(*(uint32_t*)param);
break;
}
case DefaultTimeReportInterval:{
jt808_term_param_item.set_term_param.DefaultTimeReportInterval =Swap32(*(uint32_t*)param);
break;
}
case InflexionAngle:{
jt808_term_param_item.set_term_param.InflexionAngle =Swap32(*(uint32_t*)param);
break;
}
case MaxSpeed:{
jt808_term_param_item.set_term_param.MaxSpeed =Swap32(*(uint32_t*)param);
break;
}
case ProvinceID:{
jt808_term_param_item.set_term_param.ProvinceID =Swap16(*(uint16_t*)param);
break;
}
case CityID:{
jt808_term_param_item.set_term_param.CityID =Swap16(*(uint16_t*)param);
break;
}
case CarPlateNum:{
memcpy(jt808_term_param_item.set_term_param.CarPlateNum,param,10<param_len?param_len:10);
break;
}
case CarPlateColor:{
jt808_term_param_item.set_term_param.CarPlateColor =((uint8_t*)param)[0];
break;
}
default:{
// TODO: 未知参数
return -1;
break;
}
}
return 0;
}
// 更新位置基本信息
int jt808_updateLocBasicInfo(Loc_basic_info_t *loc_basic_info){
// (void *)loc_basic_info;
return 0;
}
osThreadFunc_t Autoreport_param_ThreadId;
void Autoreport_param_Task(void *arg){
uint32_t count_Sec = 0;// 计数器
nmeaTIME beiJingTime; // 北京时间
while(1){
// TODO: 自动上报参数
// 1. 位置基本信息
GMTconvert(&gps_data.info.utc, &beiJingTime, 8, 1);
// info.lat lon中的格式为[degree][min].[sec/60],使用以下函数转换成[degree].[degree]格式
jt808_term_param_item.big_loc_report.basic_info.latitude = Swap32(nmea_ndeg2degree(gps_data.info.lat) * 1e6);
jt808_term_param_item.big_loc_report.basic_info.longitude = Swap32(nmea_ndeg2degree(gps_data.info.lon) * 1e6);
jt808_term_param_item.big_loc_report.basic_info.altitude = Swap16(gps_data.info.elv);
jt808_term_param_item.big_loc_report.basic_info.speed = Swap16(gps_data.info.speed * 10);
jt808_term_param_item.big_loc_report.basic_info.direction = Swap16(gps_data.info.direction);
jt808_term_param_item.big_loc_report.basic_info.BCDtime[0] =((((beiJingTime.year+1900)%2000%100/10)&0x0F)<<4) | (((beiJingTime.year+1900)%2000%10)&0x0F);
jt808_term_param_item.big_loc_report.basic_info.BCDtime[1] = (((beiJingTime.mon%100/10)&0x0F)<<4) | ((beiJingTime.mon%10)&0x0F);
jt808_term_param_item.big_loc_report.basic_info.BCDtime[2] = (((beiJingTime.day%100/10)&0x0F)<<4) | ((beiJingTime.day%10)&0x0F);
jt808_term_param_item.big_loc_report.basic_info.BCDtime[3] = (((beiJingTime.hour%100/10)&0x0F)<<4) | ((beiJingTime.hour%10)&0x0F);
jt808_term_param_item.big_loc_report.basic_info.BCDtime[4] = (((beiJingTime.min%100/10)&0x0F)<<4) | ((beiJingTime.min%10)&0x0F);
jt808_term_param_item.big_loc_report.basic_info.BCDtime[5] = (((beiJingTime.sec%100/10)&0x0F)<<4) | ((beiJingTime.sec%10)&0x0F);
jt808_term_param_item.big_loc_report.basic_info.status.val32 = 0; // 清除状态信息
jt808_term_param_item.big_loc_report.basic_info.status.acc =0; // 0:未开启1:已开启
jt808_term_param_item.big_loc_report.basic_info.status.positioning = (0 == gps_data.info.sig) ? 0 : 1; // 0:未定位1:已定位
jt808_term_param_item.big_loc_report.basic_info.status.door_lock = 0; // 0:未锁车1:已锁车
jt808_term_param_item.big_loc_report.basic_info.status.operation = 0; // 0:运营状态; 1:停运状态
jt808_term_param_item.big_loc_report.basic_info.status.circuit_cut = 0; // 0:车辆电路正常; 1:车辆电路断开
jt808_term_param_item.big_loc_report.basic_info.status.val32 = Swap32(jt808_term_param_item.big_loc_report.basic_info.status.val32); // 状态信息(转大端)
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.val32 = 0; // 清除报警标志
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.overspeed = 0; // bit_1 超速报警
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.power_low = 0; // bit_7 终端主电源欠压
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.road_deviate = 0; // bit_23 路线偏离报警
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.car_move = 0; // bit_28 车辆非法位移.收到应答后清零
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.val32 = Swap32(jt808_term_param_item.big_loc_report.basic_info.alarm_flag.val32); // 报警标志(转大端)
// jt808_term_param_item.big_loc_report.basic_info.alarm_flag.gnss_fault = 0 == gps_data.info.sig ? 1 : 0; // 0:无故障1:有故障
if(0 == (count_Sec % jt808_term_param_item.set_term_param.HeartBeatInterval)){
if(0 == jt808_term_param_item.big_loc_report.basic_info.status.positioning){ // 未定位时发送心跳包
jt808_pkg_send(ID_Term_HB,0); // 发送心跳包 // 不接收应答
}else{
jt808_pkg_send(ID_LocReport,10000/5); // 发送位置信息上报包
}
}
count_Sec++;
osDelay(1000/5); // 1S
}
}
// 启动自动上报参数
void jt808_Autoreport_param_start(void){
if(Autoreport_param_ThreadId == NULL){
osThreadAttr_t Autoreport_param_task_attr = {
.name = "Autoreport_param_Task",
.stack_size = 1024,
.priority = osPriorityNormal,
};
Autoreport_param_ThreadId = osThreadNew((osThreadFunc_t)Autoreport_param_Task, 0, &Autoreport_param_task_attr);
}else{
osThreadResume(Autoreport_param_ThreadId); //恢复线程
}
}
// 停止自动上报参数
void jt808_Autoreport_param_stop(void){
if(Autoreport_param_ThreadId != NULL){
osThreadSuspend(Autoreport_param_ThreadId); //挂起线程
}
}
// 初始化终端参数
void jt808_set_term_param_init(void){
memset(&jt808_term_param_item,0,sizeof(Term_Param_item_t));
do{ // 设置终端手机号
char cm_iccid[32] = {0};
char get_iccid_ok = 0;
int error_count = 0;
while(error_count <= 20) {
memset(cm_iccid, 0, sizeof(cm_iccid));
get_iccid_ok = 0;
cm_sim_get_iccid(cm_iccid);
// 统计有效字符
for(int i = strlen(cm_iccid) - 1; i >= 8; i--) {
if(cm_iccid[i] >= '0' && cm_iccid[i] <= '9') {
get_iccid_ok++;
}else{
break;
}
}
JT808_DEBUG("get_iccid_ok:%d\n",get_iccid_ok);
if(get_iccid_ok == 12){ // IC CID 获取成功
JT808_DEBUG("iccid:%d,:%s\n",strlen(cm_iccid), cm_iccid);
rawStrToBcd(jt808_term_param_item.phone_BCDnum, cm_iccid+8, 12); // 终端手机号码
break;
}else{
error_count++;
JT808_DEBUG("get iccid failed count:%d\n",error_count);
}
osDelay(1000 / 5); // 根据需求设置延时
}
jt808_term_param_item.msg_flow_num =0;
JT808_DEBUG("phone_BCDnum:");
for(int i=0;i<6;i++){
app_printf("%02X ",jt808_term_param_item.phone_BCDnum[i]);
}
app_printf("\n");
}while(0);
do{// 注册信息初始化
char read_buf[35] = {0};
jt808_term_param_item.big_reg_info.province_id = Swap16(0); // 省域ID
jt808_term_param_item.big_reg_info.city_id = Swap16(0); // 市域ID
memcpy(jt808_term_param_item.big_reg_info.manufacturer_id, "LAT01", 5); // 制造商ID
while(0 != cm_sys_get_sn(read_buf)){
JT808_DEBUG("get sn failed\n");
osDelay(1000/5);
}
JT808_DEBUG("SN:%s\n", read_buf);
memcpy(jt808_term_param_item.big_reg_info.term_model, read_buf, 20); // 终端型号
while(0 != cm_sys_get_imei(read_buf)){
JT808_DEBUG("get imei failed\n");
osDelay(1000/5);
}
JT808_DEBUG("IMEI:%s\n", read_buf);
memcpy(jt808_term_param_item.big_reg_info.term_id, read_buf, 7); // 终端ID
jt808_term_param_item.big_reg_info.car_plate_color = blue_plate; // 车牌颜色
char CarPlateNum[] ="京A12345"; // 车牌号码
memcpy(jt808_term_param_item.big_reg_info.car_plate_num, CarPlateNum, strlen(CarPlateNum)); // 车牌号码
}while(0);
do{// 授权信息初始化
char str_auth[]="auth code error..."; // 授权码
jt808_term_param_item.big_auth_info.str_auth_code = jt808_malloc(strlen(str_auth)+1); // 授权码
if(jt808_term_param_item.big_auth_info.str_auth_code == NULL){
JT808_DEBUG("malloc auth_code failed\r\n");
}
memcpy(jt808_term_param_item.big_auth_info.str_auth_code, str_auth, strlen(str_auth)+1); // 授权码
JT808_DEBUG("auth_code:%d,%s\r\n",strlen(jt808_term_param_item.big_auth_info.str_auth_code), jt808_term_param_item.big_auth_info.str_auth_code);
// jt808_free(jt808_term_param_item.big_auth_info.str_auth_code);
// jt808_term_param_item.big_auth_info.str_auth_code = NULL;
}while(0);
do{// 终端参数初始化
jt808_term_param_item.set_term_param.HeartBeatInterval = 5; // 心跳包间隔(秒)
char ServerAddr[] ="47.99.118.34"; // 车牌号码
uint32_t ServerPort = 5000; // 服务器端口
// char ServerAddr[] ="36.137.226.30"; // 车牌号码
// uint32_t ServerPort = 36204; // 服务器端口
// memset(jt808_term_param_item.set_term_param.MainServerAddr, 0, 50);
memcpy(jt808_term_param_item.set_term_param.MainServerAddr, ServerAddr, strlen(ServerAddr)+1); // 主服务器地址
jt808_term_param_item.set_term_param.ServerPort = ServerPort; // 服务器端口
jt808_term_param_item.set_term_param.DefaultTimeReportInterval = 60; // 默认时间上报间隔(秒)
jt808_term_param_item.set_term_param.InflexionAngle = 0; // 俯仰角(度)
jt808_term_param_item.set_term_param.MaxSpeed = 0; // 最大速度(km/h)
jt808_term_param_item.set_term_param.ProvinceID = 0; // 省域ID
jt808_term_param_item.set_term_param.CityID = 0; // 市域ID
jt808_term_param_item.set_term_param.CarPlateNum[0] = 0; // 车牌号码
jt808_term_param_item.set_term_param.CarPlateColor = 0; // 车牌颜色
}while(0);
do{// 位置信息上报初始化
memset(&jt808_term_param_item.big_loc_report.basic_info,0,sizeof(Loc_basic_info_t));
jt808_term_param_item.big_loc_report.basic_info.status.val32 = 0; // 状态信息
jt808_term_param_item.big_loc_report.basic_info.alarm_flag.val32 = 0; // 报警标志
}while(0);
PrsResult.term_param_item =&jt808_term_param_item;// 全局变量指针指向终端参数项
// JT808_DEBUG("auth_code:%s\r\n",PrsResult.term_param_item->big_auth_info.str_auth_code);
}
// 释放终端参数
void jt808_set_term_param_free(void){
if(jt808_term_param_item.big_auth_info.str_auth_code != NULL){ // 释放授权码
jt808_free(jt808_term_param_item.big_auth_info.str_auth_code);
jt808_term_param_item.big_auth_info.str_auth_code = NULL;
}
if(jt808_term_param_item.big_specific_params.param_id_list != NULL){ // 释放特定参数列表
jt808_free(jt808_term_param_item.big_specific_params.param_id_list);
jt808_term_param_item.big_specific_params.param_id_list = NULL;
}
if(jt808_term_param_item.big_ctrl_info.str_cmd_params != NULL){ // 释放控制命令参数
jt808_free(jt808_term_param_item.big_ctrl_info.str_cmd_params);
jt808_term_param_item.big_ctrl_info.str_cmd_params = NULL;
}
if(jt808_term_param_item.big_upgrade_info.str_upgrade_pkg != NULL){ // 释放残留升级包内存
jt808_free(jt808_term_param_item.big_upgrade_info.str_upgrade_pkg);
jt808_term_param_item.big_upgrade_info.str_upgrade_pkg = NULL;
}
if(jt808_term_param_item.big_upgrade_info.str_ver != NULL){ // 释放升级版本号
jt808_free(jt808_term_param_item.big_upgrade_info.str_ver);
jt808_term_param_item.big_upgrade_info.str_ver = NULL;
}
Loc_addi_info_t *p_addi_info; // 附加信息
Loc_addi_info_t *p_addi_info_next; // 附加信息下一个节点
p_addi_info = jt808_term_param_item.big_loc_report.addi_info;
p_addi_info_next = p_addi_info->next;
while(p_addi_info != NULL){ // 释放附加信息列表
jt808_free(p_addi_info);
p_addi_info = p_addi_info_next;
if(p_addi_info != NULL){
p_addi_info_next = p_addi_info->next;
}
}
PrsResult.term_param_item = NULL;
}