Files
vd_960/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/dbn_ble_srv.c
wangfq 95808f9f25 refactor(vd960Loop): 算法回退到 DLD154V4B,四通道适配
- 用 DLD154V4B vd1_task/per_channel 替换 vds_task 复杂算法
- 移除 FUNCTION_B/二次判断/快速变化/多重确认等增强特性
- 保留平坦性离开算法 (CN200910309382),每通道独立状态
- 灵敏度表改为 DLD154V4B 4级: {216,108,36,10} / {108,72,18,9}
- 清理废弃类型: FltHistoryManager, Loop_ACS_Info, StageRangeConfig 等
- 首次添加 vd960DBN 完整源码
2026-06-25 16:21:57 +08:00

923 lines
30 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* dbn_ble_srv.c
*
* Created on: Aug 27, 2024
* Author: Thinkpad
*/
#include "dbn_ble_srv.h"
#include "cmcng.h"
#include "storage.h"
#include <string.h>
#include "net_srv.h"
uint8_t g_flag_notify_temp = 0; //临时通知notify flag, 0 disable, 1 enable
BLE_Notify_Buf g_notify_buftemp = {0,0, ""};
BLE_Notify_Buf g_ble_rcv_buf = {0,0, ""};
BLE_Notify_Buf g_tmp_report_buf = {0,0, ""};
Buf_DBN_BLE g_buf_ble_response = {0,0,0,0,0,0,0,""};
DBN_BLE_State g_dbn_ble_state_acs_enable = {0};
uint8_t tmp_ble_buf[MAX_BLE_TMP_BUF_LEN] = "";
extern uint8_t loop1_FLAG_CUT;
void clear_ble_notify_buf(BLE_Notify_Buf * buf)
{
buf->len = 0;
buf->flag = 0;
memset(buf, 0, MAX_BLE_Notify_Buf_LEN);
}
void clear_buf_dbn_ble(Buf_DBN_BLE * buf)
{
uint8_t i = 0;
buf->flag = 0;
buf->magic = 0;
buf->cmd = 0;
memset(buf->dat, 0, buf->dat_len);
buf->dat_len = 0;
buf->dat_offset = 0;
buf->pkg_amount = 0;
buf->pkg_seq = 0;
}
void clear_buf_dbn_ble_all(Buf_DBN_BLE * buf)
{
uint8_t i = 0;
// if(g_flag_debug)
{
// PRINT("\nclear_buf_dbn_ble_flag:%02X,magic:%02X,pkg_amount:%02X,seq:%02X,cmd:%02X, dat_len:%d,offset:%d\n",
// buf->flag,buf->magic,buf->pkg_amount, buf->pkg_seq,buf->cmd, buf->dat_len,buf->dat_offset);
// for(i = 0; i < buf->dat_len; i++)
// {
// PRINT(" %02X", buf->dat[i]);
// }
// PRINT("\n");
}
buf->flag = 0;
buf->magic = 0;
buf->cmd = 0;
memset(buf->dat, 0, MAX_BLE_BUF_LEN);
buf->dat_len = 0;
buf->dat_offset = 0;
buf->pkg_amount = 0;
buf->pkg_seq = 0;
}
// 0: 包检测异常
//检测包是否完整Magic Byte, Header Byte, CK Byte, 校验字节(异或校验,以及和校验)
uint8_t check_pkg(uint8_t * pkg, uint8_t len)
{
if(len < 6) //min length of ble pkg is 6
return 0;
uint8_t magic = pkg[0];
uint8_t _len = pkg[2]; //data_len
if(magic == 0x9F){
// if(_len + 4 < len){
// return 0;
// }
if(pkg[1] == 0x01 && pkg[2] == 0x00 && pkg[3] == 0x01 && pkg[4] == 0xA5 && pkg[5] == 0xA7){
g_flag_counter_ota.tick = 0;
g_flag_counter_ota.flag = 1;
PRINT("Come into OTA___\n");
}
}
if(_len + 5 < len)
{
return 0;
}
uint8_t _dxor = 0;
uint8_t _dsum = 0;
uint8_t _cklen = _len + 3; //不计算 校验字节
uint8_t i = 0;
for(i = 1; i < _cklen; i++)
{
_dxor ^= pkg[i];
_dsum += pkg[i];
}
if((_dxor != pkg[_cklen]) || (_dsum != pkg[_cklen+1]))
{
// if(g_flag_debug)
// {
// PRINT("_dxor:0x%02X - 0x%02X, _dsum:0x%02X - 0x%02X\r\n", _dxor, pkg[_cklen], _dsum, pkg[_cklen + 1] );
// }
return 0;
}
return magic;
}
static uint8_t set_dev_info_to_ready(uint8_t *dat_dst)
{
uint8_t i = 0, j = 0;
for(i = 0; i < 6; i++)
{
dat_dst[i] = gMacAddr[i];
// PRINT(" %02X",dat_dst[i] );
}
// memcpy(dat_dst, MACAddr, sizeof(MACAddr));
// i += sizeof(MACAddr);
dat_dst[i++] = HARDWARE_VER_MAIN;
dat_dst[i++] = HARDWARE_VER_SUB;
dat_dst[i++] = FIRMWARE_VER_MAIN;
dat_dst[i++] = FIRMWARE_VER_SUB;
// Dev Model
dat_dst[i++] = strlen(PRODUCT_MODEL);
memcpy(&dat_dst[i], PRODUCT_MODEL, strlen(PRODUCT_MODEL));
i += strlen(PRODUCT_MODEL);
// Dev Number
for(j = 0; j < 6; j++, i++)
{
dat_dst[i] = g_dev_number[j];
}
// sub_code
// memcpy(&dat_dst[i], &(g_sub_code_enable.code_set), sizeof(g_sub_code_enable.code_set));
// i += sizeof(g_sub_code_enable.code_set);
dat_dst[i++] = 0;
dat_dst[i++] = 0;
dat_dst[i++] = 0; // g_bus_dus_amount_stored.bus1_amount;
dat_dst[i++] = 0; //g_bus_dus_amount_stored.bus2_amount;
return i;
}
static uint8_t set_net_info_to_ready(uint8_t * dat_dst)
{
uint8_t i = 0;
memcpy(&dat_dst[i], local_net_cfg.lip, 4);
i += 4;
memcpy(&dat_dst[i], local_net_cfg.sub, 4);
i += 4;
memcpy(&dat_dst[i], local_net_cfg.gw, 4);
i += 4;
memcpy(&dat_dst[i], net_center_info.lssc_ip, 4);
i += 4;
memcpy(&dat_dst[i], local_net_cfg.dns, 4);
i += 4;
dat_dst[i++] = local_net_cfg.port_ssc_tcp;
dat_dst[i++] = local_net_cfg.port_ssc_tcp >> 8;
dat_dst[i++] = local_net_cfg.port_ssc_udp;
dat_dst[i++] = local_net_cfg.port_ssc_udp >> 8;
dat_dst[i++] = local_net_cfg.port_ssc_udp_message;
dat_dst[i++] = local_net_cfg.port_ssc_udp_message >> 8;
dat_dst[i++] = local_net_cfg.port_dev_tcp;
dat_dst[i++] = local_net_cfg.port_dev_tcp >> 8;
dat_dst[i++] = local_net_cfg.port_dev_udp;
dat_dst[i++] = local_net_cfg.port_dev_udp >> 8;
return i;
}
void set_response_iot_net(Buf_DBN_BLE *response_dst)
{ // config iot_net
uint8_t ret = 0;
uint8_t i = 0;
int _len = 0;
clear_buf_dbn_ble(response_dst);
response_dst->magic = MAGIC_BYTE_DBN_DEFAULT;
response_dst->cmd = CMD_DBN_GET_IOT_NET;
memcpy(response_dst->dat, iot_net_info.remote_addr, strlen(iot_net_info.remote_addr));
i += strlen(iot_net_info.remote_addr);
i++;
_len = sprintf(&(response_dst->dat[i]), "%d", iot_net_info.mqtt_port);
i += _len;
i++;
memcpy(&(response_dst->dat[i]), iot_net_info.client_id, strlen(iot_net_info.client_id));
i += strlen(iot_net_info.client_id);
i++;
memcpy(&(response_dst->dat[i]), iot_net_info.username, strlen(iot_net_info.username));
i += strlen(iot_net_info.username);
i++;
memcpy(&(response_dst->dat[i]), iot_net_info.password, strlen(iot_net_info.password));
i += strlen(iot_net_info.password);
response_dst->dat_len = i;
response_dst->pkg_amount = i / MAX_BLE_DAT_RESPONSE_LEN;
if((i % MAX_BLE_DAT_RESPONSE_LEN) > 0)
{
response_dst->pkg_amount += 1;
}
response_dst->pkg_seq = 0;
response_dst->flag = 1;
}
void set_response_iot_topic(Buf_DBN_BLE *response_dst)
{ //config iot_topic
uint8_t ret = 0;
uint8_t i = 0;
int _len = 0;
clear_buf_dbn_ble(response_dst);
response_dst->magic = MAGIC_BYTE_DBN_DEFAULT;
response_dst->cmd = CMD_DBN_GET_IOT_TOPIC;
response_dst->dat[0] = g_iot_topic.clientid_enable + 0x30;
i++;
i++;
memcpy(&(response_dst->dat[i]), g_iot_topic.topic_pub, strlen(g_iot_topic.topic_pub));
i += strlen(g_iot_topic.topic_pub);
i++;
memcpy(&(response_dst->dat[i]), g_iot_topic.topic_sub, strlen(g_iot_topic.topic_sub));
i += strlen(g_iot_topic.topic_sub);
response_dst->dat_len = i;
response_dst->pkg_amount = i / MAX_BLE_DAT_RESPONSE_LEN;
if((i % MAX_BLE_DAT_RESPONSE_LEN) > 0)
{
response_dst->pkg_amount += 1;
}
response_dst->pkg_seq = 0;
response_dst->flag = 1;
}
uint8_t set_response_buf(Buf_DBN_BLE *response_dst, uint8_t magic, uint8_t cmd, uint8_t * dat, uint8_t dat_len)
{
uint8_t ret = 0;
uint8_t i = 0;
clear_buf_dbn_ble(response_dst);
response_dst->magic = magic;
response_dst->cmd = cmd;
uint8_t _amount = dat_len / MAX_BLE_DAT_RESPONSE_LEN;
if((dat_len % MAX_BLE_DAT_RESPONSE_LEN) > 0)
{
_amount++;
}
response_dst->pkg_amount = _amount;
response_dst->pkg_seq = 0;
response_dst->dat_len = dat_len;
for(i = 0; i < dat_len; i++)
{
response_dst->dat[i] = dat[i];
}
response_dst->flag = 1;
return ret;
}
uint16_t compute_ckb(uint8_t header_0, uint8_t header_1, uint8_t header_cmd, uint8_t *dat, uint8_t dat_len)
{
uint16_t ret = 0;
uint8_t i = 0;
uint8_t _dxor = header_0 ^ header_1 ^ header_cmd;
uint8_t _dsum = header_0 + header_1 + header_cmd;
for(i = 0; i < dat_len; i++)
{
_dxor ^= dat[i];
_dsum += dat[i];
}
ret = _dxor;
ret = (ret << 8) + (_dsum % 0x100);
return ret;
}
uint8_t set_response_tran_to_notify(uint8_t *dat_ori, uint8_t dat_len, BLE_Notify_Buf * notify_dst)
{
uint8_t ret = 0;
uint8_t i = 0;
if(g_flag_bt_state == 0){
return ret;
}
if(notify_dst->flag)
{ //dst not idle
return ret;
}
if(dat_len < 6)
{
return ret;
}
for(i = 0; i < dat_len; i++)
{
notify_dst->buf[i] = dat_ori[i];
}
notify_dst->len = dat_len;
notify_dst->flag = 1;
}
//response_ori must set_response_buf first
uint8_t set_response_to_notify(Buf_DBN_BLE *response_ori, BLE_Notify_Buf * notify_dst)
{
uint8_t ret = 0;
uint8_t i = 0;
uint16_t _ckbl = 0;
if(notify_dst->flag)
{ //dst not idle
return ret;
}
if(response_ori->flag == 0)
{ //ori idle
return ret;
}
if(response_ori->pkg_amount <= 1)
{
//没有分包的情况
notify_dst->buf[0] = response_ori->magic;
if(response_ori->magic == MAGIC_BYTE_DBN_TRANSPARENT)
{
notify_dst->buf[1] = response_ori->pkg_seq;
}
else
{
notify_dst->buf[1] = 0;
}
notify_dst->buf[2] = response_ori->dat_len + 1; // 1 is cmd_byte
notify_dst->buf[3] = response_ori->cmd;
_ckbl = compute_ckb(notify_dst->buf[1], notify_dst->buf[2], notify_dst->buf[3], response_ori->dat, response_ori->dat_len);
for(i = 0; i < response_ori->dat_len; i++)
{
notify_dst->buf[i + 4] = response_ori->dat[i];
}
notify_dst->buf[i + 4] = (uint8_t)(_ckbl >> 8);
i++;
notify_dst->buf[i + 4] = (uint8_t)(_ckbl);
i++;
notify_dst->len = i + 4;
// if(g_flag_debug)
// {
// PRINT("set_response_to_notify_dst__\n");
// for(i = 0; i < notify_dst->len; i++)
// {
// PRINT(" %02X", notify_dst->buf[i]);
// }
// }
notify_dst->flag = 1;
clear_buf_dbn_ble(response_ori);
return 1;
}
else
{
notify_dst->buf[0] = response_ori->magic;
uint8_t _pkg_amount = response_ori->pkg_amount;
uint8_t _pkg_seq = response_ori->pkg_seq;
uint8_t _remain_len = response_ori->dat_len - response_ori->dat_offset;
if(_remain_len > MAX_BLE_DAT_RESPONSE_LEN)
{
_remain_len = MAX_BLE_DAT_RESPONSE_LEN;
}
_pkg_seq += 1;
notify_dst->buf[1] = (_pkg_amount << 4)|(_pkg_seq);
notify_dst->buf[2] = _remain_len + 1; // 1 is cmd_byte
notify_dst->buf[3] = response_ori->cmd;
_ckbl = compute_ckb(notify_dst->buf[1], notify_dst->buf[2], notify_dst->buf[3],
&(response_ori->dat[response_ori->dat_offset]), _remain_len);
for(i = 0; i < _remain_len; i++)
{
notify_dst->buf[i + 4] = response_ori->dat[response_ori->dat_offset + i];
}
notify_dst->buf[i + 4] = (uint8_t)(_ckbl >> 8);
i++;
notify_dst->buf[i + 4] = (uint8_t)(_ckbl);
i++;
response_ori->dat_offset += _remain_len;
response_ori->pkg_seq += 1;
notify_dst->len = i + 4;
// if(g_flag_debug)
// {
// PRINT("\nset_notify_dst,amount:%d,seq:%d,offset:%d\n", response_ori->pkg_amount,response_ori->pkg_seq, response_ori->dat_offset);
// for(i = 0; i < notify_dst->len; i++)
// {
// PRINT(" %02X", notify_dst->buf[i]);
// }
// PRINT("\n");
// }
notify_dst->flag = 1;
if(response_ori->pkg_amount == response_ori->pkg_seq)
{
clear_buf_dbn_ble(response_ori);
}
return 1;
}
}
static uint8_t unpack_packs(uint8_t *pkg, uint8_t len)
{
static uint8_t _offset = 0;
uint8_t _header_0 = pkg[1];
uint8_t _header_0_high = _header_0 >> 4;
uint8_t _header_0_low = _header_0 % 0x10;
uint8_t _len = pkg[2];
uint8_t _cmd = pkg[3];
uint8_t i = 0, j = 0, k = 0;
uint8_t _amount = 0;
if(_header_0_high)
{
if(_header_0_low == 1)
{
g_buf_ble_response.magic = pkg[0];
g_buf_ble_response.pkg_amount = _header_0_high;
g_buf_ble_response.pkg_seq = _header_0_low;
g_buf_ble_response.cmd = _cmd;
memcpy(&g_buf_ble_response.dat, &pkg[4], _len - 1);
_offset = _len - 1;
g_buf_ble_response.dat_len = _len - 1;
}
else
{
if((g_buf_ble_response.pkg_amount != _header_0_high) || (g_buf_ble_response.cmd != _cmd))
{
//printf("\nNot_the_right_sub_pack!\n");
clear_buf_dbn_ble_all(&g_buf_ble_response);
return 0;
}
if(g_buf_ble_response.pkg_seq != (_header_0_low -1))
{
//printf("\nNot_the_right_sub_pack!!\n");
clear_buf_dbn_ble_all(&g_buf_ble_response);
return 0;
}
g_buf_ble_response.pkg_seq = _header_0_low;
g_buf_ble_response.dat_len += (_len - 1); // not include cmd_byte
memcpy(&g_buf_ble_response.dat[_offset], &pkg[4], _len - 1);
_offset += (_len - 1);
}
}
else
{
clear_buf_dbn_ble(&g_buf_ble_response);
g_buf_ble_response.magic = pkg[0];
g_buf_ble_response.pkg_amount = 1;
g_buf_ble_response.pkg_seq = 0;
g_buf_ble_response.cmd = _cmd;
g_buf_ble_response.dat_len = (_len - 1);
memcpy(g_buf_ble_response.dat, &pkg[4], _len - 1);
}
if(_header_0_high == _header_0_low)
{
// received end.
// if(g_flag_debug)
// {
// printf("\nReceive_pack_over:\n");
// for(i = 0; i < g_buf_ble_response.dat_len; i++)
// {
// printf(" %02X", g_buf_ble_response.dat[i]);
// }
// printf("\nEnd\n");
// }
if(g_buf_ble_response.cmd == CMD_DBN_CHECK_PASS)
{
memset(tmp_ble_buf, 0, MAX_BLE_TMP_BUF_LEN);
if(g_buf_ble_response.dat_len != 6)
{
//response pass failed
tmp_ble_buf[0] = 0x01;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
}
else
{
char _pass = check_ble_safe_pass(g_buf_ble_response.dat);
if(_pass)
{
//response ok
tmp_ble_buf[0] = 0x0;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
}
else
{
//response failed
tmp_ble_buf[0] = 0x01;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
}
}
} //end if g_buf_ble_response.cmd == CMD_DBN_CHECK_PASS
else if(g_buf_ble_response.cmd == CMD_DBN_MODIFY_PASS)
{
memset(tmp_ble_buf, 0, MAX_BLE_TMP_BUF_LEN);
if(g_buf_ble_response.dat_len != 12)
{
//response failed
tmp_ble_buf[0] = 0x01;
}
else
{
char _pass = check_ble_safe_pass(g_buf_ble_response.dat);
if(_pass)
{
//response ok
set_ble_safe_pass(&g_buf_ble_response.dat[6]);
tmp_ble_buf[0] = 0x00;
}
else
{
//response failed
tmp_ble_buf[0] = 0x01;
}
}
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
} //end if g_buf_ble_response.cmd == CMD_DBN_MODIFY_PASS
else if(g_buf_ble_response.cmd == CMD_DBN_SET_IOT_NET)
{
for(i = 0, j = 0, k = 0; i < g_buf_ble_response.dat_len; i++)
{
if(g_buf_ble_response.dat[i] == 0x00)
{
j++;
if(k == 0)
{
//iot _host
PRINT("Rcv_Host:%s\n", tmp_ble_buf);
memcpy(iot_net_info.remote_addr, tmp_ble_buf, j);
}
else if(k == 1)
{
PRINT("Rcv_Port:%s\n", tmp_ble_buf);
uint16_t _port = 0;
for(j = 0; j < strlen(tmp_ble_buf); j++)
{
_port *= 10;
_port += tmp_ble_buf[j] - 0x30;
}
iot_net_info.mqtt_port = _port;
}
else if(k == 2)
{
PRINT("Rcv_Client:%s\n", tmp_ble_buf);
if((strlen(tmp_ble_buf) == 1) && (tmp_ble_buf[0] == 0x20))
{
PRINT("Client_use local_serial\n");
}
else
{
memcpy(iot_net_info.client_id, tmp_ble_buf, j);
}
}
else if(k == 3)
{
PRINT("Rcv_Username:%s\n", tmp_ble_buf);
memcpy(iot_net_info.username, tmp_ble_buf, j);
}
else if(k == 4)
{
PRINT("Rcv_Pass:%s\n", tmp_ble_buf);
memcpy(iot_net_info.password, tmp_ble_buf, j);
}
k++;
memset(tmp_ble_buf, 0, MAX_BLE_TMP_BUF_LEN);
j = 0;
}
else
{
tmp_ble_buf[j] = g_buf_ble_response.dat[i];
j++;
}
}
if(k == 4)
{
PRINT("Rcv_Pass:%s\n", tmp_ble_buf);
memcpy(iot_net_info.password, tmp_ble_buf, strlen(tmp_ble_buf) + 1);
}
memset(tmp_ble_buf, 0, MAX_BLE_TMP_BUF_LEN);
write_net_config(&local_net_cfg, &net_center_info, &iot_net_info, &g_iot_topic);
// response finally
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
//clear_buf_dbn_ble_all(&g_buf_ble_response);
} //end if CMD_DBN_SET_IOT_NET
else if(g_buf_ble_response.cmd == CMD_DBN_SET_IOT_TOPIC)
{
for(i = 0, j = 0, k = 0; i < g_buf_ble_response.dat_len; i++)
{
if(g_buf_ble_response.dat[i] == 0x00)
{
//j++;
if(k == 0)
{
g_iot_topic.clientid_enable = tmp_ble_buf[0] - 0x30;
}
else if(k == 1)
{
// if(g_flag_debug)
// {
// printf("rcv_topic_pub_:%s\n", tmp_ble_buf);
// for(f = 0; f < j; f++)
// {
// printf(" %02X", tmp_ble_buf[f]);
// }
// printf(", j:%d\n", j);
// }
memset(g_iot_topic.topic_pub, 0, MAX_TOPIC_LENGTH);
memcpy(g_iot_topic.topic_pub, tmp_ble_buf, j + 1);
}
k++;
j = 0;
memset(tmp_ble_buf, 0, MAX_BLE_TMP_BUF_LEN);
}
else
{
tmp_ble_buf[j] = g_buf_ble_response.dat[i];
j++;
}
}
if(k == 2)
{
// if(g_flag_debug)
// {
// printf("rcv_topic_sub_:%s\n", tmp_ble_buf);
// }
memset(g_iot_topic.topic_sub, 0, MAX_TOPIC_LENGTH);
memcpy(g_iot_topic.topic_sub, tmp_ble_buf, strlen(tmp_ble_buf) + 1);
}
memset(tmp_ble_buf, 0, MAX_BLE_TMP_BUF_LEN);
write_net_config(&local_net_cfg, &net_center_info, &iot_net_info, &g_iot_topic);
// response finally
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
} // end if CMD_DBN_SET_IOT_TOPIC
}
return 0;
}
void manage_dbn_ble_default(uint8_t *pkg, uint8_t len)
{
uint8_t _header_0 = pkg[1];
uint8_t _header_0_high = 0;
uint8_t _header_0_low = _header_0 % 0x10;
uint8_t _len = pkg[2];
uint8_t _cmd = pkg[3];
uint8_t _tmp = 0;
uint8_t i = 0, k = 0;
memset(tmp_ble_buf, 0, MAX_BLE_TMP_BUF_LEN);
switch(_cmd)
{
case CMD_DBN_GET_DEV_INFO:
{
i = set_dev_info_to_ready(tmp_ble_buf);
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i);
// printf("\nGet_dev_info\n");
} break;
case CMD_DBN_SET_LSSC_NET:
{
//printf("Set_Net_info_len:%d\n", len);
if(len < 34)
{
return;
}
i = 4;
memcpy(local_net_cfg.lip, &pkg[i], 4);
i += 4;
memcpy(local_net_cfg.sub, &pkg[i], 4);
i += 4;
memcpy(local_net_cfg.gw, &pkg[i], 4);
i += 4;
memcpy(net_center_info.lssc_ip, &pkg[i], 4);
//i += 4;
//printf("Reset_lip:%d\n",local_net_cfg.lip[3]);
i = 24;
//printf("Reset_lport:%02X %02X\n",pkg[24], pkg[25]);
//memcpy(local_net_cfg.dns
// local_net_cfg.port_ssc_tcp = *(uint16_t *)(&pkg[24]); //TOOD: Will err, why?
local_net_cfg.port_ssc_tcp = (pkg[25] << 8) | pkg[24];// This is OK
i += 2;
// local_net_cfg.port_ssc_udp = *(uint16_t *)(&pkg[i]);
local_net_cfg.port_ssc_udp =(pkg[27] <<8 ) | pkg[26];
i += 2;
// local_net_cfg.port_ssc_udp_message = *(uint16_t *)(&pkg[i]);
local_net_cfg.port_ssc_udp_message = (pkg[29] << 8) | pkg[28];
i += 2;
// local_net_cfg.port_dev_tcp = *(uint16_t *)(&pkg[i]);
local_net_cfg.port_dev_tcp = (pkg[31] << 8) | pkg[30];
net_center_info.tcp_port = local_net_cfg.port_dev_tcp;
i += 2;
// local_net_cfg.port_dev_udp = *(uint16_t *)(&pkg[32]);
local_net_cfg.port_dev_udp = (pkg[33] << 8) | pkg[32];
//printf("Will_reset_net_param___\n");
write_net_config(&local_net_cfg, &net_center_info, &iot_net_info, &g_iot_topic);
//response
tmp_ble_buf[0] = 0;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
} break;
case CMD_DBN_GET_LSSC_NET:
{
i = set_net_info_to_ready(tmp_ble_buf);
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i);
// printf("Get_Net_Info\n");
} break;
case CMD_DBN_GET_IOT_NET:
{
set_response_iot_net(&g_buf_ble_response);
} break;
case CMD_DBN_SET_IOT_NET:
{
unpack_packs(pkg, len);
} break;
case CMD_DBN_SET_IOT_TOPIC:
{
unpack_packs(pkg, len);
} break;
case CMD_DBN_GET_IOT_TOPIC:
{
set_response_iot_topic(&g_buf_ble_response);
} break;
case CMD_DBN_RESET_DEV:
{
//Restart Dev
NVIC_SystemReset();
} break;
case CMD_DBN_CHECK_PASS:
{
unpack_packs(pkg, len);
} break;
case CMD_DBN_SET_CJQ_PARAM:
{
// PRINT("\nSet_Cjq_param\n");
// unpack_pkg_set_cjq_param(pkg, len);
tmp_ble_buf[0] = 0;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
// para_store_init();
} break;
case CMD_DBN_GET_CJQ_PARAM:
{
i = 0;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i);
// PRINT("\nGet_Cjq_param\n");
} break;
case CMD_DBN_LOOP_SENS_LIST: {
// PRINT("SENS_CNG: %02X\n", pkg[4]);
memset(tmp_ble_buf, 0, MAX_BLE_TMP_BUF_LEN);
} break;
case CMD_DBN_SET_FACTORY:
case CMD_DBN_SET_CJQ_FACTORY: {
// 出厂初始化
tmp_ble_buf[0] = 0;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
factory_dev_info();
Delay_Ms(10);
//TODO: 不整个设备复位,复位除了蓝牙的部分,即蓝牙正常,其他部分重新初始化
} break;
case CMD_DBN_RW_UART_BAUD:{ //
uint8_t _rw = pkg[4];
uint32_t _baud = 0;
i = 0;
tmp_ble_buf[i++] = _rw;
tmp_ble_buf[i++] = 0x01; //status
if(_rw == 0){// read baud
tmp_ble_buf[i++] = g_max_counter_bt_min; // Idle Ble timeout
tmp_ble_buf[i++] = (uint8_t)g_storage_uart_baud; //1 g_storage_uart_baud? 2 g_storage_uart_baud_2
tmp_ble_buf[i++] = (uint8_t)(g_storage_uart_baud >> 8);
tmp_ble_buf[i++] = (uint8_t)(g_storage_uart_baud >> 16);
tmp_ble_buf[i++] = 0x02;
tmp_ble_buf[i++] = (uint8_t)g_storage_uart_baud_2;
tmp_ble_buf[i++] = (uint8_t)(g_storage_uart_baud_2 >> 8);
tmp_ble_buf[i++] = (uint8_t)(g_storage_uart_baud_2 >> 16);
// 4BYte Reserved
}
else { // write baud
alter_dev_baud(&pkg[5]); //
g_storage_uart_num = pkg[5];
g_storage_uart_baud = pkg[6];
g_storage_uart_baud |= (uint16_t)(pkg[7] << 8) & 0xFF00;
g_storage_uart_baud |= (uint32_t)(pkg[8] << 16) & 0xFF0000;
tmp_ble_buf[i++] = g_storage_uart_baud;
tmp_ble_buf[i++] = (uint8_t)g_storage_uart_baud;
tmp_ble_buf[i++] = (uint8_t)(g_storage_uart_baud >> 8);
tmp_ble_buf[i++] = (uint8_t)(g_storage_uart_baud >> 16);
tmp_ble_buf[i++] = 0x00; tmp_ble_buf[i++] = 0x00; tmp_ble_buf[i++] = 0x00; tmp_ble_buf[i++] = 0x00; // 4BYte Reserved
}
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, i);
} break;
case CMD_DBN_UPDATE_DEV_SERIAL:
{
alter_dev_serila(&pkg[4]);
//response
tmp_ble_buf[0] = 1;
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, 1);
} break;
case CMD_SENS_ACS_ENABLE: {
// 线圈动态
g_dbn_ble_state_acs_enable.enable = pkg[5];
if(g_dbn_ble_state_acs_enable.enable){
g_dbn_ble_state_acs_enable.interval = pkg[6] * 0x7F;
g_dbn_ble_state_acs_enable.timeout_min = pkg[7];
if(g_dbn_ble_state_acs_enable.timeout_min){
g_dbn_ble_state_acs_enable.counter = mstick();
g_dbn_ble_state_acs_enable.timeout_counter = g_dbn_ble_state_acs_enable.timeout_min * 60 * 100; // TODO: min --> ms
}
g_dbn_ble_state_acs_enable.flag = 1;
}
else{
g_dbn_ble_state_acs_enable.flag = 0;
}
PRINT("Rcv_acs_enable_flag: %d\n", g_dbn_ble_state_acs_enable.flag);
} break;
default:
{
} break;
}
}
void manage_dbn_ble_transparent(uint8_t *pkg, uint8_t len)
{
//
// transparent_485(pkg, len);
// UART1_SendString(pkg, len);
UART2_SendString(pkg, len);
}
void poll_dbn_ble(void)
{
uint8_t i = 0;
uint8_t magic = 0;
if(g_ble_rcv_buf.flag)
{
if(g_flag_debug && g_flag_counter_ota.flag == 0)
{
PRINT("profile ChangeCB CHAR1?..:%s, len:%d \n", g_ble_rcv_buf.buf, g_ble_rcv_buf.len);
for(i = 0; i < g_ble_rcv_buf.len; i++)
{
PRINT(" %02X", g_ble_rcv_buf.buf[i]);
}
PRINT("\n");
}
if(g_flag_counter_ota.flag == 0){
magic = check_pkg(g_ble_rcv_buf.buf, g_ble_rcv_buf.len);
}
// printf("_magic: %02X\n", magic);
if(g_flag_counter_ota.flag){
manage_dbn_ble_transparent(g_ble_rcv_buf.buf, g_ble_rcv_buf.len);
}
else{
if(magic != 0)
{
if(magic == MAGIC_BYTE_DBN_DEFAULT)
{
manage_dbn_ble_default(g_ble_rcv_buf.buf, g_ble_rcv_buf.len);
}
else if (magic == MAGIC_BYTE_DBN_TRANSPARENT)
{
manage_dbn_ble_transparent(g_ble_rcv_buf.buf, g_ble_rcv_buf.len);
}
}
}
// memcpy(g_notify_buftemp.buf, g_ble_rcv_buf.buf, g_ble_rcv_buf.len);
// g_notify_buftemp.len = g_ble_rcv_buf.len;
// g_flag_notify_temp = 1;
clear_ble_notify_buf(&g_ble_rcv_buf);
}
if(g_notify_buftemp.flag == 0)
{
// report_sens_acs();
g_flag_notify_temp = set_response_to_notify(&g_buf_ble_response, &g_notify_buftemp);
}
}