Initial commit: CCU621_M firmware project with BLE debug link support.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,472 @@
|
||||
/**
|
||||
* @file bs_connect_impl.c
|
||||
* @brief 平台链路层实现:TCP/4G 连接、收发、4G 双 socket 分发
|
||||
*
|
||||
* - 联网参数从 t_sys_fix_cfg.s_net_cfg 读取
|
||||
* - 4G 模式经 WH-GM5 模组,支持 socketA/B 分发
|
||||
* - 以太网分支(u8_netType!=0)预留待补全
|
||||
*/
|
||||
#if EC200A_4G_EN
|
||||
#include "plat_comm/4g_module/ec200a_4g.h"
|
||||
#include "plat_comm/4g_module/ec200a_4g_cfg.h"
|
||||
#endif
|
||||
#if WH_GM5_EN
|
||||
#include "plat_comm/4g_module/bs_wh_gm5.h"
|
||||
#endif
|
||||
#include "publicdata/publicdata.h"
|
||||
#include "plat_comm/plat_comm_task.h"
|
||||
#include "plat_comm/lwip_module/lwip_module.h"
|
||||
|
||||
#define BS_PRINTF_EN 1 //平台收发数据打印
|
||||
|
||||
ws_url_t url_info;
|
||||
|
||||
/**
|
||||
* @brief 网口 TCP:关闭指定平台通道 socket
|
||||
*/
|
||||
void v_bs_eth_close_socket(U8_T u8_id)
|
||||
{
|
||||
if (s_bs_task_ctrl.s_bs_ctrl[u8_id].fd >= 0) {
|
||||
lwip_tcp_close((int)s_bs_task_ctrl.s_bs_ctrl[u8_id].fd);
|
||||
s_bs_task_ctrl.s_bs_ctrl[u8_id].fd = (S32_T)-1;
|
||||
s_bs_task_ctrl.s_bs_ctrl[u8_id].u8_TCP_connect_flag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#if 1 //联网参数配置
|
||||
/**
|
||||
* ************************************************************************
|
||||
* @brief - 4G模块联网参数获取
|
||||
*
|
||||
* @param[in] s_4g_para - 4G联网参数结构体
|
||||
*
|
||||
*
|
||||
* @author jiankalka
|
||||
* @date 2025-09-01
|
||||
* ************************************************************************
|
||||
*/
|
||||
#if WH_GM5_EN
|
||||
void v_get_4G_config_para(S_4G_CONFIG_PARA *s_4g_para)
|
||||
{
|
||||
SYS_FIX_CFG_T *t_sys_fix_cfg = &g_t_share_data.t_sys_fix_cfg;
|
||||
|
||||
|
||||
memset(s_4g_para , 0 ,sizeof(S_4G_CONFIG_PARA));
|
||||
|
||||
//s_4g_para->socketA_IP = testIP;
|
||||
s_4g_para->socketA_IP = t_sys_fix_cfg->s_net_cfg.u8_serverA_domain_name; //
|
||||
s_4g_para->socketB_IP = t_sys_fix_cfg->s_net_cfg.u8_serverB_domain_name;
|
||||
|
||||
s_4g_para->u8_Sim_Type = t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_sim_anp_type;
|
||||
s_4g_para->u8_socketB_en = t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_platB_en;
|
||||
}
|
||||
#endif /* WH_GM5_EN */
|
||||
/**
|
||||
* ************************************************************************
|
||||
* @brief - 4G模块参数初始化
|
||||
*
|
||||
*
|
||||
*
|
||||
* @author jiankalka
|
||||
* @date 2025-09-19
|
||||
* ************************************************************************
|
||||
*/
|
||||
void v_bs_4G_data_init(void)
|
||||
{
|
||||
#if EC200A_4G_EN
|
||||
{
|
||||
S_4G_CONFIG_PARA s_4g_para;
|
||||
SYS_FIX_CFG_T *t_sys_fix_cfg = &g_t_share_data.t_sys_fix_cfg;
|
||||
memset(&s_4g_para, 0, sizeof(S_4G_CONFIG_PARA));
|
||||
s_4g_para.socketA_IP = t_sys_fix_cfg->s_net_cfg.u8_serverA_domain_name;
|
||||
s_4g_para.socketB_IP = t_sys_fix_cfg->s_net_cfg.u8_serverB_domain_name;
|
||||
s_4g_para.u8_Sim_Type = t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_sim_anp_type;
|
||||
s_4g_para.u8_socketB_en = t_sys_fix_cfg->s_net_cfg.u_net_comm_para.bits.bit_platB_en;
|
||||
v_4g_data_init(&s_4g_para);
|
||||
}
|
||||
#endif /* EC200A_4G_EN */
|
||||
#if WH_GM5_EN
|
||||
{
|
||||
S_4G_CONFIG_PARA s_4g_para;
|
||||
v_get_4G_config_para(&s_4g_para);
|
||||
v_wh_gm5_data_init(&s_4g_para);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/**
|
||||
* ************************************************************************
|
||||
* @brief - TCP 联网测试函数
|
||||
*
|
||||
*
|
||||
* @return U8_T - 0未连接TCP 1已连接
|
||||
*
|
||||
* @author jiankalka
|
||||
* @date 2025-08-29
|
||||
* ************************************************************************
|
||||
*/
|
||||
U8_T u8_tcp_connect(U8_T u8_id)
|
||||
{
|
||||
U8_T u8_ret = 0;
|
||||
|
||||
if(s_bs_task_ctrl.s_bs_ctrl[u8_id].u8_netType == 0) //4G联网
|
||||
{
|
||||
#if WH_GM5_EN
|
||||
// 无线模块WH_GM5初始化
|
||||
if(s8_WH_GM5_init() == 0) //如果4g配置成功
|
||||
{
|
||||
if(s8_check_socket_LinkState(u8_id) >= 0) //查询网路连接状态
|
||||
{
|
||||
mSleep(100);
|
||||
v_4g_uart_cache_clear(); //4G模块配置完毕 清除串口缓存区中的数据
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(u8_ret == 0 && u32_safe_seconds_since(s_bs_task_ctrl.s_bs_ctrl[u8_id].ulong_restart_timer) > NUM_120) //120分钟 没连上 则重新连接
|
||||
{
|
||||
v_bs_4G_data_init(); //4G模块控制数据 初始化
|
||||
s_bs_task_ctrl.s_bs_ctrl[u8_id].ulong_restart_timer = get_current_seconds();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if EC200A_4G_EN
|
||||
if(s8_ec200a_4g_init() == 0)
|
||||
{
|
||||
u8_ret = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else //网线连接
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return u8_ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if WH_GM5_EN // WH-GM5 4G收发接口
|
||||
/**
|
||||
* ************************************************************************
|
||||
* @brief - 4G模块多端口数据接收、用于多socket分端口接收、需要传入两平台接收处理函数接口
|
||||
*
|
||||
* @param[in] socketA_unPack - socketA 接收处理函数,不存在时赋值为NULL
|
||||
* @param[in] socketB_unPack - socketB 接收处理函数,不存在时赋值为NULL
|
||||
*
|
||||
*
|
||||
* @author jiankalka
|
||||
* @date 2025-09-02
|
||||
* ************************************************************************
|
||||
*/
|
||||
void v_4g_wh5_data_divide_recv(RecvUnpackHandler socketA_unPack, RecvUnpackHandler socketB_unPack)
|
||||
{
|
||||
// 静态缓冲区用于保存残包
|
||||
static U8_T u8_recv_saveBuf[BS_RECV_BUF_LEN];
|
||||
static U16_T u16_recv_saveLen = 0;
|
||||
|
||||
// 1. 数据合并:将新数据与静态缓冲区的残包合并
|
||||
U16_T u16_totalLen = 0; // 总数据长度(静态缓冲区+新数据)
|
||||
U16_T u16_rcvByteNum = 0; // 当前解析位置
|
||||
U16_T u16_oneFrmLen = 0; // 完整帧长度
|
||||
U16_T u16_dataLen = 0; // 数据域长度
|
||||
U8_T frameType = 0; // 帧类型
|
||||
U8_T flags = 0; // 标志位
|
||||
U8_T* payloadStart = NULL; // 有效载荷起始位置
|
||||
U16_T payloadLen = 0; // 有效载荷长度
|
||||
|
||||
U8_T u8_recvBuf[BS_RECV_BUF_LEN] = {0}; //接收数据缓存区
|
||||
|
||||
// 0. 获取串口数据
|
||||
U16_T u16_recvLen = u16_usart_recv(COM_PORT_BS, u8_recvBuf, BS_RECV_BUF_LEN);
|
||||
|
||||
// 如果没有接收到数据,直接返回
|
||||
if(u16_recvLen == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 计算新数据需要复制的长度(避免缓冲区溢出)
|
||||
U16_T actualCopyLen = u16_recvLen;
|
||||
if (u16_recv_saveLen + u16_recvLen > BS_RECV_BUF_LEN) {
|
||||
// 缓冲区溢出处理:保留新数据,丢弃最旧的数据
|
||||
U16_T overflowBytes = (u16_recv_saveLen + u16_recvLen) - BS_RECV_BUF_LEN;
|
||||
|
||||
// 移动现有数据,为新数据腾出空间
|
||||
memmove(u8_recv_saveBuf, &u8_recv_saveBuf[overflowBytes],
|
||||
u16_recv_saveLen - overflowBytes);
|
||||
u16_recv_saveLen -= overflowBytes;
|
||||
|
||||
// 更新实际可复制长度
|
||||
actualCopyLen = BS_RECV_BUF_LEN - u16_recv_saveLen;
|
||||
}
|
||||
|
||||
// 追加新数据到静态缓冲区末尾
|
||||
memcpy(u8_recv_saveBuf + u16_recv_saveLen, u8_recvBuf, actualCopyLen);
|
||||
u16_recv_saveLen += actualCopyLen;
|
||||
|
||||
// 设置总数据长度
|
||||
u16_totalLen = u16_recv_saveLen;
|
||||
|
||||
// 2. 主解析循环 - 处理完整帧
|
||||
while (u16_totalLen >= 8)
|
||||
{
|
||||
// 帧头检查
|
||||
if (u8_recv_saveBuf[u16_rcvByteNum] != 0xAA ||
|
||||
u8_recv_saveBuf[u16_rcvByteNum+1] != 0xFD ||
|
||||
u8_recv_saveBuf[u16_rcvByteNum+2] != 0x55)
|
||||
{
|
||||
// 帧头不匹配,移动搜索位置
|
||||
u16_rcvByteNum++;
|
||||
u16_totalLen--;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 获取数据长度(大端格式)
|
||||
u16_dataLen = (U16_T)((u8_recv_saveBuf[u16_rcvByteNum+3] << 8) |
|
||||
u8_recv_saveBuf[u16_rcvByteNum+4]);
|
||||
|
||||
// 计算完整帧长度 = 头部(3) + 长度字段(2) + 元数据(3) + 数据长度
|
||||
u16_oneFrmLen = 6 + u16_dataLen;
|
||||
|
||||
// 检查帧完整性
|
||||
if (u16_oneFrmLen > u16_totalLen) {
|
||||
// 残包处理:帧不完整,等待更多数据
|
||||
break;
|
||||
}
|
||||
|
||||
// 提取关键字段
|
||||
frameType = u8_recv_saveBuf[u16_rcvByteNum + 5]; // 类型字段(0x61/0x62)
|
||||
flags = u8_recv_saveBuf[u16_rcvByteNum + 6]; // 标志位
|
||||
|
||||
// 安全获取有效载荷(跳过帧头、长度字段和类型字段)
|
||||
payloadStart = &u8_recv_saveBuf[u16_rcvByteNum + 7];
|
||||
payloadLen = u16_dataLen - 2; // 减去类型和标志位
|
||||
|
||||
// 确保有效载`` 荷在缓冲区范围内
|
||||
if ((payloadStart + payloadLen) > (u8_recv_saveBuf + BS_RECV_BUF_LEN)) {
|
||||
// 缓冲区越界错误处理:重置缓冲区
|
||||
u16_recv_saveLen = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// 处理网络返回数据
|
||||
if ((flags & 0x80) == 0) {
|
||||
if (frameType == 0x61 && socketA_unPack != NULL) {
|
||||
// SOCKETA数据
|
||||
socketA_unPack(0, payloadStart, payloadLen);
|
||||
}
|
||||
else if (frameType == 0x62 && socketB_unPack != NULL) {
|
||||
// SOCKETB数据
|
||||
socketB_unPack(1, payloadStart, payloadLen);
|
||||
}
|
||||
//测试打印
|
||||
#if BS_PRINTF_EN
|
||||
printf("--------------plat[%d] recv\r\n",frameType - 0x60);
|
||||
for (int i = 0; i < u16_recvLen; i++)
|
||||
{
|
||||
printf("%02x ",u8_recvBuf[i]);
|
||||
}
|
||||
printf("\n---------------\r\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
// 移动位置指针(处理完整帧)
|
||||
u16_rcvByteNum += u16_oneFrmLen;
|
||||
u16_totalLen -= u16_oneFrmLen;
|
||||
}
|
||||
|
||||
// 3. 残包处理:保存剩余数据到静态缓冲区
|
||||
if (u16_totalLen > 0) {
|
||||
// 移动剩余数据到静态缓冲区开头
|
||||
if (u16_rcvByteNum > 0) {
|
||||
memmove(u8_recv_saveBuf, &u8_recv_saveBuf[u16_rcvByteNum], u16_totalLen);
|
||||
}
|
||||
u16_recv_saveLen = u16_totalLen;
|
||||
} else {
|
||||
// 没有剩余数据,重置静态缓冲区
|
||||
u16_recv_saveLen = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* ************************************************************************
|
||||
* @brief - 4G 模块发送数据接口
|
||||
*
|
||||
* @param[in] u8_id - 发送接口ID 0代表不使能分发功能,直接透传发送 1代表像socketA发送数据 2代表像socketB发送数据
|
||||
* @param[in] u8_sendBuf - 发送数据数组指针
|
||||
* @param[in] u16_len - 发送数据长度
|
||||
*
|
||||
*
|
||||
* @author jiankalka
|
||||
* @date 2025-09-01
|
||||
* ************************************************************************
|
||||
*/
|
||||
void v_4g_wh5_data_send(U8_T u8_id,U8_T *u8_sendBuf,U16_T u16_len)
|
||||
{
|
||||
U16_T len,u16_checkSum;
|
||||
U8_T send_buf[10]={0};
|
||||
|
||||
if(u8_id == 0) //不使用套接字分发 直接发送数据
|
||||
u16_usart_send(COM_PORT_BS, u8_sendBuf, u16_len);
|
||||
else
|
||||
{
|
||||
//套接字分发组帧头
|
||||
send_buf[0] = 0x55;
|
||||
send_buf[1] = 0xFD;
|
||||
send_buf[2] = 0xAA;
|
||||
len = u16_len + 2;
|
||||
send_buf[3] = (len >> 8) & 0xFF;
|
||||
send_buf[4] = len & 0xFF;
|
||||
send_buf[5] = 0x60 + u8_id; //SOCKETA为0x61,SOCKETB为0x62
|
||||
send_buf[6] = 0;
|
||||
|
||||
//发送帧头
|
||||
u16_usart_send(COM_PORT_BS, send_buf, 7);
|
||||
//发送数据
|
||||
u16_usart_send(COM_PORT_BS, u8_sendBuf, u16_len);
|
||||
//计算校验合 发送数据+SOCKET序号
|
||||
u16_checkSum = u16_crc_checksum(u8_sendBuf, u16_len);
|
||||
u16_checkSum = u16_checkSum + send_buf[5];
|
||||
|
||||
send_buf[0] = u16_checkSum&0xFF;
|
||||
u16_usart_send(COM_PORT_BS, send_buf, 1);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* ************************************************************************
|
||||
* @brief - 4G模块数据接收 接收原始数据 不进行分包解析
|
||||
*
|
||||
* @param[in] u8_recvBuf - 接收数据缓存数组
|
||||
* @param[in] u16_len - 接受数组长度
|
||||
*
|
||||
* @return U16_T -
|
||||
*
|
||||
* @author jiankalka
|
||||
* @date 2025-09-02
|
||||
* ************************************************************************
|
||||
*/
|
||||
U16_T u16_4g_wh5_data_recv(U8_T *u8_recvBuf,U16_T u16_len)
|
||||
{
|
||||
U16_T u16_recvLen;
|
||||
|
||||
memset(u8_recvBuf , 0 , u16_len);
|
||||
u16_recvLen = u16_usart_recv(COM_PORT_BS, u8_recvBuf, u16_len);
|
||||
|
||||
return u16_recvLen;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1 //公共s收发函数接口
|
||||
/**
|
||||
* ************************************************************************
|
||||
* @brief - 公共发送接口
|
||||
*
|
||||
* @param[in] u8_id - 平台位置 0-1
|
||||
* @param[in] u8_sendBuf - 发送数据
|
||||
* @param[in] u16_len - 发送数据长度
|
||||
*
|
||||
*
|
||||
* @author jiankalka
|
||||
* @date 2025-09-02
|
||||
* ************************************************************************
|
||||
*/
|
||||
void v_bs_send(U8_T u8_id,U8_T *u8_sendBuf,U16_T u16_len)
|
||||
{
|
||||
if(s_bs_task_ctrl.s_bs_ctrl[u8_id].u8_netType == 0) //4G联网
|
||||
{
|
||||
#if WH_GM5_EN
|
||||
if(s_bs_task_ctrl.u8_4g_dispense_en == 1) u8_id+=1; //分发使能 序号加一
|
||||
|
||||
v_4g_wh5_data_send(u8_id,u8_sendBuf,u16_len);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#if EC200A_4G_EN
|
||||
if(s_bs_task_ctrl.u8_4g_dispense_en == 1) u8_id+=1;
|
||||
#if EC200A_TCP_USE_TRANSPARENT_MODE
|
||||
v_4g_send_data(u8_id,u8_sendBuf,u16_len);
|
||||
#else
|
||||
v_ec200a_tcp_app_send(u8_id,u8_sendBuf,u16_len);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
mSleep(Plat_Send_Sleep);
|
||||
s_bs_task_ctrl.u8_sendCnt++;
|
||||
|
||||
#if BS_PRINTF_EN
|
||||
printf("\n--------------bs send\r\n");
|
||||
for (int i = 0; i < u16_len; i++)
|
||||
{
|
||||
printf("%c",u8_sendBuf[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
for (int i = 0; i < u16_len; i++)
|
||||
{
|
||||
printf("%02x ",u8_sendBuf[i]);
|
||||
}
|
||||
printf("\n---------------\r\n");
|
||||
#endif
|
||||
}
|
||||
/**
|
||||
* ************************************************************************
|
||||
* @brief - 公共接收函数
|
||||
*
|
||||
* @param[in] u8_id - 平台位置 0-1
|
||||
* @param[in] u8_recvBuf - 接收数据缓存地址
|
||||
* @param[in] u16_len - 最大接收长度
|
||||
*
|
||||
* @return U16_T -
|
||||
*
|
||||
* @author jiankalka
|
||||
* @date 2025-09-02
|
||||
* ************************************************************************
|
||||
*/
|
||||
U16_T u16_bs_recv(U8_T u8_id,U8_T *u8_recvBuf,U16_T u16_len)
|
||||
{
|
||||
U16_T u16_recvLen = 0;
|
||||
|
||||
if(s_bs_task_ctrl.s_bs_ctrl[u8_id].u8_netType == 0) //4G联网
|
||||
{
|
||||
#if WH_GM5_EN
|
||||
u16_recvLen = u16_usart_recv(COM_PORT_BS, u8_recvBuf, u16_len);
|
||||
|
||||
#endif
|
||||
|
||||
#if EC200A_4G_EN
|
||||
u16_recvLen = u16_ec200a_tcp_app_recv(u8_recvBuf, u16_len);
|
||||
#endif
|
||||
}
|
||||
else //以太网
|
||||
{
|
||||
// if(bs_task_ctrl_data.s_bs_ctrl[id].fd >= 0)
|
||||
// u16_recvLen = eth_recv((int)bs_task_ctrl_data.s_bs_ctrl[id].fd, (char *)recvBuf, BS_RECV_BUF_LEN, 1);
|
||||
}
|
||||
|
||||
#if BS_PRINTF_EN
|
||||
if(u16_recvLen == 0) return u16_recvLen;
|
||||
|
||||
printf("\n--------------bs recv\r\n");
|
||||
for (int i = 0; i < u16_recvLen; i++)
|
||||
{
|
||||
printf("%c",u8_recvBuf[i]);
|
||||
}
|
||||
printf("\r\n");
|
||||
for (int i = 0; i < u16_recvLen; i++)
|
||||
{
|
||||
printf("%02x ",u8_recvBuf[i]);
|
||||
}
|
||||
printf("\n---------------\r\n");
|
||||
#endif
|
||||
|
||||
return u16_recvLen;
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,53 @@
|
||||
|
||||
#ifndef BS_CONNECT_IMPL_H
|
||||
#define BS_CONNECT_IMPL_H
|
||||
|
||||
#ifdef __cplusplus /*C++编译环境下兼容C语言*/
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*------ Exported includes(头文件) ----------------------*/
|
||||
#include "main.h"
|
||||
#include "publicdata/publicdata.h"
|
||||
#include "plat_comm/plat_comm_task.h"
|
||||
#if EC200A_4G_EN
|
||||
#include "plat_comm/4g_module/ec200a_4g.h"
|
||||
#endif
|
||||
#if WH_GM5_EN
|
||||
#include "plat_comm/4g_module/bs_wh_gm5.h"
|
||||
#endif
|
||||
/*------ Exported macro(宏定义) -------------------------*/
|
||||
|
||||
|
||||
|
||||
/** 4G 套接字分发接收回调:id=平台序号,buf/len=有效载荷 */
|
||||
typedef void (*RecvUnpackHandler)(U8_T id, U8_T *buf, U16_T len);
|
||||
|
||||
/*------ Exported struct(结构体定义) --------------------*/
|
||||
|
||||
typedef struct {
|
||||
char host[NUM_64];
|
||||
int port;
|
||||
char path[NUM_64];
|
||||
char apn_str[NUM_32];
|
||||
int is_secure; /* 0=ws, 1=wss */
|
||||
} ws_url_t;
|
||||
/*------ Exported variables(变量定义) -------------------*/
|
||||
|
||||
/*------ Exported function prototypes (函数声明) -------*/
|
||||
void v_bs_4G_data_init(void);
|
||||
U8_T u8_tcp_connect(U8_T u8_id);
|
||||
/** 网口:关闭指定通道 socket 并清零 fd/u8_TCP_connect_flag,重连前必须调用,避免 socket 泄漏导致“再连也连不上” */
|
||||
void v_bs_eth_close_socket(U8_T u8_id);
|
||||
|
||||
void v_bs_send(U8_T u8_id,U8_T *u8_sendBuf,U16_T u16_len);
|
||||
U16_T u16_bs_recv(U8_T u8_id,U8_T *u8_recvBuf,U16_T u16_len);
|
||||
void v_4g_wh5_data_divide_recv(RecvUnpackHandler socketA_unPack, RecvUnpackHandler socketB_unPack);
|
||||
|
||||
int parse_websocket_url_simple(const char* url, ws_url_t* result) ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* BS_CONNECT_IMPL_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,237 @@
|
||||
|
||||
#ifndef BS_PUBLIC_IMPL_H
|
||||
#define BS_PUBLIC_IMPL_H
|
||||
|
||||
#ifdef __cplusplus /*C++编译环境下兼容C语言*/
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*------ Exported includes(头文件) ----------------------*/
|
||||
#include "main.h"
|
||||
#include "publicdata/publicdata.h"
|
||||
#include "fault_cheak/fault_interface.h"
|
||||
#include "app_rtc/app_rtc.h"
|
||||
#include "meter_calculate/meter_calculate_impl.h"
|
||||
#include "flowctrl/flow_interface.h"
|
||||
|
||||
/*------ Exported macro(宏定义) -------------------------*/
|
||||
#define BS_BUF_SIZE_16 16
|
||||
#define BS_BUF_SIZE_32 32
|
||||
#define BS_BUF_SIZE_64 64
|
||||
#define BS_BUF_SIZE_128 128
|
||||
#define BS_BUF_SIZE_256 256
|
||||
/*------ Exported struct(结构体定义) --------------------*/
|
||||
typedef enum
|
||||
{
|
||||
GUN_NULL = 0, //无
|
||||
GUN_1 = 0, //1枪
|
||||
GUN_2, //2枪
|
||||
}E_GUN_NO;
|
||||
typedef enum{
|
||||
GET_FLAG=0, //获取数据
|
||||
SET_FALG, //设置标志
|
||||
CLEAR_FALG, //清空标志
|
||||
}FLAG_CTLR;
|
||||
typedef union {
|
||||
U8_T u8_data;
|
||||
S8_T s8_data;
|
||||
U16_T u16_data;
|
||||
S16_T s16_data;
|
||||
U32_T u32_data;
|
||||
F32_T f32_data;
|
||||
U64_T u64_data;
|
||||
}TYPE_DATA;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
//字符串数据类型 0x7000--0x8000
|
||||
E_STR_TYPE = 0,
|
||||
E_STR_PILE_NO, //桩编号-16
|
||||
E_STR_SOFTWARE_VERSION, //软件版本号
|
||||
E_STR_HARDWARE_VERSION, //硬件版本号
|
||||
|
||||
E_STR_LOG_preTradeNo, //订单流水号 type=0,平台流水号;type=1,设备流水号
|
||||
E_STR_LOG_user_id, //订单用户标识
|
||||
E_STR_LOG_vin, //VIN 车辆信息
|
||||
|
||||
E_STR_SDK_PARA_product_key, //国网sdk 产品密钥
|
||||
E_STR_SDK_PARA_device_name, //国网sdk 资产吗
|
||||
E_STR_SDK_PARA_device_secret, //国网sdk 设备秘钥
|
||||
E_STR_SDK_PARA_device_reg_code, //国网sdk 注册码
|
||||
E_STR_SDK_PARA_device_uid, //国网sdk 出厂编码
|
||||
E_STR_SDK_PARA_firmware_version, //国网sdk 固件版本信息
|
||||
|
||||
E_STR_SDK_SIM_ID, //sim卡号
|
||||
E_STR_METER_ADDR, //获取电表号 0直流电表 1交流电表
|
||||
E_STR_FEE_ID, //计费模型ID
|
||||
E_STR_QR_DISPLAY, //枪二维码 u8_gunNo=0/1 对应枪A/B
|
||||
|
||||
}E_GET_SYS_STR;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
U8_T u8_init_flag; //初始化标志
|
||||
U8_T u8_netType; //网络类型 04G 1网线
|
||||
U8_T u8_update_server_addr[32]; //升级服务器IP
|
||||
U16_T u16_update_server_port; //升级服务器端口号
|
||||
U8_T u8_user[20]; //用户名,字符串,不足尾部补0
|
||||
U8_T u8_pwd[20]; //密码,字符串,不足尾部补0
|
||||
U8_T u8_path[64]; //路径名,字符串,不足尾部补0
|
||||
U8_T u8_file_name[32]; //文件名,字符串,不足尾部补0
|
||||
|
||||
U8_T u8_bs_ack; //平台回复报文
|
||||
U8_T u8_update_result; //升级结果
|
||||
|
||||
U32_T u32_file_size; //文件大小
|
||||
U16_T u16_packSize; //单包数据大小
|
||||
U16_T u16_packNum; //包数量
|
||||
U16_T u16_packIndex; //获取包索引号
|
||||
|
||||
U32_T u32_file_fd; //文件句柄 EC200A 4G模块使用
|
||||
}T_FTP_UPDATE_INFO;
|
||||
|
||||
/***************************
|
||||
变量功能:定义变量类型枚举,内部调用时使用统一函数接口获取不同的数据内容
|
||||
*********************************/
|
||||
typedef enum
|
||||
{
|
||||
//桩信息
|
||||
E_BS_GET_SYS_DATA_GUN_NUM = 0, //枪数量
|
||||
E_BS_GET_SYS_DATA_NET_TYPE, //联网类型 0:4G 1:网线
|
||||
E_BS_GET_SYS_DATA_PLAT_EN, //平台使能 u8_gunNo=0平台A 1平台B,0不使能 1使能
|
||||
|
||||
E_BS_GET_SYS_DATA_NOW_FAULT_ALARM_NUM, //type=0当前故障数量/type=1当前告警数量
|
||||
E_BS_GET_SYS_DATA_NOW_FAULT_ALARM_DATA, //获取故障内容 参数 0-N 获取故障位置数量
|
||||
|
||||
E_BS_GET_SYS_DATA_4G_signal_quality, //4G信号强度
|
||||
E_BS_GET_SYS_DATA_RATED_POWER, //额定功率 单位w
|
||||
E_BS_GET_SYS_DATA_PILE_PUT_PARA, //充电桩输出参数 单位0.1V/0.1A 0最大电压 1最小电压 2最大电流 3最小电流
|
||||
|
||||
|
||||
|
||||
//枪信息
|
||||
E_BS_GET_SYS_DATA_GUN_FLOW_STATE, //终端充电状态 0空闲 1充电启动 2绝缘启动 3绝缘计算完成 4绝缘检测模块停止 5开始预充 6预充完成 7充电中 8BMS通讯超时 9充电停止 10充电停止完成
|
||||
E_BS_GET_SYS_DATA_GUN_STATE, //枪状态信息 type=0,枪连接状态;
|
||||
//type=1,电子锁状态;
|
||||
//type=2,枪空座归位状态;
|
||||
//type=3,正母线直流输出接触器状态
|
||||
//type=4,负母线直流输出接触器状态
|
||||
E_BS_GET_SYS_DATA_GUN_TEMP_POS, //充电枪正极温度 单位0.1度 0-100最小为0
|
||||
E_BS_GET_SYS_DATA_GUN_TEMP_NEG, //充电枪负极温度 单位0.1度 0-100最小为0
|
||||
E_BS_GET_SYS_DATA_MEMTER_ELECT, //电表电量 0.001kWh
|
||||
|
||||
E_BS_GET_SYS_DATA_PILE_TEMP, //环境温度 精确到小数点后1位,-50℃偏差
|
||||
E_BS_GET_SYS_DATA_METER_CUR, //电表电流 单位0.1A
|
||||
E_BS_GET_SYS_DATA_METER_VOL, //电表电压 单位0.1V
|
||||
|
||||
//订单信息
|
||||
E_BS_GET_SYS_DATA_LOG_ENERGY, //订单电量 0.001kWh 三位小数精度 type=0,已充电量;type=1,电表起始值,type=2,电表终止值
|
||||
E_BS_GET_SYS_DATA_LOG_STOP_REASON, //充电订单停止原因
|
||||
E_BS_GET_SYS_DATA_LOG_charge_flag, //订单充电标志 0未充电 1已经充电
|
||||
E_BS_GET_SYS_DATA_SOC_DATA, //SOC 数据 type=0,当前SOC;type=1,启动时SOC;type=2,结束时SOC
|
||||
E_BS_GET_SYS_DATA_LOG_CHARGE_TIME, //充电时间 min
|
||||
|
||||
|
||||
|
||||
//bms信息
|
||||
E_BS_GET_SYS_DATA_BMS_CELL_MAX_VOL, //最高单体动力蓄电池电压
|
||||
E_BS_GET_SYS_DATA_BMS_NEED_VOL, //电压需求 单位0.1V
|
||||
E_BS_GET_SYS_DATA_BMS_NEED_CUR, //电流需求 单位0.1A
|
||||
|
||||
E_BS_GET_SYS_DATA_BMS_CHARGE_VOL, //BMS充电电压测量值
|
||||
E_BS_GET_SYS_DATA_BMS_CHARGE_CUR, //BMS充电电流测量值
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_CHARGE_MAX_VOL, //最高允许充电总电压
|
||||
E_BS_GET_SYS_DATA_BMS_CELL_CHARGE_MAX_VOL, //单体动力蓄电池最高允许充电电压
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_CHARGE_MAX_CUR, //最高允许充电电流
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_RATED_VOL, //整车动力蓄电池系统额定总电压
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_VOL, //整车动力蓄当前电池总电压
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_RATED_C10, //整车动力蓄电池系统额定容量
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_RATED_ENERY, //动力蓄电池标称总能量
|
||||
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_ID, //电池编号信息 0最高单体动力蓄电池电压所在编号 1最高动力蓄电池温度检测点编号 2最低动力蓄电池温度检测点编号
|
||||
E_BS_GET_SYS_DATA_BMS_TEMP, //单位 0.1度0-100最小为0 0 电池最高温度 1最低温度
|
||||
E_BS_GET_SYS_DATA_BMS_REMAIN_TIME, //剩余充电时间 min
|
||||
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_MAX_TEMP, //最高动力蓄电池温度
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_MIN_TEMP, //最低动力蓄电池温度
|
||||
E_BS_GET_SYS_DATA_BMS_BATT_ALLOW_MAX_TEMP, //最高允许动力蓄电池温度
|
||||
|
||||
E_BS_GET_SYS_DATA_UNIX_TIMESTAMP, //当前 RTC Unix 时间戳(秒)
|
||||
} E_GET_SYS_DATA;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
U16_T u16_ctrl_res; //控制原因 启动时为启动原因 停止时为停止原因;启动原因0 无动作 1离线卡 2在线卡 3后台启动(tcu/积成)\扫码启动 4vin启动 5调试启动
|
||||
|
||||
E_CHRG_LIMIT_MOD e_start_mode; //启动充电限制方式 0 不做限制的充电(默认) 1 限制金额 2 限制电量 electricity 3 限制SOC 4 限制充电时长 5 限制功率
|
||||
U16_T u16_limit; //限制参数 默认精度 0.01
|
||||
|
||||
U32_T u32_balance_begin; //启动充电前金额 0.0001元
|
||||
|
||||
USER_TYPE_E e_user_type; //用户类型
|
||||
U8_T u8_user_id[NUM_32]; //用户标识符
|
||||
|
||||
U8_T u8_tradeNo[EVS_MAX_TRADE_LEN]; //设备流水号
|
||||
U8_T u8_preTradeNo[EVS_MAX_TRADE_LEN]; //平台订单流水号
|
||||
}S_BS_CHAR_CTRL;
|
||||
typedef enum
|
||||
{
|
||||
E_CHAR_CTRL_START = 0, //启动充电
|
||||
E_CHAR_CHANGE_LOG, //修改数据
|
||||
E_CHAR_CTRL_STOP, //停止充电
|
||||
}E_CTRL_TYPE;
|
||||
|
||||
/*------ Exported variables(变量定义) -------------------*/
|
||||
extern T_FTP_UPDATE_INFO t_ftp_update_info;
|
||||
/*------ Exported function prototypes (函数声明) -------*/
|
||||
U8_T u8_get_str_data(U8_T u8_gunNo,E_GET_SYS_STR e_dataType,U8_T u8_dataPara,char *u8_getData,U8_T u8_len);
|
||||
/** 写字符串类系统参数;u8_len 为有效字节数(帧体可非 '\0' 结尾);返回 1 成功 0 失败 */
|
||||
U8_T u8_set_str_data(U8_T u8_gunNo, E_GET_SYS_STR e_dataType, U8_T u8_dataPara,
|
||||
const char *pu8_data, U8_T u8_len);
|
||||
U32_T u32_bs_get_sys_data(U8_T u8_gunNo,E_GET_SYS_DATA e_datatype,U8_T u8_dataPara);
|
||||
/** 写数值类系统参数;返回 1 成功 0 失败(如 E_BS_GET_SYS_DATA_UNIX_TIMESTAMP 校时) */
|
||||
U8_T u8_set_sys_data(U8_T u8_gunNo, E_GET_SYS_DATA e_datatype, U32_T u32_val, U8_T u8_dataPara);
|
||||
U64_T u64_bs_get_sys_data(U8_T u8_gunNo,E_GET_SYS_DATA e_datatype);
|
||||
|
||||
|
||||
U8_T u8_bs_get_flow_state(U8_T u8_gunNo);
|
||||
void v_bs_set_time(Comm_Time *currtime);
|
||||
void v_bs_save_fee_data(U8_T u8_flag, S_FEE_MODEL *s_fee_model);
|
||||
void v_bs_log_txFlag_tradUpload(U8_T u8_gunNo);
|
||||
void v_bs_log_txFlag_autoStart(U8_T u8_gunNo); //设置充电鉴权上送标志;
|
||||
|
||||
void v_bs_charge_action_ctrl(U8_T u8_gunNo,E_CTRL_TYPE e_type, S_BS_CHAR_CTRL *s_ctrl_data);
|
||||
void v_remote_gunLock_ctrl(U8_T u8_gunNo,U8_T u8_type);
|
||||
void v_remote_reboot(U8_T type) ;
|
||||
|
||||
void v_cheak_state_change(void);
|
||||
void v_ftp_update_action(void);
|
||||
|
||||
U8_T u8_bs_get_txFlag_autoRwsult(U8_T u8_gunNo) ; //对外获取鉴权结果
|
||||
U8_T u8_bs_get_log_on_flag();
|
||||
|
||||
U8_T u8_card_info_add(char *card_id);
|
||||
void v_card_info_clear();
|
||||
void v_bs_get_gun_log_data(U8_T u8_gunNo , S_LOG_DATA *s_log);
|
||||
void v_bs_gwsdk_set_para(U8_T u8_type, S_SDK_DATA *s_sdk_data);
|
||||
void v_bs_logUploadOk_updateInfo(U16_T u16_cmplte_bill_index);
|
||||
void v_bs_get_fee_part_data(U8_T u8_gunNo,U8_T flag,S_LOG_DATA *t_log,U32_T *u32_part_energy,F32_T *f32_rate,F32_T *f32_sevice);
|
||||
|
||||
S8_T s8_plat_get_unsettled_order( S_LOG_DATA *s_log,U8_T u8_type);
|
||||
void v_bs_platform_settlement_confirm(U8_T u8_gunNo);
|
||||
void v_ocpp_offline_local_authentication_check(U8_T u8_gunNo);
|
||||
U8_T u8_plat_get_real_order(S_LOG_DATA *s_log,U8_T u8_gunNo);
|
||||
|
||||
void v_get_ocpp_cfg_info(char *mag , U16_T u16_len);
|
||||
U8_T u8_set_ocpp_cfg_info(const char *key,const char *data);
|
||||
void v_ocpp_get_real_log_file_name(char *fileName,int len);
|
||||
U8_T u8_bs_get_update_flag();
|
||||
U8_T u8_bs_get_gun_disable_flag(U8_T u8_gunNo);
|
||||
void v_ocpp_set_gun_flow_real_state_init(U8_T u8_gunNo);
|
||||
/** 设置二维码更新标志(CCU621 暂未实现) */
|
||||
void v_ccu_set_qrcode_flag(U8_T u8_gunNo, U8_T flag);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* BS_PUBLIC_IMPL_H */
|
||||
Reference in New Issue
Block a user