修改了4G的发送逻辑

This commit is contained in:
小马_666 2025-01-03 17:01:35 +08:00
parent 11bd76d695
commit d446e2a999
10 changed files with 174 additions and 225 deletions

View File

@ -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/completion.c=GBK
encoding//rt-thread/components/drivers/ipc/ringbuffer.c=GBK encoding//rt-thread/components/drivers/ipc/ringbuffer.c=GBK
encoding//rt-thread/components/drivers/serial/serial.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/finsh/shell.c=GBK
encoding//rt-thread/components/net/at/include/at.h=GBK encoding//rt-thread/components/net/at/include/at.h=GBK
encoding//rt-thread/components/net/at/src/at_cli.c=GBK encoding//rt-thread/components/net/at/src/at_cli.c=GBK

View File

@ -23,6 +23,7 @@
#include "bsp_mq.h" #include "bsp_mq.h"
#include "bsp_button.h" #include "bsp_button.h"
#include "bsp_ml307.h" #include "bsp_ml307.h"
#include "bsp_adc.h"
#include "bsp_vin_detection.h" #include "bsp_vin_detection.h"
#include "user_sys.h" #include "user_sys.h"
#include "bsp_bt.h" #include "bsp_bt.h"
@ -440,6 +441,7 @@ int main(void)
LOG_E("电磁阀动作失败"); LOG_E("电磁阀动作失败");
} }
} }
GAS_POWER_CLOSE;
LOG_D("Enter AnalogWatchdog Interrupt"); LOG_D("Enter AnalogWatchdog Interrupt");
// 等待30s,要是还没断电就重启 // 等待30s,要是还没断电就重启
for (uint8_t i = 0; i < 30; i++) for (uint8_t i = 0; i < 30; i++)

View File

@ -191,7 +191,7 @@ uint32_t ip_to_uint32(const char *ip_str)
return ip; 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 地址转换为字节数组 // 将 IP 地址转换为字节数组
uint32_t ip_addr = ip_to_uint32(sever_info->server_url); uint32_t ip_addr = ip_to_uint32(sever_info->server_url);

View File

@ -269,13 +269,11 @@ typedef struct __attribute__((packed))
rt_uint8_t nb_iccid[20]; // ICCID rt_uint8_t nb_iccid[20]; // ICCID
} sys_config_info; } sys_config_info;
struct flash_sever_info typedef struct
{ {
char server_url[64]; char server_url[32];
char server_port[8]; char server_port[8];
}; }flash_sever_info;
extern struct flash_sever_info sever_info;
void Flash_Write_Record(TeRecord record); void Flash_Write_Record(TeRecord record);
int Get_Iot_Imei(char *buf, rt_size_t len); 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); rt_uint8_t Flash_Get_Valve_Num(void);
int Flash_Set_Valve_Num(rt_uint8_t valve_num); int Flash_Set_Valve_Num(rt_uint8_t valve_num);
int BSP_Flash_Write_Info(rt_uint8_t *buf, rt_size_t len); 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); int Flash_Set_Sever_Addr_Info(rt_uint8_t *data);
rt_uint16_t Flash_Get_WorkDuration(void); rt_uint16_t Flash_Get_WorkDuration(void);
int Flash_Set_WorkDuration(rt_uint16_t value); int Flash_Set_WorkDuration(rt_uint16_t value);

View File

@ -233,5 +233,5 @@ extern rt_sem_t ml307_recv_sem;
extern rt_uint8_t ml307_conncet_tcp_flag; extern rt_uint8_t ml307_conncet_tcp_flag;
extern rt_uint8_t power_on_send_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); void Ml307_Send_Event(Ml307Event event_type);

View File

@ -2,7 +2,7 @@
* @Author : stark1898y 1658608470@qq.com * @Author : stark1898y 1658608470@qq.com
* @Date : 2024-09-04 13:33:49 * @Date : 2024-09-04 13:33:49
* @LastEditors: mbw && 1600520629@qq.com * @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 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c
* @Description : * @Description :
* *
@ -51,7 +51,7 @@ ml307_sys_info ml307 = {0};
struct rt_completion ml307_init_complate; struct rt_completion ml307_init_complate;
volatile rt_uint8_t socket_id = 0; 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) 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) 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; return RT_EOK;
} }
#ifdef TEST_ENABLE #ifdef TEST_ENABLE
void TEST_Ml307_Reset() void TEST_Ml307_Reset(void)
{ {
Ml307_Reset(RT_NULL); Ml307_Reset(RT_NULL);
} }
MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset"); MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset");
#endif #endif
static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size) 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: case 571:
LOG_D("PDP激活失败"); LOG_D("PDP激活失败");
ml307_conncet_tcp_flag = 0; ml307_conncet_tcp_flag = 0;
break;
default: default:
LOG_D("连接失败"); LOG_D("连接失败");
ml307_conncet_tcp_flag = 0; ml307_conncet_tcp_flag = 0;
break; 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) if (id == socket_id)
{ {
ml307_conncet_tcp_flag = 0; ml307_conncet_tcp_flag = 0;
if (SysControl.status == kNormalDetectionEvents)
{
LED_G_NORMAL;
}
switch (state) switch (state)
{ {
case 1: case 1:
LOG_D("服务器断开连接"); LOG_D("服务器断开连接");
rt_sem_release(ml307_life_sem); rt_sem_release(ml307_disconnect_sem);
break; break;
case 2: // 连接异常 case 2: // 连接异常
LOG_D("连接异常"); LOG_D("连接异常");
rt_sem_release(ml307_life_sem); rt_sem_release(ml307_disconnect_sem);
break; break;
case 3: // PDP去激活 case 3: // PDP去激活
LOG_D("ml307 tcp server PDP deactivate"); LOG_D("ml307 tcp server PDP deactivate");
rt_sem_release(ml307_life_sem); rt_sem_release(ml307_disconnect_sem);
break; break;
default: default:
break; 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[] = { static const struct at_urc urc_table[] = {
{"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时, {"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时,
{"+MIPOPEN:", "\r\n", urc_tcp_connect_state}, {"+MIPOPEN:", "\r\n", urc_tcp_connect_state},
{"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect}, {"+MIPURC: \"disconn\"", "\r\n", urc_tcp_disconnect},
{"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv}, {"+MIPURC: \"rtcp\"", "\r\n", urc_tcp_recv},
{"+MATREADY", "\r\n", urc_device_reset}, {"+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); RT_ASSERT(resp);
/* Print response line buffer */ /* Print response line buffer */
@ -275,7 +285,6 @@ int at_device_ml307_disconnect_tcp(struct at_device *device)
return -RT_ERROR; return -RT_ERROR;
} }
ml307_conncet_tcp_flag = 0; ml307_conncet_tcp_flag = 0;
show_resp_info(resp);
at_delete_resp(resp); at_delete_resp(resp);
} }
return RT_EOK; 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) static int at_device_ml307_connect_tcp(struct at_device *device)
{ {
flash_sever_info sever_info = {0};
rt_err_t ret = RT_ERROR; rt_err_t ret = RT_ERROR;
ASSERT(device); ASSERT(device);
rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); 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 (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) if (ml307_conncet_tcp_flag)
{ {
@ -317,7 +327,6 @@ static int at_device_ml307_connect_tcp(struct at_device *device)
else else
{ {
LOG_E("ml307 connect to tcp server fail"); 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错误 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); rt_thread_mdelay(60000);
@ -340,12 +351,6 @@ 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) int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
{ {
#define ML307_SEND_RESP_TIME (5000) #define ML307_SEND_RESP_TIME (5000)
if (ml307_conncet_tcp_flag)
{
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); at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN / 4, 0, ML307_SEND_RESP_TIME);
if (resp == RT_NULL) if (resp == RT_NULL)
@ -354,8 +359,11 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
at_delete_resp(resp); at_delete_resp(resp);
return -RT_ERROR; return -RT_ERROR;
} }
while (retry < max_retry_count) /*设置包模式*/
if (at_obj_exec_cmd(device->client, resp, "AT+MIPCFG=\"encoding\",0,1,1") != RT_EOK)
{ {
return RT_ERROR;
}
if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK) if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, send_len, data) == RT_EOK)
{ {
@ -368,26 +376,11 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t send_len)
at_delete_resp(resp); at_delete_resp(resp);
return RT_EOK; 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);
} }
at_delete_resp(resp); at_delete_resp(resp);
return -RT_ERROR; return -RT_ERROR;
} }
else
{
LOG_D("not connected tcp sever!");
return -RT_ERROR;
}
}
static int ml307_check_link_status(struct at_device *device) 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 */ /* check signal strength */
for (i = 0; i < RETRY; i++) for (i = 0; i < RETRY; i++)
{ {
if (at_obj_exec_cmd(device->client, resp, "AT+CSQ") == RT_EOK) if (at_obj_exec_cmd(device->client, resp, "AT+CSQ") == RT_EOK)
{ {
int signal_strength = 0, err_rate = 0; int signal_strength = 0, err_rate = 0;
@ -1263,8 +1255,7 @@ rt_err_t Ml307_Get_Signal_Info(struct at_device *device)
{ {
if ((rsrp < 97) && (rsrp > 0)) if ((rsrp < 97) && (rsrp > 0))
{ {
LOG_D("%s device signal rsrp: %d", LOG_D("%s device signal rsrp: %d", device->name, rsrp);
device->name, rsrp);
ml307.rsrp = rsrp; ml307.rsrp = rsrp;
break; 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); LOG_E("%s device signal data failed", device->name);
result = -RT_ERROR; 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); at_delete_resp(resp);
return result; return result;
} }
@ -1373,7 +1317,7 @@ static int ml307_init(struct at_device *device)
LOG_E("add netdev(%s) failed.", ml307->device_name); LOG_E("add netdev(%s) failed.", ml307->device_name);
return -RT_ERROR; 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 */ /* initialize ml307 pin configuration */
if (ml307->pwr_en_pin != -1) if (ml307->pwr_en_pin != -1)
{ {

View File

@ -2,7 +2,7 @@
* @Author: mbw * @Author: mbw
* @Date: 2024-12-03 10:31:45 * @Date: 2024-12-03 10:31:45
* @LastEditors: mbw && 1600520629@qq.com * @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 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c
* @Description: * @Description:
* *
@ -333,10 +333,6 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len)
LOG_I("接收到阀门注册响应:"); LOG_I("接收到阀门注册响应:");
LOG_HEX("bt_rx_data:", 16, data_buf, fram_len); 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); rt_sem_release(&bt_reg_sem);
} }
break; break;

View File

@ -70,24 +70,20 @@ static void _CommonBtnEvtCb(void *arg)
if (Flash_Set_Mac_Addr(mac_addr, 1) != RESET) if (Flash_Set_Mac_Addr(mac_addr, 1) != RESET)
{ {
LOG_E("本地阀门信息清空完成"); LOG_E("本地阀门信息清空完成");
Flash_Set_Valve_Num(0);
} }
} }
Bt_Valve_Handler(kValveCmdRemAll, RT_NULL, RT_NULL); Bt_Valve_Handler(kValveCmdRemAll, RT_NULL, RT_NULL);
if (rt_sem_take(&bt_rem_sem, 10000) == RT_EOK) // 如果没刷掉数据,则黄灯会亮一秒,如果刷成功了,则红灯闪一下黄灯不会亮 if (rt_sem_take(&bt_rem_sem, 10000) == RT_EOK) // 如果没刷掉数据,则黄灯会亮一秒,如果刷成功了,则红灯闪一下黄灯不会亮
{ {
LED_OFF(g);
LED_OFF(r);
LED_OFF(y);
LED_ON(r); LED_ON(r);
rt_thread_mdelay(100); rt_thread_mdelay(100);
LED_OFF(r); LED_OFF(r);
LOG_I("本地清除阀门信息成功"); LOG_I("本地清除阀门信息成功");
} }
else
{
LOG_E("本地清除阀门信息错误");
LED_OFF(g);
LED_ON(y);
rt_thread_mdelay(100);
LED_OFF(y);
}
} }
#if 1 // 测试LED灯状态用测试完成后关闭 #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)) 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))

View File

@ -13,7 +13,7 @@
#include <stdlib.h> #include <stdlib.h>
// 在此修改默认的服务器地址 // 在此修改默认的服务器地址
struct flash_sever_info sever_info = flash_sever_info sever_info =
{ {
.server_url = "8.130.122.162", .server_url = "8.130.122.162",
.server_port = "7153", .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_emagnetic_switch = 0x04; // 具备阀门功能
rt_uint8_t sys_relay_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) \ #define GETATTR(info, id) ((id) == kHwVerId ? (&(info)->hw_ver) \
: (id) == kSwVerId ? (&(info)->sw_ver) \ : (id) == kSwVerId ? (&(info)->sw_ver) \
: (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \ : (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \
@ -280,15 +280,17 @@ int Flash_Set_WorkDuration(rt_uint16_t value)
return Flash_Write_ConfigInfo(page_buf); 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_uint8_t data[FLASH_SERVER_LEN];
rt_memcpy(data, (rt_uint8_t *)FLASH_SERVER_ADDR_ADDR, FLASH_SERVER_LEN); rt_memcpy(data, (rt_uint8_t *)FLASH_SERVER_ADDR_ADDR, FLASH_SERVER_LEN);
if (data == RT_NULL) if (data == RT_NULL)
{ {
LOG_E("Flash_Get_Sever_Addr_Info failed"); LOG_E("Flash_Get_Sever_Addr_Info failed");
return -RT_ERROR; 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]); 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", rt_snprintf(sever_info->server_url, sizeof(sever_info->server_url), "%d.%d.%d.%d",
data[3], data[2], data[1], data[0]); data[3], data[2], data[1], data[0]);
@ -311,6 +313,7 @@ int Flash_Set_Sever_Addr_Info(rt_uint8_t *data)
return -RT_ERROR; return -RT_ERROR;
} }
LOG_D("Flash_Set_Sever_Addr_Info in_page_offset = %d", in_page_offset);
Flash_ErasePage_ReadConfigInfo(page_buf); Flash_ErasePage_ReadConfigInfo(page_buf);
//*将传入的数据写到flash地址中 //*将传入的数据写到flash地址中
for (size_t i = 0; i < FLASH_SERVER_LEN; i++) 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 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); 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) if (mac_addr == RT_NULL)
{ {
return -RT_ERROR; return -RT_ERROR;

View File

@ -2,7 +2,7 @@
* @Author: mbw * @Author: mbw
* @Date: 2024-11-30 15:46:21 * @Date: 2024-11-30 15:46:21
* @LastEditors: mbw && 1600520629@qq.com * @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 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c
* @Description: * @Description:
* *
@ -48,12 +48,11 @@ static struct rt_thread ml307_life_thread;
struct rt_event at_device_event; struct rt_event at_device_event;
rt_sem_t ml307_recv_sem; rt_sem_t ml307_recv_sem;
rt_sem_t ml307_life_sem; rt_sem_t ml307_disconnect_sem;
static rt_timer_t ml307_timer; // 上报心跳 static rt_timer_t ml307_timer; // 上报心跳
static rt_timer_t ml307_upload_timer; // 更新本地时间定时器 static rt_timer_t ml307_upload_timer; // 更新本地时间定时器
static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器 static rt_timer_t ml307_power_error_timer; // 上电失败情况下启动定时器
rt_uint8_t ml307_conncet_tcp_flag; rt_uint8_t ml307_conncet_tcp_flag;
Ml307EventIndex ml307_event_index; Ml307EventIndex ml307_event_index;
@ -338,8 +337,6 @@ 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_memset(ops->body, 0, sizeof(struct DataBody));
rt_mutex_take(ml307_mutex, RT_WAITING_FOREVER); rt_mutex_take(ml307_mutex, RT_WAITING_FOREVER);
if (ml307_conncet_tcp_flag)
{
ret = ml307_ops.update_data(ops, device_type, event_type); ret = ml307_ops.update_data(ops, device_type, event_type);
if (ret == RT_EOK) if (ret == RT_EOK)
{ {
@ -362,7 +359,6 @@ int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd,
ret = -ret; ret = -ret;
} }
} }
}
rt_mutex_release(ml307_mutex); rt_mutex_release(ml307_mutex);
return ret; return ret;
} }
@ -778,6 +774,9 @@ const Ml307EventInfo ml307_event_info[] = {
*/ */
int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, void *param) 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; struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param;
const Ml307EventInfo *event = RT_NULL; const Ml307EventInfo *event = RT_NULL;
@ -790,12 +789,14 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device,
break; break;
} }
} }
if (event) // 处理该事件 if (event) // 处理该事件
{ {
// 打印事件的名称 // 打印事件的名称
LOG_D("%s上报\n", event->event_name); LOG_D("%s上报\n", event->event_name);
for (size_t i = 0; i < max_retry_count; i++)
{
if (ml307_conncet_tcp_flag)
{
// 如果事件有关联的发送函数,则调用该发送函数 // 如果事件有关联的发送函数,则调用该发送函数
if (event->send_func) if (event->send_func)
{ {
@ -803,33 +804,21 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device,
if (result != RT_EOK) if (result != RT_EOK)
{ {
LOG_E("ml307 send cmd failed\n"); LOG_E("ml307 send cmd failed\n");
Ml307_Reset(device); // 重启模组 }
else
return RT_EOK;// 函数执行完毕返回0
}
}
else
{
LOG_D("断网\n");
rt_sem_release(ml307_disconnect_sem);
}
rt_thread_mdelay(5000); rt_thread_mdelay(5000);
if (ml307_conncet_tcp_flag != 1) }
{ }
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == 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); return RT_ERROR;
rt_thread_mdelay(5000);
}
}
else
{
LOG_E("ml307 connect tcp failed\n");
}
}
}
else
return RT_EOK;
}
}
// 函数执行完毕返回0
return RT_EOK;
} }
// 比较帧头和帧尾 // 比较帧头和帧尾
@ -1149,6 +1138,7 @@ void Handle_Time_Calibration_Data(struct Ml307_Ops *ops)
// 下发修改服务器地址指令 // 下发修改服务器地址指令
void Handle_Sever_Addr_Set(struct Ml307_Ops *ops) void Handle_Sever_Addr_Set(struct Ml307_Ops *ops)
{ {
flash_sever_info sever_info = {0};
rt_uint8_t data[6] = {0}; rt_uint8_t data[6] = {0};
char imei[16] = {0}; char imei[16] = {0};
char temp[32] = "0"; char temp[32] = "0";
@ -1180,7 +1170,7 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN);
String2Hex(temp, imei); // 将字符串转为十六进制字符串 String2Hex(temp, imei); // 将字符串转为十六进制字符串
if (cnt >= MAX_VALVE_NUM) if (cnt >= 1)
{ {
LOG_E("阀门设备数量超过最大值\n"); 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); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_VALVE_ADD, temp, RESPONSE_CODE_ACTION_FAILURE);
@ -1190,6 +1180,12 @@ rt_err_t Handle_Valve_Add(struct Ml307_Ops *ops)
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); 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]); 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]);
@ -1694,13 +1690,24 @@ static void Ml307_Life_Thread_Entry(void *parameter)
while (1) 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 (ret == RT_EOK)
{ {
if (ml307_conncet_tcp_flag != RT_TRUE) if (ml307_conncet_tcp_flag != RT_TRUE)
{ {
device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL); LOG_D("重连网络中...\n");
LOG_D("retry ml307 tcp connect\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"); LOG_E("ml307_recv_sem create failed");
} }
ml307_life_sem = rt_sem_create("ml307_life", 0, RT_IPC_FLAG_FIFO); ml307_disconnect_sem = rt_sem_create("ml307_life", 0, RT_IPC_FLAG_FIFO);
if (ml307_life_sem == RT_NULL) 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", ml307_timer = rt_timer_create("heartbeat",