add:增加上位机交互框架、Flash R/W 框架

This commit is contained in:
2026-05-08 18:17:26 +08:00
parent f858a672a4
commit 8a5a32b139
21 changed files with 1131 additions and 381 deletions

View File

@@ -1,54 +1,44 @@
#if 1
#include "global.h"
#include "charger_to_server.h"
/************参数修改****************/
#define GUN_NUM 2 // 枪数量
#define TELE_FACTORY 0 // 0x00,移动,02:电信,03:联通,04:其他
const uint8_t SERVER_PROTOCOL_VER = 0x10; // 协议版本BCD 0x16 => V1.6
const char iccid_ascii[10] = {0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a}; // SIM卡号BCD
uint16_t pack_serial = 0;
// 充电桩登录认证
void charger_to_server_0X01(uint8_t stake_index)
{
PACK_DATA_0X01 data = {0};
load_charger_serial(stake_index,data.charger_serial); // 加载充电桩序列号
data.charger_type = CHARGER_TYPE_DC;
data.gun_num = GUN_NUM;
load_charger_serial(stake_index, data.charger_serial); // 加载充电桩序列号
data.charger_type = g_charger_manager.charger_piles[stake_index - 1].login_info.charger_type;
data.gun_num = g_charger_manager.charger_piles[stake_index - 1].login_info.gun_num;
data.protocol_ver = g_charger_manager.charger_piles[stake_index - 1].login_info.protocol_ver;
memcpy(data.software_ver, SOFTWARE_VERSION, strlen(SOFTWARE_VERSION));
data.net_conn_type = NET_CONN_TYPE;
data.tele_factory = TELE_FACTORY;
memcpy(data.sim, iccid_ascii, strlen(iccid_ascii));
printf("北向:对电桩 %d 发送登录认证,序列号:%s\r\n", stake_index,data.charger_serial);
pack_and_send_server_data(FRAME_TYPE_0X01, stake_index, 0, (uint8_t *)&data, sizeof(PACK_DATA_0X01),stake_index);
memcpy(data.software_ver, g_charger_manager.charger_piles[stake_index - 1].login_info.software_ver, 8);
data.net_conn_type = g_charger_manager.charger_piles[stake_index - 1].login_info.net_conn_type;
data.tele_factory = g_charger_manager.charger_piles[stake_index - 1].login_info.tele_factory;
memcpy(data.sim, g_charger_manager.charger_piles[stake_index - 1].login_info.sim, 10);
printf("北向:对电桩 %d 发送登录认证,序列号:%s\r\n", stake_index, data.charger_serial);
pack_and_send_server_data(FRAME_TYPE_0X01, (uint8_t *)&data, sizeof(PACK_DATA_0X01), stake_index);
}
void charger_to_server_0X03(uint8_t stake_index,uint8_t gun_index, uint8_t gun_status)
void charger_to_server_0X03(uint8_t stake_index, uint8_t gun_index, uint8_t gun_status)
{
PACK_DATA_0X03 data = {0};
load_charger_serial(stake_index,data.charger_serial); // 加载充电桩序列号
load_charger_serial(stake_index, data.charger_serial); // 加载充电桩序列号
data.gun_index = gun_index;
data.gun_status = gun_status;
printf("北向:对电桩 %d 发送心跳请求,枪号:%d状态%d\r\n", stake_index,gun_index,gun_status);
pack_and_send_server_data(FRAME_TYPE_0X03, stake_index, 0, (uint8_t *)&data, sizeof(PACK_DATA_0X03),stake_index);
printf("北向:对电桩 %d 发送心跳请求,枪号:%d状态%d\r\n", stake_index, gun_index, gun_status);
pack_and_send_server_data(FRAME_TYPE_0X03, (uint8_t *)&data, sizeof(PACK_DATA_0X03), stake_index);
}
// 计费模型验证请求
void charger_to_server_0X05(uint16_t num,uint8_t stake_index)
// 计费模型验证请求
void charger_to_server_0X05(uint16_t num, uint8_t stake_index)
{
PACK_DATA_0X05 data = {0};
load_charger_serial(stake_index,data.charger_serial); // 加载充电桩序列号
load_charger_serial(stake_index, data.charger_serial); // 加载充电桩序列号
data.fee_model_no = num;
printf("北向:对电桩 %d 计费模型验证请求,模型号:%d\r\n", stake_index,num);
pack_and_send_server_data(FRAME_TYPE_0X05, stake_index, 0, (uint8_t *)&data, sizeof(PACK_DATA_0X05),stake_index);
printf("北向:对电桩 %d 计费模型验证请求,模型号:%d\r\n", stake_index, num);
pack_and_send_server_data(FRAME_TYPE_0X05, (uint8_t *)&data, sizeof(PACK_DATA_0X05), stake_index);
}
// 充电桩计费模型请求
@@ -56,60 +46,103 @@ void charger_to_server_0X09(uint8_t stake_index)
{
PACK_DATA_0X09 data = {0};
load_charger_serial(stake_index,data.charger_serial); // 加载充电桩序列号
printf("北向:对电桩 %d 计费模型请求,序列号:%s\r\n", stake_index,data.charger_serial);
pack_and_send_server_data(FRAME_TYPE_0X09, stake_index, 0, (uint8_t *)&data, sizeof(PACK_DATA_0X09),stake_index);
load_charger_serial(stake_index, data.charger_serial); // 加载充电桩序列号
printf("北向:对电桩 %d 计费模型请求,序列号:%s\r\n", stake_index, data.charger_serial);
pack_and_send_server_data(FRAME_TYPE_0X09, (uint8_t *)&data, sizeof(PACK_DATA_0X09), stake_index);
}
// 上传实时监测数据
void charger_to_server_0X13(uint8_t stake_index,uint8_t gun_index)
void charger_to_server_0X13(uint8_t stake_index, uint8_t gun_index)
{
const unsigned char trade_data[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00
};
PACK_DATA_0X13 data = {0};
load_charger_serial(stake_index,data.charger_serial); // 加载充电桩序列号
ChargerGun *gun = &g_charger_manager.charger_piles[stake_index - 1].guns[gun_index - 1]; // 获取枪指针
data = gun->real_time_data;// 复制结构体
// 覆盖需要重新加载的字段
load_charger_serial(stake_index, data.charger_serial);
load_trade_serial(stake_index, gun_index, data.trade_serial);
data.gun_index = gun_index;
//data.gun_back = getGunBack(All_status[gun_index-1]);
// data.gun_is_insert = getGunIsInsert(All_status[gun_index-1]);
data.gun_back = g_charger_manager.charger_piles[stake_index - 1].guns[gun_index - 1].real_time_data.gun_back;
data.gun_is_insert = 1;
//Serial.printf("data.gun_is_insert====%d\n",data.gun_is_insert);
data.status =2;
if(data.status ==0x01 || data.status==0X02 )
{
memcpy(data.trade_serial, trade_data,16);
data.out_voltage = 0;
data.charge_energy = 0;
data.out_current = 0;
// 根据状态清零特定字段
if (data.status == 0x01 || data.status == 0x02||data.status == 0x00)
{
memset(data.trade_serial, 0, sizeof(data.trade_serial));
data.out_voltage = 0;
data.out_current = 0;
data.charge_energy = 0;
data.charge_time = 0;
data.charge_money = 0;
data.hard_fault = 0;
}
printf("北向:对电桩 %d 上传实时监测数据,枪号:%d状态%d返回%d是否插入%d\r\n", stake_index,gun_index,data.status,data.gun_back,data.gun_is_insert);
pack_and_send_server_data(FRAME_TYPE_0X13, stake_index, 0, (uint8_t *)&data, sizeof(PACK_DATA_0X13),stake_index);
pack_and_send_server_data(FRAME_TYPE_0X13, (uint8_t *)&data, sizeof(PACK_DATA_0X13), stake_index);
}
// 充电结束上报
void charger_to_server_0X19(uint8_t stake_index, uint8_t gun_index)
{
PACK_DATA_0X19 data = {0};
load_charger_serial(stake_index, data.charger_serial);
load_trade_serial(stake_index, gun_index, data.trade_serial);
pack_and_send_server_data(FRAME_TYPE_0X19, (uint8_t *)&data, sizeof(PACK_DATA_0X19), stake_index);
}
//平台启动回复
void charger_to_server_0X33(uint8_t stake_mark,uint8_t gun_index,uint8_t result,uint8_t err_code)
// 平台启动回复
void charger_to_server_0X33(uint8_t stake_index, uint8_t gun_index, uint8_t result, uint8_t err_code)
{
PACK_DATA_0X33 data = {0};
load_charger_serial(stake_mark,data.charger_serial);
load_trade_serial(stake_mark,gun_index,data.trade_serial);
load_charger_serial(stake_index, data.charger_serial);
load_trade_serial(stake_index, gun_index, data.trade_serial);
data.gun_index = gun_index;
data.result = result;
data.err_code = err_code;
printf("北向:对电桩 %d 的平台启动回复,结果:%d错误码%d\r\n", stake_mark,result,err_code);
pack_and_send_server_data(FRAME_TYPE_0X33, stake_mark, 0, (uint8_t *)&data, sizeof(PACK_DATA_0X33), stake_mark);
uint8_t *trade_serial = g_charger_manager.charger_piles[stake_index - 1].guns[data.gun_index - 1].real_time_data.trade_serial;
printf("回复订单ID: ");
for (int i = 0; i < 16; i++)
{
printf("%02X", trade_serial[i]);
}
printf("\r\n");
printf("北向:对电桩 %d 的平台启动回复,结果:%d错误码%d\r\n", stake_index, result, err_code);
pack_and_send_server_data(FRAME_TYPE_0X33, (uint8_t *)&data, sizeof(PACK_DATA_0X33), stake_index);
}
// 平台停机回复
void charger_to_server_0X35(uint8_t stake_index, uint8_t gun_index, uint8_t result, uint8_t err_code)
{
PACK_DATA_0X35 data = {0};
load_charger_serial(stake_index, data.charger_serial);
data.gun_index = gun_index;
data.result = result;
data.err_code = err_code;
printf("北向:对电桩 %d 的平台停机回复,结果:%d错误码%d\r\n", stake_index, result, err_code);
pack_and_send_server_data(FRAME_TYPE_0X35, (uint8_t *)&data, sizeof(PACK_DATA_0X35), stake_index);
}
#endif
// 上传交易记录
void charger_to_server_0X3B(uint8_t stake_index, uint8_t gun_index)
{
PACK_DATA_0X3B data = {0};
load_charger_serial(stake_index, data.charger_serial);
load_trade_serial(stake_index, gun_index, data.trade_serial);
data.gun_index = gun_index;
pack_and_send_server_data(FRAME_TYPE_0X3B, (uint8_t *)&data, sizeof(PACK_DATA_0X3B), stake_index);
}
// 计费模型主动更新回复
void charger_to_server_0x57(uint8_t stake_index)
{
PACK_DATA_0X57 data = {0};
load_charger_serial(stake_index, data.charger_serial);
data.result = 0x01;
printf("北向:对电桩 %d 的计费模型主动更新回复\r\n", stake_index);
pack_and_send_server_data(FRAME_TYPE_0X57, (uint8_t *)&data, sizeof(PACK_DATA_0X57), stake_index);
}

View File

@@ -5,6 +5,7 @@
#include "server_common.h"
extern uint16_t pack_serial;
uint32_t get_current_rtc_sec();
//充电桩登录认证请求
@@ -23,13 +24,11 @@ extern void charger_to_server_0X09(uint8_t stake_index);
extern void charger_to_server_0X13(uint8_t stake_index,uint8_t gun_index);
// 充电结束
extern void charger_to_server_0X19(uint8_t gun_index);
extern void charger_to_server_0X19(uint8_t stake_index,uint8_t gun_index);
// 报文被改为A5A8
extern void charger_to_server_0X31(uint8_t gun_index,uint32_t card_id); //0x31-0x34改为0xA5-0xA8
extern void charger_to_server_0X33(uint8_t stake_index,uint8_t gun_index,uint8_t result,uint8_t err_code); //0x310x33
extern void charger_to_server_0X35(uint8_t gun_index,uint8_t err_code,uint8_t result);
extern void charger_to_server_0X33(uint8_t stake_index,uint8_t gun_index,uint8_t result,uint8_t err_code);
extern void charger_to_server_0X35(uint8_t stake_index, uint8_t gun_index, uint8_t result, uint8_t err_code);
extern void charger_to_server_0x3B(uint8_t gun_index,uint32_t card_id,uint8_t trade_flag,uint8_t stop_reason); //3B改为3D
@@ -41,7 +40,7 @@ extern void charger_to_server_0X55(uint32_t time);
//计费模型应答
extern void charger_to_server_0X57(uint8_t result);
extern void charger_to_server_0X57(uint8_t stake_index);
extern uint8_t get_real_status_for_server(uint8_t idx);
//远程启机命令回复

View File

@@ -1,6 +1,7 @@
#if 1
#include "global.h"
#include "server_common.h"
#include "time.h"
#include <string.h>
@@ -210,7 +211,7 @@ uint8_t unpack_server_data(uint8_t *buf, uint8_t len, SERVER_PACK *pack)
return ret;
}
void pack_and_send_server_data(uint8_t type, uint8_t encrypt, uint16_t serial, uint8_t *pdata, uint8_t len, uint8_t stake_mark)
void pack_and_send_server_data(uint8_t type, uint8_t *pdata, uint8_t len, uint8_t stake_mark)
{
uint8_t index = 0;
uint16_t crc = 0;
@@ -223,10 +224,10 @@ void pack_and_send_server_data(uint8_t type, uint8_t encrypt, uint16_t serial, u
}
/* 原子获取全局包序号,避免多任务竞争 */
taskENTER_CRITICAL();
// taskENTER_CRITICAL();
current_serial = pack_serial;
pack_serial++;
taskEXIT_CRITICAL();
// taskEXIT_CRITICAL();
buf[index++] = 0x55;
buf[index++] = 0xAA;
@@ -238,7 +239,7 @@ void pack_and_send_server_data(uint8_t type, uint8_t encrypt, uint16_t serial, u
buf[index++] = (current_serial >> 8) & 0xFF;
buf[index++] = current_serial & 0xFF;
buf[index++] = encrypt;
buf[index++] = 0x00;
buf[index++] = type;
if ((len > 0) && (pdata))
{
@@ -250,11 +251,6 @@ void pack_and_send_server_data(uint8_t type, uint8_t encrypt, uint16_t serial, u
buf[index++] = (crc >> 8) & 0xFF;
buf[index++] = 0xAA;
buf[index++] = 0x55;
// for (int i = 4; i < index - 2; i++)
// {
// printf("%02X", buf[i]);
// }
Air724_Message_Send(buf, index);
vPortFree(buf);
}
@@ -285,13 +281,16 @@ int get_num_from_string(const char *str, int *num)
void get_cp56time_from_sec(uint8_t *buff, uint32_t sec)
{
st_cp56time2a cp56time;
cp56time.Compts.year = 25;
cp56time.Compts.month = 9;
cp56time.Compts.mday = 23;
cp56time.Compts.hour = 15;
cp56time.Compts.min = 56;
cp56time.Compts.msec = 47 * 1000;
struct tm timeinfo;
st_cp56time2a cp56time = {0};
time_t rawtime = sec;
localtime_r(&rawtime, &timeinfo);
cp56time.Compts.year = timeinfo.tm_year % 100; // 获取年份的最后两位数
cp56time.Compts.month = timeinfo.tm_mon + 1; // tm_mon是从0开始的所以需要加1
cp56time.Compts.mday = timeinfo.tm_mday;
cp56time.Compts.hour = timeinfo.tm_hour;
cp56time.Compts.min = timeinfo.tm_min;
cp56time.Compts.msec = timeinfo.tm_sec * 1000;
buff[0] = cp56time.time & 0xFF;
buff[1] = (cp56time.time >> 8) & 0xFF;
buff[2] = (cp56time.time >> 16) & 0xFF;

View File

@@ -47,7 +47,7 @@
#define FRAME_TYPE_0X36 0x36 // 运营平台远程停机
//---------------------------------------
#define FRAME_TYPE_0X3D 0x3D // 交易记录
#define FRAME_TYPE_0X3B 0x3B // 交易记录
#define FRAME_TYPE_0X40 0x40 // 交易记录确认
#define FRAME_TYPE_0X41 0x41 // 交易更新应答
#define FRAME_TYPE_0X42 0x42 // 远程账户余额更新
@@ -291,7 +291,7 @@ typedef struct
{
uint8_t charger_serial[CHARGER_SERIAL_LENGTH]; // 桩编号
uint8_t gun_index; // 枪编号
uint8_t reseut; // 停止结果,0x00失败 0x01成功
uint8_t result; // 停止结果,0x00失败 0x01成功
uint8_t err_code; // 失败原因,0x0无
} __attribute__((packed)) PACK_DATA_0X35; // 0x35
@@ -343,7 +343,7 @@ typedef struct
uint8_t trade_data[7]; // 交易日期
uint8_t stop_reason; // 停止原因
uint8_t phy_cardid[8]; // 物理卡号
} __attribute__((packed)) PACK_DATA_0X3D; // 0x3D
} __attribute__((packed)) PACK_DATA_0X3B; // 0x3B
typedef struct
{
@@ -460,7 +460,7 @@ extern void increase_heart_beat_cnt(void);
extern void reset_heart_beat_cnt(void);
extern uint32_t get_heart_beat_cnt(void);
extern uint8_t unpack_server_data(uint8_t *buf, uint8_t len, SERVER_PACK *pack);
extern void pack_and_send_server_data(uint8_t type, uint8_t encrypt, uint16_t serial, uint8_t *data, uint8_t len, uint8_t stake_mark);
extern void pack_and_send_server_data(uint8_t type, uint8_t *data, uint8_t len, uint8_t stake_mark);
extern int get_num_from_string(const char *str, int *num);
extern uint32_t get_card_logic_num(uint8_t idx);
extern uint32_t get_card_phy_num(uint8_t idx);

View File

@@ -53,7 +53,7 @@ void on_cmd_frame_type_0X0A(uint8_t stake_index, SERVER_PACK *pack)
g_charger_manager.charger_piles[stake_index - 1].get_model = true;
#ifdef DEBUG
printf("北向:接收到计费模型应答,模型ID:%d\r\n", g_charger_manager.fee_model_global.fee_model_no);
printf("尖电费率:%d 服务费:%d\r\n", g_charger_manager.fee_model_global.shark_fee_ratio, g_charger_manager.fee_model_global.shark_service_ratio);
printf("峰电费率:%d 服务费:%d\r\n", g_charger_manager.fee_model_global.peak_fee_ratio, g_charger_manager.fee_model_global.peak_service_ratio);
@@ -116,7 +116,6 @@ void on_cmd_frame_type_0X0A(uint8_t stake_index, SERVER_PACK *pack)
end_hour, end_min,
fee_name);
i = j; // 跳到下一个不同费率段
}
printf("================================================================\r\n");
@@ -200,57 +199,73 @@ void on_cmd_frame_type_0X58(uint8_t stake_index, SERVER_PACK *pack)
i = j; // 跳到下一个不同费率段
}
printf("================================================================\r\n");
charger_to_server_0x57(stake_index);
#endif
}
}
// 平台控制充电
// 平台控制充电
void on_cmd_frame_type_0X34(uint8_t stake_index, SERVER_PACK *pack)
{
PACK_DATA_0X34 data;
uint8_t result = 1;
uint8_t err_code = 0;
uint8_t result = TRUE; // 默认启动结果成功
uint8_t err_code = 0; // 默认错误码为0
memcpy(&data, pack->data, sizeof(PACK_DATA_0X34));
set_trade_serial(stake_index,data.gun_index, data.trade_serial);
set_trade_serial(stake_index, data.gun_index, data.trade_serial);
printf("北向:平台控制充电,桩ID:%d, 枪ID:%d, 金额:%d\r\n", stake_index, data.gun_index, data.remain_money);
uint8_t *trade_serial = data.trade_serial;
memcpy(g_charger_manager.charger_piles[stake_index - 1].guns[data.gun_index - 1].real_time_data.trade_serial, data.trade_serial, 16);
if (!is_my_charger_serial(stake_index, data.charger_serial))
{
result = 0;
err_code = 0x1; // 桩编号不匹配
}
// else if (get_user_current_action(data.gun_index - 1))
// {
// result = 0;
// err_code = 0x2; // 枪在使用
// }
// else if (is_gun_fault_occur(data.gun_index - 1))
// {
// result = 0;
// err_code = 0x3; // 设备故障
// }
// else if (get_gun_status(data.gun_index - 1) == GUN_STATUS_UN_INSERT)
// {
// result = 0;
// err_code = 0x5; // 未插枪
// }
// else
// {
// Serial.print("In %s\r\n", __func__);
// uint32_t id = *(uint32_t *)&data.trade_serial[12];
// pack_cmd_to_charge_task(data.gun_index - 1, CHARGE_TASK_CMD_USER_START_CHARGE, id);
// set_charge_start_mode(data.gun_index - 1, CAHRGE_START_MODE_APP);
// update_remain_money_to_gun(data.gun_index - 1, data.remain_money);
// }
else if (g_charger_manager.charger_piles[stake_index - 1].guns[data.gun_index - 1].real_time_data.status == 3)
{
result = 0;
err_code = 0x2; // 枪在使用
}
else if (g_charger_manager.charger_piles[stake_index - 1].guns[data.gun_index - 1].real_time_data.status == 1)
{
result = 0;
err_code = 0x3; // 故障
}
else if (g_charger_manager.charger_piles[stake_index - 1].guns[data.gun_index - 1].real_time_data.status == 0)
{
result = 0;
err_code = 0x4; // 枪离线
}
else if (g_charger_manager.charger_piles[stake_index - 1].guns[data.gun_index - 1].real_time_data.gun_is_insert == FALSE)
{
result = 0;
err_code = 0x5; // 未插枪
}
charger_to_server_0X33(stake_index, data.gun_index, result, err_code);
}
#if 0
// 平台控制停止充电
void on_cmd_frame_type_0X36(uint8_t stake_index, SERVER_PACK *pack)
{
PACK_DATA_0X36 data;
uint8_t result = TRUE; // 默认启动结果成功
uint8_t err_code = 0; // 默认错误码为0
memcpy(&data, pack->data, sizeof(PACK_DATA_0X36));
printf("北向:平台控制停止充电,桩ID:%d, 枪ID:%d\r\n", stake_index, data.gun_index);
//计费模型应答
#endif
if (!is_my_charger_serial(stake_index, data.charger_serial))
{
result = 0;
err_code = 0x1; // 桩编号不匹配
}
else if (g_charger_manager.charger_piles[stake_index - 1].guns[data.gun_index - 1].real_time_data.status != 3)
{
result = 0;
err_code = 0x2; // 枪未在使用
}
charger_to_server_0X33(stake_index, data.gun_index, result, err_code);
}