From dcce7887ca5072887663ae0db2964d8ac799b090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=A9=AC=5F666?= <13089258+pony-six-hundred-and-sixty-six@user.noreply.gitee.com> Date: Fri, 25 Apr 2025 08:49:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E4=BA=86=E8=93=9D=E7=89=99=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=98=BE=E7=A4=BA=E5=BE=97=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 4 +- applications/main.c | 42 ++---- applications/user_sys.h | 8 +- bsp/inc/bsp_bt.h | 4 +- bsp/inc/bsp_ml307.h | 290 +++++++++++++++++++------------------- bsp/src/at_device_ml307.c | 17 +-- bsp/src/bsp_bt.c | 28 +++- bsp/src/bsp_button.c | 5 +- bsp/src/bsp_flash.c | 14 +- bsp/src/bsp_ml307.c | 182 +++++++++++++++++++++--- doc/README.md | 2 +- rt-thread/rtconfig.h | 6 +- 12 files changed, 368 insertions(+), 234 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d8038d9..535d1df 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -74,6 +74,8 @@ "drv_log.h": "c", "drv_usart.h": "c", "signal.h": "c", - "xtr1common": "c" + "xtr1common": "c", + "stddef.h": "c", + "netdev_ipaddr.h": "c" } } diff --git a/applications/main.c b/applications/main.c index c7766b2..1e1a052 100644 --- a/applications/main.c +++ b/applications/main.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-10-23 17:14:16 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-04-08 14:36:58 + * @LastEditTime: 2025-04-13 16:02:06 * @FilePath: \ble_bjq_ch303rct6_ml307\applications\main.c * @Descrt_thread_ * @@ -168,7 +168,7 @@ int APP_Calibration_Handle(void) gas_calibration_voltage = Get_Gas_VoltageAdcInt1000x(); LOG_D("ticks[%d] gas_calibration_voltage = %d", ticks++, gas_calibration_voltage); - if (ticks > TIMEOUT_MS) + if (ticks > (TIMEOUT_MS / 1000)) { ticks = 0; // 加这个的原因是,如果刚开始没标定,但是时间到了,此时刚通气开始标定,可能直接就读到值了,所以加这个判断 if (gas_calibration_voltage > (MQ_VOLTAGE_ALARM_DEFAULT - 1500) && gas_calibration_voltage < (MQ_VOLTAGE_ALARM_DEFAULT + 1000)) @@ -294,29 +294,6 @@ void APP_Handle(void) Send_Laser_Alarm_Event(kFaultEvent); } } - // if (SysControl.last_status == kSelfCheckEvent) - // { - // rt_thread_mdelay(5000); - // // 第5s关闭电磁阀 - // LOG_I("自检机械手动作"); - // EMV_FORWARD_ON(50); - // rt_thread_mdelay(10); - // EMV_BACKWARD_ON(50); - // if (Flash_Get_Valve_Num()) - // { - // rt_uint8_t mac_addr[6] = {0}; - // Flash_Get_Mac_Addr(mac_addr, 1); - // Bt_Valve_Handler(kValveCmdCtr, 1, mac_addr); - // if (rt_sem_take(&bt_ctr_sem, 10000) == RT_EOK) - // { - // LOG_D("电磁阀动作完成"); - // } - // else - // { - // LOG_E("电磁阀动作失败"); - // } - // } - // } } else if (received_event & Get_Sys_Event_Flag(kAlarmExceptionEvent)) // 浓度异常 { @@ -431,17 +408,13 @@ void APP_Handle(void) GAS_POWER_CLOSE; // 写入掉电记录 Flash_Write_Record(kRecordPowerDown); - Flash_Set_WorkDuration(work_duration); // 写入工作时长 -#if (IOT_MODULE_SWITCH == 1) - Ml307_Send_Event(kMl307PowerDownEvent); -#endif if (Flash_Get_Valve_Num()) { rt_uint8_t mac_addr[6]; Flash_Get_Mac_Addr(mac_addr, 1); Bt_Valve_Handler(kValveCmdCtr, 1, mac_addr); - if (rt_sem_take(&bt_ctr_sem, 10000) == RT_EOK) + if (rt_sem_take(&bt_ctr_sem, 5000) == RT_EOK) { LOG_D("电磁阀动作完成"); } @@ -450,8 +423,11 @@ void APP_Handle(void) LOG_E("电磁阀动作失败"); } } +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307PowerDownEvent); +#endif rt_uint8_t cnt = 0; - while ((ml307_power_down_flag == 0) && (cnt < 30)) // 等待接收到物联网模组关机完成 + while ((ml307_power_down_flag == 0) && (cnt < 60)) // 等待接收到物联网模组关机完成 { rt_thread_mdelay(1000); LOG_D("cnt = %d", cnt); @@ -510,7 +486,9 @@ void APP_Handle(void) { Flash_Write_Record(kRecordSensoEndOfLife); } - LED_Y_END_OF_LIFE; + Ml307_Send_Event(kMl307DeviceFailureEvent);//发送一个失效事件 + Send_Laser_Alarm_Event(kNormalDetectionEvents);///再返回正常模式继续检测 + // LED_Y_END_OF_LIFE; } } } diff --git a/applications/user_sys.h b/applications/user_sys.h index 19854b0..6af50a2 100644 --- a/applications/user_sys.h +++ b/applications/user_sys.h @@ -23,7 +23,7 @@ #define SYS_IOT_UPLOAD_CYCLE_MIN (0X003CU) // 高位在后,低位在前 #define SYS_IOT_RETRY (0X03U) #define SYS_TEMP_ALARM_THRESHOLD (0X32U) -#define SYS_ALARM_VALVE (0x0640U)//1600 +#define SYS_ALARM_VALVE (0x06D6U)//1750 #define SYS_EMV_SWITCH (0X04U) #define SYS_RELAY_SWITCH (0X04U) #define SYS_ALARM_VALVE_MAX (0X30U) @@ -31,7 +31,11 @@ #define SYS_IOT_URL ("8.130.122.162") #define SYS_IOT_PORT ("7153") -#define K (5 * 1000) +// #define SYS_IOT_URL ("8.130.105.38") +// #define SYS_IOT_PORT ("7133") + + +#define K (8 * 1000) // 定义宏来打印编译时间和日期 #define COMPILE_TIME \ diff --git a/bsp/inc/bsp_bt.h b/bsp/inc/bsp_bt.h index b676efb..a5af425 100644 --- a/bsp/inc/bsp_bt.h +++ b/bsp/inc/bsp_bt.h @@ -50,8 +50,8 @@ typedef enum kValveEventRem,//阀门移除 kValveEventRep,//阀门更换 kValveEventRemAll,//移除所有,此时不看阀门是否对应,直接删除全部 - kValveEventStatus, - kValveEventConnect,//阀门连接状态发生改变,未实现 + kValveEventStatus,//阀门主动上报信息 + kValveEventConnect,//阀门连接状态上报,未实现 kValveEventMax }ValveEventType; diff --git a/bsp/inc/bsp_ml307.h b/bsp/inc/bsp_ml307.h index ac0b1b9..8b20d6b 100644 --- a/bsp/inc/bsp_ml307.h +++ b/bsp/inc/bsp_ml307.h @@ -1,12 +1,12 @@ -/*** +/*** * @Author: mbw * @Date: 2024-11-30 15:46:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-02-21 09:18:33 + * @LastEditTime: 2025-04-22 09:36:02 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\bsp_ml307.h - * @Description: + * @Description: * @ - * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ #include @@ -16,126 +16,132 @@ #define MAX_VALVE_NUM 8 -#define ML307_ENABLE_3_8_V GET_PIN(B, 3) -#define ML307_PWR_PIN GET_PIN(B, 4) -#define ML307_RST_PIN GET_PIN(B, 5) -#define ML307_USIM_DECT_PIN GET_PIN(B, 6) +#define ML307_ENABLE_3_8_V GET_PIN (B, 3) +#define ML307_PWR_PIN GET_PIN (B, 4) +#define ML307_RST_PIN GET_PIN (B, 5) +#define ML307_USIM_DECT_PIN GET_PIN (B, 6) #define ML307_SAMPLE_DEIVCE_NAME "ml307" /*默认参数*/ -#define DEVICE_MANUFACTURE 0x4454 // DT +#define DEVICE_MANUFACTURE 0x4454 // DT /*命令集*/ -#define CMD_TYPE_DEVICE_DATA_REPORT 0x10 // 命令类型 - 设备数据上报 (设备->平台) -#define CMD_TYPE_DEVICE_EVENT_REPORT 0x11 // 命令类型 - 设备事件上报 (设备->平台) -#define CMD_TYPE_SERVER_REPLY 0x12 // 命令类型 - 服务器回复 (平台->设备) -#define CMD_TYPE_INSTRUCTION_DOWN 0x13 // 命令类型 - 指令下发 (平台->设备) -#define CMD_TYPE_INSTRUCTION_REPLY 0x14 // 命令类型 - 指令下发回复 (设备->平台) -#define CMD_TYPE_TIME_CALIBRATION 0x15 // 命令类型 - 时间校准 (设备->平台) +#define CMD_TYPE_DEVICE_DATA_REPORT 0x10 // 命令类型 - 设备数据上报 (设备->平台) +#define CMD_TYPE_DEVICE_EVENT_REPORT 0x11 // 命令类型 - 设备事件上报 (设备->平台) +#define CMD_TYPE_SERVER_REPLY 0x12 // 命令类型 - 服务器回复 (平台->设备) +#define CMD_TYPE_INSTRUCTION_DOWN 0x13 // 命令类型 - 指令下发 (平台->设备) +#define CMD_TYPE_INSTRUCTION_REPLY 0x14 // 命令类型 - 指令下发回复 (设备->平台) +#define CMD_TYPE_TIME_CALIBRATION 0x15 // 命令类型 - 时间校准 (设备->平台) -#define PROTOCOL_VERSION 0x41 /*协议版本*/ +#define PROTOCOL_VERSION 0x41 /*协议版本*/ /*数据序列号*/ -#define DATA_SERIAL_NUM 0x0001 // 1 +#define DATA_SERIAL_NUM 0x0001 // 1 /*设备类型*/ #define DEVICE_TYPE_ML307 0x21 /*事件类型*/ -#define EVENT_TYPE_HEARTBEAT 0x30 // 心跳事件 -#define EVENT_TYPE_SELF_CHECK 0x31 // 自检事件 -#define EVENT_TYPE_SILENCE 0x32 // 消音事件 -#define EVENT_TYPE_EXCEPTION 0x33 // 异常事件 -#define EVENT_TYPE_VALVE_STATUS 0x40 // 电磁阀状态改变事件 -#define EVENT_TYPE_FAN_STATUS 0x41 // 风机状态改变事件 -#define EVENT_TYPE_TEMP_ANOMALY 0x42 // 产品工作温度异常事件 -#define EVENT_TYPE_POWER_ON 0x43 // 上电事件 -#define EVENT_TYPE_POWER_OFF 0x44 // 掉电事件 -#define EVENT_TYPE_ALARM 0x45 // 报警事件 -#define EVENT_TYPE_ALARM_RECOVER 0x46 // 报警恢复事件 -#define EVENT_TYPE_FAULT 0x47 // 故障事件 -#define EVENT_TYPE_FAULT_RECOVER 0x48 // 故障恢复事件 -#define EVENT_TYPE_DEVICE_FAILURE 0x49 // 设备失效事件 -#define EVENT_TYPE_TIME_CALIBRATION 0x50 // 时间校准事件 +#define EVENT_TYPE_HEARTBEAT 0x30 // 心跳事件 +#define EVENT_TYPE_SELF_CHECK 0x31 // 自检事件 +#define EVENT_TYPE_SILENCE 0x32 // 消音事件 +#define EVENT_TYPE_EXCEPTION 0x33 // 异常事件 +#define EVENT_TYPE_VALVE_STATUS 0x40 // 电磁阀状态改变事件 +#define EVENT_TYPE_FAN_STATUS 0x41 // 风机状态改变事件 +#define EVENT_TYPE_TEMP_ANOMALY 0x42 // 产品工作温度异常事件 +#define EVENT_TYPE_POWER_ON 0x43 // 上电事件 +#define EVENT_TYPE_POWER_OFF 0x44 // 掉电事件 +#define EVENT_TYPE_ALARM 0x45 // 报警事件 +#define EVENT_TYPE_ALARM_RECOVER 0x46 // 报警恢复事件 +#define EVENT_TYPE_FAULT 0x47 // 故障事件 +#define EVENT_TYPE_FAULT_RECOVER 0x48 // 故障恢复事件 +#define EVENT_TYPE_DEVICE_FAILURE 0x49 // 设备失效事件 +#define EVENT_TYPE_TIME_CALIBRATION 0x50 // 时间校准事件 + +#define EVENT_TYPE_VALVE_CONNECT 0x51 +#define EVENT_TYPE_VALVE_DISCONNECT 0x52 /*调压器新增事件类型*/ /*指令下发*/ -#define INSTRUCTION_DOWN_SELF_CHECK 0x50 // 指令下发 - 自检 -#define INSTRUCTION_DOWN_MUTE 0x51 // 指令下发 - 消音 -#define INSTRUCTION_DOWN_CLOSE_VALVE 0x52 // 指令下发 - 关阀 -#define INSTRUCTION_DOWN_OPEN_VALVE 0x53 // 指令下发 - 开阀 -#define INSTRUCTION_DOWN_OPEN_RELAY 0x54 // 指令下发 - 开继电器 -#define INSTRUCTION_DOWN_CLOSE_RELAY 0x55 // 指令下发 - 关继电器 -#define INSTRUCTION_DOWN_QUERY_PARAMS 0x56 // 指令下发 - 查询系统参数 -#define INSTRUCTION_DOWN_CONFIG_PARAMS 0x57 // 指令下发 - 配置系统参数 -#define INSTRUCTION_DOWN_TIME_CALIBRATION 0x58 // 指令下发 - 时间校准 -#define INSTRUCTION_HEART_BEAT 0x59 // 心跳 -#define INSTRUCTION_DOWN_SEVER_ADDR 0x60 // 设置服务器地址和端口 +#define INSTRUCTION_DOWN_SELF_CHECK 0x50 // 指令下发 - 自检 +#define INSTRUCTION_DOWN_MUTE 0x51 // 指令下发 - 消音 +#define INSTRUCTION_DOWN_CLOSE_VALVE 0x52 // 指令下发 - 关阀 +#define INSTRUCTION_DOWN_OPEN_VALVE 0x53 // 指令下发 - 开阀 +#define INSTRUCTION_DOWN_OPEN_RELAY 0x54 // 指令下发 - 开继电器 +#define INSTRUCTION_DOWN_CLOSE_RELAY 0x55 // 指令下发 - 关继电器 +#define INSTRUCTION_DOWN_QUERY_PARAMS 0x56 // 指令下发 - 查询系统参数 +#define INSTRUCTION_DOWN_CONFIG_PARAMS 0x57 // 指令下发 - 配置系统参数 +#define INSTRUCTION_DOWN_TIME_CALIBRATION 0x58 // 指令下发 - 时间校准 +#define INSTRUCTION_HEART_BEAT 0x59 // 心跳回复 +#define INSTRUCTION_DOWN_SEVER_ADDR 0x60 // 设置服务器地址和端口 /**********************************调压器新增指令下发**********************************************************/ -#define INSTRUCTION_DOWN_VALVE_ADD 0x61 // 新增阀门设备 -#define INSTRUCTION_DOWN_VALVE_REPLACE 0x62 // 更换阀门设备 -#define INSTRUCTION_DOWN_VALVE_REMOVE 0x63 // 移除阀门设备 +#define INSTRUCTION_DOWN_VALVE_ADD 0x61 // 新增阀门设备 +#define INSTRUCTION_DOWN_VALVE_REPLACE 0x62 // 更换阀门设备 +#define INSTRUCTION_DOWN_VALVE_REMOVE 0x63 // 移除阀门设备 /************************************************************************************************************/ -#define RESPONSE_CODE_SUCCESS 0x00 // 响应码 - 操作成功 -#define RESPONSE_CODE_CRC_FAIL 0x01 // 响应码 - CRC 校验失败 -#define RESPONSE_CODE_PARSE_FAIL 0x02 // 响应码 - 数据解析失败(命令错误或者其他指令错误) -#define RESPONSE_CODE_ACTION_FAILURE 0x03 // 响应码 - 动作执行失败 -#define RESPONSE_CODE_NO_FUNCTION 0xAF // 响应码 - 无此功能 -#define RESPONSE_CODE_OTHER_ERROR 0xFF // 响应码 - 其他错误 +#define RESPONSE_CODE_SUCCESS 0x00 // 响应码 - 操作成功 +#define RESPONSE_CODE_CRC_FAIL 0x01 // 响应码 - CRC 校验失败 +#define RESPONSE_CODE_PARSE_FAIL 0x02 // 响应码 - 数据解析失败(命令错误或者其他指令错误) +#define RESPONSE_CODE_ACTION_FAILURE 0x03 // 响应码 - 动作执行失败 +#define RESPONSE_CODE_NO_FUNCTION 0xAF // 响应码 - 无此功能 +#define RESPONSE_CODE_OTHER_ERROR 0xFF // 响应码 - 其他错误 -#define MAX_DATA_LEN 512 // 数据长度 +#define MAX_DATA_LEN 512 // 数据长度 -#define ML307_DEFIENE_DATA "000000000000000000000000000000" +#define ML307_DEFIENE_DATA "000000000000000000000000000000" + +#define DEVICE_DEFINE 1 // 具备该设备功能 +#define DEVICE_NOT_DEFINE 0 // 不具备该功能 +#define DEVICE_CONNECTED 1 // 设备连接上 +#define DEVICE_DISCONNECTED 0 // 设备未连接 +#define DEVICE_OPEN 1 // 设备开启 +#define DEVICE_CLOSE 0 // 设备关闭 -#define DEVICE_DEFINE 1 // 具备该设备功能 -#define DEVICE_NOT_DEFINE 0 // 不具备该功能 -#define DEVICE_CONNECTED 1 // 设备连接上 -#define DEVICE_DISCONNECTED 0 // 设备未连接 -#define DEVICE_OPEN 1 // 设备开启 -#define DEVICE_CLOSE 0 // 设备关闭 typedef enum { /****************优先级最低***************** */ - kMl307HeartbeatEvent, // 定时心跳事件 - kMl307SilenceEvent, // 消音事件 - kMl307ExceptionEvent, // 异常事件 - kMl307ValveStatusEvent, // 电磁阀状态改变事件 - kMl307FanStatusEvent, // 风机状态改变事件 - kMl307TempAnomalyEvent, // 产品工作温度异常事件 - kMl307AlarmEvent, // 报警事件 - kMl307AlarmRcyEvent, // 报警恢复事件 - kMl307FaultEvent, // 故障事件 - kMl307FaultRcyEvent, // 故障恢复事件 - kMl307DeviceFailureEvent, // 设备失效事件 - kMl307TimeCalibrationEvent, // 时间校准事件 - /**********************优先级第三************************* */ - kMl307SelfCheckEvent, // 自检事件 - /**********************优先级第二************************* */ - kMl307PowerDownEvent, // 掉电事件 - /**********************优先级第一************************* */ - kMl307PowerOnEvent, // 上电事件 + kMl307HeartbeatEvent, // 定时心跳事件 + kMl307SilenceEvent, // 消音事件 + kMl307ExceptionEvent, // 异常事件 + kMl307ValveStatusEvent, // 电磁阀状态改变事件 + kMl307FanStatusEvent, // 风机状态改变事件 + kMl307TempAnomalyEvent, // 产品工作温度异常事件 + kMl307AlarmEvent, // 报警事件 + kMl307AlarmRcyEvent, // 报警恢复事件 + kMl307FaultEvent, // 故障事件 + kMl307FaultRcyEvent, // 故障恢复事件 + kMl307DeviceFailureEvent, // 设备失效事件 + kMl307TimeCalibrationEvent, // 时间校准事件 + kMl307ValveConnectEvent, // 阀门连接事件 + KMl307ValveDisconnectEvent, // 阀门断开事件 + /**********************优先级第三************************* */ + kMl307SelfCheckEvent, // 自检事件 + /**********************优先级第二************************* */ + kMl307PowerDownEvent, // 掉电事件 + /**********************优先级第一************************* */ + kMl307PowerOnEvent, // 上电事件 - kMl307MaxEventcnt // 最大事件计数 -} Ml307Event; // 当前所处的事件类型 + kMl307MaxEventcnt // 最大事件计数 +} Ml307Event; // 当前所处的事件类型 typedef enum { - kHeartbeatStatus, // 定时心跳状态 - kConcentrationHighStatus, // 浓度异常状态 - kSelfCheckStatus, // 自检触发状态 - kAlarmStatus, // 报警触发状态 - kAlarmClearedStatus, // 报警解除状态 - kSensorFaultStatus, // 传感器故障触发状态 - kSensorRecoveredStatus, // 传感器故障解除状态 - kPowerDownStatus, // 掉电状态 -} Ml307Status; // 当前所处的上报状态 + kHeartbeatStatus, // 定时心跳状态 + kConcentrationHighStatus, // 浓度异常状态 + kSelfCheckStatus, // 自检触发状态 + kAlarmStatus, // 报警触发状态 + kAlarmClearedStatus, // 报警解除状态 + kSensorFaultStatus, // 传感器故障触发状态 + kSensorRecoveredStatus, // 传感器故障解除状态 + kPowerDownStatus, // 掉电状态 +} Ml307Status; // 当前所处的上报状态 typedef struct { - Ml307Event current_event; // 当前事件 - Ml307Event last_event; // 上次事件 + Ml307Event current_event; // 当前事件 + Ml307Event last_event; // 上次事件 } Ml307EventIndex; /* @@ -149,7 +155,8 @@ typedef struct 无线调压阀大气压 */ typedef struct valve_t valve_data; -struct __attribute__((packed)) valve_t + +struct __attribute__ ((packed)) valve_t { uint8_t valve_id; uint8_t valve_mac[6]; @@ -161,59 +168,58 @@ struct __attribute__((packed)) valve_t uint32_t valve_atm_pressure; }; - -struct __attribute__((packed)) DataBody +struct __attribute__ ((packed)) DataBody { - uint8_t device_type; // 设备类型 - uint8_t event_type; // 事件类型 - uint8_t hw; // 硬件版本 - uint8_t sw; // 软件版本 - uint8_t imei[15]; // 设备编号(IMEI) - uint8_t iccid[20]; // ICCID - uint8_t imsi[15]; // IMSI - uint8_t rssi; // RSSI - uint8_t rsrp; // RSRP - uint16_t gas_voltage; // 传感器电压 - uint8_t product_work_temperature; //产品工作温度 - uint16_t work_duration; //工作时长 - uint8_t device_status; // 设备失效状态 - rt_uint8_t valve_num; // 阀门数量 + uint8_t device_type; // 设备类型 + uint8_t event_type; // 事件类型 + uint8_t hw; // 硬件版本 + uint8_t sw; // 软件版本 + uint8_t imei[15]; // 设备编号(IMEI) + uint8_t iccid[20]; // ICCID + uint8_t imsi[15]; // IMSI + uint8_t rssi; // RSSI + uint8_t rsrp; // RSRP + uint16_t gas_voltage; // 传感器电压 + uint8_t product_work_temperature; // 产品工作温度 + uint16_t work_duration; // 工作时长 + uint8_t device_status; // 设备失效状态 + rt_uint8_t valve_num; // 阀门数量 struct valve_t valve_data[MAX_VALVE_NUM]; }; // 定义数据帧结构体 -struct __attribute__((packed)) Ml307DataFrame +struct __attribute__ ((packed)) Ml307DataFrame { - uint8_t header[3]; // 帧头 - uint8_t version; // 协议版本 - uint16_t manufacture; // 厂商标识 - uint16_t datanumber; // 数据序列号 - uint8_t cmd; // 命令位 - uint16_t datalen; // 数据长度 - struct DataBody data; // 数据体 - uint16_t crc16; // 校验位 - uint8_t tail[3]; // 帧尾 + uint8_t header[3]; // 帧头 + uint8_t version; // 协议版本 + uint16_t manufacture; // 厂商标识 + uint16_t datanumber; // 数据序列号 + uint8_t cmd; // 命令位 + uint16_t datalen; // 数据长度 + struct DataBody data; // 数据体 + uint16_t crc16; // 校验位 + uint8_t tail[3]; // 帧尾 }; -struct __attribute__((packed)) Ml307Data +struct __attribute__ ((packed)) Ml307Data { - rt_uint8_t device_type; // 设备类型 - rt_uint8_t event_type; // 事件类型 - rt_uint8_t res_data[15]; // + rt_uint8_t device_type; // 设备类型 + rt_uint8_t event_type; // 事件类型 + rt_uint8_t res_data[15]; // rt_uint8_t res_num; }; -struct __attribute__((packed)) Ml307RecvData +struct __attribute__ ((packed)) Ml307RecvData { - rt_uint8_t header[3]; // 帧头 - rt_uint8_t version; // 协议版本 - rt_uint16_t manufacture; // 厂商标识 - rt_uint16_t datanumber; // 数据序列号 - rt_uint8_t cmd; // 命令位 - rt_uint16_t datalen; // 数据长度 - struct Ml307Data recv_data; // 接收数据体 - rt_uint16_t crc16; // 校验位 - rt_uint8_t tail[3]; // 帧尾 + rt_uint8_t header[3]; // 帧头 + rt_uint8_t version; // 协议版本 + rt_uint16_t manufacture; // 厂商标识 + rt_uint16_t datanumber; // 数据序列号 + rt_uint8_t cmd; // 命令位 + rt_uint16_t datalen; // 数据长度 + struct Ml307Data recv_data; // 接收数据体 + rt_uint16_t crc16; // 校验位 + rt_uint8_t tail[3]; // 帧尾 }; struct Ml307_Ops @@ -221,11 +227,11 @@ struct Ml307_Ops struct DataBody *body; struct Ml307DataFrame *frame; struct Ml307RecvData *recv; - int (*init)(struct Ml307_Ops *ops, rt_uint8_t version); - int (*update_data)(struct Ml307_Ops *ops, rt_uint8_t device_type, rt_uint8_t cmd); - int (*send)(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type); - int (*Resp)(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type, char *data, rt_uint8_t res); - int (*Recv)(struct Ml307_Ops *ops, char *data); // 解析数据 + int (*init) (struct Ml307_Ops *ops, rt_uint8_t version); + int (*update_data) (struct Ml307_Ops *ops, rt_uint8_t device_type, rt_uint8_t cmd); + int (*send) (struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type); + int (*Resp) (struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type, char *data, rt_uint8_t res); + int (*Recv) (struct Ml307_Ops *ops, char *data); // 解析数据 }; extern struct Ml307_Ops ml307_ops; @@ -237,12 +243,10 @@ extern rt_sem_t ml307_disconnect_sem; extern rt_uint8_t ml307_conncet_tcp_flag; extern rt_uint8_t ml307_connect_sever_flag; extern rt_uint8_t ml307_disconnect_pdp_flag; -extern rt_uint8_t power_on_send_flag; +extern rt_uint8_t power_on_send_flag; extern rt_uint8_t ml307_power_down_flag; - - -void Ml307_Send_Event(Ml307Event event_type); -int ml307_device_register(void); -int BSP_Ml307_Thread_Init(void); +void Ml307_Send_Event (Ml307Event event_type); +int ml307_device_register (void); +int BSP_Ml307_Thread_Init (void); diff --git a/bsp/src/at_device_ml307.c b/bsp/src/at_device_ml307.c index 30a8265..476ad51 100644 --- a/bsp/src/at_device_ml307.c +++ b/bsp/src/at_device_ml307.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-11-30 15:46:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-02-25 10:48:30 + * @LastEditTime: 2025-04-16 10:10:33 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c * @Description: * @@ -164,17 +164,7 @@ static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t s rt_memset(ml307_ops.recv, 0, sizeof(struct Ml307RecvData)); // 清空结构体 rt_memcpy(ml307_ops.recv, recv_byte_buf, sizeof(struct Ml307RecvData)); ml307_connect_sever_flag = 1; - if ((ml307_ops.recv->recv_data.event_type == INSTRUCTION_HEART_BEAT) || - (ml307_ops.recv->recv_data.event_type == EVENT_TYPE_POWER_ON)) // 加这个的原因就是如果有指令下发,会出现两个信号量,指令会执行两次,所以排除心跳包才释放信号量 - - { - rt_sem_release(ml307_recv_msg_sem); // 接收到的是心跳包 - } - else - { - rt_sem_release(ml307_recv_sem); - rt_sem_release(ml307_recv_msg_sem); // 接收到的是心跳包 - } + rt_sem_release(ml307_recv_sem); } else { @@ -256,13 +246,14 @@ void urc_sim_remove(struct at_client *client, const char *data, rt_size_t size) LOG_D("SIM removed"); ml307_conncet_tcp_flag = 0; } + 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}, + // {"+CPIN: SIM REMOVED", "\r\n", urc_sim_remove}, }; void show_resp_info(at_response_t resp) diff --git a/bsp/src/bsp_bt.c b/bsp/src/bsp_bt.c index 3fd1d6c..1d05fba 100644 --- a/bsp/src/bsp_bt.c +++ b/bsp/src/bsp_bt.c @@ -2,11 +2,11 @@ * @Author: mbw * @Date: 2024-12-03 10:31:45 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2025-04-08 16:04:01 + * @LastEditTime: 2025-04-22 14:50:43 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_bt.c - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + * @Description: + * + * Copyright (c) 2025 by ${git_name_email}, All Rights Reserved. */ #include "bsp_bt.h" #include "bsp_ml307.h" @@ -280,7 +280,7 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) { index++; } - for (size_t i = 0; i < len - 3; i++)//发现了一种情况,会出现两个AA,用这种方法排除一下 + for (size_t i = 0; i < (len - 3); i++)//发现了一种情况,会出现两个AA,用这种方法排除一下 { if (data[index + i + 1] == 0XAA) { @@ -354,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) // 移除成功 @@ -372,7 +372,21 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) break; case kValveEventConnect: - + LOG_I("接收到阀门连接状态数据"); + LOG_HEX("bt_rx_data:", 16, data_buf, fram_len); + + rt_memcpy(&valve[data_buf[3] - 1], &data_buf[3], sizeof(struct valve_t) - 14);//只要前面的一部分数据,后面的不要 + LOG_HEX("valve_data:", 16, (rt_uint8_t *)&valve[data_buf[3] - 1], sizeof(struct valve_t)); + if(valve[data_buf[3] - 1].valve_connct_status == 1) + { + LOG_D("阀门连接"); + Ml307_Send_Event(kMl307ValveConnectEvent); + } + else + { + LOG_D("阀门断开"); + Ml307_Send_Event(KMl307ValveDisconnectEvent); + } break; default: LOG_W("unknow cmd: %02X", data[index + 2]); diff --git a/bsp/src/bsp_button.c b/bsp/src/bsp_button.c index 3c25c52..5796e4c 100644 --- a/bsp/src/bsp_button.c +++ b/bsp/src/bsp_button.c @@ -62,12 +62,13 @@ static void _CommonBtnEvtCb(void *arg) } else if (flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_CLICK) { - if (Sensor_device.detection_flag == kSensorAlarm) + if (SysControl.status == kAlarmEvent) { Send_Laser_Alarm_Event(KMuteEvent); } } - else if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_REPEAT_CLICK) && (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_LONG_HOLD)) + // else if ((flex_button_event_read(&user_button[USER_BUTTON_0]) == FLEX_BTN_PRESS_REPEAT_CLICK) && (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_LONG_HOLD)) + else if (flex_button_event_read(&user_button[USER_BUTTON_1]) == FLEX_BTN_PRESS_LONG_HOLD) { LOG_I("本地清除阀门信息"); rt_uint8_t mac_addr[6] = {0}; diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c index 44538d1..c53159e 100644 --- a/bsp/src/bsp_flash.c +++ b/bsp/src/bsp_flash.c @@ -155,7 +155,7 @@ int Get_IotImei(char *buf, rt_size_t len) { rt_memcpy(buf, (char *)FLASH_IOT_IMEI_ADDR, len); - LOG_D("NB IMEI: %s", buf); + LOG_D("IMEI: %s", buf); return 0; } else @@ -165,7 +165,7 @@ int Get_IotImei(char *buf, rt_size_t len) { buf[i] = '0'; } - LOG_D("NB IMSI: %s", buf); + LOG_D("IMSI: %s", buf); return -1; } } @@ -176,7 +176,7 @@ int Get_IotImsi(char *buf, rt_size_t len) { rt_memcpy(buf, (char *)FLASH_IOT_IMSI_ADDR, len); - LOG_D("NB IMSI: %s", buf); + LOG_D("IMSI: %s", buf); return 0; } else @@ -186,7 +186,7 @@ int Get_IotImsi(char *buf, rt_size_t len) { buf[i] = '0'; } - LOG_D("NB IMSI: %s", buf); + LOG_D("IMSI: %s", buf); return -1; } } @@ -197,7 +197,7 @@ int Get_IotIccid(char *buf, rt_size_t len) { rt_memcpy(buf, (char *)FLASH_IOT_ICCID_ADDR, len); - LOG_D("NB ICCID: %s", buf); + LOG_D("ICCID: %s", buf); return 0; } else @@ -207,7 +207,7 @@ int Get_IotIccid(char *buf, rt_size_t len) { buf[i] = '0'; } - LOG_D("NB ICCID: %s", buf); + LOG_D("ICCID: %s", buf); return -1; } } @@ -894,7 +894,7 @@ int BSP_Flash_Init (void) Flash_SetProductTimeLimit (2025, 2, 10, 13, 50, 20, kFactoryTimeId); Set_ExpirationTime (MAX_EXPIRATION_DAYS); - Flash_Set_Calibration_State(kNotCalibrated); // 标定状态 + Flash_Set_Calibration_State(kSysGasCalibStatus); // 标定状态 Flash_Set_Valve_Num(0); sci.hw_ver = SYS_HW_VERSION; sci.sw_ver = SYS_SW_VERSION; diff --git a/bsp/src/bsp_ml307.c b/bsp/src/bsp_ml307.c index 63e95a4..ad3455f 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-02-22 15:59:21 + * @LastEditTime: 2025-04-25 08:41:52 * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c * @Description: * @@ -700,6 +700,29 @@ int Ml307_Send_Temp_Anomaly(struct at_device *device, void *param) return RT_EOK; } +/** + * 处理上电事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Power_On(struct at_device *device, void *param) +{ + struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; + if ((device == RT_NULL) || (ml307_ops == RT_NULL)) + { + LOG_E("ml307 param error\n"); + return RT_ERROR; + } + + if (ml307_ops->send(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_ML307, EVENT_TYPE_POWER_ON)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_POWER_ON); + return -RT_ERROR; + } + return RT_EOK; +} + /** * 处理断电事件 * @param device 设备结构体指针 @@ -724,12 +747,12 @@ int Ml307_Send_Power_Off(struct at_device *device, void *param) } /** - * 处理断电事件 + * 处理阀门连接事件 * @param device 设备结构体指针 * @param param 操作结构体指针 * @return 操作结果 */ -int Ml307_Send_Power_On(struct at_device *device, void *param) +int Ml307_Send_Valve_Connect(struct at_device *device, void *param) { struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; if ((device == RT_NULL) || (ml307_ops == RT_NULL)) @@ -738,9 +761,32 @@ int Ml307_Send_Power_On(struct at_device *device, void *param) return RT_ERROR; } - if (ml307_ops->send(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_ML307, EVENT_TYPE_POWER_ON)) + if (ml307_ops->send(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_ML307, EVENT_TYPE_VALVE_CONNECT)) { - LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_POWER_ON); + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_VALVE_CONNECT); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理阀门断开事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Valve_Disconnect(struct at_device *device, void *param) +{ + struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; + if ((device == RT_NULL) || (ml307_ops == RT_NULL)) + { + LOG_E("ml307 param error\n"); + return RT_ERROR; + } + + if (ml307_ops->send(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_ML307, EVENT_TYPE_VALVE_DISCONNECT)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_VALVE_DISCONNECT); return -RT_ERROR; } return RT_EOK; @@ -775,6 +821,8 @@ int Ml307_Send_Device_Failure(struct at_device *device, void *param) const Ml307EventInfo ml307_event_info[] = { {kMl307PowerOnEvent, kMl307PriorityHighest, "上电心跳事件", Ml307_Send_Power_On}, {kMl307PowerDownEvent, kMl307PriorityHigh, "掉电事件", Ml307_Send_Power_Off}, + {kMl307ValveConnectEvent, kMl307PriorityMedium, "阀门连接事件", Ml307_Send_Valve_Connect}, + {KMl307ValveDisconnectEvent, kMl307PriorityMedium, "阀门断开事件", Ml307_Send_Valve_Disconnect}, {kMl307SelfCheckEvent, kMl307PriorityMedium, "自检事件", Ml307_Send_Self_Check}, {kMl307HeartbeatEvent, kMl307PriorityLowest, "定时心跳事件", Ml307_Send_Heartbeat}, {kMl307TempAnomalyEvent, kMl307PriorityLowest, "温度异常事件", Ml307_Send_Temp_Anomaly}, @@ -827,20 +875,19 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, if (event) // 处理该事件 { // 打印事件的名称 - LOG_D("%s上报\n", event->event_name); + ml307_current_evnet = event->event_flag; for (size_t i = 0; i < max_retry_count; i++) { if (ml307_conncet_tcp_flag) { - // 如果事件有关联的发送函数,则调用该发送函数 - rt_thread_mdelay(IMEI_Delay()); if (event->send_func) { #ifdef TEST_ENABLE RTC_ShowTime(); // 每次发送打印下时间,容易定位问题 #endif - LOG_D("send data cnt :%d", cnt); + LOG_D("%s上报, cnt :%d", event->event_name, cnt); + int result = event->send_func(device, ml307_ops); if (result != RT_EOK) { @@ -850,7 +897,7 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, } else { - if (rt_sem_take(ml307_recv_msg_sem, 5000) == RT_EOK) + if (rt_sem_take(ml307_recv_msg_sem, 8000) == RT_EOK) { LOG_D("收到回复\n"); ml307_connect_sever_flag = 1; @@ -869,7 +916,6 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, { ret = RT_ERROR; } - rt_thread_mdelay(3000); if (event->priority < Get_Event_Priority(ml307_latest_evnet)) // 查看当前事件和新传入的事件的优先级哪个高,如果有高的直接退出处理高优先级的 { LOG_W("有更高优先级的事件进入,退出当前处理\n"); @@ -886,12 +932,11 @@ int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, { LOG_D("关闭TCP"); } - if (device->class->device_ops->control(device, AT_DEVICE_CTRL_POWER_OFF, RT_NULL) == RT_EOK) - { - LOG_D("关闭模组"); - ml307_power_down_flag = 1; - ret = RT_EOK; - } + + rt_pin_write(_dev.pwr_en_pin, PIN_LOW); // 断开3_8v供电 + LOG_D("关闭模组"); + ml307_power_down_flag = 1; + ret = RT_EOK; } else { @@ -946,9 +991,29 @@ int Compare_HeaderToTail(struct Ml307_Ops *ops) void Handle_Server_Reply(struct Ml307_Ops *ops) { - if ((ops->recv->recv_data.event_type == INSTRUCTION_HEART_BEAT) || (ops->recv->recv_data.event_type == EVENT_TYPE_POWER_ON)) + if ((ops->recv->recv_data.event_type == INSTRUCTION_HEART_BEAT) || + (ops->recv->recv_data.event_type == EVENT_TYPE_SELF_CHECK) || + (ops->recv->recv_data.event_type == EVENT_TYPE_SILENCE) || + (ops->recv->recv_data.event_type == EVENT_TYPE_EXCEPTION) || + (ops->recv->recv_data.event_type == EVENT_TYPE_VALVE_STATUS) || + (ops->recv->recv_data.event_type == EVENT_TYPE_FAN_STATUS) || + (ops->recv->recv_data.event_type == EVENT_TYPE_TEMP_ANOMALY) || + (ops->recv->recv_data.event_type == EVENT_TYPE_POWER_ON) || + (ops->recv->recv_data.event_type == EVENT_TYPE_POWER_OFF) || + (ops->recv->recv_data.event_type == EVENT_TYPE_ALARM) || + (ops->recv->recv_data.event_type == EVENT_TYPE_ALARM_RECOVER) || + (ops->recv->recv_data.event_type == EVENT_TYPE_FAULT) || + (ops->recv->recv_data.event_type == EVENT_TYPE_FAULT_RECOVER) || + (ops->recv->recv_data.event_type == EVENT_TYPE_DEVICE_FAILURE) || + (ops->recv->recv_data.event_type == EVENT_TYPE_VALVE_CONNECT) || + (ops->recv->recv_data.event_type == EVENT_TYPE_VALVE_DISCONNECT)) { LOG_D("服务器响应成功,响应码:[%02X]\n", ops->recv->recv_data.event_type); + rt_sem_release(ml307_recv_msg_sem); + } + else + { + LOG_E("服务器响应失败,响应码:[%02X]\n", ops->recv->recv_data.event_type); } } @@ -1591,7 +1656,9 @@ static void Ml307_Send_Thread_Entry(void *param) Ml307_Get_Event_Flag(kMl307FaultEvent) | Ml307_Get_Event_Flag(kMl307FaultRcyEvent) | Ml307_Get_Event_Flag(kMl307DeviceFailureEvent) | - Ml307_Get_Event_Flag(kMl307TimeCalibrationEvent), + Ml307_Get_Event_Flag(kMl307TimeCalibrationEvent) | + Ml307_Get_Event_Flag(kMl307ValveConnectEvent) | + Ml307_Get_Event_Flag(KMl307ValveDisconnectEvent), RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &ml307_recv_event); // 这个事件一般是设备端发生了变化,发送到服务器时调用 @@ -1632,6 +1699,22 @@ static void Ml307_Send_Thread_Entry(void *param) LOG_E("ml307 send data failed result = [%d]\n", result); } } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307ValveConnectEvent)) + { + result = Ml307_Process_Events(kMl307ValveConnectEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(KMl307ValveDisconnectEvent)) + { + result = Ml307_Process_Events(KMl307ValveDisconnectEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307TimeCalibrationEvent)) { Time_Calibration(device); @@ -1826,8 +1909,8 @@ static void Ml307_Life_Thread_Entry(void *parameter) result = -RT_ERROR; goto __exit; } - /* Define PDP Context */ - rt_uint8_t i = 0; + /* Define PDP Context */ + rt_uint8_t i = 0; for (i = 0; i < 5; i++) { if (at_obj_exec_cmd(device->client, resp, "AT+CGDCONT=1,\"IPV4V6\",\"cmnet\"") == RT_EOK) @@ -1843,7 +1926,64 @@ static void Ml307_Life_Thread_Entry(void *parameter) result = -RT_ERROR; goto __exit; } + /* check SIM card */ + for (i = 0; i < 60; i++) + { + if (at_obj_exec_cmd(device->client, resp, "AT+CPIN?") == RT_EOK) + { + char code[8] = {0}; + if (at_resp_parse_line_args_by_kw(resp, "+CPIN:", "+CPIN: %s", code) > 0) + { + if (rt_strcmp(code, "READY") == 0) + { + LOG_D("%s device SIM card detection success.", device->name); + break; + } + else + { + LOG_E("%s device SIM card detection failed.", device->name); + result = -RT_ERROR; + goto __exit; + } + } + } + rt_thread_mdelay(3000); + } + if (i == 60) + { + LOG_E("%s device SIM card detection failed.", device->name); + result = -RT_ERROR; + goto __exit; + } + /* check the GPRS network is registered */ + for (i = 0; i < 60; i++) + { + if (at_obj_exec_cmd(device->client, resp, "AT+CEREG?") == RT_EOK) + { + int link_stat = 0; + if (at_resp_parse_line_args_by_kw(resp, "+CEREG:", "+CEREG: %*d,%d", &link_stat) > 0) + { + if ((link_stat == 1) || (link_stat == 5)) + { + LOG_D("%s device GPRS is registered", device->name); + break; + } + } + } + rt_thread_mdelay(1000); + } + if (i == 60) + { + LOG_E("%s device GPRS is register failed", device->name); + result = -RT_ERROR; + goto __exit; + } + if (at_obj_exec_cmd(device->client, resp, "AT+MIPCALL=1,1") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) { LOG_D("重连网络成功\n"); diff --git a/doc/README.md b/doc/README.md index 35ccfb0..5775480 100644 --- a/doc/README.md +++ b/doc/README.md @@ -5,7 +5,7 @@ # 引脚占用 -## NB通讯 +## 通讯 | 引脚 | 占用 | 占用方式 | | ----- | ----------- | ------------------- | diff --git a/rt-thread/rtconfig.h b/rt-thread/rtconfig.h index 4ec2e0f..bb8c993 100644 --- a/rt-thread/rtconfig.h +++ b/rt-thread/rtconfig.h @@ -132,7 +132,7 @@ #define NETDEV_IPV4 1 #define NETDEV_IPV6 0 #define RT_USING_AT - +// #define NETDEV_USING_PING//用来监测和平台之间的延时 #ifdef ENABLE_LOG_ALL #define AT_DEBUG #endif @@ -149,14 +149,14 @@ #define AT_SW_VERSION_NUM 0x10301 /* end of Network */ -#define IOT_MODULE_SWITCH 1 // 开启NB物联网功能 +#define IOT_MODULE_SWITCH 1 // 开启物联网功能 /* Utilities */ #define TEST_ENABLE //打开所有的终端测试程序 #define RT_USING_ULOG #define ULOG_OUTPUT_LVL_D -#define ULOG_OUTPUT_LVL 7 // 生产时将其设为0 +#define ULOG_OUTPUT_LVL 7 #define ULOG_USING_ISR_LOG #define ULOG_ASSERT_ENABLE #define ULOG_LINE_BUF_SIZE 1024