diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 7560313..b987da2 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -36,6 +36,7 @@ encoding//rt-thread/components/drivers/include/ipc/ringbuffer.h=GBK encoding//rt-thread/components/drivers/ipc/completion.c=GBK encoding//rt-thread/components/drivers/ipc/ringbuffer.c=GBK encoding//rt-thread/components/drivers/serial/serial.c=GBK +encoding//rt-thread/components/finsh/finsh.h=GBK encoding//rt-thread/components/finsh/shell.c=GBK encoding//rt-thread/components/net/at/include/at.h=GBK encoding//rt-thread/components/net/at/src/at_cli.c=GBK diff --git a/applications/main.c b/applications/main.c index 49d11fd..40f5b22 100644 --- a/applications/main.c +++ b/applications/main.c @@ -23,6 +23,7 @@ #include "bsp_mq.h" #include "bsp_button.h" #include "bsp_ml307.h" +#include "bsp_adc.h" #include "bsp_vin_detection.h" #include "user_sys.h" #include "bsp_bt.h" @@ -440,6 +441,7 @@ int main(void) LOG_E("电磁阀动作失败"); } } + GAS_POWER_CLOSE; LOG_D("Enter AnalogWatchdog Interrupt"); // 等待30s,要是还没断电就重启 for (uint8_t i = 0; i < 30; i++) diff --git a/applications/user_sys.c b/applications/user_sys.c index 5263ce4..94cb0cf 100644 --- a/applications/user_sys.c +++ b/applications/user_sys.c @@ -191,7 +191,7 @@ uint32_t ip_to_uint32(const char *ip_str) return ip; } -int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array) +int Convert_To_Hex(const flash_sever_info *sever_info, uint8_t *hex_array) { // 将 IP 地址转换为字节数组 uint32_t ip_addr = ip_to_uint32(sever_info->server_url); diff --git a/bsp/inc/bsp_flash.h b/bsp/inc/bsp_flash.h index 88ced0b..c378791 100644 --- a/bsp/inc/bsp_flash.h +++ b/bsp/inc/bsp_flash.h @@ -269,13 +269,11 @@ typedef struct __attribute__((packed)) rt_uint8_t nb_iccid[20]; // ICCID } sys_config_info; -struct flash_sever_info +typedef struct { - char server_url[64]; + char server_url[32]; char server_port[8]; -}; - -extern struct flash_sever_info sever_info; +}flash_sever_info; void Flash_Write_Record(TeRecord record); int Get_Iot_Imei(char *buf, rt_size_t len); @@ -317,7 +315,7 @@ int Flash_Get_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number); rt_uint8_t Flash_Get_Valve_Num(void); int Flash_Set_Valve_Num(rt_uint8_t valve_num); int BSP_Flash_Write_Info(rt_uint8_t *buf, rt_size_t len); -int Flash_Get_Sever_Addr_Info(struct flash_sever_info *sever_info); +int Flash_Get_Sever_Addr_Info(flash_sever_info *sever_info); int Flash_Set_Sever_Addr_Info(rt_uint8_t *data); rt_uint16_t Flash_Get_WorkDuration(void); int Flash_Set_WorkDuration(rt_uint16_t value); diff --git a/bsp/inc/bsp_ml307.h b/bsp/inc/bsp_ml307.h index b132b7c..d662603 100644 --- a/bsp/inc/bsp_ml307.h +++ b/bsp/inc/bsp_ml307.h @@ -233,5 +233,5 @@ extern rt_sem_t ml307_recv_sem; extern rt_uint8_t ml307_conncet_tcp_flag; extern rt_uint8_t power_on_send_flag; -extern rt_sem_t ml307_life_sem; +extern rt_sem_t ml307_disconnect_sem; void Ml307_Send_Event(Ml307Event event_type); diff --git a/bsp/src/at_device_ml307.c b/bsp/src/at_device_ml307.c index 9dc2689..595fe6b 100644 --- a/bsp/src/at_device_ml307.c +++ b/bsp/src/at_device_ml307.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-09-04 13:33:49 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-01-02 17:41:28 + * @LastEditTime: 2025-01-03 16:44:30 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c * @Description : * @@ -51,7 +51,7 @@ ml307_sys_info ml307 = {0}; struct rt_completion ml307_init_complate; volatile rt_uint8_t socket_id = 0; -rt_sem_t ml307_connect_sem; +rt_sem_t ml307_connect_flag_sem; static rt_bool_t ml307_get_power_state(struct at_device *device) { @@ -102,17 +102,22 @@ static rt_err_t ml307_power_off(struct at_device *device) rt_err_t Ml307_Reset(struct at_device *device) { - at_client_send("AT+MREBOOT\r\n", rt_strlen("AT+MREBOOT\r\n")); + rt_pin_write(ML307_RST_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(ML307_RST_PIN, PIN_LOW); + rt_sem_release(ml307_disconnect_sem); + // at_client_send("AT+MREBOOT\r\n", rt_strlen("AT+MREBOOT\r\n")); return RT_EOK; } #ifdef TEST_ENABLE -void TEST_Ml307_Reset() +void TEST_Ml307_Reset(void) { Ml307_Reset(RT_NULL); } MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset"); + #endif static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size) @@ -187,12 +192,14 @@ static void urc_tcp_connect_state(struct at_client *client, const char *data, rt case 571: LOG_D("PDP激活失败"); ml307_conncet_tcp_flag = 0; + break; default: LOG_D("连接失败"); ml307_conncet_tcp_flag = 0; break; } - rt_sem_release(ml307_connect_sem); + rt_sem_release(ml307_connect_flag_sem);//用于返回连接的标志量在连接函数中 + rt_sem_release(ml307_disconnect_sem); } } } @@ -208,23 +215,19 @@ static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_si if (id == socket_id) { ml307_conncet_tcp_flag = 0; - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } switch (state) { case 1: LOG_D("服务器断开连接"); - rt_sem_release(ml307_life_sem); + rt_sem_release(ml307_disconnect_sem); break; case 2: // 连接异常 LOG_D("连接异常"); - rt_sem_release(ml307_life_sem); + rt_sem_release(ml307_disconnect_sem); break; case 3: // PDP去激活 LOG_D("ml307 tcp server PDP deactivate"); - rt_sem_release(ml307_life_sem); + rt_sem_release(ml307_disconnect_sem); break; default: break; @@ -233,14 +236,21 @@ static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_si } } +static void urc_sim_remove(struct at_client *client, const char *data, rt_size_t size) +{ + LOG_D("SIM removed"); + Send_Laser_Alarm_Event(kFaultEvent); +} static const struct at_urc urc_table[] = { {"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时, {"+MIPOPEN:", "\r\n", urc_tcp_connect_state}, {"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect}, {"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv}, {"+MATREADY", "\r\n", urc_device_reset}, + {"+CPIN: SIM REMOVED", "\r\n", urc_sim_remove}, }; -static void show_resp_info(at_response_t resp) + +void show_resp_info(at_response_t resp) { RT_ASSERT(resp); /* Print response line buffer */ @@ -275,7 +285,6 @@ int at_device_ml307_disconnect_tcp(struct at_device *device) return -RT_ERROR; } ml307_conncet_tcp_flag = 0; - show_resp_info(resp); at_delete_resp(resp); } return RT_EOK; @@ -283,6 +292,7 @@ int at_device_ml307_disconnect_tcp(struct at_device *device) static int at_device_ml307_connect_tcp(struct at_device *device) { + flash_sever_info sever_info = {0}; rt_err_t ret = RT_ERROR; ASSERT(device); rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); @@ -306,7 +316,7 @@ static int at_device_ml307_connect_tcp(struct at_device *device) { if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL) { - if (rt_sem_take(ml307_connect_sem, 10000) == RT_EOK) + if (rt_sem_take(ml307_connect_flag_sem, 10000) == RT_EOK) { if (ml307_conncet_tcp_flag) { @@ -317,7 +327,6 @@ static int at_device_ml307_connect_tcp(struct at_device *device) else { LOG_E("ml307 connect to tcp server fail"); - at_device_ml307_disconnect_tcp(device); } } } @@ -328,7 +337,9 @@ static int at_device_ml307_connect_tcp(struct at_device *device) } else if (at_resp_get_line_by_kw(resp, "+CME ERROR: 559") == RT_EOK)//SOCKET错误 { - at_device_ml307_disconnect_tcp(device); + ml307_conncet_tcp_flag = 0; + rt_sem_release(ml307_disconnect_sem); + break; } } rt_thread_mdelay(60000); @@ -340,53 +351,35 @@ static int at_device_ml307_connect_tcp(struct at_device *device) int at_send_data(struct at_device *device, const char *data, rt_size_t send_len) { #define ML307_SEND_RESP_TIME (5000) + at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN / 4, 0, ML307_SEND_RESP_TIME); - if (ml307_conncet_tcp_flag) + if (resp == RT_NULL) { - rt_uint8_t retry = 0; - rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); - LOG_D("max_retry_count:%d", max_retry_count); - at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN / 4, 0, ML307_SEND_RESP_TIME); - - if (resp == RT_NULL) - { - LOG_E("no memory for ml307 device(%s) response structure.", device->name); - at_delete_resp(resp); - return -RT_ERROR; - } - while (retry < max_retry_count) - { - - if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK) - { - size_t len = 0; - if (at_resp_parse_line_args_by_kw(resp, "+MIPSEND:", "+MIPSEND:%*d,%d", &len) > 0) - { - if(len == send_len) - { - LOG_D("send data success, len:%d", len); - at_delete_resp(resp); - return RT_EOK; - } - - } - else - { - LOG_E("send data error, retry %d times, socket_id: %d", retry + 1, socket_id); - retry++; - } - } - retry++; - rt_thread_mdelay(1000); - } + LOG_E("no memory for ml307 device(%s) response structure.", device->name); at_delete_resp(resp); return -RT_ERROR; } - else + /*设置包模式*/ + if (at_obj_exec_cmd(device->client, resp, "AT+MIPCFG=\"encoding\",0,1,1") != RT_EOK) { - LOG_D("not connected tcp sever!"); - return -RT_ERROR; + return RT_ERROR; + } + + if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK) + { + size_t len = 0; + if (at_resp_parse_line_args_by_kw(resp, "+MIPSEND:", "+MIPSEND:%*d,%d", &len) > 0) + { + if(len == send_len) + { + LOG_D("send data success, len:%d", len); + at_delete_resp(resp); + return RT_EOK; + } + } } + at_delete_resp(resp); + return -RT_ERROR; } static int ml307_check_link_status(struct at_device *device) @@ -1226,7 +1219,6 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device) /* check signal strength */ for (i = 0; i < RETRY; i++) { - if (at_obj_exec_cmd(device->client, resp, "AT+CSQ") == RT_EOK) { int signal_strength = 0, err_rate = 0; @@ -1254,7 +1246,7 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device) //+CESQ:99,99,255,255,28,44 for (i = 0; i < RETRY; i++) - { + { if (at_obj_exec_cmd(device->client, resp, "AT+CESQ") == RT_EOK) { rt_uint8_t rsrp = 0; @@ -1263,9 +1255,8 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device) { if ((rsrp < 97) && (rsrp > 0)) { - LOG_D("%s device signal rsrp: %d", - device->name, rsrp); - ml307.rsrp = rsrp; + LOG_D("%s device signal rsrp: %d", device->name, rsrp); + ml307.rsrp = rsrp; break; } } @@ -1277,53 +1268,6 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device) LOG_E("%s device signal data failed", device->name); result = -RT_ERROR; } - // /* get signal snr, pci */ - // for (int i = 0; i < RETRY; i++) - // { - // if (at_obj_exec_cmd(device->client, resp, "AT+NUESTATS") == RT_EOK) - // { - // const char *key1 = "SNR:"; - // const char *key2 = "PCI:"; - // int pci = 0, snr = 0; - // // show_resp_info(resp); - - // // 获取第 2 行的响应 - // const char *line = at_resp_get_line(resp, 2); - - // if (line != NULL) - // { - // snr = Extract_Value(line, key1); - // pci = Extract_Value(line, key2); - - // if (snr != 0 && pci != 0) - // { - // ml307.pci = pci; - // ml307.snr = snr; - // LOG_D("pci:%d,snr:%d", ml307.pci, ml307.snr); - // break; - // } - // else - // { - // LOG_D("Extracted values are invalid: SNR=%d, PCI=%d", snr, pci); - // } - // } - // else - // { - // LOG_D("Failed to get line 2 from response"); - // } - // } - // else - // { - // LOG_D("Failed to execute AT command"); - // } - // rt_thread_mdelay(2000); - // } - // if (i == RETRY) - // { - // LOG_E("%s device signal data failed", device->name); - // result = -RT_ERROR; - // } - at_delete_resp(resp); return result; } @@ -1373,7 +1317,7 @@ static int ml307_init(struct at_device *device) LOG_E("add netdev(%s) failed.", ml307->device_name); return -RT_ERROR; } - ml307_connect_sem = rt_sem_create("ml307_connect_sem", 0, RT_IPC_FLAG_PRIO); + ml307_connect_flag_sem = rt_sem_create("ml307_connect_flag_sem", 0, RT_IPC_FLAG_PRIO); /* initialize ml307 pin configuration */ if (ml307->pwr_en_pin != -1) { diff --git a/bsp/src/bsp_bt.c b/bsp/src/bsp_bt.c index 824238d..b07387a 100644 --- a/bsp/src/bsp_bt.c +++ b/bsp/src/bsp_bt.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-03 10:31:45 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-01-02 14:11:22 + * @LastEditTime: 2025-01-03 14:57:36 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c * @Description: * @@ -333,10 +333,6 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) LOG_I("接收到阀门注册响应:"); LOG_HEX("bt_rx_data:", 16, data_buf, fram_len); - Flash_Set_Mac_Addr(&data_buf[4], data[index + 3] - 1); - rt_uint8_t num = Flash_Get_Valve_Num(); - Flash_Set_Valve_Num(num + 1); - rt_sem_release(&bt_reg_sem); } break; @@ -358,7 +354,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) LOG_E("阀门更换失败"); } break; - case kValveEventRemAll: + case kValveEventRemAll: LOG_I("接收到移除所有阀门信息回应"); LOG_HEX("bt_rx_data:", 16, data_buf, fram_len); if (data_buf[fram_len - 3] == RT_TRUE) // 移除成功 diff --git a/bsp/src/bsp_button.c b/bsp/src/bsp_button.c index bcebde0..9b24543 100644 --- a/bsp/src/bsp_button.c +++ b/bsp/src/bsp_button.c @@ -70,24 +70,20 @@ static void _CommonBtnEvtCb(void *arg) if (Flash_Set_Mac_Addr(mac_addr, 1) != RESET) { LOG_E("本地阀门信息清空完成"); + Flash_Set_Valve_Num(0); } } Bt_Valve_Handler(kValveCmdRemAll, RT_NULL, RT_NULL); if (rt_sem_take(&bt_rem_sem, 10000) == RT_EOK) // 如果没刷掉数据,则黄灯会亮一秒,如果刷成功了,则红灯闪一下黄灯不会亮 { + LED_OFF(g); + LED_OFF(r); + LED_OFF(y); LED_ON(r); rt_thread_mdelay(100); LED_OFF(r); LOG_I("本地清除阀门信息成功"); } - else - { - LOG_E("本地清除阀门信息错误"); - LED_OFF(g); - LED_ON(y); - rt_thread_mdelay(100); - LED_OFF(y); - } } #if 1 // 测试LED灯状态用,测试完成后关闭 if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_DOUBLE_CLICK) || (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_DOUBLE_CLICK)) diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c index 1978604..2071d43 100644 --- a/bsp/src/bsp_flash.c +++ b/bsp/src/bsp_flash.c @@ -13,10 +13,10 @@ #include // 在此修改默认的服务器地址 -struct flash_sever_info sever_info = - { - .server_url = "8.130.122.162", - .server_port = "7153", +flash_sever_info sever_info = +{ + .server_url = "8.130.122.162", + .server_port = "7153", }; /*默认的系统配置*/ @@ -30,7 +30,7 @@ rt_uint8_t sys_temp_alarm_threshold = 0x32; rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能 rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能 -extern int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array); +extern int Convert_To_Hex(const flash_sever_info *sever_info, uint8_t *hex_array); #define GETATTR(info, id) ((id) == kHwVerId ? (&(info)->hw_ver) \ : (id) == kSwVerId ? (&(info)->sw_ver) \ : (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \ @@ -280,15 +280,17 @@ int Flash_Set_WorkDuration(rt_uint16_t value) return Flash_Write_ConfigInfo(page_buf); } -int Flash_Get_Sever_Addr_Info(struct flash_sever_info *sever_info) +int Flash_Get_Sever_Addr_Info(flash_sever_info *sever_info) { rt_uint8_t data[FLASH_SERVER_LEN]; rt_memcpy(data, (rt_uint8_t *)FLASH_SERVER_ADDR_ADDR, FLASH_SERVER_LEN); if (data == RT_NULL) { LOG_E("Flash_Get_Sever_Addr_Info failed"); + return -RT_ERROR; } + LOG_D("FLASH_SERVER_ADDR_ADDR = %X", FLASH_SERVER_ADDR_ADDR); LOG_D("data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x data[%d] = %x", 0, data[0], 1, data[1], 2, data[2], 3, data[3], 4, data[4], 5, data[5]); rt_snprintf(sever_info->server_url, sizeof(sever_info->server_url), "%d.%d.%d.%d", data[3], data[2], data[1], data[0]); @@ -310,7 +312,8 @@ int Flash_Set_Sever_Addr_Info(rt_uint8_t *data) { return -RT_ERROR; } - + + LOG_D("Flash_Set_Sever_Addr_Info in_page_offset = %d", in_page_offset); Flash_ErasePage_ReadConfigInfo(page_buf); //*将传入的数据写到flash地址中 for (size_t i = 0; i < FLASH_SERVER_LEN; i++) @@ -345,6 +348,8 @@ int Flash_Set_Mac_Addr(rt_uint8_t *mac_addr, rt_uint8_t number) { rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0}; rt_uint8_t in_page_offset = ((FLASH_VALVE_1_MAC_ADDR_ADDR + (number - 1) * FLASH_VALVE_MAC_ADDR_LEN) - FLASH_CONFIG_INFO_START_ADDR); + LOG_D("FLASH_VALVE_1_MAC_ADDR_ADDR = %X", FLASH_VALVE_1_MAC_ADDR_ADDR); + LOG_D("FLASH_VALVE_MAC_ADDR_LEN = %d", in_page_offset); if (mac_addr == RT_NULL) { return -RT_ERROR; diff --git a/bsp/src/bsp_ml307.c b/bsp/src/bsp_ml307.c index b6e4611..6844110 100644 --- a/bsp/src/bsp_ml307.c +++ b/bsp/src/bsp_ml307.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-11-30 15:46:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-01-02 10:41:22 + * @LastEditTime: 2025-01-03 16:53:49 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c * @Description: * @@ -48,11 +48,10 @@ static struct rt_thread ml307_life_thread; struct rt_event at_device_event; rt_sem_t ml307_recv_sem; -rt_sem_t ml307_life_sem; -static rt_timer_t ml307_timer; // 上报心跳 -static rt_timer_t ml307_upload_timer; // 更新本地时间定时器 -static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器 - +rt_sem_t ml307_disconnect_sem; +static rt_timer_t ml307_timer; // 上报心跳 +static rt_timer_t ml307_upload_timer; // 更新本地时间定时器 +static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器 rt_uint8_t ml307_conncet_tcp_flag; Ml307EventIndex ml307_event_index; @@ -338,29 +337,26 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_memset(ops->body, 0, sizeof(struct DataBody)); rt_mutex_take(ml307_mutex, RT_WAITING_FOREVER); - if (ml307_conncet_tcp_flag) + ret = ml307_ops.update_data(ops, device_type, event_type); + if (ret == RT_EOK) { - ret = ml307_ops.update_data(ops, device_type, event_type); - if (ret == RT_EOK) + if (ops->body->valve_num == 0) { - if (ops->body->valve_num == 0) - { - lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - 1) * sizeof(struct valve_t)); // 至少要发送一个阀门数据体 - } - else - { - lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - ops->body->valve_num) * sizeof(struct valve_t)); // 至少要发送一个阀门数据体 - } - for (int i = 0; i < lenght; i++) - { - rt_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]); - rt_memcpy(data_buf + i * 2, temp, 2); - } - ret = _Send_Handle(ops, data_num, cmd, data_buf); - if (ret != RT_EOK) - { - ret = -ret; - } + lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - 1) * sizeof(struct valve_t)); // 至少要发送一个阀门数据体 + } + else + { + lenght = (sizeof(struct DataBody) - (MAX_VALVE_NUM - ops->body->valve_num) * sizeof(struct valve_t)); // 至少要发送一个阀门数据体 + } + for (int i = 0; i < lenght; i++) + { + rt_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]); + rt_memcpy(data_buf + i * 2, temp, 2); + } + ret = _Send_Handle(ops, data_num, cmd, data_buf); + if (ret != RT_EOK) + { + ret = -ret; } } rt_mutex_release(ml307_mutex); @@ -778,6 +774,9 @@ const Ml307EventInfo ml307_event_info[] = { */ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, void *param) { + rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); + LOG_D("max_retry_count:%d", max_retry_count); + struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; const Ml307EventInfo *event = RT_NULL; @@ -790,46 +789,36 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, break; } } - if (event) // 处理该事件 { // 打印事件的名称 LOG_D("%s上报\n", event->event_name); - - // 如果事件有关联的发送函数,则调用该发送函数 - if (event->send_func) + for (size_t i = 0; i < max_retry_count; i++) { - int result = event->send_func(device, ml307_ops); - if (result != RT_EOK) + if (ml307_conncet_tcp_flag) { - LOG_E("ml307 send cmd failed\n"); - Ml307_Reset(device); // 重启模组 - rt_thread_mdelay(5000); - if (ml307_conncet_tcp_flag != 1) + // 如果事件有关联的发送函数,则调用该发送函数 + if (event->send_func) { - if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接 + int result = event->send_func(device, ml307_ops); + if (result != RT_EOK) { - result = event->send_func(device, ml307_ops); - if (result != RT_EOK) - { - LOG_E("ml307 send cmd after module reset failed\n"); - - Ml307_Reset(device); - rt_thread_mdelay(5000); - } + LOG_E("ml307 send cmd failed\n"); } else - { - LOG_E("ml307 connect tcp failed\n"); - } + return RT_EOK;// 函数执行完毕,返回0 } } else - return RT_EOK; + { + LOG_D("断网\n"); + rt_sem_release(ml307_disconnect_sem); + } + rt_thread_mdelay(5000); } } - // 函数执行完毕,返回0 - return RT_EOK; + + return RT_ERROR; } // 比较帧头和帧尾 @@ -888,7 +877,7 @@ void Handle_Self_Check(struct Ml307_Ops *ops) Send_Laser_Alarm_Event(kSelfCheckEvent); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_SELF_CHECK, temp, RESPONSE_CODE_SUCCESS); - Send_Laser_Alarm_Event(kNormalDetectionEvents);//先返回正常状态,然后跳转到所处的状态 + Send_Laser_Alarm_Event(kNormalDetectionEvents); // 先返回正常状态,然后跳转到所处的状态 } void Handle_Mute(struct Ml307_Ops *ops) @@ -926,11 +915,11 @@ rt_err_t Handle_Close_Valve(struct Ml307_Ops *ops) LOG_E("没有设置无线阀门\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; - } + } else { LOG_D("无线阀门编号:%d\n", data[0]); - if(Flash_Get_Mac_Addr(mac_addr, data[0]) != RT_EOK) + if (Flash_Get_Mac_Addr(mac_addr, data[0]) != RT_EOK) { LOG_E("获取无线阀门mac地址失败\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_ACTION_FAILURE); @@ -1149,9 +1138,10 @@ void Handle_Time_Calibration_Data(struct Ml307_Ops *ops) // 下发修改服务器地址指令 void Handle_Sever_Addr_Set(struct Ml307_Ops *ops) { - rt_uint8_t data[6] = {0}; - char imei[16] = {0}; - char temp[32] = "0"; + flash_sever_info sever_info = {0}; + rt_uint8_t data[6] = {0}; + char imei[16] = {0}; + char temp[32] = "0"; Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); String2Hex(temp, imei); // 将字符串转为十六进制字符串 @@ -1172,30 +1162,36 @@ 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"; - rt_uint8_t cnt = Flash_Get_Valve_Num(); + LOG_D("服务器下发注册阀门指令\n"); + rt_uint8_t data[7] = {0}; + char imei[16] = {0}; + char temp[32] = "0"; + rt_uint8_t cnt = Flash_Get_Valve_Num(); Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); String2Hex(temp, imei); // 将字符串转为十六进制字符串 - if (cnt >= MAX_VALVE_NUM) + if (cnt >= 1) { LOG_E("阀门设备数量超过最大值\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); return RT_ERROR; } // 无阀门数据时添加,有阀门数据时不添加 - if(cnt >= 0 && cnt < MAX_VALVE_NUM) + if (cnt >= 0 && cnt < MAX_VALVE_NUM) { rt_memcpy(data, (ops->recv->recv_data.res_data + 8), FLASH_VALVE_MAC_ADDR_LEN + 1); + if (data[0] > 1) + { + LOG_E("阀门设备数量超过最大值[1]\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_OTHER_ERROR); + return RT_ERROR; + } LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x data[6] = %x", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); - valve[data[0] - 1].valve_id = data[0];//更新阀门ID + valve[data[0] - 1].valve_id = data[0]; // 更新阀门ID rt_memcpy(valve[data[0] - 1].valve_mac, &data[1], FLASH_VALVE_MAC_ADDR_LEN); // 更新MAC地址 - if (Bt_Valve_Handler(kValveCmdReg, data[0], &data[1]) != RT_EOK)//更新蓝牙端mac地址 + if (Bt_Valve_Handler(kValveCmdReg, data[0], &data[1]) != RT_EOK) // 更新蓝牙端mac地址 { LOG_E("新增阀门设备失败\n"); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE); @@ -1236,7 +1232,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); String2Hex(temp, imei); // 将字符串转为十六进制字符串 rt_memcpy(data, (ops->recv->recv_data.res_data + 2), (2 * FLASH_VALVE_MAC_ADDR_LEN + 1)); - LOG_HEX("data", 16, data, sizeof(data)); + LOG_HEX("data", 16, data, sizeof(data)); /*设备编号(1byte)+ 新MAC地址(6)+ 旧阀门MAC地址(6) + 补零字节= 15byte*/ if (Flash_Get_Mac_Addr(mac_addr, data[0]) == RT_EOK) { @@ -1247,7 +1243,7 @@ rt_err_t Handle_Valve_Replace(struct Ml307_Ops *ops) 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; - } + } } LOG_D("data[0] = %x data[1] = %x data[2] = %x data[3] = %x data[4] = %x, data[5] = %x data[6] = %x data[7] = %x data[8] = %x data[9] = %x data[10] = %x data[11] = %x data[12] = %x", 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]); @@ -1302,13 +1298,13 @@ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops) rt_uint8_t cnt = Flash_Get_Valve_Num(); Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); String2Hex(temp, imei); // 将字符串转为十六进制字符串 - + LOG_I("接收到服务器下发移除阀门指令"); #if 1 if (cnt == 0) { LOG_W("阀门设备数量为0\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_SUCCESS);//如果本地无阀门信息,直接返回成功 + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_REMOVE, temp, RESPONSE_CODE_SUCCESS); // 如果本地无阀门信息,直接返回成功 return RT_EOK; } @@ -1345,7 +1341,7 @@ rt_err_t Handle_Remove_Valve(struct Ml307_Ops *ops) return RT_EOK; } - } + } #endif } @@ -1694,13 +1690,24 @@ static void Ml307_Life_Thread_Entry(void *parameter) while (1) { - ret = rt_sem_take(ml307_life_sem, RT_WAITING_FOREVER); + ret = rt_sem_take(ml307_disconnect_sem, RT_WAITING_FOREVER); if (ret == RT_EOK) { if (ml307_conncet_tcp_flag != RT_TRUE) { - device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL); - LOG_D("retry ml307 tcp connect\n "); + LOG_D("重连网络中...\n"); + device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_DISCONN, RT_NULL); // 先关闭,再处理 + if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) + { + LOG_D("重连网络成功\n"); + ml307_conncet_tcp_flag = RT_TRUE; + } + else + { + LOG_D("重连网络失败\n"); + rt_thread_mdelay(10000); + rt_sem_release(ml307_disconnect_sem); + } } } } @@ -1730,10 +1737,10 @@ int BSP_Ml307_Thread_Init(void) LOG_E("ml307_recv_sem create failed"); } - ml307_life_sem = rt_sem_create("ml307_life", 0, RT_IPC_FLAG_FIFO); - if (ml307_life_sem == RT_NULL) + ml307_disconnect_sem = rt_sem_create("ml307_life", 0, RT_IPC_FLAG_FIFO); + if (ml307_disconnect_sem == RT_NULL) { - LOG_E("ml307_life_sem create failed"); + LOG_E("ml307_disconnect_sem create failed"); } // 创建定时器 ml307_timer = rt_timer_create("heartbeat", @@ -1757,14 +1764,14 @@ int BSP_Ml307_Thread_Init(void) RT_NULL, 24 * 60 * RT_TICK_PER_SECOND, // RT_TIMER_FLAG_PERIODIC); - ret = rt_thread_init(&ml307_thread, - "ml307_send_thread", - Ml307_Send_Thread_Entry, - &ml307_ops, - &ml307_thread_stack[0], - sizeof(ml307_thread_stack), - ML307_THREAD_PRIORITY, - ML307_THREAD_TICKS); + ret = rt_thread_init(&ml307_thread, + "ml307_send_thread", + Ml307_Send_Thread_Entry, + &ml307_ops, + &ml307_thread_stack[0], + sizeof(ml307_thread_stack), + ML307_THREAD_PRIORITY, + ML307_THREAD_TICKS); rt_thread_startup(&ml307_thread); ret = rt_thread_init(&ml307_recv_thread,