测试服务器和蓝牙之间的交互通过

This commit is contained in:
小马_666 2024-12-17 15:42:58 +08:00
parent 0a494a737a
commit bb4e10bf74
8 changed files with 122 additions and 86 deletions

View File

@ -1,4 +1,5 @@
eclipse.preferences.version=1
encoding//.git/objects/54/7f302e8700e84e20866af42cd1486f10f532a1=GBK
encoding//Ld/Link.ld=GBK
encoding//applications/main.c=UTF-8
encoding//applications/user_sys.h=UTF-8
@ -15,6 +16,7 @@ encoding//bsp/src/bsp_flash.c=UTF-8
encoding//bsp/src/bsp_led.c=GBK
encoding//bsp/src/bsp_rtc.c=UTF-8
encoding//bsp/src/bsp_vin_detection.c=UTF-8
encoding//libcpu/cpu/context_gcc.S=GBK
encoding//libraries/hal_drivers/drv_gpio.c=GBK
encoding//libraries/hal_drivers/drv_gpio.h=GBK
encoding//libraries/hal_drivers/drv_usart.c=UTF-8

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-10-23 17:14:16
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-05 16:42:07
* @LastEditTime: 2024-12-17 11:47:24
* @FilePath: \ble_bjq_ch303rct6_ml307\applications\main.c
* @Descrt_thread_
*
@ -25,6 +25,7 @@
#include "bsp_ml307.h"
#include "bsp_vin_detection.h"
#include "user_sys.h"
#include "bsp_bt.h"
#define LOG_TAG "main"
#define LOG_LVL LOG_LVL_DBG
@ -121,9 +122,15 @@ int _Self_Check_Mode(void)
rt_thread_mdelay(2000);
// 第5s关闭电磁阀
LOG_I("自检电磁阀动作");
LOG_I("自检风机动作");
Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL);
if (rt_sem_take(&bt_ctr_sem, 10000) == RT_EOK)
{
LOG_D("电磁阀动作完成");
}
else
{
LOG_E("电磁阀动作失败");
}
return RT_EOK;
}
@ -153,7 +160,7 @@ int main(void)
{
// 定义超时时间,单位为毫秒
// #define TIMEOUT_MS 3 * 60 * 1000
#define TIMEOUT_MS 8* 1000
#define TIMEOUT_MS 8 * 1000
#define WORK_TIMER_CNT (1000 * 60 * 60 * 24)
rt_err_t result = RT_EINVAL;
rt_uint32_t received_event;
@ -173,7 +180,7 @@ int main(void)
uint32_t ticks = 0, gas_calibration_voltage;
while (1)
{
gas_calibration_voltage = Get_Gas_VoltageInt1000x();
gas_calibration_voltage = Get_Gas_VoltageAdcInt1000x();
LOG_D("ticks[%d] gas_calibration_voltage = %d", ticks++, gas_calibration_voltage);
if (g_Calibration_status == kNotCalibrated)//没标定
@ -299,11 +306,18 @@ int main(void)
SysControl.last_status = SysControl.status;
SysControl.status = kAlarmEvent;
Flash_Write_Record(kRecordAlarm); // 写入flash报警信息
LED_R_ALARM;
BEEP_ALARM;
Flash_Write_Record(kRecordAlarm); // 写入flash报警信息
Bt_Valve_Handler(kValveCmdCtr, 0, RT_NULL);
if (rt_sem_take(&bt_ctr_sem, 10000) == RT_EOK)
{
LOG_D("电磁阀动作完成");
}
else
{
LOG_E("电磁阀动作失败");
}
#if (IOT_MODULE_SWITCH == 1)
Ml307_Send_Event(kMl307AlarmEvent);

View File

@ -74,7 +74,7 @@ extern agile_led_t *led_y;
LED_STOP(r); \
LED_STOP(g); \
LED_STOP(y); \
LED_CTRL(g, "200,200", -1);\
LED_CTRL(g, "200,200", 3);\
LED_START(g);\
} while (0U)

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-11-30 16:46:31
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-04 16:18:21
* @LastEditTime: 2024-12-17 11:35:28
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\bsp_mq.h
* @Description:
* @
@ -95,6 +95,7 @@ typedef enum
int BSP_MQ_Init(void);
uint16_t Get_Gas_VoltageInt1000x(void);
uint16_t Get_Gas_VoltageAdcInt1000x(void);
uint8_t IS_EndOfLife(void);

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-12-03 10:31:45
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-16 19:00:53
* @LastEditTime: 2024-12-17 15:40:10
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c
* @Description:
*
@ -30,7 +30,7 @@ struct rt_semaphore bt_reg_sem; // 注册阀门信号量
struct rt_semaphore bt_rem_sem; // 移除阀门信号量
struct rt_semaphore bt_rep_sem; // 更换阀门信号量
#define BT_THREAD_TIMESLICE (5)
#define BT_THREAD_TIMESLICE (20)
#define BT_THREAD_PRIORITY (10)
#define BT_THREAD_STACK_SIZE (2048)
@ -39,10 +39,10 @@ static rt_uint8_t bt_thread_stack[BT_THREAD_STACK_SIZE] = {0};
static struct rt_thread bt_thread = {0};
lwrb_t bt_lwrb_rx;
static char bt_rx_buffer[256] = {0};
BTFrameData bt_frame = {0};
static char bt_rx_buffer[1024] = {0};
BTFrameData bt_frame = {0};
valve_data valve[MAX_VALVE_NUM];
valve_data valve[MAX_VALVE_NUM] = {0};
rt_size_t BSP_Bt_Send_Data(uint8_t *data, size_t size)
{
@ -53,31 +53,6 @@ rt_size_t BSP_Bt_Recv_Data(uint8_t *data, size_t size)
{
return lwrb_read(&bt_lwrb_rx, data, size);
}
int BSP_BT_Init(void)
{
rt_uint8_t num = Flash_Get_Valve_Num();
rt_uint8_t mac_buf[FLASH_VALVE_MAC_ADDR_LEN] = {0};
if (num != 0)
{
for (size_t i = 0; i < MAX_VALVE_NUM; i++)
{
valve[i].valve_id = (i + 1); // 1-8
if (Flash_Get_Mac_Addr(valve[i].valve_mac, i) == RT_EOK)
{
rt_memcpy(valve[i].valve_mac, mac_buf, 6);
}
}
}
else
{
for (size_t i = 0; i < MAX_VALVE_NUM; i++)
{
rt_memset(&valve[i], 0, sizeof(struct valve_t));
}
}
return RT_EOK;
}
INIT_PREV_EXPORT(BSP_BT_Init);
static rt_err_t bt_getchar(char *ch, rt_int32_t timeout)
{
@ -255,11 +230,6 @@ int Bt_Valve_Handler(ValveCmdType type, rt_uint8_t id, rt_uint8_t *data)
break;
case kValveCmdRep: // 阀门更换
ret = BSP_Bt_Replace_Valve(valve[id].valve_id, valve[id].valve_mac, data);
if (ret == RT_EOK)
{
rt_memcpy(valve[id].valve_mac, data, 6);
Flash_Set_Mac_Addr(valve[id].valve_mac, valve[id].valve_id - 1);
}
break;
default:
ret = -RT_ERROR;
@ -274,10 +244,11 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
{
int ret = 0;
uint16_t index = 0;
rt_uint8_t end_index = 0;
uint8_t data_buf[256] = {0};
// 解析接收到的数据帧先寻找AA开头然后再找AA下一个字节其代表了数据长度然后找到代表长度的值的长度的下一位其为校验码校验码后为结束码0x55
// 如果数据正确,则提取数据,不正确,则不处理
// LOG_HEX("BT_RX_DATA", 16, data, len);
LOG_HEX("BT_RX_DATA", 16, data, len);
LOG_D("len = %d", len);
if (len < 4)
{ // 至少需要 4 个字节:起始码、长度、校验码、结束码
@ -289,7 +260,21 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
{
index++;
}
LOG_D("index = %d", index);
for (size_t i = 0; i < len - 3; i++)//发现了一种情况会出现两个AA用这种方法排除一下
{
if (data[index + i + 1] == 0XAA)
{
index++;
}
else
{
break;
}
}
while (end_index < len && data[end_index] != 0x55) // 寻找起始码 0xAA
{
end_index++;
}
uint16_t datalength = data[index + 1]; // 读取数据长度
LOG_D("datalength = %d", datalength);
@ -299,12 +284,15 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
{
LOG_E("校验和不对 rx_sum[%02X] != calculated_sum[%02X]", rx_sum, calculated_sum);
LOG_HEX("bt_rx_data:", 16, data, len);
lwrb_reset(&bt_lwrb_rx);
return 4;
}
if (data[index + 2 + datalength + 1] != 0x55) // 检查结束码
if (data[index + 1 + datalength + 2] != data[end_index])// 检查结束码
{
LOG_E("结束码错误");
LOG_E("结束码位置错误");
LOG_HEX("bt_rx_data:", 16, data, len);
lwrb_reset(&bt_lwrb_rx);
return 5;
}
rt_uint8_t fram_len = datalength + 4;
@ -340,11 +328,15 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
}
break;
case kValveEventRep:
if (data_buf[index + datalength - 3] == RT_TRUE) // 更换成功
if (data_buf[fram_len - 3] == RT_TRUE) // 更换成功
{
LOG_D("阀门更换响应成功");
rt_sem_release(&bt_rep_sem);
}
else
{
LOG_E("阀门更换失败");
}
break;
case kValveEventStatus:
LOG_I("接收到阀门心跳数据:");
@ -365,25 +357,32 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
static void BSP_Bt_Parse_Data(void)
{
rt_size_t len = lwrb_get_full(&bt_lwrb_rx);
char *rx_ptr = rt_calloc(1, len + 1);
BSP_Bt_Recv_Data(rx_ptr, len);
// char *rx_ptr = rt_malloc(len + 1);
rt_uint8_t bt_rx_buf[256] = {0};
BSP_Bt_Recv_Data(bt_rx_buf, len);
// 发送过来的数据格式为:帧头 + 数据长度 + 事件类型 + 数据 + 校验码 + 帧尾
BSP_Bt_Process(rx_ptr, len);
rt_free(rx_ptr);
BSP_Bt_Process(bt_rx_buf, len);
// rt_free(rx_ptr);
}
static void Bt_Thread_Entry(void *parameter)
{
// 初始化阀门信息
valve[0].valve_id = 1;
valve[0].valve_mac[0] = 0XA2;
valve[0].valve_mac[1] = 0xB4;
valve[0].valve_mac[2] = 0x8F;
valve[0].valve_mac[3] = 0x10;
valve[0].valve_mac[4] = 0x53;
valve[0].valve_mac[5] = 0x5C;
Flash_Set_Mac_Addr(valve[0].valve_mac, 0);
Flash_Set_Valve_Num(1);
// valve[0].valve_id = 1;
// valve[0].valve_mac[0] = 0X93;
// valve[0].valve_mac[1] = 0xB4;
// valve[0].valve_mac[2] = 0x8F;
// valve[0].valve_mac[3] = 0x10;
// valve[0].valve_mac[4] = 0x53;
// valve[0].valve_mac[5] = 0x5C;
//
Flash_Set_Mac_Addr(valve[0].valve_mac, 0);
Flash_Set_Valve_Num(1);
lwrb_init(&bt_lwrb_rx, bt_rx_buffer, sizeof(bt_rx_buffer));
lwrb_reset(&bt_lwrb_rx);
LOG_D("Bt_Thread_Entry");
while (1)
{
@ -406,8 +405,11 @@ int BSP_Bt_Init(void)
{
rt_err_t ret = RT_EOK;
lwrb_init(&bt_lwrb_rx, bt_rx_buffer, sizeof(bt_rx_buffer));
lwrb_reset(&bt_lwrb_rx);
rt_sem_init(&bt_rx_sem, "bt_rx_sem", 0, RT_IPC_FLAG_PRIO); /* 接收来自蓝牙主机的信号量 */
rt_sem_init(&bt_ctr_sem, "bt_ctr_sem", 0, RT_IPC_FLAG_PRIO);
rt_sem_init(&bt_reg_sem, "bt_reg_sem", 0, RT_IPC_FLAG_PRIO);
rt_sem_init(&bt_rem_sem, "bt_rem_sem", 0, RT_IPC_FLAG_PRIO);
rt_sem_init(&bt_rep_sem, "bt_rep_sem", 0, RT_IPC_FLAG_PRIO);
/* 查找系统中的串口设备 */
rt_bt_device = rt_device_find(BT_UART);
@ -422,11 +424,6 @@ int BSP_Bt_Init(void)
LOG_E("rt_device_open failed!\n");
return RT_ERROR;
}
rt_sem_init(&bt_rx_sem, "bt_rx_sem", 0, RT_IPC_FLAG_PRIO); /* 接收来自蓝牙主机的信号量 */
rt_sem_init(&bt_ctr_sem, "bt_ctr_sem", 0, RT_IPC_FLAG_PRIO);
rt_sem_init(&bt_reg_sem, "bt_reg_sem", 0, RT_IPC_FLAG_PRIO);
rt_sem_init(&bt_rem_sem, "bt_rem_sem", 0, RT_IPC_FLAG_PRIO);
rt_sem_init(&bt_rep_sem, "bt_rep_sem", 0, RT_IPC_FLAG_PRIO);
/* 设置接收回调函数 */
if (rt_device_set_rx_indicate(rt_bt_device, Bt_Rcv_Cb) != RT_EOK)
{
@ -447,7 +444,7 @@ int BSP_Bt_Init(void)
return ret;
}
INIT_DEVICE_EXPORT(BSP_Bt_Init);
INIT_COMPONENT_EXPORT(BSP_Bt_Init);
#ifdef TEST_ENABLE
static void TEST_BT_Send_Data(int argc, char **argv)

View File

@ -824,7 +824,7 @@ size_t Flash_Get_SysCfg(TeFlashCfgInfoId id)
rt_memcpy(&buf, (rt_uint8_t *)hr_sys_cfg_info_addr[id], hr_sys_cfg_info_len[id]);
value = buf[0] | (buf[1] << 8);
LOG_D("buf[0]= %u, buf[1]: %u", buf[0], buf[1]);
// LOG_D("buf[0]= %u, buf[1]: %u", buf[0], buf[1]);
}
LOG_D("value: %u", value);
return value;
@ -947,7 +947,7 @@ int BSP_Flash_Init(void)
return 0;
}
#ifdef RT_USING_COMPONENTS_INIT
INIT_BOARD_EXPORT(BSP_Flash_Init);
INIT_PREV_EXPORT(BSP_Flash_Init);
#endif

View File

@ -2,7 +2,7 @@
* @Author: mbw
* @Date: 2024-11-30 15:46:21
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-16 19:40:43
* @LastEditTime: 2024-12-17 15:12:17
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c
* @Description:
*
@ -329,7 +329,7 @@ int BSP_Ml307_Update(struct Ml307_Ops *ops, rt_uint8_t device_type, rt_uint8_t e
ops->body->hw = (rt_uint8_t)Flash_Get_SysCfg(kHwVerId);
ops->body->sw = (rt_uint8_t)Flash_Get_SysCfg(kSwVerId);
rt_memcpy(ops->body->imei, &ml307, sizeof(ml307_sys_info)); // 直接赋值结构体数据
ops->body->gas_voltage = Get_Gas_VoltageInt1000x();
ops->body->gas_voltage = Get_Gas_VoltageAdcInt1000x();
ops->body->product_work_temperature = 0x32;
ops->body->work_duration = work_duration;
ops->body->device_status = device_state_flag;
@ -1196,6 +1196,7 @@ void Handle_Sever_Addr_Set(struct Ml307_Ops *ops)
/*新增阀门设备*/
rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
{
LOG_D("服务器下发注册阀门指令\n");
rt_uint8_t data[7] = {0};
char imei[16] = {0};
char temp[32] = "0";
@ -1267,10 +1268,11 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
rt_uint8_t mac_addr[FLASH_VALVE_MAC_ADDR_LEN] = {0};
char imei[16] = {0};
char temp[32] = "0";
LOG_I("服务器下发更换阀门设备");
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串
rt_memcpy(data, (ops->recv->recv_data.res_data + 3), (2 * FLASH_VALVE_MAC_ADDR_LEN + 1));
rt_memcpy(data, (ops->recv->recv_data.res_data + 2), (2 * FLASH_VALVE_MAC_ADDR_LEN + 1));
LOG_HEX("data", 16, data, sizeof(data));
/*设备编号1byte+ 新MAC地址6+ 旧阀门MAC地址6 + 补零字节= 15byte*/
if (Flash_Get_Mac_Addr(mac_addr, data[0] - 1) == RT_EOK)
{
@ -1278,7 +1280,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
{
if (mac_addr[i] != data[i + 7])
{
LOG_E("旧阀门MAC地址错误\n");
LOG_E("旧阀门地址错误\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_OTHER_ERROR);
return RT_ERROR;
@ -1288,7 +1290,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11], data[12]);
if (i == FLASH_VALVE_MAC_ADDR_LEN)
{
if (Bt_Valve_Handler(kValveCmdRep, data[0] - 1, &data[2]) != RT_EOK)
if (Bt_Valve_Handler(kValveCmdRep, data[0] - 1, &data[1]) != RT_EOK)
{
LOG_E("更换阀门设备失败\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_ACTION_FAILURE);
@ -1302,7 +1304,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
}
else
{
if (Flash_Set_Mac_Addr(&data[2], data[0]) == RESET)
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) == RESET)
{
LOG_E("更换阀门设备失败\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_ACTION_FAILURE);
@ -1313,7 +1315,20 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops)
return RT_EOK;
}
}
else
{
LOG_E("旧阀门MAC地址错误\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_OTHER_ERROR);
return RT_ERROR;
}
}
else
{
LOG_E("该阀门设备错误\n");
ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REPLACE, temp, RESPONSE_CODE_PARSE_FAIL);
}
return RT_EOK;
}
/*移除阀门设备*/

View File

@ -2,7 +2,7 @@
* @Author : stark1898y 1658608470@qq.com
* @Date : 2024-06-18 15:48:01
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-11 09:00:40
* @LastEditTime: 2024-12-17 11:36:52
* @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_mq.c
* @Description :
*
@ -41,10 +41,17 @@ TsSensor_t Sensor_device;
uint16_t Get_Gas_VoltageInt1000x(void)
{
uint16_t voltage = (Get_ADC_Average(kGasAdc) * 3.3 / 4096) * MQ_VOLTAGE_RATIO * 1000;
// LOG_D("Get_Gas_VoltageInt1000x = %04d", voltage);
LOG_D("Get_Gas_VoltageInt1000x = %04d", voltage);
return voltage;
}
uint16_t Get_Gas_VoltageAdcInt1000x(void)
{
rt_uint16_t voltage_adc = (Get_ADC_Average(kGasAdc) * 3.3 / 4096) * 1000;
LOG_D("Get_Gas_VoltageAdcInt1000x = %04d", voltage_adc);
return voltage_adc;
}
#ifdef TEST_ENABLE
static void TEST_Get_Gas_VoltageInt1000x(void)
{
@ -103,9 +110,9 @@ static uint8_t Sensor_CheckData(void)
static rt_uint8_t index = 0;
static rt_uint8_t alarm_status_buffer[SENSOR_SAMPLING_TIMS] = {0};
static rt_uint8_t fault_buf[SENSOR_SAMPLING_TIMS] = {0};
rt_uint16_t voltage = Get_Gas_VoltageInt1000x();
rt_uint16_t voltage = Get_Gas_VoltageAdcInt1000x();
alarm_status_buffer[index] = (voltage < Sensor_device.alarm_value) ? kSensorNormal : kSensorAlarm;
alarm_status_buffer[index] = ((voltage > Sensor_device.alarm_value) && (voltage < MQ_VOLTAGE_HIGH_LIMIT)) ? kSensorAlarm : kSensorNormal;
fault_buf[index] = ((voltage < MQ_VOLTAGE_LOW_LIMIT) || (voltage > MQ_VOLTAGE_HIGH_LIMIT)) ? kSensorFault : kSensorNormal;
index++;
if (index >= SENSOR_SAMPLING_TIMS)