修改了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/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

View File

@ -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++)

View File

@ -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);

View File

@ -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);

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 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);

View File

@ -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)
{

View File

@ -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) // 移除成功

View File

@ -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))

View File

@ -13,10 +13,10 @@
#include <stdlib.h>
// 在此修改默认的服务器地址
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;

View File

@ -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,