From a0b3ad50f314519c5671ff84bac39474886ddfa4 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: Tue, 3 Dec 2024 10:24:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=864G=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cproject | 2 +- .settings/org.eclipse.core.resources.prefs | 4 +- .vscode/settings.json | 2 +- applications/main.c | 56 +- .../{at_device_mb26.h => at_device_ml307.h} | 53 +- bsp/inc/bsp_flash.h | 20 +- bsp/inc/bsp_led.h | 2 +- bsp/inc/{bsp_mb26.h => bsp_ml307.h} | 129 +- bsp/src/at_device_mb26.c | 1594 --------------- bsp/src/at_device_ml307.c | 1715 +++++++++++++++++ bsp/src/bsp_adc.c | 2 +- bsp/src/bsp_flash.c | 38 +- bsp/src/bsp_hr.c | 8 +- bsp/src/bsp_mb26.c | 1616 ---------------- bsp/src/bsp_ml307.c | 1617 ++++++++++++++++ libraries/hal_drivers/drv_adc.c | 4 +- .../ch32v303_hal/include/ch32v30x_adc.h | 2 +- .../ch32v303_hal/include/ch32v30x_usb.h | 2 +- .../ch32v303_hal/source/ch32v30x_adc.c | 4 +- packages/at_device-2.1.0/at_device.h | 2 +- rt-thread/include/rtdef.h | 4 +- rt-thread/rtconfig.h | 22 +- 22 files changed, 3507 insertions(+), 3391 deletions(-) rename bsp/inc/{at_device_mb26.h => at_device_ml307.h} (53%) rename bsp/inc/{bsp_mb26.h => bsp_ml307.h} (65%) delete mode 100644 bsp/src/at_device_mb26.c create mode 100644 bsp/src/at_device_ml307.c delete mode 100644 bsp/src/bsp_mb26.c create mode 100644 bsp/src/bsp_ml307.c diff --git a/.cproject b/.cproject index 17229bb..4aeb167 100644 --- a/.cproject +++ b/.cproject @@ -174,7 +174,7 @@ - + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index a5cf778..1a5d4dd 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -4,10 +4,10 @@ encoding//applications/main.c=UTF-8 encoding//applications/user_sys.h=UTF-8 encoding//board/board.c=UTF-8 encoding//board/board.h=UTF-8 -encoding//bsp/inc/at_device_mb26.h=GBK +encoding//bsp/inc/at_device_ml307.h=GBK encoding//bsp/inc/bsp_hr.h=GBK encoding//bsp/inc/bsp_led.h=UTF-8 -encoding//bsp/src/at_device_mb26.c=UTF-8 +encoding//bsp/src/at_device_ml307.c=UTF-8 encoding//bsp/src/bsp_button.c=GBK encoding//bsp/src/bsp_flash.c=UTF-8 encoding//bsp/src/bsp_led.c=GBK diff --git a/.vscode/settings.json b/.vscode/settings.json index dd1f635..65550c9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -37,7 +37,7 @@ "pin.h": "c", "cstring": "c", "bsp_beep.h": "c", - "at_device_mb26.h": "c", + "at_device_ml307.h": "c", "at_log.h": "c", "at_device.h": "c", "stdlib.h": "c", diff --git a/applications/main.c b/applications/main.c index 802cb5a..0d96ea0 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: 2024-12-01 15:55:01 + * @LastEditTime: 2024-12-02 09:03:56 * @FilePath: \ble_bjq_ch303rct6_ml307\applications\main.c * @Descrt_thread_ * @@ -22,7 +22,7 @@ #include "bsp_hr.h" #include "bsp_mq.h" #include "bsp_button.h" -#include "bsp_mb26.h" +#include "bsp_ml307.h" #include "bsp_vin_detection.h" #include "user_sys.h" @@ -39,6 +39,8 @@ rt_bool_t is_event_initialized = RT_FALSE; // 是否初始化完成 TsSysControl SysControl; struct rt_timer work_cnt_timer; +struct rt_timer preheat_timer;//传统模式需要进行预热, + void Send_Laser_Alarm_Event(AlarmEvent event_type); TeCalibrationStatus g_Calibration_status = kNotCalibrated; @@ -137,6 +139,11 @@ void Work_Cnt_Timer_Callback(void *parameter) Send_Laser_Alarm_Event(kSensorFailureEvent); } } + +void Preheat_Timer_Callback(void *parameter) +{ + Send_Laser_Alarm_Event(kNormalDetectionEvents); +} int main(void) { // 定义超时时间,单位为毫秒 @@ -195,8 +202,14 @@ int main(void) Work_Cnt_Timer_Callback, RT_NULL, WORK_TIMER_CNT, - RT_TIMER_FLAG_PERIODIC); + RT_TIMER_FLAG_SOFT_TIMER|RT_TIMER_FLAG_PERIODIC); rt_timer_start(&work_cnt_timer); + rt_timer_init(&preheat_timer, + "preheat_timer", + Preheat_Timer_Callback, + RT_NULL, + TIMEOUT_MS, + RT_TIMER_FLAG_SOFT_TIMER|RT_TIMER_FLAG_ONE_SHOT); if (Get_VIN_VoltageInt1000x() > 10000) { // 检测上电/掉电复位标志 @@ -270,7 +283,8 @@ int main(void) LED_STOP(g); LED_STOP(y); LOG_D("预热完成"); - Send_Laser_Alarm_Event(kNormalDetectionEvents); + rt_timer_start(&preheat_timer); + } else if (received_event & Get_Sys_Event_Flag(kNormalDetectionEvents)) // 正常检测 { @@ -278,8 +292,8 @@ int main(void) SysControl.last_status = SysControl.status; SysControl.status = kNormalDetectionEvents; -#if (NB_MODULE_SWITCH == 1) - if (mb26_conncet_tcp_flag) +#if (IOT_MODULE_SWITCH == 1) + if (ml307_conncet_tcp_flag) { LED_G_INTERNET; } @@ -287,7 +301,7 @@ int main(void) { #endif LED_G_NORMAL; -#if (NB_MODULE_SWITCH == 1) +#if (IOT_MODULE_SWITCH == 1) } #endif rt_thread_mdelay(10); @@ -315,8 +329,8 @@ int main(void) LED_R_ALARM; BEEP_ALARM; -#if (NB_MODULE_SWITCH == 1) - Mb26_Send_Event(kMb26AlarmEvent); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307AlarmEvent); #endif } else if (received_event & Get_Sys_Event_Flag(kAlarmRcyEvent)) // 报警恢复 @@ -330,8 +344,8 @@ int main(void) BEEP_STOP; -#if (NB_MODULE_SWITCH == 1) - Mb26_Send_Event(kMb26AlarmRcyEvent); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307AlarmRcyEvent); #endif Send_Laser_Alarm_Event(kNormalDetectionEvents); @@ -348,8 +362,8 @@ int main(void) LED_Y_FAULT; BEEP_FAULT; -#if (NB_MODULE_SWITCH == 1) - Mb26_Send_Event(kMb26FaultEvent); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307FaultEvent); #endif } else if (received_event & Get_Sys_Event_Flag(kFaultRcyEvent)) // 故障恢复 @@ -364,8 +378,8 @@ int main(void) BEEP_STOP; Send_Laser_Alarm_Event(kNormalDetectionEvents); -#if (NB_MODULE_SWITCH == 1) - Mb26_Send_Event(kMb26FaultRcyEvent); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307FaultRcyEvent); #endif } else if (received_event & Get_Sys_Event_Flag(KMuteEvent)) // 消音 @@ -374,8 +388,8 @@ int main(void) SysControl.last_status = SysControl.status; SysControl.status = KMuteEvent; -#if (NB_MODULE_SWITCH == 1) - Mb26_Send_Event(kMb26SilenceEvent); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307SilenceEvent); #endif BEEP_STOP; } @@ -391,8 +405,8 @@ int main(void) Flash_Write_Record(kRecordPowerDown); Flash_Set_WorkDuration(work_duration); // 写入工作时长 -#if (NB_MODULE_SWITCH == 1) - Mb26_Send_Event(kMb26PowerDownEvent); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307PowerDownEvent); #endif LOG_D("Enter AnalogWatchdog Interrupt"); @@ -415,8 +429,8 @@ int main(void) _Self_Check_Mode(); Send_Laser_Alarm_Event(SysControl.last_status); -#if (NB_MODULE_SWITCH == 1) - Mb26_Send_Event(kMb26SelfCheckEvent); +#if (IOT_MODULE_SWITCH == 1) + Ml307_Send_Event(kMl307SelfCheckEvent); #endif } else if (received_event & Get_Sys_Event_Flag(kSensorFailureEvent)) // 失效 diff --git a/bsp/inc/at_device_mb26.h b/bsp/inc/at_device_ml307.h similarity index 53% rename from bsp/inc/at_device_mb26.h rename to bsp/inc/at_device_ml307.h index fdcc176..0bfd2c7 100644 --- a/bsp/inc/at_device_mb26.h +++ b/bsp/inc/at_device_ml307.h @@ -2,8 +2,8 @@ * @Author: mbw * @Date: 2024-10-09 08:42:14 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-11-07 14:21:17 - * @FilePath: \JT-DT-YD4N02A_RTT_MRS\bsp\inc\at_device_mb26.h + * @LastEditTime: 2024-12-02 16:54:17 + * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\inc\at_device_ml307.h * @Description: * @ * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. @@ -13,25 +13,25 @@ * @Date: 2024-10-09 08:42:14 * @LastEditors: mbw && 1600520629@qq.com * @LastEditTime: 2024-10-14 14:25:58 - * @FilePath: \JT-DT-YD4N02A_RTT_MRS\bsp\inc\at_device_mb26.h + * @FilePath: \JT-DT-YD4N02A_RTT_MRS\bsp\inc\at_device_ml307.h * @Description: * @ * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ -#ifndef __AT_DEVICE_MB26_H__ -#define __AT_DEVICE_MB26_H__ +#ifndef __AT_DEVICE_ML307_H__ +#define __AT_DEVICE_ML307_H__ #include #include #include "completion.h" - #define TCP_SERVER_URL ("47.94.169.135") // - #define TCP_SERVER_PORT ("7150") - -//#define TCP_SERVER_URL ("8.135.10.183 ") // -//#define TCP_SERVER_PORT ("35383") +/*测试地址*/ +#if 0 +#define TCP_SERVER_URL ("8.135.10.183 ") // +#define TCP_SERVER_PORT ("35383") +#endif #define AT_NSONMI_MODE_1 1 #define AT_NSONMI_MODE_2 2 @@ -43,25 +43,24 @@ #define AT_SEND_MSOSD_FLAG_400 ("0x400") #define AT_SEND_MSOSD_FLAG_DEFAULT AT_SEND_MSOSD_FLAG_100 -#define TCP_GET_SOCKET_STATUS ("AT+NSOSTATUS=%d") -#define TCP_SOCKET_CREAT ("AT+NSOCR=STREAM,6,%s") // port socket_port -#define TCP_CONNECT_CMD ("AT+NSOCO=%d,%s,%s") -#define TCP_READ_SET_CMD ("AT+NSORF=%d,%d") /* socket_id,length */ -#define TCP_SET_NSONMI ("AT+NSONMI=%d") -#define TCP_SEND_DATA ("AT+NSOSD=%d,%d,%s,%s") -#define TCP_CLOSE_SOCKET ("AT+NSOCL=%d") /* close socket_id */ +#define TCP_GET_SOCKET_STATUS ("AT+NSOSTATUS=%d") +#define TCP_CONNECT_CMD ("AT+MIPOPEN=%d,\"TCP\",\"%s\",%s") //AT+MIPOPEN=0,"TCP","120.27.12.119",2040 建立TCP连接 +#define TCP_CONNECT_STATE ("AT+MIPSTATE=%d")//AT+MIPSTATE=0 //查询指定连接的连接状态 +#define TCP_SEND_DATA ("AT+MIPSEND=%d,%d,\"%s\"") //第一个参数一般设为0,表示使用自动分配的 +#define TCP_CLOSE_SOCKET ("AT+MIPCLOSE=%d") /* close socket_id */ -#define AT_DEVICE_MB26_SOCKETS_NUM 5 -/* The maximum number of sockets supported by the mb26 device */ +#define AT_DEVICE_ML307_SOCKETS_NUM 5 +/* The maximum number of sockets supported by the ml307 device */ -struct at_device_mb26 +struct at_device_ml307 { char *device_name; char *client_name; int pwr_en_pin; + int power_pin; int rst_pin; - int wkp_pin; + int power_status_pin; size_t recv_line_num; struct at_device device; @@ -82,13 +81,13 @@ typedef struct __attribute__((packed)) uint8_t rsrq; // RSRQ uint16_t pci; // PCI uint8_t snr; // SNR -} mb26_sys_info; +} ml307_sys_info; -extern mb26_sys_info mb26; -extern rt_uint8_t mb26_init_complate_flag; -extern struct rt_completion mb26_init_complate; +extern ml307_sys_info ml307; +extern rt_uint8_t ml307_init_complate_flag; +extern struct rt_completion ml307_init_complate; int at_send_data(struct at_device *device, const char *data, rt_size_t size); -rt_err_t Mb26_Reset(struct at_device *device); +rt_err_t Ml307_Reset(struct at_device *device); int Time_Calibration(struct at_device *device); -#endif /* __AT_DEVICE_MB26_H__ */ +#endif /* __AT_DEVICE_ML307_H__ */ diff --git a/bsp/inc/bsp_flash.h b/bsp/inc/bsp_flash.h index 88eaee4..78a06b1 100644 --- a/bsp/inc/bsp_flash.h +++ b/bsp/inc/bsp_flash.h @@ -224,14 +224,14 @@ typedef enum kSwVerId, kAlarmLValueId, kAlarmHValueId, - kNbUploadCycleId, - kNbRetryId, + kIotUploadCycleId, + kIotRetryId, kTempAlarmThresholdId, // 温度报警阈值 kEmagneticSwitchId, // 电磁阀功能开启 kRelaySwitchId, // 继电器功能开启 - kNbImeiId, - kNbImsiId, - kNbIccidId, + kIotImeiId, + kIotImsiId, + kIotIccidId, kCnt } TeFlashCfgInfoId; @@ -261,9 +261,9 @@ struct flash_sever_info extern struct flash_sever_info sever_info; void Flash_Write_Record(TeRecord record); -int Get_Nb_Imei(char *buf, rt_size_t len); -int Get_Nb_Imsi(char *buf, rt_size_t len); -int Get_Nb_Iccid(char *buf, rt_size_t len); +int Get_Iot_Imei(char *buf, rt_size_t len); +int Get_Iot_Imsi(char *buf, rt_size_t len); +int Get_Iot_Iccid(char *buf, rt_size_t len); rt_uint8_t Flash_GetNum_Records(TeRecord record); @@ -296,8 +296,8 @@ rt_uint8_t Flash_Sys_Cfg(TeFlashCfgInfoId id, rt_uint8_t *buf, rt_size_t len); size_t Flash_Get_SysCfg(TeFlashCfgInfoId id); int BSP_Flash_Write_Info(rt_uint8_t *buf, rt_size_t len); -int Flash_Get_Sever_Data(struct flash_sever_info *sever_info); -int Flash_Set_Sever_Data(rt_uint8_t *data); +int Flash_Get_Sever_Addr_Info(struct 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_led.h b/bsp/inc/bsp_led.h index 9cd23d9..716a33d 100644 --- a/bsp/inc/bsp_led.h +++ b/bsp/inc/bsp_led.h @@ -73,7 +73,7 @@ extern agile_led_t *led_y; LED_STOP(r); \ LED_STOP(g); \ LED_STOP(y); \ - LED_CTRL(g, "200,200", -1);\ + LED_CTRL(g, "100,2000", -1);\ LED_START(g);\ } while (0U) diff --git a/bsp/inc/bsp_mb26.h b/bsp/inc/bsp_ml307.h similarity index 65% rename from bsp/inc/bsp_mb26.h rename to bsp/inc/bsp_ml307.h index c5d7309..0091a14 100644 --- a/bsp/inc/bsp_mb26.h +++ b/bsp/inc/bsp_ml307.h @@ -3,30 +3,20 @@ * @Date: 2024-10-09 08:42:14 * @LastEditors: mbw && 1600520629@qq.com * @LastEditTime: 2024-10-17 09:26:13 - * @FilePath: \JT-DT-YD4N02A_RTT_MRS\bsp\inc\bsp_mb26.h + * @FilePath: \JT-DT-YD4N02A_RTT_MRS\bsp\inc\bsp_ml307.h * @Description: * @ * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ -/*** - * @Author: mbw - * @Date: 2024-10-09 08:42:14 - * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-10-16 09:03:41 - * @FilePath: \JT-DT-YD4N02A_RTT_MRS\bsp\inc\bsp_mb26.h - * @Description: - * @ - * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. - */ -#include +#include #include "drv_gpio.h" -#define MB26_PWR_EN_PIN GET_PIN(B, 3) -#define MB26_RST_PIN GET_PIN(A, 11) -#define MB26_WKP_PIN GET_PIN(C, 7) +#define ML307_ENABLE_3_8_V GET_PIN(A, 4) +#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 MB26_SAMPLE_DEIVCE_NAME "mb26" +#define ML307_SAMPLE_DEIVCE_NAME "ml307" /*默认参数*/ #define DEVICE_MANUFACTURE 0x4454 // DT @@ -44,7 +34,7 @@ #define DATA_SERIAL_NUM 0x0001 // 1 /*设备类型*/ -#define DEVICE_TYPE_MB26 0x20 +#define DEVICE_TYPE_ML307 0x20 /*事件类型*/ #define EVENT_TYPE_HEARTBEAT 0x30 // 心跳事件 #define EVENT_TYPE_SELF_CHECK 0x31 // 自检事件 @@ -84,39 +74,38 @@ #define MAX_DATA_LEN 256 // 数据长度 -#define MB26_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 { /****************优先级最低***************** */ - kMb26HeartbeatEvent, // 定时心跳事件 - kMb26SilenceEvent, // 消音事件 - kMb26ExceptionEvent, // 异常事件 - kMb26ValveStatusEvent, // 电磁阀状态改变事件 - kMb26FanStatusEvent, // 风机状态改变事件 - kMb26TempAnomalyEvent, // 产品工作温度异常事件 - kMb26AlarmEvent, // 报警事件 - kMb26AlarmRcyEvent, // 报警恢复事件 - kMb26FaultEvent, // 故障事件 - kMb26FaultRcyEvent, // 故障恢复事件 - kMb26DeviceFailureEvent, // 设备失效事件 - kMb26TimeCalibrationEvent, // 时间校准事件 -/**********************优先级第三************************* */ - kMb26SelfCheckEvent, // 自检事件 -/**********************优先级第二************************* */ - kMb26PowerDownEvent, // 掉电事件 -/**********************优先级第一************************* */ - kMb26PowerOnEvent, // 上电事件 + kMl307HeartbeatEvent, // 定时心跳事件 + kMl307SilenceEvent, // 消音事件 + kMl307ExceptionEvent, // 异常事件 + kMl307ValveStatusEvent, // 电磁阀状态改变事件 + kMl307FanStatusEvent, // 风机状态改变事件 + kMl307TempAnomalyEvent, // 产品工作温度异常事件 + kMl307AlarmEvent, // 报警事件 + kMl307AlarmRcyEvent, // 报警恢复事件 + kMl307FaultEvent, // 故障事件 + kMl307FaultRcyEvent, // 故障恢复事件 + kMl307DeviceFailureEvent, // 设备失效事件 + kMl307TimeCalibrationEvent, // 时间校准事件 + /**********************优先级第三************************* */ + kMl307SelfCheckEvent, // 自检事件 + /**********************优先级第二************************* */ + kMl307PowerDownEvent, // 掉电事件 + /**********************优先级第一************************* */ + kMl307PowerOnEvent, // 上电事件 - kMb26MaxEventcnt // 最大事件计数 -} Mb26Event; // 当前所处的事件类型 + kMl307MaxEventcnt // 最大事件计数 +} Ml307Event; // 当前所处的事件类型 typedef enum { @@ -128,14 +117,13 @@ typedef enum kSensorFaultStatus, // 传感器故障触发状态 kSensorRecoveredStatus, // 传感器故障解除状态 kPowerDownStatus, // 掉电状态 -} Mb26Status; // 当前所处的上报状态 +} Ml307Status; // 当前所处的上报状态 typedef struct { - Mb26Event current_event;//当前事件 - Mb26Event last_event;//上次事件 -}Mb26EventIndex; - + Ml307Event current_event; // 当前事件 + Ml307Event last_event; // 上次事件 +} Ml307EventIndex; struct __attribute__((packed)) DataBody { @@ -165,7 +153,7 @@ struct __attribute__((packed)) DataBody }; // 定义数据帧结构体 -struct __attribute__((packed)) Mb26DataFrame +struct __attribute__((packed)) Ml307DataFrame { uint8_t header[3]; // 帧头 uint8_t version; // 协议版本 @@ -178,15 +166,15 @@ struct __attribute__((packed)) Mb26DataFrame uint8_t tail[3]; // 帧尾 }; -struct __attribute__((packed)) Mb26Data +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)) Mb26RecvData +struct __attribute__((packed)) Ml307RecvData { rt_uint8_t header[3]; // 帧头 rt_uint8_t version; // 协议版本 @@ -194,26 +182,25 @@ struct __attribute__((packed)) Mb26RecvData rt_uint16_t datanumber; // 数据序列号 rt_uint8_t cmd; // 命令位 rt_uint16_t datalen; // 数据长度 - struct Mb26Data recv_data; // 接收数据体 + struct Ml307Data recv_data; // 接收数据体 rt_uint16_t crc16; // 校验位 rt_uint8_t tail[3]; // 帧尾 }; -struct Mb26_Ops +struct Ml307_Ops { struct DataBody *body; - struct Mb26DataFrame *frame; - struct Mb26RecvData *recv; - int (*init)(struct Mb26_Ops *ops, rt_uint8_t version); - int (*update_data)(struct Mb26_Ops *ops, rt_uint8_t device_type, rt_uint8_t cmd); - int (*send)(struct Mb26_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type); - int (*Resp)(struct Mb26_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 Mb26_Ops *ops, char *data); // 解析数据 + 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); // 解析数据 }; -extern struct Mb26_Ops mb26_ops; -extern rt_sem_t mb26_recv_sem; -extern rt_uint8_t mb26_conncet_tcp_flag; +extern struct Ml307_Ops ml307_ops; +extern rt_sem_t ml307_recv_sem; +extern rt_uint8_t ml307_conncet_tcp_flag; - -void Mb26_Send_Event(Mb26Event event_type); +void Ml307_Send_Event(Ml307Event event_type); diff --git a/bsp/src/at_device_mb26.c b/bsp/src/at_device_mb26.c deleted file mode 100644 index 5a2eb3e..0000000 --- a/bsp/src/at_device_mb26.c +++ /dev/null @@ -1,1594 +0,0 @@ -/* - * @Author : stark1898y 1658608470@qq.com - * @Date : 2024-09-04 13:33:49 - * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-11-29 16:27:04 - * @FilePath: \JT-DT-YD4N02A_RTT_MRS\bsp\src\at_device_mb26.c - * @Description : - * - * Copyright (c) 2024 by yzy, All Rights Reserved. - */ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-12-13 qiyongzhong first version - */ - -#include -#include -#include "bsp_flash.h" -#include -#include "bsp_mb26.h" -#include "user_sys.h" -#include "bsp_rtc.h" -#include "bsp_led.h" - -#define LOG_TAG "at.dev.mb26" -#include - -#include "pin.h" - -#if NB_MODULE_SWITCH == 1 - -#define MB26_POWER_OFF RT_FALSE -#define MB26_POWER_ON RT_TRUE -#define MB26_POWER_ON_TIME 3 -#define MB26_POWER_OFF_TIME 4 -#define AT_CLIENT_RECV_BUFF_LEN 512 -#define AT_DEFAULT_TIMEOUT 1000 -#ifdef AT_DEVICE_USING_MB26 -#define MB26_WAIT_CONNECT_TIME 5000 -#define MB26_THREAD_STACK_SIZE 4096 -#define MB26_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 2) -char data_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; - -mb26_sys_info mb26 = {0}; -struct rt_completion mb26_init_complate; -volatile rt_uint8_t socket_id = 0; - -static int mb26_power_on(struct at_device *device) -{ - struct at_device_mb26 *mb26 = RT_NULL; - - mb26 = (struct at_device_mb26 *)device->user_data; - mb26->power_status = RT_TRUE; - - /* not nead to set pin configuration for mb26 device power on */ - if (mb26->pwr_en_pin == -1) - { - return (RT_EOK); - } - rt_pin_write(mb26->rst_pin, PIN_LOW); - rt_thread_mdelay(10); - rt_pin_write(mb26->pwr_en_pin, PIN_HIGH); - - return (RT_EOK); -} - -static rt_err_t mb26_power_off(struct at_device *device) -{ - struct at_device_mb26 *mb26 = RT_NULL; - - mb26 = (struct at_device_mb26 *)device->user_data; - if (mb26->power_status != RT_FALSE) - { - rt_pin_mode(mb26->pwr_en_pin, PIN_MODE_OUTPUT); - rt_pin_write(mb26->pwr_en_pin, PIN_HIGH); - } -} - -rt_err_t Mb26_Reset(struct at_device *device) -{ - // at_client_send("AT+NRB\r\n", rt_strlen("AT+NRB\r\n")); - rt_pin_mode(MB26_RST_PIN, PIN_MODE_OUTPUT); - rt_pin_write(MB26_RST_PIN, PIN_LOW); - rt_thread_mdelay(10); - rt_pin_write(MB26_RST_PIN, PIN_HIGH); - rt_thread_mdelay(50); - rt_pin_write(MB26_RST_PIN, PIN_LOW); -} - -#ifdef TEST_ENABLE -void TEST_Mb26_Reset() -{ - Mb26_Reset(RT_NULL); -} -MSH_CMD_EXPORT(TEST_Mb26_Reset, "test_mb26_reset"); -#endif - -static int mb26_sleep(struct at_device *device) -{ - at_response_t resp = RT_NULL; - struct at_device_mb26 *mb26 = RT_NULL; - - mb26 = (struct at_device_mb26 *)device->user_data; - if (!mb26->power_status) // power off - { - return (RT_EOK); - } - if (mb26->sleep_status) // is sleep status - { - return (RT_EOK); - } - - resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); - if (resp == RT_NULL) - { - LOG_D("no memory for resp create."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - /* enable sleep mode */ - // Sleep1 - if (at_obj_exec_cmd(device->client, resp, "AT+ECPMUCFG=1,2") != RT_EOK) - - { - LOG_D("enable sleep fail.\"AT+ECPMUCFG=1,2\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - /* enable PSM mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+CPSMS=1,,,,\"00100010\"") != RT_EOK) - - { - LOG_D("enable sleep fail.\"AT+CPSMS=1,,,,\"00100010\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - mb26->sleep_status = RT_TRUE; - - at_delete_resp(resp); - return (RT_EOK); -} - -static int mb26_wakeup(struct at_device *device) -{ - at_response_t resp = RT_NULL; - struct at_device_mb26 *mb26 = RT_NULL; - - mb26 = (struct at_device_mb26 *)device->user_data; - if (!mb26->power_status) // power off - { - LOG_E("the power is off and the wake-up cannot be performed"); - return (-RT_ERROR); - } - if (!mb26->sleep_status) // no sleep status - { - return (RT_EOK); - } - - resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); - if (resp == RT_NULL) - { - LOG_D("no memory for resp create."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - if (mb26->wkp_pin != -1) - { - rt_pin_write(mb26->wkp_pin, PIN_LOW); - rt_thread_mdelay(100); - rt_pin_write(mb26->wkp_pin, PIN_HIGH); - rt_thread_mdelay(100); - rt_pin_write(mb26->wkp_pin, PIN_LOW); - } - - /* disable sleep mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+ECPMUCFG=1,0") != RT_EOK) - { - LOG_D("wake up fail. \"AT+ECPMUCFG=1,0\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - /* disable PSM mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+CPSMS=0") != RT_EOK) - { - LOG_D("wake up fail.\"AT+CPSMS=0\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - mb26->sleep_status = RT_FALSE; - - at_delete_resp(resp); - return (RT_EOK); -} - -static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size) -{ - int len = 0; - rt_uint16_t crc16 = 0; - rt_uint16_t rec_crc16 = 0; - char crc16_buf[6] = {0}; - rt_uint8_t recv_byte_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; - rt_memset(data_buf, 0, sizeof(data_buf)); - - if (sscanf(data, "+NSONMI:%*d,%d,%s", &len, data_buf) == 2) - { - HexStrToBytes(data_buf, recv_byte_buf, len * 2); - LOG_D("mb26 recv data: %s", data_buf); - crc16 = crc1021(data_buf, len * 2 - 10);//去掉帧尾三个字节和2个字节的校验值,字符长度为10 - - rt_strncpy(crc16_buf, data_buf + len * 2 - 10, 4); - LOG_D("mb26 crc16: %04s", crc16_buf); - rec_crc16 = strtol(crc16_buf, NULL, 16); - if (crc16 != rec_crc16)//看下数据接收的是否正确 - { - LOG_E("mb26 recv data error {crc16 [%x]!= rec_crc16[%x]}", crc16, rec_crc16); - } - else - { - /*比较数组的长度和结构体的长度是否一致,如果不一致则数据解析错误,如果一致复制数组值到结构体中*/ - if (len == sizeof(struct Mb26RecvData)) - { - rt_memset(mb26_ops.recv, 0, sizeof(struct Mb26RecvData)); // 清空结构体 - rt_memcpy(mb26_ops.recv, recv_byte_buf, sizeof(struct Mb26RecvData)); - - rt_sem_release(mb26_recv_sem); - } - else - { - LOG_E("mb26 recv data error {len [%d]!= sizeof(struct Mb26RecvData)[%d]}", len, sizeof(struct Mb26RecvData)); - } - } - - } -} - -static void urc_device_reset(struct at_client *client, const char *data, rt_size_t size) -{ - LOG_D("device reset"); - mb26_conncet_tcp_flag = 0; - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } -} - -static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_size_t size) -{ - size_t err_code = 0, id; - - if (sscanf(data, "+NSOCLI:%d,%d", &id, &err_code) == 2) - { - if ((id == socket_id) && (err_code == 107))//107错误一般是服务器没加这个IMEI - { - LOG_W("socket %d disconnect, error code: %d", id, err_code); - mb26_conncet_tcp_flag = 0; - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } - } - } -} - -static const struct at_urc urc_table[] = { - {"+NSONMI:", "\r\n", urc_tcp_recv}, - {"REBOOTING", "\r\n", urc_device_reset}, // 这个是软件复位时, - {"Lierda", "\r\n", urc_device_reset}, // 这个时硬件复位时回复 - {"+NSOCLI:", "\r\n", urc_tcp_disconnect}, // 这个时硬件复位时回复 -}; - -static void show_resp_info(at_response_t resp) -{ - RT_ASSERT(resp); - /* Print response line buffer */ - const char *line_buffer = RT_NULL; - - for (rt_size_t line_num = 1; line_num <= resp->line_counts; line_num++) - { - if ((line_buffer = at_resp_get_line(resp, line_num)) != RT_NULL) - LOG_I("line %d buffer : %s", line_num, line_buffer); - else - LOG_I("Parse line buffer error!"); - } - return; -} - -int at_device_mb26_disconnect_tcp(struct at_device *device) -{ -#define MB26_CLOSE_REP_TIME (5 * AT_DEFAULT_TIMEOUT) - - if (mb26_conncet_tcp_flag) - { - at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 0, MB26_CLOSE_REP_TIME); - if (resp == RT_NULL) - { - LOG_E("No memory for response structure!"); - at_delete_resp(resp); - return -RT_ENOMEM; - } - if (at_obj_exec_cmd(device->client, resp, TCP_CLOSE_SOCKET, socket_id) != RT_EOK) - { - at_delete_resp(resp); - return -RT_ERROR; - } - mb26_conncet_tcp_flag = 0; - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } - show_resp_info(resp); - at_delete_resp(resp); - } - return RT_EOK; -} - -int at_device_mb26_socket_creat(struct at_device *device) -{ - rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kNbRetryId); - at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 4, AT_DEFAULT_TIMEOUT); - if (resp == RT_NULL) - { - LOG_E("No memory for response structure!"); - at_delete_resp(resp); - return -RT_ENOMEM; - } - while (retry--) - { - if (at_obj_exec_cmd(device->client, resp, TCP_SOCKET_CREAT, TCP_SERVER_PORT) == RT_EOK) - { - if (at_resp_parse_line_args(resp, 2, "%d", &socket_id) > 0) - { - LOG_D("mb26 create tcp socket:%d", socket_id); - at_delete_resp(resp); - return RT_EOK; - } - else - { - LOG_E("mb26 create tcp socket failed. retry %d", retry); - } - } - } - at_delete_resp(resp); - Mb26_Reset(device); - - return RT_ERROR; -} -static int at_device_mb26_connect_tcp(struct at_device *device) -{ - ASSERT(device); - rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kNbRetryId); - at_response_t resp = at_create_resp(64, 0, AT_DEFAULT_TIMEOUT); - if (resp == RT_NULL) - { - LOG_E("No memory for response structure!"); - at_delete_resp(resp); - return -RT_ENOMEM; - } - if (at_device_mb26_socket_creat(device) != RT_EOK) - { - LOG_E("mb26 connect to tcp server failed."); - at_delete_resp(resp); - return -RT_ERROR; - } - - /* read data from tcp server */ - if (at_obj_exec_cmd(device->client, resp, TCP_READ_SET_CMD, socket_id, AT_CLIENT_RECV_BUFF_LEN) != RT_EOK) - { - at_delete_resp(resp); - return RT_ERROR; - } - /* enable tcp notification */ - if (at_obj_exec_cmd(device->client, resp, TCP_SET_NSONMI, AT_NSONMI_MODE_DEFAULT) != RT_EOK) - { - at_delete_resp(resp); - return RT_ERROR; - } - if (Flash_Get_Sever_Data(&sever_info) != RT_EOK) - { - LOG_E("Get Sever Data Failed"); - at_delete_resp(resp); - return RT_ERROR; - } - - for (size_t i = 0; i < retry; i++) - { - // if (at_obj_exec_cmd(device->client, resp, TCP_CONNECT_CMD, socket_id, TCP_SERVER_URL, TCP_SERVER_PORT) == RT_EOK) - if (at_obj_exec_cmd(device->client, resp, TCP_CONNECT_CMD, socket_id, sever_info.server_url, sever_info.server_port) == RT_EOK) - { - if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL) - { - LOG_D("mb26 connect to tcp server success"); - mb26_conncet_tcp_flag = 1; - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_INTERNET; - } - at_delete_resp(resp); - return RT_EOK; - } - else - { - mb26_conncet_tcp_flag = 0; - - LOG_E("mb26 connect to tcp server failed."); - } - } - } - if ((SysControl.status == kNormalDetectionEvents)&&(mb26_conncet_tcp_flag == RESET)) - { - LED_G_NORMAL; - } - at_delete_resp(resp); - return RT_EOK; -} - -int at_send_data(struct at_device *device, const char *data, rt_size_t size) -{ -#define MB26_SEND_RESP_TIME (5000) - - rt_uint8_t retry = 0; - rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kNbRetryId); - LOG_D("max_retry_count:%d", max_retry_count); - at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN / 4, 0, MB26_SEND_RESP_TIME); - - if (resp == RT_NULL) - { - LOG_E("no memory for mb26 device(%s) response structure.", device->name); - at_delete_resp(resp); - return -RT_ERROR; - } - - while (retry < max_retry_count) - { - rt_thread_mdelay(1000); - if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, size, data, AT_SEND_MSOSD_FLAG_DEFAULT) == RT_EOK) - { - if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL) - { - 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++; - } - - // 重试失败,模组复位 - LOG_D("send data failed, reset at device"); - Mb26_Reset(device); - mb26_conncet_tcp_flag = 0; - if (SysControl.status == kNormalDetectionEvents) - { - LED_G_NORMAL; - } - - if (at_device_mb26_connect_tcp(device) != RT_EOK) - { - LOG_E("failed to reconnect TCP after reset, socket_id: %d", socket_id); - at_delete_resp(resp); - return -RT_ERROR; - } - - at_delete_resp(resp); - return -RT_ERROR; -} - -static int mb26_check_link_status(struct at_device *device) -{ - at_response_t resp = RT_NULL; - struct at_device_mb26 *mb26 = RT_NULL; - int result = -RT_ERROR; - - mb26 = (struct at_device_mb26 *)device->user_data; - if (!mb26->power_status) // power off - { - LOG_D("the power is off,power on device"); - device->class->device_ops->control(device, AT_DEVICE_CTRL_POWER_ON, RT_NULL);//开启设备 - } - if (mb26->sleep_status) // is sleep status - { - if (mb26->wkp_pin != -1) - { - rt_pin_write(mb26->wkp_pin, PIN_LOW); - rt_thread_mdelay(100); - rt_pin_write(mb26->wkp_pin, PIN_HIGH); - rt_thread_mdelay(100); - - rt_pin_write(mb26->wkp_pin, PIN_LOW); - } - } - - resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); - if (resp == RT_NULL) - { - LOG_D("no memory for resp create."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - result = -RT_ERROR; - 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) - { - result = RT_EOK; - } - } - } - - if (mb26->sleep_status) // is sleep status - { - if (at_obj_exec_cmd(device->client, resp, "AT+CPSMS=1,,,,\"00100010\"") != RT_EOK) - { - LOG_D("startup entry into sleep fail."); - } - } - - at_delete_resp(resp); - - return (result); -} - -/* ============================= mb26 network interface operations ============================= */ -/* set mb26 network interface device status and address information */ -static int mb26_netdev_set_info(struct netdev *netdev) -{ -#define MB26_INFO_RESP_SIZE 128 -#define MB26_INFO_RESP_TIMO rt_tick_from_millisecond(1000) - - int result = RT_EOK; - ip_addr_t addr; - at_response_t resp = RT_NULL; - struct at_device *device = RT_NULL; - - RT_ASSERT(netdev); - - device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); - if (device == RT_NULL) - { - LOG_E("get device(%s) failed.", netdev->name); - return -RT_ERROR; - } - - /* set network interface device status */ - netdev_low_level_set_status(netdev, RT_TRUE); - netdev_low_level_set_link_status(netdev, RT_TRUE); - netdev_low_level_set_dhcp_status(netdev, RT_TRUE); - - resp = at_create_resp(MB26_INFO_RESP_SIZE, 0, MB26_INFO_RESP_TIMO); - if (resp == RT_NULL) - { - LOG_E("no memory for resp create."); - at_delete_resp(resp); - result = -RT_ENOMEM; - goto __exit; - } - /* set network interface device dns server */ - { -#define DNS_ADDR_SIZE_MAX 16 - char dns_server1[DNS_ADDR_SIZE_MAX] = {0}, dns_server2[DNS_ADDR_SIZE_MAX] = {0}; - - /* send "AT+DNSSERVER?" commond to get DNS servers address */ - if (at_obj_exec_cmd(device->client, resp, "AT+DNSSERVER?") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - // LOG_HEX("resp", 16, resp->buf, resp->buf_len); - int a1 = at_resp_parse_line_args(resp, 2, "PrimaryIpv4Dns:%s", dns_server1); - int a2 = at_resp_parse_line_args(resp, 3, "SecondaryIpv4Dns:%s", dns_server2); - - /* parse response data "+QIDNSCFG: ,," */ - if (a1 <= 0 || a2 <= 0) - { - LOG_E("%s device prase \"AT+DNSSERVER?\" cmd error.", device->name); - result = -RT_ERROR; - goto __exit; - } - - LOG_D("%s device primary DNS server address: %s", device->name, dns_server1); - LOG_D("%s device secondary DNS server address: %s", device->name, dns_server2); - - inet_aton(dns_server1, &addr); - netdev_low_level_set_dns_server(netdev, 0, &addr); - - inet_aton(dns_server2, &addr); - netdev_low_level_set_dns_server(netdev, 1, &addr); - } -__exit: - if (resp) - { - at_delete_resp(resp); - } - - return result; -} - -/** - * @brief check mb26 network interface device status - * - * @param netdev: mb26 network interface device - */ -static void mb26_check_link_status_entry(void *parameter) -{ -#define MB26_LINK_DELAY_TIME (60 * RT_TICK_PER_SECOND) - -#define MB26_LINK_STATUS_OK 1 - - int link_status; - struct at_device *device = RT_NULL; - struct netdev *netdev = (struct netdev *)parameter; - - device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); - if (device == RT_NULL) - { - LOG_E("get device(%s) failed.", netdev->name); - return; - } - - while (1) - { - link_status = mb26_check_link_status(device); - if (link_status < 0) - { - rt_thread_mdelay(MB26_LINK_DELAY_TIME); - continue; - } - /* check the network interface device link status */ - if ((MB26_LINK_STATUS_OK == link_status) != netdev_is_link_up(netdev)) - { - netdev_low_level_set_link_status(netdev, (MB26_LINK_STATUS_OK == link_status)); - } - rt_thread_delay(MB26_LINK_DELAY_TIME); - } -} - -static int mb26_netdev_check_link_status(struct netdev *netdev) -{ -#define MB26_LINK_THREAD_TICK 20 -#define MB26_LINK_THREAD_STACK_SIZE (1024 + 512) -#define MB26_LINK_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX - 2) - - rt_thread_t tid; - char tname[RT_NAME_MAX] = {0}; - - RT_ASSERT(netdev); - - rt_snprintf(tname, RT_NAME_MAX, "%s", netdev->name); - - /* create mb26 link status polling thread */ - tid = rt_thread_create(tname, mb26_check_link_status_entry, (void *)netdev, - MB26_LINK_THREAD_STACK_SIZE, MB26_LINK_THREAD_PRIORITY, MB26_LINK_THREAD_TICK); - if (tid != RT_NULL) - { - rt_thread_startup(tid); - } - - return RT_EOK; -} - -static int mb26_net_init(struct at_device *device); - -static int mb26_netdev_set_up(struct netdev *netdev) -{ - struct at_device *device = RT_NULL; - - device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); - if (device == RT_NULL) - { - LOG_E("get device(%s) failed.", netdev->name); - return -RT_ERROR; - } - - if (device->is_init == RT_FALSE) - { - mb26_net_init(device); - device->is_init = RT_TRUE; - - netdev_low_level_set_status(netdev, RT_TRUE); - LOG_D("network interface device(%s) set up status.", netdev->name); - } - - return RT_EOK; -} - -static int mb26_netdev_set_down(struct netdev *netdev) -{ - struct at_device *device = RT_NULL; - - device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); - if (device == RT_NULL) - { - LOG_E("get device(%s) failed.", netdev->name); - return -RT_ERROR; - } - - if (device->is_init == RT_TRUE) - { - mb26_power_off(device); - device->is_init = RT_FALSE; - - netdev_low_level_set_status(netdev, RT_FALSE); - LOG_D("network interface device(%s) set down status.", netdev->name); - } - - return RT_EOK; -} - -static int mb26_netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, ip_addr_t *dns_server) -{ -#define MB26_DNS_RESP_LEN 64 -#define MB26_DNS_RESP_TIMEO rt_tick_from_millisecond(300) - - int result = RT_EOK; - at_response_t resp = RT_NULL; - struct at_device *device = RT_NULL; - - RT_ASSERT(netdev); - RT_ASSERT(dns_server); - - device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); - if (device == RT_NULL) - { - LOG_E("get device(%s) failed.", netdev->name); - return -RT_ERROR; - } - - resp = at_create_resp(MB26_DNS_RESP_LEN, 0, MB26_DNS_RESP_TIMEO); - if (resp == RT_NULL) - { - LOG_D("no memory for resp create."); - at_delete_resp(resp); - result = -RT_ENOMEM; - goto __exit; - } - - /* send "AT+QIDNSCFG=[,]" commond to set dns servers */ - if (at_obj_exec_cmd(device->client, resp, "AT+QIDNSCFG=%d,%s", - dns_num, inet_ntoa(*dns_server)) != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - - netdev_low_level_set_dns_server(netdev, dns_num, dns_server); - -__exit: - if (resp) - { - at_delete_resp(resp); - } - - return result; -} - -#ifdef NETDEV_USING_PING -static int mb26_netdev_ping(struct netdev *netdev, const char *host, size_t data_len, - uint32_t timeout, struct netdev_ping_resp *ping_resp -#if RT_VER_NUM >= 0x50100 - , - rt_bool_t is_bind -#endif -) -{ -#define MB26_PING_RESP_SIZE 128 -#define MB26_PING_IP_SIZE 16 -#define MB26_PING_TIMEO (MB26_CON_REP_TIME) - - rt_err_t result = RT_EOK; - int response = -1, recv_data_len, ping_time, ttl; - char ip_addr[MB26_PING_IP_SIZE] = {0}; - at_response_t resp = RT_NULL; - struct at_device *device = RT_NULL; - -#if RT_VER_NUM >= 0x50100 - RT_UNUSED(is_bind); -#endif - - RT_ASSERT(netdev); - RT_ASSERT(host); - RT_ASSERT(ping_resp); - - device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); - if (device == RT_NULL) - { - LOG_E("get device(%s) failed.", netdev->name); - return -RT_ERROR; - } - - resp = at_create_resp(MB26_PING_RESP_SIZE, 4, MB26_PING_TIMEO); - if (resp == RT_NULL) - { - LOG_E("no memory for resp create"); - at_delete_resp(resp); - return -RT_ENOMEM; - } - - /* send "AT+QPING=""[,[][,]]" commond to send ping request */ - if (at_obj_exec_cmd(device->client, resp, "AT+QPING=1,\"%s\",%d,1", host, timeout / RT_TICK_PER_SECOND) < 0) - { - result = -RT_ERROR; - goto __exit; - } - - at_resp_parse_line_args_by_kw(resp, "+QPING:", "+QPING:%d", &response); - /* Received the ping response from the server */ - if (response == 0) - { - if (at_resp_parse_line_args_by_kw(resp, "+QPING:", "+QPING:%d,\"%[^\"]\",%d,%d,%d", - &response, ip_addr, &recv_data_len, &ping_time, &ttl) <= 0) - { - result = -RT_ERROR; - goto __exit; - } - } - - /* prase response number */ - switch (response) - { - case 0: - inet_aton(ip_addr, &(ping_resp->ip_addr)); - ping_resp->data_len = recv_data_len; - ping_resp->ticks = ping_time; - ping_resp->ttl = ttl; - result = RT_EOK; - break; - case 569: - result = -RT_ETIMEOUT; - break; - default: - result = -RT_ERROR; - break; - } - -__exit: - if (resp) - { - at_delete_resp(resp); - } - - return result; -} -#endif /* NETDEV_USING_PING */ - -const struct netdev_ops mb26_netdev_ops = - { - mb26_netdev_set_up, - mb26_netdev_set_down, - - RT_NULL, - mb26_netdev_set_dns_server, - RT_NULL, - -#ifdef NETDEV_USING_PING - mb26_netdev_ping, -#endif - RT_NULL, -}; - -static struct netdev *mb26_netdev_add(const char *netdev_name) -{ -#define ETHERNET_MTU 1380 -#define HWADDR_LEN 8 - struct netdev *netdev = RT_NULL; - - netdev = netdev_get_by_name(netdev_name); - if (netdev != RT_NULL) - { - return (netdev); - } - - netdev = (struct netdev *)rt_calloc(1, sizeof(struct netdev)); - if (netdev == RT_NULL) - { - LOG_E("no memory for netdev create."); - return RT_NULL; - } - - netdev->mtu = ETHERNET_MTU; - netdev->ops = &mb26_netdev_ops; - netdev->hwaddr_len = HWADDR_LEN; - -#ifdef SAL_USING_AT - extern int sal_at_netdev_set_pf_info(struct netdev * netdev); - /* set the network interface socket/netdb operations */ - sal_at_netdev_set_pf_info(netdev); -#endif - - netdev_register(netdev, netdev_name, RT_NULL); - - return netdev; -} - -/* ============================= mb26 device operations ============================= */ - -/* initialize for mb26 */ -static void mb26_init_thread_entry(void *parameter) -{ -#define INIT_RETRY 5 -#define CPIN_RETRY 5 -#define CSQ_RETRY 20 -#define CEREG_RETRY 50 -#define IPADDR_RETRY 10 - - int i; - rt_uint8_t retry_num = INIT_RETRY; - rt_err_t result = RT_EOK; - at_response_t resp = RT_NULL; - struct at_device *device = (struct at_device *)parameter; - struct at_client *client = device->client; - - resp = at_create_resp(128, 0, rt_tick_from_millisecond(300)); - if (resp == RT_NULL) - { - LOG_E("no memory for resp create."); - at_delete_resp(resp); - return; - } - - LOG_D("start init %s device.", device->name); - - while (retry_num--) - { - /* power on the mb26 device */ - mb26_power_on(device); - rt_thread_mdelay(1000); - - /* wait mb26 startup finish, send AT every 500ms, if receive OK, SYNC success*/ - if (at_client_obj_wait_connect(client, MB26_WAIT_CONNECT_TIME)) - { - result = -RT_ETIMEOUT; - goto __exit; - } - - /* disable echo */ - if (at_obj_exec_cmd(device->client, resp, "ATE0") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - - /* disable sleep mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+ECPMUCFG=1,0") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - - /* disable eDRX mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+CEDRXS=0") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - - /* disable PSM mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+CPSMS=0") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - - /* Get the baudrate */ - if (at_obj_exec_cmd(device->client, resp, "AT+IPR?") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - at_resp_parse_line_args_by_kw(resp, "+IPR:", "+IPR: %d", &i); - LOG_D("%s device baudrate %d", device->name, i); - - /* get module version */ - if (at_obj_exec_cmd(device->client, resp, "AT+CGMR") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - for (i = 0; i < (int)resp->line_counts - 1; i++) - { - LOG_D("%s", at_resp_get_line(resp, i + 1)); - } - /* set network interface device hardware address(IMEI) */ - { -#define MB26_NETDEV_HWADDR_LEN 8 -#define MB26_IMEI_LEN 15 - - char imei[MB26_IMEI_LEN] = {0}; - // int i = 0, j = 0; - - /* send "AT+GSN" commond to get device IMEI */ - if (at_obj_exec_cmd(device->client, resp, "AT+CGSN=1") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - - if (at_resp_parse_line_args_by_kw(resp, "+CGSN:", "+CGSN:%s", imei) <= 0) - { - LOG_E("%s device prase \"AT+CGSN=1\" cmd error.", device->name); - result = -RT_ERROR; - goto __exit; - } - - LOG_D("%s device IMEI number: %s", device->name, imei); - - rt_memcpy(mb26.imei, imei, MB26_IMEI_LEN); - Flash_Sys_Cfg(kNbImeiId, mb26.imei, MB26_IMEI_LEN); - // netdev->hwaddr_len = MB26_NETDEV_HWADDR_LEN; - // /* get hardware address by IMEI */ - // for (i = 0, j = 0; i < MB26_NETDEV_HWADDR_LEN && j < MB26_IMEI_LEN; i++, j += 2) - // { - // if (j != MB26_IMEI_LEN - 1) - // { - // netdev->hwaddr[i] = (imei[j] - '0') * 10 + (imei[j + 1] - '0'); - // } - // else - // { - // netdev->hwaddr[i] = (imei[j] - '0'); - // } - // } - } - /* check SIM card */ - for (i = 0; i < CPIN_RETRY; i++) - { - - if (at_obj_exec_cmd(device->client, resp, "AT+CPIN?") == RT_EOK) - { - if (at_resp_get_line_by_kw(resp, "READY") != RT_NULL) - break; - } - rt_thread_mdelay(1000); - } - if (i == CPIN_RETRY) - { - LOG_E("%s device SIM card detection failed.", device->name); - result = -RT_ERROR; - goto __exit; - } - /*网络注册 */ - for (i = 0; i < CSQ_RETRY; i++) - { - - if (at_obj_exec_cmd(device->client, resp, "AT+CREG=3") == RT_EOK) - { - if (at_resp_get_line_by_kw(resp, "OK") > 0) - { - LOG_D("%s device network registration success.", device->name); - break; - } - } - rt_thread_mdelay(1000); - } - if (i == CSQ_RETRY) - { - LOG_D("%s device network registration failed.", device->name); - result = -RT_ERROR; - goto __exit; - } - /* set network interface device hardware iccid */ - { - -#define MB26_ICCID_LEN 20 - - char iccid[MB26_ICCID_LEN] = {0}; - - /* send "AT+ECICCID" commond to get device iccid */ - if (at_obj_exec_cmd(device->client, resp, "AT+ECICCID") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - if (at_resp_parse_line_args_by_kw(resp, "+ECICCID:", "+ECICCID:%s", iccid) <= 0) - { - LOG_E("%s device prase \"AT+ECICCID\" cmd error.", device->name); - result = -RT_ERROR; - goto __exit; - } - - LOG_D("%s device iccid number: %s", device->name, iccid); - - rt_memcpy(mb26.iccid, iccid, MB26_ICCID_LEN); - Flash_Sys_Cfg(kNbIccidId, mb26.iccid, MB26_ICCID_LEN); - } - - /* set network interface device hardware imsi */ - { - -#define MB26_IMSI_LEN 15 - - char imsi[MB26_IMSI_LEN] = {0}; - - /* send "AT+CIMI" commond to get device imsi */ - if (at_obj_exec_cmd(device->client, resp, "AT+CIMI") != RT_EOK) - { - result = -RT_ERROR; - goto __exit; - } - if (at_resp_parse_line_args_by_kw(resp, "46", "%s", imsi) <= 0) - { - LOG_E("%s device prase \"AT+CIMI\" cmd error.", device->name); - result = -RT_ERROR; - goto __exit; - } - - LOG_D("%s device imsi number: %s", device->name, imsi); - - rt_memcpy(mb26.imsi, imsi, MB26_IMSI_LEN); - Flash_Sys_Cfg(kNbImsiId, mb26.imsi, MB26_IMSI_LEN); - } - - /* check signal strength */ - for (i = 0; i < CSQ_RETRY; i++) - { - - if (at_obj_exec_cmd(device->client, resp, "AT+CSQ") == RT_EOK) - { - int signal_strength = 0, err_rate = 0; - - if (at_resp_parse_line_args_by_kw(resp, "+CSQ:", "+CSQ: %d,%d", &signal_strength, &err_rate) > 0) - { - if ((signal_strength != 99) && (signal_strength != 0)) - { - LOG_D("%s device signal strength: %d, channel bit err_rate: %d", - device->name, signal_strength, err_rate); - mb26.rssi = signal_strength; - break; - } - } - } - rt_thread_mdelay(1000); - } - if (i == CSQ_RETRY) - { - LOG_E("%s device signal strength check failed", device->name); - result = -RT_ERROR; - goto __exit; - } - - /* check the GPRS network is registered */ - for (i = 0; i < CEREG_RETRY; 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 == CEREG_RETRY) - { - LOG_E("%s device GPRS is register failed", device->name); - result = -RT_ERROR; - goto __exit; - } - - /* check the GPRS network IP address */ - for (i = 0; i < IPADDR_RETRY; i++) - { - - if (at_obj_exec_cmd(device->client, resp, "AT+CGPADDR=0") == RT_EOK) - { -#define IP_ADDR_SIZE_MAX 16 - char ipaddr[IP_ADDR_SIZE_MAX] = {0}; - - /* parse response data "+CGPADDR: 1," */ - if (at_resp_parse_line_args_by_kw(resp, "+CGPADDR:", "+CGPADDR: %*d,%s", ipaddr) > 0) - { - LOG_D("%s device IP address: %s", device->name, ipaddr); - break; - } - } - rt_thread_mdelay(1000); - } - if (i == IPADDR_RETRY) - { - LOG_E("%s device GPRS is get IP address failed", device->name); - result = -RT_ERROR; - goto __exit; - } - - /* initialize successfully */ - result = RT_EOK; - break; - - __exit: - if (result != RT_EOK) - { - /* power off the mb26 device */ - // mb26_power_off(device); - rt_thread_mdelay(1000); - - LOG_I("%s device initialize retry...", device->name); - } - } - - if (resp) - { - at_delete_resp(resp); - } - - if (result == RT_EOK) - { - /* set network interface device status and address information */ - mb26_netdev_set_info(device->netdev); - /* check and create link staus sync thread */ - mb26_netdev_check_link_status(device->netdev); - LOG_I("%s device network initialize success.", device->name); - rt_completion_done(&mb26_init_complate); // 通知初始化完成 - } - else - { - LOG_E("%s device network initialize failed(%d).", device->name, result); - } -} - -/* mb26 device network initialize */ -static int mb26_net_init(struct at_device *device) -{ -#ifdef AT_DEVICE_MB26_INIT_ASYN - rt_thread_t tid; - /* 初始化完成量对象 */ - rt_completion_init(&mb26_init_complate); - - tid = rt_thread_create("mb26_net", mb26_init_thread_entry, (void *)device, - MB26_THREAD_STACK_SIZE, MB26_THREAD_PRIORITY, 20); - if (tid) - { - rt_thread_startup(tid); - } - else - { - LOG_E("create %s device init thread failed.", device->name); - return -RT_ERROR; - } -#else - mb26_init_thread_entry(device); -#endif /* AT_DEVICE_MB26_INIT_ASYN */ - - return RT_EOK; -} - -// 去除字符串中的 \r 和 \n -void remove_crlf(char *str) -{ - char *p = str; - while (*p) - { - if (*p == '\r' || *p == '\n') - { - memmove(p, p + 1, strlen(p)); - } - else - { - p++; - } - } -} - -rt_err_t Mb26_Get_Signal_Info(struct at_device *device) -{ - -#define RETRY 20 - - rt_err_t result = RT_EOK; - at_response_t resp = RT_NULL; - rt_uint8_t i; - RT_ASSERT(device); - resp = at_create_resp(1024, 4, rt_tick_from_millisecond(2000)); - if (resp == RT_NULL) - { - LOG_E("no memory for resp create."); - at_delete_resp(resp); - return RT_ERROR; - } - /* 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; - - if (at_resp_parse_line_args_by_kw(resp, "+CSQ:", "+CSQ: %d,%d", &signal_strength, &err_rate) > 0) - { - if ((signal_strength != 99) && (signal_strength != 0)) - { - LOG_D("%s device signal strength: %d, channel bit err_rate: %d", - device->name, signal_strength, err_rate); - mb26.rssi = signal_strength; - break; - } - } - } - rt_thread_mdelay(1000); - } - if (i == RETRY) - { - LOG_E("%s device signal strength check failed", device->name); - result = -RT_ERROR; - } - /* check signal strength */ - - //+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, rsrq = 0; - - if (at_resp_parse_line_args_by_kw(resp, "+CESQ:", "+CESQ:%*[^,],%*[^,],%*[^,],%*[^,],%d,%d", &rsrq, &rsrp) > 0) - { - if ((rsrp < 97) && (rsrp > 0) && ((rsrq < 34) && (rsrq > 0))) - { - LOG_D("%s device signal rsrp: %d, rsrq: %d", - device->name, rsrp, rsrq); - mb26.rsrp = rsrp; - mb26.rsrq = rsrq; - break; - } - } - } - rt_thread_mdelay(1000); - } - if (i == RETRY) - { - 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) - { - mb26.pci = pci; - mb26.snr = snr; - LOG_D("pci:%d,snr:%d", mb26.pci, mb26.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; -} - -/* mb26 device network interface attach - * - set network interface device link status - */ -static int mb26_init(struct at_device *device) -{ - struct at_device_mb26 *mb26 = RT_NULL; - - RT_ASSERT(device); - - mb26 = (struct at_device_mb26 *)device->user_data; - mb26->power_status = RT_FALSE; // default power is off. - mb26->sleep_status = RT_FALSE; // default sleep is disabled. - - /* initialize AT client */ -#if RT_VER_NUM >= 0x50100 - at_client_init(mb26->client_name, mb26->recv_line_num, mb26->recv_line_num); -#else - at_client_init(mb26->client_name, mb26->recv_line_num); -#endif - - device->client = at_client_get(mb26->client_name); - if (device->client == RT_NULL) - { - LOG_E("get AT client(%s) failed.", mb26->client_name); - return -RT_ERROR; - } - - /* register URC data execution function */ - at_obj_set_urc_table(device->client, urc_table, sizeof(urc_table) / sizeof(urc_table[0])); - -#ifdef AT_USING_SOCKET - mb26_socket_init(device); -#endif - - /* add mb26 device to the netdev list */ - device->netdev = mb26_netdev_add(mb26->device_name); - if (device->netdev == RT_NULL) - { - LOG_E("add netdev(%s) failed.", mb26->device_name); - return -RT_ERROR; - } - - /* initialize mb26 pin configuration */ - if (mb26->pwr_en_pin != -1) - { - rt_pin_mode(mb26->pwr_en_pin, PIN_MODE_OUTPUT); - rt_pin_write(mb26->pwr_en_pin, PIN_LOW); - } - - /* initialize mb26 device network */ - return mb26_netdev_set_up(device->netdev); -} - -static int mb26_deinit(struct at_device *device) -{ - RT_ASSERT(device); - - return mb26_netdev_set_down(device->netdev); -} - -static int mb26_control(struct at_device *device, int cmd, void *arg) -{ - int result = -RT_ERROR; - - RT_ASSERT(device); - - switch (cmd) - { - case AT_DEVICE_CTRL_SLEEP: - result = mb26_sleep(device); - break; - case AT_DEVICE_CTRL_WAKEUP: - result = mb26_wakeup(device); - break; - case AT_DEVICE_CTRL_NET_CONN: - result = at_device_mb26_connect_tcp(device); - break; - case AT_DEVICE_CTRL_NET_DISCONN: - result = at_device_mb26_disconnect_tcp(device); // 直接删除Socket - break; - case AT_DEVICE_CTRL_GET_SIGNAL: - result = Mb26_Get_Signal_Info(device); - break; - case AT_DEVICE_CTRL_RESET: - result = Mb26_Reset(device); - break; - case AT_DEVICE_CTRL_POWER_ON: - result = mb26_power_on(device); - break; - case AT_DEVICE_CTRL_POWER_OFF: - result = mb26_power_off(device); - break; - case AT_DEVICE_CTRL_LOW_POWER: - case AT_DEVICE_CTRL_SET_WIFI_INFO: - case AT_DEVICE_CTRL_GET_GPS: - case AT_DEVICE_CTRL_GET_VER: - LOG_W("not support the control command(%d).", cmd); - break; - default: - LOG_E("input error control command(%d).", cmd); - break; - } - - return result; -} - -// 将本地时间转换为对应时区时间 -void Time_Zone_Conversion(TsRtcDateTime* timeInfo) -{ - // 根据时区差异进行转换,这里时区差为8小时,没有分钟差异。 - timeInfo -> hour += RT_LIBC_DEFAULT_TIMEZONE; //小时部分加8小时 - if (timeInfo -> hour >= 24) - { // 如果超过24小时,则天数加1,小时数减24。 - timeInfo -> day++; - timeInfo -> hour -= 24; - if (timeInfo -> day >365) - { - timeInfo -> year += 1; - } - } -} - -int Time_Calibration(struct at_device *device) -{ - at_response_t resp = RT_NULL; - RT_ASSERT(device); - resp = at_create_resp(64, 2, rt_tick_from_millisecond(2000)); - if (resp == RT_NULL) - { - LOG_E("no memory for resp create."); - at_delete_resp(resp); - return RT_ERROR; - } - if (at_obj_exec_cmd(device->client, resp, "AT+CCLK?") == RT_EOK) - { - TsRtcDateTime rtc_dt;;//网络时间 - int year, mounth, days, hous, min, sec; - /*+CCLK:24/11/12,06:08:19+32*/ - if (at_resp_parse_line_args_by_kw(resp, "+CCLK:", "+CCLK:%d/%d/%d,%d:%d:%d+32", &year, &mounth, &days, &hous, &min, &sec) > 0) - { - rtc_dt.year = (2000 + year); - rtc_dt.month = mounth; - rtc_dt.day = days; - rtc_dt.hour = hous;//此时为零区时间,需要转化为东八区 - rtc_dt.minute = min; - rtc_dt.second = sec; - Time_Zone_Conversion(&rtc_dt);//时区设置 - rtc_dt.week = RTC_GetWeek(rtc_dt.year, rtc_dt.month, rtc_dt.day); - RTC_SetTime(rtc_dt.year, rtc_dt.month, rtc_dt.day, - rtc_dt.hour, rtc_dt.minute, rtc_dt.second); //设置时间 - LOG_I("RTC时间: %04d-%02d-%02d %02d:%02d:%02d \n", - rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second); - at_delete_resp(resp); - return RT_EOK; - } - } - at_delete_resp(resp); - return RT_ERROR; -} - -const struct at_device_ops mb26_device_ops = - { - mb26_init, - mb26_deinit, - mb26_control, -}; - -static int mb26_device_class_register(void) -{ - struct at_device_class *class = RT_NULL; - - class = (struct at_device_class *)rt_calloc(1, sizeof(struct at_device_class)); - if (class == RT_NULL) - { - LOG_E("no memory for device class create."); - rt_free(class); - return -RT_ENOMEM; - } - class->device_ops = &mb26_device_ops; - - return at_device_class_register(class, AT_DEVICE_CLASS_MB26); -} -INIT_DEVICE_EXPORT(mb26_device_class_register); -#endif //! NB_MODULE_SWITCH - -#endif /* AT_DEVICE_USING_MB26 */ - diff --git a/bsp/src/at_device_ml307.c b/bsp/src/at_device_ml307.c new file mode 100644 index 0000000..20fd898 --- /dev/null +++ b/bsp/src/at_device_ml307.c @@ -0,0 +1,1715 @@ +/* + * @Author : stark1898y 1658608470@qq.com + * @Date : 2024-09-04 13:33:49 + * @LastEditors: mbw && 1600520629@qq.com + * @LastEditTime: 2024-12-03 08:38:36 + * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\at_device_ml307.c + * @Description : + * + * Copyright (c) 2024 by yzy, All Rights Reserved. + */ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-12-13 qiyongzhong first version + */ + +#include +#include +#include "bsp_flash.h" +#include +#include "bsp_ml307.h" +#include "user_sys.h" +#include "bsp_rtc.h" +#include "bsp_led.h" + +#define LOG_TAG "at.dev.ml307" +#include + +#include "pin.h" + +#if IOT_MODULE_SWITCH == 1 + +#define ML307_POWER_OFF RT_FALSE +#define ML307_POWER_ON RT_TRUE +#define ML307_POWER_ON_TIME 3 +#define ML307_POWER_OFF_TIME 4 +#define AT_CLIENT_RECV_BUFF_LEN 512 +#define AT_DEFAULT_TIMEOUT 1000 + +#ifdef AT_DEVICE_USING_ML307 +#define ML307_WAIT_CONNECT_TIME 5000 +#define ML307_THREAD_STACK_SIZE 2560 +#define ML307_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 2) +char data_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; + +ml307_sys_info ml307 = {0}; +struct rt_completion ml307_init_complate; +volatile rt_uint8_t socket_id = 0; + +static rt_bool_t ml307_get_power_state(struct at_device *device) +{ + struct at_device_ml307 *ml307 = RT_NULL; + + ml307 = (struct at_device_ml307 *)device->user_data; + + return (!rt_pin_read(ml307->power_status_pin)) ? ML307_POWER_ON : ML307_POWER_OFF; +} + +static rt_err_t ml307_power_on(struct at_device *device) +{ + struct at_device_ml307 *ml307 = RT_NULL; + + ml307 = (struct at_device_ml307 *)device->user_data; + + /* not nead to set pin configuration for ml307 device power on */ + if (ml307->power_pin == -1 || ml307->power_status_pin == -1) + { + return -1; + } + + if (ml307_get_power_state(device) == ML307_POWER_ON) + { + return RT_EOK; + } + + rt_pin_write(ml307->power_pin, PIN_HIGH); + rt_thread_mdelay(ML307_POWER_ON_TIME * RT_TICK_PER_SECOND); + rt_pin_write(ml307->power_pin, PIN_LOW); + + return RT_EOK; +} + +static rt_err_t ml307_power_off(struct at_device *device) +{ + struct at_device_ml307 *ml307 = RT_NULL; + + ml307 = (struct at_device_ml307 *)device->user_data; + do { + /* not nead to set pin configuration for ml307 device power on */ + if (ml307->power_pin == -1 || ml307->power_status_pin == -1) + { + return -1; + } + + if (ml307_get_power_state(device) == ML307_POWER_OFF) + { + return RT_EOK; + } + + rt_pin_write(ml307->power_pin, PIN_HIGH); + rt_thread_mdelay(ML307_POWER_OFF_TIME * RT_TICK_PER_SECOND); + rt_pin_write(ml307->power_pin, PIN_LOW); + rt_thread_mdelay(100); + } while (ml307_get_power_state(device) != ML307_POWER_OFF); + return RT_EOK; +} + +rt_err_t Ml307_Reset(struct at_device *device) +{ + at_client_send("AT+MREBOOT\r\n", rt_strlen("AT+MREBOOT\r\n")); + + // struct at_device_ml307 *ml307 = RT_NULL; + // ml307 = (struct at_device_ml307 *) device->user_data; + // do{ + /* not nead to set pin configuration for ml307 device power on */ + // if (ml307->power_status_pin == -1 || ml307->rst_pin == -1) + // { + // return; + // } + // if(ml307_get_power_state(device) == ML307_POWER_OFF) + // { + // return; + // } + // rt_pin_write(ml307->rst_pin, PIN_HIGH); + // rt_thread_mdelay(RT_TICK_PER_SECOND/2); + // rt_pin_write(ml307->rst_pin, PIN_LOW); + // rt_thread_mdelay(100); + // }while(ml307_get_power_state(device) != ML307_POWER_OFF); + + return RT_EOK; +} + +#ifdef TEST_ENABLE +void TEST_Ml307_Reset() +{ + Ml307_Reset(RT_NULL); +} +MSH_CMD_EXPORT(TEST_Ml307_Reset, "test_ml307_reset"); +#endif + +#if 0 +static int ml307_sleep(struct at_device *device) +{ + at_response_t resp = RT_NULL; + struct at_device_ml307 *ml307 = RT_NULL; + + ml307 = (struct at_device_ml307 *)device->user_data; + if (!ml307->power_status) // power off + { + return (RT_EOK); + } + if (ml307->sleep_status) // is sleep status + { + return (RT_EOK); + } + + resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); + if (resp == RT_NULL) + { + LOG_D("no memory for resp create."); + at_delete_resp(resp); + return (-RT_ERROR); + } + + /* enable sleep mode */ + // Sleep 轻度睡眠 + if (at_obj_exec_cmd(device->client, resp, "AAT+MLPMCFG=\"sleepmode\",1,1") != RT_EOK) + { + LOG_D("enable sleep set.\"AT+MLPMCFG=\"sleepmode\",1,1\" execute fail."); + at_delete_resp(resp); + return (-RT_ERROR); + } + /* enable PSM mode */ + if (at_obj_exec_cmd(device->client, resp, "AT+MLPMCFG=\"psind\",1") != RT_EOK)//启用(配置协议栈低功耗状态是否上报URC) + { + LOG_D("enable sleep URC.\"AAT+MLPMCFG=\"psind\",1\" execute fail."); + at_delete_resp(resp); + return (-RT_ERROR); + } + ml307->sleep_status = RT_TRUE; + at_delete_resp(resp); + return (RT_EOK); +} +#endif + +#if 0 +static int ml307_wakeup(struct at_device *device) +{ + at_response_t resp = RT_NULL; + struct at_device_ml307 *ml307 = RT_NULL; + + ml307 = (struct at_device_ml307 *)device->user_data; + if (!ml307->power_status) // power off + { + LOG_E("the power is off and the wake-up cannot be performed"); + return (-RT_ERROR); + } + if (!ml307->sleep_status) // no sleep status + { + return (RT_EOK); + } + + resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); + if (resp == RT_NULL) + { + LOG_D("no memory for resp create."); + at_delete_resp(resp); + return (-RT_ERROR); + } + + if (ml307->wkp_pin != -1) + { + rt_pin_write(ml307->wkp_pin, PIN_LOW); + rt_thread_mdelay(100); + rt_pin_write(ml307->wkp_pin, PIN_HIGH); + rt_thread_mdelay(100); + rt_pin_write(ml307->wkp_pin, PIN_LOW); + } + + /* disable sleep mode */ + if (at_obj_exec_cmd(device->client, resp, "AT+MLPMCFG=\"sleepmode\",0,1") != RT_EOK) + { + LOG_D("wake up fail. \"AT+MLPMCFG=\"sleepmode\",0,1\" execute fail."); + at_delete_resp(resp); + return (-RT_ERROR); + } + + ml307->sleep_status = RT_FALSE; + + at_delete_resp(resp); + return (RT_EOK); +} +#endif + +static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t size) +{ + rt_uint8_t id; + int len = 0; + rt_uint16_t crc16 = 0; + rt_uint16_t rec_crc16 = 0; + char crc16_buf[6] = {0}; + rt_uint8_t recv_byte_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; + rt_memset(data_buf, 0, sizeof(data_buf)); + /*+MIPURC: "rtcp",,,*/ + if (sscanf(data, "+MIPURC:\"rtcp\",%d,%d,%s", &id, &len, data_buf) == 3) + { + if (id == socket_id) + { + + HexStrToBytes(data_buf, recv_byte_buf, len * 2); + LOG_D("ml307 recv data: %s", data_buf); + crc16 = crc1021(data_buf, len * 2 - 10); // 去掉帧尾三个字节和2个字节的校验值,字符长度为10 + + rt_strncpy(crc16_buf, data_buf + len * 2 - 10, 4); + LOG_D("ml307 crc16: %04s", crc16_buf); + rec_crc16 = strtol(crc16_buf, NULL, 16); + if (crc16 != rec_crc16) // 看下数据接收的是否正确 + { + LOG_E("ml307 recv data error {crc16 [%x]!= rec_crc16[%x]}", crc16, rec_crc16); + } + // else + // { + // /*比较数组的长度和结构体的长度是否一致,如果不一致则数据解析错误,如果一致复制数组值到结构体中*/ + // if (len == sizeof(struct Ml307RecvData)) + // { + // rt_memset(ml307_ops.recv, 0, sizeof(struct Ml307RecvData)); // 清空结构体 + // rt_memcpy(ml307_ops.recv, recv_byte_buf, sizeof(struct Ml307RecvData)); + + // rt_sem_release(ml307_recv_sem); + // } + // else + // { + // LOG_E("ml307 recv data error {len [%d]!= sizeof(struct Ml307RecvData)[%d]}", len, sizeof(struct Ml307RecvData)); + // } + // } + } + } +} + +static void urc_device_reset(struct at_client *client, const char *data, rt_size_t size) +{ + LOG_D("device reset"); + ml307_conncet_tcp_flag = 0; + if (SysControl.status == kNormalDetectionEvents) + { + LED_G_NORMAL; + } +} + +static void urc_tcp_connect_state(struct at_client *client, const char *data, rt_size_t size) +{ + size_t err_code = 0, id; + + if (sscanf(data, "+MIPOPEN:%d,%d", &id, &err_code) == 2) + { + if ((id == socket_id) && (err_code == 0)) + { + LOG_D("ml307 connect to tcp server success"); + ml307_conncet_tcp_flag = 1; + if (SysControl.status == kNormalDetectionEvents) + { + LED_G_INTERNET; + } + } + } +} + + +static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_size_t size) +{ + size_t state = 0, id; + LOG_D("ml307 disconnect to tcp server"); + + if (sscanf(data, "+MIPURC: \"disconn\",%d,%d", &id, &state) == 2) + { + if (id == socket_id) + { + ml307_conncet_tcp_flag = 0; + if (SysControl.status == kNormalDetectionEvents) + { + LED_G_NORMAL; + } + switch (state) + { + case 1: + LOG_D("ml307 tcp server disconnect"); + break; + case 2: // 连接异常 + LOG_D("ml307 tcp server connect error"); + break; + case 3: // PDP去激活 + LOG_D("ml307 tcp server PDP deactivate"); + break; + default: + break; + } + } + } +} + +static const struct at_urc urc_table[] = { + // {"+NSONMI:", "\r\n", urc_tcp_recv}, + {"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}}; + +static void show_resp_info(at_response_t resp) +{ + RT_ASSERT(resp); + /* Print response line buffer */ + const char *line_buffer = RT_NULL; + + for (rt_size_t line_num = 1; line_num <= resp->line_counts; line_num++) + { + if ((line_buffer = at_resp_get_line(resp, line_num)) != RT_NULL) + LOG_I("line %d buffer : %s", line_num, line_buffer); + else + LOG_I("Parse line buffer error!"); + } + return; +} + +int at_device_ml307_disconnect_tcp(struct at_device *device) +{ +#define ML307_CLOSE_REP_TIME (5 * AT_DEFAULT_TIMEOUT) + + if (ml307_conncet_tcp_flag) + { + at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 0, ML307_CLOSE_REP_TIME); + if (resp == RT_NULL) + { + LOG_E("No memory for response structure!"); + at_delete_resp(resp); + return -RT_ENOMEM; + } + if (at_obj_exec_cmd(device->client, resp, TCP_CLOSE_SOCKET, socket_id) != RT_EOK) + { + at_delete_resp(resp); + return -RT_ERROR; + } + ml307_conncet_tcp_flag = 0; + if (SysControl.status == kNormalDetectionEvents) + { + LED_G_NORMAL; + } + show_resp_info(resp); + at_delete_resp(resp); + } + return RT_EOK; +} + +#if 0 + + +int at_device_ml307_socket_creat(struct at_device *device) +{ + rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); + at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 4, AT_DEFAULT_TIMEOUT); + if (resp == RT_NULL) + { + LOG_E("No memory for response structure!"); + at_delete_resp(resp); + return -RT_ENOMEM; + } + while (retry--) + { + if (at_obj_exec_cmd(device->client, resp, TCP_SOCKET_CREAT, TCP_SERVER_PORT) == RT_EOK) + { + if (at_resp_parse_line_args(resp, 2, "%d", &socket_id) > 0) + { + LOG_D("ml307 create tcp socket:%d", socket_id); + at_delete_resp(resp); + return RT_EOK; + } + else + { + LOG_E("ml307 create tcp socket failed. retry %d", retry); + } + } + } + at_delete_resp(resp); + Ml307_Reset(device); + + return RT_ERROR; +} +#endif // 0 + +static int at_device_ml307_connect_tcp(struct at_device *device) +{ + rt_err_t ret = RT_EOK; + ASSERT(device); + rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kIotRetryId); + at_response_t resp = at_create_resp(64, 2, 2000); + if (resp == RT_NULL) + { + LOG_E("No memory for response structure!"); + at_delete_resp(resp); + return -RT_ENOMEM; + } +#if 0 + if (at_device_ml307_socket_creat(device) != RT_EOK) + { + LOG_E("ml307 connect to tcp server failed."); + at_delete_resp(resp); + return -RT_ERROR; + } + + // /* read data from tcp server */ + // if (at_obj_exec_cmd(device->client, resp, TCP_READ_SET_CMD, socket_id, AT_CLIENT_RECV_BUFF_LEN) != RT_EOK) + // { + // at_delete_resp(resp); + // return RT_ERROR; + // } + + /* enable tcp notification */ + if (at_obj_exec_cmd(device->client, resp, TCP_SET_NSONMI, AT_NSONMI_MODE_DEFAULT) != RT_EOK) + { + at_delete_resp(resp); + return RT_ERROR; + } +#endif + if (Flash_Get_Sever_Addr_Info(&sever_info) != RT_EOK) + { + LOG_E("Get Sever Data Failed"); + at_delete_resp(resp); + return RT_ERROR; + } + // rt_uint16_t sever_port = strtol(sever_info.server_port, RT_NULL, 10); // 将字符串转为十进制 + LOG_D("sever_info.server_url:%s sever_info.server_port:%s", sever_info.server_url, sever_info.server_port); + for (size_t i = 0; i < retry; i++) + { + if (at_obj_exec_cmd(device->client, resp, TCP_CONNECT_CMD, socket_id, (char *)sever_info.server_url, (char *)sever_info.server_port) == RT_EOK) + { + if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL) + { + rt_thread_mdelay(2000); + if (ml307_conncet_tcp_flag == RT_TRUE) + { + LOG_D("ml307 connect to tcp server success"); + break; + } + } + else + { + ml307_conncet_tcp_flag = 0; + LOG_E("ml307 connect to tcp server failed."); + ret = -RT_ERROR; + } + } + rt_thread_mdelay(3000); + } + if ((SysControl.status == kNormalDetectionEvents) && (ml307_conncet_tcp_flag == RT_FALSE)) + { + LED_G_NORMAL; + } + at_delete_resp(resp); + return ret; +} + +int at_send_data(struct at_device *device, const char *data, rt_size_t size) +{ +#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); + + 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) + { + rt_thread_mdelay(1000); + if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, size, data) == RT_EOK) + { + if (at_resp_get_line_by_kw(resp, "OK") != RT_NULL) + { + 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++; + } + at_delete_resp(resp); + return -RT_ERROR; + } + else + { + LOG_D("not connected tcp sever!"); + return -RT_ERROR; + } +} + +static int ml307_check_link_status(struct at_device *device) +{ + at_response_t resp = RT_NULL; + // struct at_device_ml307 *ml307 = RT_NULL; + int result = -RT_ERROR; + int link_stat = 0; + + RT_ASSERT(device); + + // ml307 = (struct at_device_ml307 *)device->user_data; + + resp = at_create_resp(96, 0, rt_tick_from_millisecond(300)); + if (resp == RT_NULL) + { + LOG_E("no memory for resp create."); + return -RT_ERROR; + } + + // if (at_obj_exec_cmd(device->client, resp, "AT+MIPCALL?") < 0) // 建立模组应用层拨号连接 + // { + // result = -RT_ERROR; + // goto __exit; + // } + + // if (at_resp_parse_line_args_by_kw(resp, "+MIPCALL:", "+MIPCALL: %d,%*d,%*s", &link_stat) > 0) + // { + // if (link_stat == 1) + // { + // result = RT_EOK; + // } + // } + + if (at_obj_exec_cmd(device->client, resp, "AT+CGACT?") < 0) + { + result = -RT_ERROR; + goto __exit; + } + //+CGACT: 1,1 + if (at_resp_parse_line_args_by_kw(resp, "+CGACT:", "+CGACT: %d,%*d", &link_stat) > 0) + { + result = link_stat; + } + +__exit: + + if (resp) + { + at_delete_resp(resp); + } + + return (result); +} + +/* ============================= ml307 network interface operations ============================= */ +/* set ml307 network interface device status and address information */ +static int ml307_netdev_set_info(struct netdev *netdev) +{ +#define ML307_IMEI_RESP_SIZE 32 +#define ML307_IPADDR_RESP_SIZE 64 +#define ML307_DNS_RESP_SIZE 96 +#define ML307_INFO_RESP_TIMO rt_tick_from_millisecond(2000) +#define ML307_CONNECT_TIME rt_tick_from_millisecond(2000) + int result = RT_EOK; + ip_addr_t addr; + at_response_t resp = RT_NULL; + struct at_device *device = RT_NULL; + + RT_ASSERT(netdev); + + device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); + if (device == RT_NULL) + { + LOG_E("get device(%s) failed.", netdev->name); + return -RT_ERROR; + } + + /* set network interface device status */ + netdev_low_level_set_status(netdev, RT_TRUE); + netdev_low_level_set_link_status(netdev, RT_TRUE); + netdev_low_level_set_dhcp_status(netdev, RT_TRUE); + + resp = at_create_resp(ML307_IMEI_RESP_SIZE, 0, ML307_INFO_RESP_TIMO); + if (resp == RT_NULL) + { + LOG_E("no memory for resp create."); + result = -RT_ENOMEM; + goto __exit; + } + /* set network interface device IP address */ + { +#define IP_ADDR_SIZE_MAX 16 + char ipaddr[IP_ADDR_SIZE_MAX] = {0}; + + at_resp_set_info(resp, ML307_IPADDR_RESP_SIZE * 2, 2, ML307_INFO_RESP_TIMO); + + /* send "AT+CIFSR" commond to get IP address */ + if (at_obj_exec_cmd(device->client, resp, "AT+CGPADDR=1") < 0) + { + result = -RT_ERROR; + goto __exit; + } + + if (at_resp_parse_line_args_by_kw(resp, "+CGPADDR:", "+CGPADDR: %*d,\"%[^\"]", ipaddr) <= 0) + { + LOG_E("ml307 device(%s) prase \"AT+CGPADDR=1\" commands resposne data error!", device->name); + result = -RT_ERROR; + goto __exit; + } + + LOG_D("ml307 device(%s) IP address: %s", device->name, ipaddr); + + /* set network interface address information */ + inet_aton(ipaddr, &addr); + netdev_low_level_set_ipaddr(netdev, &addr); + } +#if 0 + /* set network interface device dns server */ + { +#define DNS_ADDR_SIZE_MAX 16 + char dns_server1[DNS_ADDR_SIZE_MAX] = {0}, dns_server2[DNS_ADDR_SIZE_MAX] = {0}; + char dns_str[DNS_ADDR_SIZE_MAX*3] = {0}; + + at_resp_set_info(resp, ML307_DNS_RESP_SIZE, 0, ML307_INFO_RESP_TIMO); + + /* send "AT+MDNSCFG=\"priority\",0" commond to set resolve IPV4 address priority */ + if (at_obj_exec_cmd(device->client, resp, "AT+MDNSCFG=\"priority\",0") < 0) + { + result = -RT_ERROR; + goto __exit; + } + /* send "AT+MDNSCFG=\"ip\"" commond to get DNS servers address */ + if (at_obj_exec_cmd(device->client, resp, "AT+MDNSCFG=\"ip\"") < 0) + { + result = -RT_ERROR; + goto __exit; + } + //+MDNSCFG: "ip","183.230.126.224",,"183.230.126.225" + if (at_resp_parse_line_args_by_kw(resp, "+MDNSCFG:", "+MDNSCFG: \"ip\",%s", dns_str) < 0) + { + result = -RT_ERROR; + goto __exit; + } + + const char *dns1_str = strstr(dns_str, "\""); + sscanf(dns1_str, "\"%[^\"]", dns_server1); + const char *dns2_str = strstr(dns_str, "\",\""); + sscanf(dns2_str, "\",\"%[^\"]", dns_server2); + + LOG_D("ml307 device(%s) primary DNS server address: %s", device->name, dns_server1); + LOG_D("ml307 device(%s) secondary DNS server address: %s", device->name, dns_server2); + + inet_aton(dns_server1, &addr); + netdev_low_level_set_dns_server(netdev, 0, &addr); + + inet_aton(dns_server2, &addr); + netdev_low_level_set_dns_server(netdev, 1, &addr); + } +#endif // +__exit: + if (resp) + { + at_delete_resp(resp); + } + + return result; +} + +/** + * @brief check ml307 network interface device status + * + * @param netdev: ml307 network interface device + */ +static void ml307_check_link_status_entry(void *parameter) +{ +#define ML307_LINK_DELAY_TIME (60 * RT_TICK_PER_SECOND) + +#define ML307_LINK_STATUS_OK 1 + + int link_status; + struct at_device *device = RT_NULL; + struct netdev *netdev = (struct netdev *)parameter; + + device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); + if (device == RT_NULL) + { + LOG_E("get device(%s) failed.", netdev->name); + return; + } + + while (1) + { + link_status = ml307_check_link_status(device); + if (link_status < 0) + { + rt_thread_mdelay(ML307_LINK_DELAY_TIME); + continue; + } + /* check the network interface device link status */ + if ((ML307_LINK_STATUS_OK == link_status) != netdev_is_link_up(netdev)) + { + netdev_low_level_set_link_status(netdev, (ML307_LINK_STATUS_OK == link_status)); + } + rt_thread_delay(ML307_LINK_DELAY_TIME); + } +} + +static int ml307_netdev_check_link_status(struct netdev *netdev) +{ +#define ML307_LINK_THREAD_TICK 20 +#define ML307_LINK_THREAD_STACK_SIZE (1024 + 512) +#define ML307_LINK_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX - 2) + + rt_thread_t tid; + char tname[RT_NAME_MAX] = {0}; + if (netdev == RT_NULL) + { + LOG_E("input network interface device is NULL.\n"); + return -RT_ERROR; + } + // RT_ASSERT(netdev); + + rt_snprintf(tname, RT_NAME_MAX, "%s", netdev->name); + + /* create ml307 link status polling thread */ + tid = rt_thread_create(tname, ml307_check_link_status_entry, (void *)netdev, + ML307_LINK_THREAD_STACK_SIZE, ML307_LINK_THREAD_PRIORITY, ML307_LINK_THREAD_TICK); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + + return RT_EOK; +} + +static int ml307_net_init(struct at_device *device); + +static int ml307_netdev_set_up(struct netdev *netdev) +{ + struct at_device *device = RT_NULL; + + device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); + if (device == RT_NULL) + { + LOG_E("get device(%s) failed.", netdev->name); + return -RT_ERROR; + } + + if (device->is_init == RT_FALSE) + { + ml307_net_init(device); + device->is_init = RT_TRUE; + + netdev_low_level_set_status(netdev, RT_TRUE); + LOG_D("network interface device(%s) set up status.", netdev->name); + } + + return RT_EOK; +} + +static int ml307_netdev_set_down(struct netdev *netdev) +{ + struct at_device *device = RT_NULL; + + device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); + if (device == RT_NULL) + { + LOG_E("get device(%s) failed.", netdev->name); + return -RT_ERROR; + } + + if (device->is_init == RT_TRUE) + { + ml307_power_off(device); + device->is_init = RT_FALSE; + + netdev_low_level_set_status(netdev, RT_FALSE); + LOG_D("network interface device(%s) set down status.", netdev->name); + } + + return RT_EOK; +} + +static int ml307_netdev_set_dns_server(struct netdev *netdev, uint8_t dns_num, ip_addr_t *dns_server) +{ +#define ML307_DNS_RESP_LEN 8 +#define ML307_DNS_RESP_TIMEO rt_tick_from_millisecond(300) + + int result = RT_EOK; + at_response_t resp = RT_NULL; + struct at_device *device = RT_NULL; + + RT_ASSERT(netdev); + RT_ASSERT(dns_server); + + device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); + if (device == RT_NULL) + { + LOG_E("get ml307 device by netdev name(%s) failed.", netdev->name); + return -RT_ERROR; + } + + resp = at_create_resp(ML307_DNS_RESP_LEN, 0, ML307_DNS_RESP_TIMEO); + if (resp == RT_NULL) + { + LOG_D("ml307 set dns server failed, no memory for response object."); + result = -RT_ENOMEM; + goto __exit; + } + + /* send "AT+CDNSCFG=[,]" commond to set dns servers */ + if (at_obj_exec_cmd(device->client, resp, "AT+MDNSCFG=\"%s\"", inet_ntoa(*dns_server)) < 0) + { + result = -RT_ERROR; + goto __exit; + } + + netdev_low_level_set_dns_server(netdev, dns_num, dns_server); + +__exit: + if (resp) + { + at_delete_resp(resp); + } + + return result; +} + +#ifdef NETDEV_USING_PING +static int ml307_netdev_ping(struct netdev *netdev, const char *host, size_t data_len, + uint32_t timeout, struct netdev_ping_resp *ping_resp +#if RT_VER_NUM >= 0x50100 + , + rt_bool_t is_bind +#endif +) +{ +#define ML307_PING_RESP_SIZE 128 +#define ML307_PING_IP_SIZE 16 +#define ML307_PING_TIMEO (ML307_CON_REP_TIME) + + rt_err_t result = RT_EOK; + int response = -1, recv_data_len, ping_time, ttl; + char ip_addr[ML307_PING_IP_SIZE] = {0}; + at_response_t resp = RT_NULL; + struct at_device *device = RT_NULL; + +#if RT_VER_NUM >= 0x50100 + RT_UNUSED(is_bind); +#endif + + RT_ASSERT(netdev); + RT_ASSERT(host); + RT_ASSERT(ping_resp); + + device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, netdev->name); + if (device == RT_NULL) + { + LOG_E("get device(%s) failed.", netdev->name); + return -RT_ERROR; + } + + resp = at_create_resp(ML307_PING_RESP_SIZE, 4, ML307_PING_TIMEO); + if (resp == RT_NULL) + { + LOG_E("no memory for resp create"); + at_delete_resp(resp); + return -RT_ENOMEM; + } + + /* send "AT+QPING=""[,[][,]]" commond to send ping request */ + if (at_obj_exec_cmd(device->client, resp, "AT+QPING=1,\"%s\",%d,1", host, timeout / RT_TICK_PER_SECOND) < 0) + { + result = -RT_ERROR; + goto __exit; + } + + at_resp_parse_line_args_by_kw(resp, "+QPING:", "+QPING:%d", &response); + /* Received the ping response from the server */ + if (response == 0) + { + if (at_resp_parse_line_args_by_kw(resp, "+QPING:", "+QPING:%d,\"%[^\"]\",%d,%d,%d", + &response, ip_addr, &recv_data_len, &ping_time, &ttl) <= 0) + { + result = -RT_ERROR; + goto __exit; + } + } + + /* prase response number */ + switch (response) + { + case 0: + inet_aton(ip_addr, &(ping_resp->ip_addr)); + ping_resp->data_len = recv_data_len; + ping_resp->ticks = ping_time; + ping_resp->ttl = ttl; + result = RT_EOK; + break; + case 569: + result = -RT_ETIMEOUT; + break; + default: + result = -RT_ERROR; + break; + } + +__exit: + if (resp) + { + at_delete_resp(resp); + } + + return result; +} +#endif /* NETDEV_USING_PING */ + +const struct netdev_ops ml307_netdev_ops = + { + ml307_netdev_set_up, + ml307_netdev_set_down, + + RT_NULL, + ml307_netdev_set_dns_server, + RT_NULL, + +#ifdef NETDEV_USING_PING + ml307_netdev_ping, +#endif + RT_NULL, +}; + +// 增加网卡设备 +static struct netdev *ml307_netdev_add(const char *netdev_name) +{ +#define ETHERNET_MTU 1380 +#define HWADDR_LEN 8 + struct netdev *netdev = RT_NULL; + + netdev = netdev_get_by_name(netdev_name); + if (netdev != RT_NULL) + { + return (netdev); + } + + netdev = (struct netdev *)rt_calloc(1, sizeof(struct netdev)); + if (netdev == RT_NULL) + { + LOG_E("no memory for netdev create."); + return RT_NULL; + } + + netdev->mtu = ETHERNET_MTU; + netdev->ops = &ml307_netdev_ops; + netdev->hwaddr_len = HWADDR_LEN; + +#ifdef SAL_USING_AT + extern int sal_at_netdev_set_pf_info(struct netdev * netdev); + /* set the network interface socket/netdb operations */ + sal_at_netdev_set_pf_info(netdev); +#endif + + netdev_register(netdev, netdev_name, RT_NULL); + + return netdev; +} + +/* ============================= ml307 device operations ============================= */ + +// #define AT_SEND_CMD(client, resp, resp_line, timeout, cmd) \ +// do { \ +// (resp) = at_resp_set_info((resp), 128, (resp_line), rt_tick_from_millisecond(timeout)); \ +// if (at_obj_exec_cmd((client), (resp), (cmd)) < 0) \ +// { \ +// result = -RT_ERROR; \ +// goto __exit; \ +// } \ +// } while(0) +/* initialize for ml307 */ +static void ml307_init_thread_entry(void *parameter) +{ +#define INIT_RETRY 5 +#define CPIN_RETRY 5 +#define CSQ_RETRY 20 +#define CEREG_RETRY 50 +#define IPADDR_RETRY 10 +#define ML307_AT_DEFAULT_TIMEOUT 1000 + int i; + rt_uint8_t retry_num = INIT_RETRY; + rt_err_t result = RT_EOK; + at_response_t resp = RT_NULL; + struct at_device *device = (struct at_device *)parameter; + struct at_client *client = device->client; + + resp = at_create_resp(128, 0, rt_tick_from_millisecond(ML307_AT_DEFAULT_TIMEOUT * 2)); + if (resp == RT_NULL) + { + LOG_E("no memory for resp create."); + at_delete_resp(resp); + return; + } + + LOG_D("start init %s device.", device->name); + ml307_power_off(device); + while (retry_num--) + { + /* power on the ml307 device */ + rt_thread_mdelay(500); + ml307_power_on(device); + rt_thread_mdelay(1000); + + /* wait ml307 startup finish, send AT every 500ms, if receive OK, SYNC success*/ + if (at_client_obj_wait_connect(client, ML307_WAIT_CONNECT_TIME)) + { + result = -RT_ETIMEOUT; + goto __exit; + } + + /* disable echo */ + if (at_obj_exec_cmd(device->client, resp, "ATE0") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + /* get module version */ + if (at_obj_exec_cmd(device->client, resp, "ATI") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + for (i = 0; i < (int)resp->line_counts - 1; i++) + { + LOG_D("%s", at_resp_get_line(resp, i + 1)); + } + /*disable sleep mode */ + if (at_obj_exec_cmd(device->client, resp, "AT+MLPMCFG=\"sleepmode\",0,1") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + /*设置心跳包*/ + if (at_obj_exec_cmd(device->client, resp, "AT+MIPTKA=0,1,120,60,1") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + { +#define ML307_NETDEV_HWADDR_LEN 8 +#define ML307_IMEI_LEN 15 + + char imei[ML307_IMEI_LEN] = {0}; + + /* send "AT+GSN" commond to get device IMEI */ + if (at_obj_exec_cmd(device->client, resp, "AT+GSN=1") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + if (at_resp_parse_line_args_by_kw(resp, "+GSN:", "+GSN:%s", imei) <= 0) + { + LOG_E("%s device prase \"AT+GSN=1\" cmd error.", device->name); + result = -RT_ERROR; + goto __exit; + } + LOG_D("%s device IMEI number: %s", device->name, imei); + rt_memcpy(ml307.imei, imei, ML307_IMEI_LEN); + Flash_Sys_Cfg(kIotImeiId, ml307.imei, ML307_IMEI_LEN); + } + /* check SIM card */ + for (i = 0; i < CPIN_RETRY; 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(1000); + } + if (i == CPIN_RETRY) + { + LOG_E("%s device SIM card detection failed.", device->name); + result = -RT_ERROR; + goto __exit; + } + // /*网络注册 */ + // for (i = 0; i < CSQ_RETRY; i++) + // { + // if (at_obj_exec_cmd(device->client, resp, "AT+CREG=1") == RT_EOK) + // { + // rt_uint8_t state; + // if (at_resp_parse_line_args_by_kw(resp, "+CREG:", "+CREG:%d", &state) > 0) + // { + // if (state == 1) + // { + // LOG_D("%s device network registration success.", device->name); + // /* code */ + // } + // else + // { + // LOG_E("%s device network registration failed.", device->name); + // result = -RT_ERROR; + // goto __exit; + // } + // } + // else + // { + // LOG_D("%s device prase \"AT+CREG=1\" cmd error.", device->name); + // result = -RT_ERROR; + // goto __exit; + // } + // } + // rt_thread_mdelay(1000); + // } + // if (i == CSQ_RETRY) + // { + // LOG_D("%s device network registration failed.", device->name); + // result = -RT_ERROR; + // goto __exit; + // } + /* set network interface device hardware iccid */ + { + +#define ML307_ICCID_LEN 20 + + char iccid[ML307_ICCID_LEN] = {0}; + + /* send "AT+ECICCID" commond to get device iccid */ + if (at_obj_exec_cmd(device->client, resp, "AT+MCCID") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + if (at_resp_parse_line_args_by_kw(resp, "+MCCID:", "+MCCID:%s", iccid) <= 0) + { + LOG_E("%s device prase \"AT+ECICCID\" cmd error.", device->name); + result = -RT_ERROR; + goto __exit; + } + + LOG_D("%s device iccid number: %s", device->name, iccid); + + rt_memcpy(ml307.iccid, iccid, ML307_ICCID_LEN); + Flash_Sys_Cfg(kIotIccidId, ml307.iccid, ML307_ICCID_LEN); + } + + /* set network interface device hardware imsi */ + { + +#define ML307_IMSI_LEN 15 + + char imsi[ML307_IMSI_LEN] = {0}; + + /* send "AT+CIMI" commond to get device imsi */ + if (at_obj_exec_cmd(device->client, resp, "AT+CIMI") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + if (at_resp_parse_line_args_by_kw(resp, "46", "%s", imsi) <= 0) + { + LOG_E("%s device prase \"AT+CIMI\" cmd error.", device->name); + result = -RT_ERROR; + goto __exit; + } + + LOG_D("%s device imsi number: %s", device->name, imsi); + + rt_memcpy(ml307.imsi, imsi, ML307_IMSI_LEN); + Flash_Sys_Cfg(kIotImsiId, ml307.imsi, ML307_IMSI_LEN); + } + + /* check signal strength */ + for (i = 0; i < CSQ_RETRY; i++) + { + + if (at_obj_exec_cmd(device->client, resp, "AT+CSQ") == RT_EOK) + { + int signal_strength = 0, err_rate = 0; + + if (at_resp_parse_line_args_by_kw(resp, "+CSQ:", "+CSQ: %d,%d", &signal_strength, &err_rate) > 0) + { + if ((signal_strength != 99) && (signal_strength != 0)) + { + LOG_D("%s device signal strength: %d, channel bit err_rate: %d", + device->name, signal_strength, err_rate); + ml307.rssi = signal_strength; + break; + } + } + } + rt_thread_mdelay(1000); + } + if (i == CSQ_RETRY) + { + LOG_E("%s device signal strength check failed", device->name); + result = -RT_ERROR; + goto __exit; + } + + /* check the GPRS network is registered */ + for (i = 0; i < CEREG_RETRY; 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 == CEREG_RETRY) + { + LOG_E("%s device GPRS is register failed", device->name); + result = -RT_ERROR; + goto __exit; + } + +#if defined(AT_DEBUG) + /* check the GPRS network IP address */ + for (i = 0; i < IPADDR_RETRY; i++) + { + if (at_obj_exec_cmd(client, resp, "AT+MIPCALL?") == RT_EOK) + { +#define IP_ADDR_SIZE_MAX 16 + char ipaddr_str[8 * IP_ADDR_SIZE_MAX] = {0}; + char ipaddr_v4[IP_ADDR_SIZE_MAX] = {0}; + char ipaddr_v6[4 * IP_ADDR_SIZE_MAX] = {0}; + + /* parse response data "+CGPADDR: 1," */ + if (at_resp_parse_line_args_by_kw(resp, "+MIPCALL:", "+MIPCALL: %*d,%*d,%s", ipaddr_str) > 0) + { + const char *ipaddr_v4_str = strstr(ipaddr_str, "\""); + sscanf(ipaddr_v4_str, "\"%[^\"]", ipaddr_v4); + const char *ipaddr_v6_str = strstr(ipaddr_str, "\",\""); + sscanf(ipaddr_v6_str, "\",\"%[^\"]", ipaddr_v6); + + LOG_D("%s device IP address: %s - %s", device->name, ipaddr_v4, ipaddr_v6); + break; + } + } + rt_thread_mdelay(1000); + } + if (i == IPADDR_RETRY) + { + LOG_E("%s device GPRS is get IP address failed", device->name); + result = -RT_ERROR; + goto __exit; + } +#endif + + /* initialize successfully */ + result = RT_EOK; + break; + + __exit: + if (result != RT_EOK) + { + /* power off the ml307 device */ + // ml307_power_off(device); + rt_thread_mdelay(1000); + + LOG_I("%s device initialize retry...", device->name); + } + } + + if (resp) + { + at_delete_resp(resp); + } + + if (result == RT_EOK) + { + /* set network interface device status and address information */ + ml307_netdev_set_info(device->netdev); + /* check and create link staus sync thread */ + ml307_netdev_check_link_status(device->netdev); + LOG_I("%s device network initialize success.", device->name); + rt_completion_done(&ml307_init_complate); // 通知初始化完成 + } + else + { + LOG_E("%s device network initialize failed(%d).", device->name, result); + } +} + +/* ml307 device network initialize */ +static int ml307_net_init(struct at_device *device) +{ +#ifdef AT_DEVICE_ML307_INIT_ASYN + rt_thread_t tid; + /* 初始化完成量对象 */ + rt_completion_init(&ml307_init_complate); + + tid = rt_thread_create("ml307_net", ml307_init_thread_entry, (void *)device, + ML307_THREAD_STACK_SIZE, ML307_THREAD_PRIORITY, 20); + if (tid) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create %s device init thread failed.", device->name); + return -RT_ERROR; + } +#else + ml307_init_thread_entry(device); +#endif /* AT_DEVICE_ML307_INIT_ASYN */ + + return RT_EOK; +} + +// 去除字符串中的 \r 和 \n +void remove_crlf(char *str) +{ + char *p = str; + while (*p) + { + if (*p == '\r' || *p == '\n') + { + memmove(p, p + 1, strlen(p)); + } + else + { + p++; + } + } +} + +rt_err_t Ml307_Get_Signal_Info(struct at_device *device) +{ + +#define RETRY 20 + + rt_err_t result = RT_EOK; + at_response_t resp = RT_NULL; + rt_uint8_t i; + RT_ASSERT(device); + resp = at_create_resp(1024, 4, rt_tick_from_millisecond(2000)); + if (resp == RT_NULL) + { + LOG_E("no memory for resp create."); + at_delete_resp(resp); + return RT_ERROR; + } + /* 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; + + if (at_resp_parse_line_args_by_kw(resp, "+CSQ:", "+CSQ: %d,%d", &signal_strength, &err_rate) > 0) + { + if ((signal_strength != 99) && (signal_strength != 0)) + { + LOG_D("%s device signal strength: %d, channel bit err_rate: %d", + device->name, signal_strength, err_rate); + ml307.rssi = signal_strength; + break; + } + } + } + rt_thread_mdelay(1000); + } + if (i == RETRY) + { + LOG_E("%s device signal strength check failed", device->name); + result = -RT_ERROR; + } + /* check signal strength */ + + //+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, rsrq = 0; + + if (at_resp_parse_line_args_by_kw(resp, "+CESQ:", "+CESQ:%*[^,],%*[^,],%*[^,],%*[^,],%d,%d", &rsrq, &rsrp) > 0) + { + if ((rsrp < 97) && (rsrp > 0) && ((rsrq < 34) && (rsrq > 0))) + { + LOG_D("%s device signal rsrp: %d, rsrq: %d", + device->name, rsrp, rsrq); + ml307.rsrp = rsrp; + ml307.rsrq = rsrq; + break; + } + } + } + rt_thread_mdelay(1000); + } + if (i == RETRY) + { + 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; +} + +/* ml307 device network interface attach + * - set network interface device link status + */ +static int ml307_init(struct at_device *device) +{ + RT_ASSERT(device); + + struct at_device_ml307 *ml307 = (struct at_device_ml307 *)device->user_data; + ml307->power_status = RT_FALSE; // default power is off. + ml307->sleep_status = RT_FALSE; // default sleep is disabled. + + rt_device_t serial = rt_device_find(ml307->client_name); + if (serial == RT_NULL) + { + LOG_E("device(%s) initialize failed, get AT client(%s) failed.", ml307->device_name, ml307->client_name); + return -RT_ERROR; + } + /* initialize AT client */ +#if RT_VER_NUM >= 0x50100 + at_client_init(ml307->client_name, ml307->recv_line_num, ml307->recv_line_num); +#else + at_client_init(ml307->client_name, ml307->recv_line_num); +#endif + + device->client = at_client_get(ml307->client_name); + if (device->client == RT_NULL) + { + LOG_E("get AT client(%s) failed.", ml307->client_name); + return -RT_ERROR; + } + + /* register URC data execution function */ + at_obj_set_urc_table(device->client, urc_table, sizeof(urc_table) / sizeof(urc_table[0])); + +#ifdef AT_USING_SOCKET + ml307_socket_init(device); +#endif + + /* add ml307 device to the netdev list */ + device->netdev = ml307_netdev_add(ml307->device_name); + if (device->netdev == RT_NULL) + { + LOG_E("add netdev(%s) failed.", ml307->device_name); + return -RT_ERROR; + } + /* initialize ml307 pin configuration */ + if (ml307->pwr_en_pin != -1) + { + rt_pin_mode(ml307->pwr_en_pin, PIN_MODE_OUTPUT); + rt_pin_write(ml307->pwr_en_pin, PIN_HIGH); // 打开3_8v供电 + } + if (ml307->power_pin != -1) + { + rt_pin_mode(ml307->power_pin, PIN_MODE_OUTPUT); + } + if (ml307->power_status_pin != -1) + { + rt_pin_mode(ml307->power_status_pin, PIN_MODE_INPUT_PULLUP); + } + /* initialize ml307 device network */ + return ml307_netdev_set_up(device->netdev); +} + +static int ml307_deinit(struct at_device *device) +{ + RT_ASSERT(device); + + return ml307_netdev_set_down(device->netdev); +} + +static int ml307_control(struct at_device *device, int cmd, void *arg) +{ + int result = -RT_ERROR; + + RT_ASSERT(device); + + switch (cmd) + { + case AT_DEVICE_CTRL_NET_CONN: + result = at_device_ml307_connect_tcp(device); + break; + case AT_DEVICE_CTRL_NET_DISCONN: + result = at_device_ml307_disconnect_tcp(device); // 直接删除Socket + break; + case AT_DEVICE_CTRL_GET_SIGNAL: + result = Ml307_Get_Signal_Info(device); + break; + case AT_DEVICE_CTRL_RESET: + result = Ml307_Reset(device); + break; + case AT_DEVICE_CTRL_POWER_ON: + result = ml307_power_on(device); + break; + case AT_DEVICE_CTRL_POWER_OFF: + result = ml307_power_off(device); + break; + case AT_DEVICE_CTRL_SLEEP: + // result = ml307_sleep(device); + // break; + case AT_DEVICE_CTRL_WAKEUP: + // result = ml307_wakeup(device); + // break; + case AT_DEVICE_CTRL_LOW_POWER: + case AT_DEVICE_CTRL_SET_WIFI_INFO: + case AT_DEVICE_CTRL_GET_GPS: + case AT_DEVICE_CTRL_GET_VER: + LOG_W("not support the control command(%d).", cmd); + break; + default: + LOG_E("input error control command(%d).", cmd); + break; + } + + return result; +} + +// 将本地时间转换为对应时区时间 +void Time_Zone_Conversion(TsRtcDateTime *timeInfo) +{ + // 根据时区差异进行转换,这里时区差为8小时,没有分钟差异。 + timeInfo->hour += RT_LIBC_DEFAULT_TIMEZONE; // 小时部分加8小时 + if (timeInfo->hour >= 24) + { // 如果超过24小时,则天数加1,小时数减24。 + timeInfo->day++; + timeInfo->hour -= 24; + if (timeInfo->day > 365) + { + timeInfo->year += 1; + } + } +} + +int Time_Calibration(struct at_device *device) +{ + at_response_t resp = RT_NULL; + RT_ASSERT(device); + resp = at_create_resp(64, 2, rt_tick_from_millisecond(2000)); + if (resp == RT_NULL) + { + LOG_E("no memory for resp create."); + at_delete_resp(resp); + return RT_ERROR; + } + if (at_obj_exec_cmd(device->client, resp, "AT+CCLK?") == RT_EOK) + { + TsRtcDateTime rtc_dt; + ; // 网络时间 + int year, mounth, days, hous, min, sec; + /*+CCLK:24/11/12,06:08:19+32*/ + if (at_resp_parse_line_args_by_kw(resp, "+CCLK:", "+CCLK:%d/%d/%d,%d:%d:%d+32", &year, &mounth, &days, &hous, &min, &sec) > 0) + { + rtc_dt.year = (2000 + year); + rtc_dt.month = mounth; + rtc_dt.day = days; + rtc_dt.hour = hous; // 此时为零区时间,需要转化为东八区 + rtc_dt.minute = min; + rtc_dt.second = sec; + Time_Zone_Conversion(&rtc_dt); // 时区设置 + rtc_dt.week = RTC_GetWeek(rtc_dt.year, rtc_dt.month, rtc_dt.day); + RTC_SetTime(rtc_dt.year, rtc_dt.month, rtc_dt.day, + rtc_dt.hour, rtc_dt.minute, rtc_dt.second); // 设置时间 + LOG_I("RTC时间: %04d-%02d-%02d %02d:%02d:%02d \n", + rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second); + at_delete_resp(resp); + return RT_EOK; + } + } + at_delete_resp(resp); + return RT_ERROR; +} + +const struct at_device_ops ml307_device_ops = + { + ml307_init, + ml307_deinit, + ml307_control, +}; + +static int ml307_device_class_register(void) +{ + struct at_device_class *class = RT_NULL; + + class = (struct at_device_class *)rt_calloc(1, sizeof(struct at_device_class)); + if (class == RT_NULL) + { + LOG_E("no memory for device class create."); + rt_free(class); + return -RT_ENOMEM; + } + class->device_ops = &ml307_device_ops; + + return at_device_class_register(class, AT_DEVICE_CLASS_ML307); +} +INIT_DEVICE_EXPORT(ml307_device_class_register); +#endif //! IOT_MODULE_SWITCH + +#endif /* AT_DEVICE_USING_ML307 */ diff --git a/bsp/src/bsp_adc.c b/bsp/src/bsp_adc.c index 5ef8e00..4e84541 100644 --- a/bsp/src/bsp_adc.c +++ b/bsp/src/bsp_adc.c @@ -90,7 +90,7 @@ int BSP_ADC_Init(void) ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 禁止外部边沿触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐 - ADC_InitStructure.ADC_NbrOfChannel = NUM_OF_CHANNEL; // 转换通道 (NUM_OF_CHANNEL) 个 + ADC_InitStructure.ADC_IotrOfChannel = NUM_OF_CHANNEL; // 转换通道 (NUM_OF_CHANNEL) 个 ADC_Init(USED_ADC, &ADC_InitStructure); // 设置指定ADC的规则组通道,设置它们的转化顺序和采样时间 diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c index 453b477..d38a28f 100644 --- a/bsp/src/bsp_flash.c +++ b/bsp/src/bsp_flash.c @@ -2,7 +2,7 @@ #include "lwutil.h" #include "bsp_rtc.h" #include "bsp_hr.h" - #include "at_device_mb26.h" + #include "at_device_ml307.h" #include #include @@ -18,13 +18,13 @@ extern int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *he : (id) == kAlarmLValueId ? (&(info)->alarm_l_value) \ : (id) == kAlarmHValueId ? (&(info)->alarm_h_value) \ : (id) == kTempAlarmThresholdId ? (&(info)->temp_alarm_threshold) \ - : (id) == kNbUploadCycleId ? (&(info)->nb_upload_cycle) \ - : (id) == kNbRetryId ? (&(info)->nb_retry) \ + : (id) == kIotUploadCycleId ? (&(info)->nb_upload_cycle) \ + : (id) == kIotRetryId ? (&(info)->nb_retry) \ : (id) == kEmagneticSwitchId ? (&(info)->emagnetic_switch) \ : (id) == kRelaySwitchId ? (&(info)->relay_switch) \ - : (id) == kNbImeiId ? ((info)->nb_imei) \ - : (id) == kNbImsiId ? ((info)->nb_imsi) \ - : (id) == kNbIccidId ? ((info)->nb_iccid) \ + : (id) == kIotImeiId ? ((info)->nb_imei) \ + : (id) == kIotImsiId ? ((info)->nb_imsi) \ + : (id) == kIotIccidId ? ((info)->nb_iccid) \ : NULL) TsTotalRecords TotalRecords; @@ -82,7 +82,7 @@ static rt_base_t interrupt_value; rt_uint8_t sys_hw_ver = 0x10; rt_uint8_t sys_sw_ver = 0x11; rt_uint8_t sys_nb_retry = 0x03; // 重试次数3次 -rt_uint16_t sys_nb_upload_cycle = 0x7800; // 120分钟一次 ,低位在前,高为在后,为了和服务器下发时保持一致,有利于读取 +rt_uint16_t sys_nb_upload_cycle = 0x0078; // 120分钟一次 rt_uint16_t sys_alarm_h_value = 0x0032; // 50 rt_uint16_t sys_alarm_l_value = 0x09C4; // 10 rt_uint8_t sys_temp_alarm_threshold = 0x32; @@ -91,8 +91,10 @@ rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能 struct flash_sever_info sever_info = { - .server_url = "47.94.169.135", - .server_port = "7150", + // .server_url = "47.94.169.135", + // .server_port = "7150", + .server_port = "34215", + .server_url = "8.135.10.183", }; @@ -150,7 +152,7 @@ static rt_size_t Flash_Read(rt_uint32_t addr, rt_uint8_t *buf, rt_size_t len) return read_len; } -int Get_Nb_Imei(char *buf, rt_size_t len) +int Get_Iot_Imei(char *buf, rt_size_t len) { if ((*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_IMEI_ADDR != 0x39)) { @@ -171,7 +173,7 @@ int Get_Nb_Imei(char *buf, rt_size_t len) } } -int Get_Nb_Imsi(char *buf, rt_size_t len) +int Get_Iot_Imsi(char *buf, rt_size_t len) { if ((*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_IMSI_ADDR != 0x39)) { @@ -192,7 +194,7 @@ int Get_Nb_Imsi(char *buf, rt_size_t len) } } -int Get_Nb_Iccid(char *buf, rt_size_t len) +int Get_Iot_Iccid(char *buf, rt_size_t len) { if ((*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0xE3)&&(*(rt_uint8_t *)FLASH_NB_ICCID_ADDR != 0x39)) { @@ -281,13 +283,13 @@ int Flash_Set_WorkDuration(rt_uint16_t value) return Flash_Write_ConfigInfo(page_buf); } -int Flash_Get_Sever_Data(struct flash_sever_info *sever_info) +int Flash_Get_Sever_Addr_Info(struct 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_Data failed"); + LOG_E("Flash_Get_Sever_Addr_Info failed"); return -RT_ERROR; } 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]); @@ -298,12 +300,12 @@ int Flash_Get_Sever_Data(struct flash_sever_info *sever_info) LOG_D("port_num = %d", port_num); rt_snprintf(sever_info->server_port, sizeof(sever_info->server_port), "%d", port_num); - LOG_D("server_url:%s, server_port:%s", sever_info->server_url, sever_info->server_port); + // LOG_D("server_url:%s, server_port:%s", sever_info->server_url, sever_info->server_port); return 0; } -int Flash_Set_Sever_Data(rt_uint8_t *data) +int Flash_Set_Sever_Addr_Info(rt_uint8_t *data) { rt_uint8_t page_buf[FLASH_PAGE_SIZE] = {0}; rt_uint8_t in_page_offset = (FLASH_SERVER_ADDR_ADDR - FLASH_CONFIG_INFO_START_ADDR); @@ -871,9 +873,9 @@ int BSP_Flash_Init(void) LOG_D("%02x", sever_data[i]); } - if(Flash_Set_Sever_Data(sever_data) <= 0) + if(Flash_Set_Sever_Addr_Info(sever_data) <= 0) { - LOG_D("Flash_Set_Sever_Data error!"); + LOG_D("Flash_Set_Sever_Addr_Info error!"); } Flash_Set_Calibration_State(kNotCalibrated);//未标定状态 diff --git a/bsp/src/bsp_hr.c b/bsp/src/bsp_hr.c index 0c3e98e..ed94cfa 100644 --- a/bsp/src/bsp_hr.c +++ b/bsp/src/bsp_hr.c @@ -12,7 +12,7 @@ #include "lwrb.h" #include "bsp_flash.h" #include "bsp_rtc.h" -#include "at_device_mb26.h" +#include "at_device_ml307.h" #include "user_sys.h" #include @@ -464,9 +464,9 @@ int Process_Factor_Cmd(const char *rx_buff, size_t length) } rt_uint32_t cnt = (rt_uint32_t)((time_buf[2]<<16)| (time_buf[1] << 8)|time_buf[0]); LOG_D("time_buf[2] = %02x time_buf[1] = %02x time_buf[0] = %02x cnt = %04d", time_buf[2], time_buf[1], time_buf[0], cnt); - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - Get_Nb_Imsi(imsi, FLASH_NB_IMSI_LEN); - Get_Nb_Iccid(iccid, FLASH_NB_ICCID_LEN); + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + Get_Iot_Imsi(imsi, FLASH_NB_IMSI_LEN); + Get_Iot_Iccid(iccid, FLASH_NB_ICCID_LEN); rt_sprintf(buf, "\r\n[ID :YD4N02/%02d%02d%02d%04d]\r\n" "[IMEI:%s]\r\n" diff --git a/bsp/src/bsp_mb26.c b/bsp/src/bsp_mb26.c deleted file mode 100644 index 9250349..0000000 --- a/bsp/src/bsp_mb26.c +++ /dev/null @@ -1,1616 +0,0 @@ -/* - * @Author: mbw - * @Date: 2024-11-30 15:46:21 - * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-11-30 16:34:14 - * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_mb26.c - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. - */ -#include -#include "drv_gpio.h" -#include "bsp_mb26.h" -#include "user_sys.h" -#include "bsp_flash.h" -#include "stddef.h" -#include "bsp_rtc.h" - -#define LOG_TAG "mb26" -#include - -#if NB_MODULE_SWITCH == 1 -#define MB26_THREAD_STACK_SIZE (4096) -#define MB26_RECV_THREAD_STACK_SIZE (4096) -#define MB26_LIFE_THREAD_STACK_SIZE (1024) -#define MB26_THREAD_PRIORITY 25 -#define MB26_THREAD_TICKS 50 -#define MB26_RECV_THREAD_PRIORITY 24 -#define MB26_RECV_THREAD_TICKS 10 - -#define MB26_LIFE_THREAD_PRIORITY 26 -#define MB26_LIFE_THREAD_TICKS 10 - -// static rt_uint32_t mb26_status = 0; -ALIGN(RT_ALIGN_SIZE) -static char mb26_thread_stack[MB26_THREAD_STACK_SIZE]; -static struct rt_thread mb26_thread; - -ALIGN(RT_ALIGN_SIZE) -static char mb26_recv_thread_stack[MB26_RECV_THREAD_STACK_SIZE]; -static struct rt_thread mb26_recv_thread; - -ALIGN(RT_ALIGN_SIZE) -static char mb26_life_thread_stack[MB26_LIFE_THREAD_STACK_SIZE]; -static struct rt_thread mb26_life_thread; - -struct rt_event at_device_event; -rt_sem_t mb26_recv_sem; -rt_sem_t mb26_life_sem; -static rt_timer_t mb26_timer; // 上报心跳 -static rt_timer_t mb26_upload_timer; // 更新本地时间定时器 -static rt_timer_t mb26_power_error_timer; // 上电失败情况下启动定时器 -/*生命周期窗口定时器,用于管理tcp连接的断开*/ -static rt_timer_t mb26_life_timer; -static rt_timer_t mb26_heartbeat_check_timer; // 用于检测定时器是否工作 -rt_uint8_t mb26_conncet_tcp_flag; -Mb26EventIndex mb26_event_index; - -rt_uint8_t power_on_send_flag = 0; -rt_mutex_t mb26_mutex; -int BSP_Mb26_Init(struct Mb26_Ops *ops, rt_uint8_t version); -int BSP_Mb26_Update(struct Mb26_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type); -int Mb26_Send_Data(struct Mb26_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type); -int Data_Resp(struct Mb26_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 Mb26_Recv_Data(struct Mb26_Ops *ops, char *data); - -static struct DataBody body; -static struct Mb26DataFrame frame; -static struct Mb26RecvData mb26_recv; - -struct Mb26_Ops mb26_ops = { - .body = &body, - .frame = &frame, - .recv = &mb26_recv, - .init = BSP_Mb26_Init, - .update_data = BSP_Mb26_Update, - .send = Mb26_Send_Data, - .Resp = Data_Resp, - // .Recv = Mb26_Recv_Data,//,没用到 -}; - -static struct at_device_mb26 _dev = - { - MB26_SAMPLE_DEIVCE_NAME, - MB26_SAMPLE_CLIENT_NAME, - - MB26_PWR_EN_PIN, - MB26_RST_PIN, - MB26_WKP_PIN, - - MB26_SAMPLE_RECV_BUFF_LEN, -}; - -static rt_uint32_t mb26_event_flags[kMb26MaxEventcnt] = {0}; -static rt_bool_t mb26_event_initialized = RT_FALSE; // 是否初始化完成 - -typedef enum -{ - - MB26_PRIORITY_LOWEST, // 4、优先级最低(定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除) - MB26_PRIORITY_MEDIUM, // 2、优先级第三高 自检触发 - MB26_PRIORITY_HIGH, // 1、优先级第二高 掉电 - MB26_PRIORITY_HIGHEST, // 0 优先级最高(设备上电时的定时心跳) -} Mb26Priority; - -typedef struct -{ - Mb26Event event_flag; - Mb26Priority priority; - const char *event_name; - int (*send_func)(struct at_device *device, void *param); -} Mb26EventInfo; - -static void Mb26_Set_Event(Mb26Event event_type) -{ - if (event_type < kMb26MaxEventcnt) - { - mb26_event_flags[event_type] = (1 << event_type); - } -} - -void Mb26_Event_Init(void) -{ - rt_err_t ret = rt_event_init(&at_device_event, "mb26_event", RT_IPC_FLAG_PRIO); - if (ret == RT_EOK) - { - mb26_event_initialized = RT_TRUE; - for (Mb26Event event = kMb26HeartbeatEvent; event < kMb26MaxEventcnt; event++) - { - Mb26_Set_Event(event); - } - } - else - { - LOG_E("mb26_event init failed!"); - } -} - -rt_uint32_t Mb26_Get_Event_Flag(Mb26Event event_type) -{ - if (event_type < kMb26MaxEventcnt) - { - return mb26_event_flags[event_type]; - } - return 0; -} - -void Mb26_Send_Event(Mb26Event event_type) -{ - LOG_D("Send_Mb26_Event = %d", event_type); - mb26_event_index.last_event = mb26_event_index.current_event; - mb26_event_index.current_event = event_type; - if (mb26_event_initialized == RT_TRUE) - { - rt_event_send(&at_device_event, Mb26_Get_Event_Flag(event_type)); - } - else - { - LOG_E("mb26_event_initialized is false"); - } -} - -static rt_uint8_t last_value = 0; // 用于存储上次检测的值 -static rt_uint8_t current_value = 0; // 用于存储当前检测的值 -// 定义定时器回调函数 -static void Mb26_Ht_Timer_Cb(void *parameter) -{ - current_value++; - Mb26_Send_Event(kMb26HeartbeatEvent); -} - -// 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接 -static void Mb26_Life_Timer_Cb(void *parameter) -{ - rt_sem_release(mb26_life_sem); -} - -// 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接 -static void Mb26_Error_Timer_Cb(void *parameter) -{ - if (power_on_send_flag) // 上电成功时,停止定时器 - { - rt_timer_stop(mb26_power_error_timer); - } - else - { - Mb26_Send_Event(kMb26PowerOnEvent); - } -} - -static void Mb26_Heartbeat_check_Timer_Cb(void *parameter) -{ -// static rt_uint8_t relay_cnt = 0; - if (last_value == current_value) - { - // rt_timer_start(mb26_timer); // 重启一下定时器 - // relay_cnt++; - reboot();//三个心跳周期定时器都没启动,直接重启 - } - // else - // { - // if (current_value > 100) // 随便设一个不大于255的数就行 目的就是循环检测,不超 - // { - // last_value = current_value; - // current_value = 0; - // } - // } -} - -// 重置定时器 -void Reset_Mb26_Life_Timer(void) -{ - if (mb26_life_timer != RT_NULL) - { - // rt_timer_stop(mb26_life_timer);//启动这个时,他会自动清除以前的定时器,所以不必担心是否已经启动的问题,困扰我不少时间,点进去第一二句就是 - rt_timer_start(mb26_life_timer); - } -} - -int _Pack_Send(struct Mb26_Ops *ops, char *buf) -{ - char mb26_send_buf[512] = {0}; // 发送缓冲区,用于存储最终发送的数据 - // char byteArr1[512]; // 转换成字节值 - unsigned short crc16 = 0; // 存储CRC16校验和 - - struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, MB26_SAMPLE_DEIVCE_NAME); - ASSERT(device); - crc16 = crc1021(buf, rt_strlen(buf)); - LOG_D("buf: %s", buf); - LOG_D("crc16: %X", crc16); - // 将数据、校验和及尾部标识添加到发送缓冲区中 - if (rt_snprintf(mb26_send_buf, sizeof(mb26_send_buf), - "%s%04X%02X%02X%02X", - buf, - crc16, - ops->frame->tail[0], - ops->frame->tail[1], - ops->frame->tail[2]) >= sizeof(mb26_send_buf)) - { - // 发生缓冲区溢出 - LOG_E("Buffer overflow in mb26_send_buf"); - return -RT_ERROR; - } - // 打印调试信息 - // LOG_D("mb26_send_buf: %s", mb26_send_buf); - rt_uint16_t data_len = rt_strlen(mb26_send_buf); - // 通过AT指令发送数据给MB26模块 - if (at_send_data(device, mb26_send_buf, data_len / 2) != RT_EOK) - { - return -RT_ERROR; - } - - return RT_EOK; -} - -/** - * @brief 发送数据到mb26模块 - * - * 本函数根据提供的数据和参数构建一个格式化字符串,计算其CRC16校验和, - * 然后将该字符串发送给MB26模块 - *@param version 协议版本 - * @param data 要发送的十六进制数据字符串 - * @param len 数据字符串的十六进制数据格式长度 - * @param data_num 数据编号 - * @param cmd_num 命令编号 - * @return int 返回0表示成功,非零表示失败 - */ -static int _Send_Handle(struct Mb26_Ops *ops, rt_size_t data_num, rt_size_t cmd_num, const char *data) -{ - // 临时缓冲区,用于格式化数据 - char data_buf[512] = {0}; - rt_size_t data_len = rt_strlen(data); - - // 格式化数据,构建发送给MB26模块的数据包 - rt_int32_t len = rt_snprintf(data_buf, sizeof(data_buf), - "%02X%02X%02X%02X%04X%04X%02X%04X%s", - ops->frame->header[0], - ops->frame->header[1], - ops->frame->header[2], - ops->frame->version, // 协议版本 - ops->frame->manufacture, // 制造商ID - data_num, - cmd_num, - data_len / 2, - data); - if (len < 0 || len >= sizeof(data_buf)) - { - LOG_E("Send Data buffer overflow"); - return -RT_ERROR; - } - - // LOG_D("data_buf: %s", data_buf); - - return _Pack_Send(ops, data_buf); -} - -// 初始化函数 -int BSP_Mb26_Init(struct Mb26_Ops *ops, rt_uint8_t version) -{ - if (ops->frame == RT_NULL) - { - LOG_E("Memory allocation failed"); - return -RT_ENOMEM; - } - rt_memset(ops->frame, 0, sizeof(struct Mb26DataFrame)); - - ops->frame->header[0] = 0x4A; - ops->frame->header[1] = 0x54; - ops->frame->header[2] = 0x34; - - ops->frame->version = version; - ops->frame->manufacture = DEVICE_MANUFACTURE; - - ops->frame->tail[0] = 0x42; - ops->frame->tail[1] = 0x4A; - ops->frame->tail[2] = 0x51; - - return RT_EOK; -} -// 更新函数 -int BSP_Mb26_Update(struct Mb26_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type) -{ - ops->body->device_type = device_type; - ops->body->event_type = event_type; - ops->body->hw = (rt_uint8_t)Flash_Get_SysCfg(kHwVerId); - ops->body->sw = (rt_uint8_t)Flash_Get_SysCfg(kSwVerId); - rt_memcpy(ops->body->imei, &mb26, sizeof(mb26_sys_info)); // 直接赋值结构体数据 - rt_memcpy(&(ops->body->lel), &H308.Data, (rt_ubase_t)offsetof(TsH308Data, checksum)); // 复制除了校验码以外的数据 - ops->body->product_work_temperature = ops->body->temp; // 暂时定为激光器测量的环境温度 - ops->body->work_duration = work_duration; - ops->body->device_status = device_state_flag; - ops->body->emv_status = emv_state_flag; - ops->body->relay_status = relay_state_flag; - - return RT_EOK; -} - -int Mb26_Send_Data(struct Mb26_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type) -{ - int ret = 0; - char data_buf[512] = {0}; - char temp[3]; // 临时缓冲区,用于存储每个字节的十六进制表示 - - if (ops == NULL || ops->body == NULL) - { - // 处理 ops 或 ops->body 为 NULL 的情况 - return RT_ERROR; // 或者抛出异常,返回错误码等 - } - - if (sizeof(struct DataBody) == 0) - { - data_buf[0] = '\0'; // 确保 data_buf 被正确初始化 - return RT_ERROR; - } - - rt_memset(ops->body, 0, sizeof(struct DataBody)); - rt_mutex_take(mb26_mutex, RT_WAITING_FOREVER); - - ret = mb26_ops.update_data(ops, device_type, event_type); - if (ret == RT_EOK) - { - for (int i = 0; i < sizeof(struct DataBody); i++) - { - rt_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]); - rt_memcpy(data_buf + i * 2, temp, 2); - } - rt_mutex_release(mb26_mutex); - ret = _Send_Handle(ops, data_num, cmd, data_buf); - if (ret != RT_EOK) - { - - return -ret; - } - } - rt_mutex_release(mb26_mutex); - return ret; -} - -int Data_Resp(struct Mb26_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) -{ - if (mb26_conncet_tcp_flag != 1) - { - LOG_E("mb26_conncet_tcp_flag error"); - return -RT_ERROR; - } - - char data_buf[512] = {0}; - - rt_int32_t len = rt_snprintf(data_buf, sizeof(data_buf), "%02X%02X%30s%02X", device_type, event_type, data, res); - if (len < 0 || len >= sizeof(data_buf)) - { - LOG_E("Resp Data buffer overflow"); - return -RT_ERROR; - } - // LOG_D("data_buf: %s", data_buf); - return _Send_Handle(ops, data_num, cmd, data_buf); -} - -int Mb26_Recv_Data(struct Mb26_Ops *ops, char *data) -{ - // ops->body = (struct DataBody *)rt_malloc(sizeof(struct DataBody)); - // rt_memset(ops->body, 0, sizeof(struct DataBody)); - // rt_free(ops->body); - return RT_EOK; -} - -/***************************************发送处理函数************************************************ */ -/** - * 处理定时心跳事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Heartbeat(struct at_device *device, void *param) -{ - - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - int ret = 0; - - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - ret = device->class->device_ops->control(device, AT_DEVICE_CTRL_GET_SIGNAL, RT_NULL); - if (ret != RT_EOK) - { - LOG_E("mb26 get signal failed\n"); - return -RT_ERROR; - } - ret = mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_DATA_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_HEARTBEAT); - if (ret != RT_EOK) - { - LOG_E("mb26 send data failed\n"); - return ret; - } - - return RT_EOK; -} - -/** - * 处理时间校准事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Time_Calibration(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_TIME_CALIBRATION, DEVICE_TYPE_MB26, EVENT_TYPE_TIME_CALIBRATION)) - { - LOG_E("mb26 send cmd[%X] failed\n", CMD_TYPE_TIME_CALIBRATION); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理报警事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Alarm(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_ALARM)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_ALARM); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理报警恢复事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Alarm_Recover(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_ALARM_RECOVER)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_ALARM_RECOVER); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理故障事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Fault(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_FAULT)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_FAULT); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理故障恢复事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Fault_Recover(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_FAULT_RECOVER)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_FAULT_RECOVER); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理自检事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Self_Check(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_SELF_CHECK)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_SELF_CHECK); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理消音事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Silence(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_SILENCE)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_SILENCE); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理异常事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Exception(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_EXCEPTION)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_EXCEPTION); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理电磁阀状态改变事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Valve_Status(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_VALVE_STATUS)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_VALVE_STATUS); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理风扇状态改变事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Fan_Status(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_FAN_STATUS)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_FAN_STATUS); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理温度异常事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Temp_Anomaly(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_TEMP_ANOMALY)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_TEMP_ANOMALY); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理断电事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Power_Off(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_POWER_OFF)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_POWER_OFF); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理断电事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Power_On(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_POWER_ON)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_POWER_ON); - return -RT_ERROR; - } - return RT_EOK; -} - -/** - * 处理设备故障事件 - * @param device 设备结构体指针 - * @param param 操作结构体指针 - * @return 操作结果 - */ -int Mb26_Send_Device_Failure(struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - if ((device == RT_NULL) || (mb26_ops == RT_NULL)) - { - LOG_E("mb26 param error\n"); - return RT_ERROR; - } - - if (mb26_ops->send(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_EVENT_REPORT, DEVICE_TYPE_MB26, EVENT_TYPE_DEVICE_FAILURE)) - { - LOG_E("mb26 send cmd[%X] failed\n", EVENT_TYPE_DEVICE_FAILURE); - return -RT_ERROR; - } - return RT_EOK; -} -/*这个【4、优先级最低当同时触发后,相同服务直接合并】暂时还没想好怎么做, -思路感觉就是得重新开一个线程,然后再开一个任务队列,将所有的事件,发送到任务队列 -在线程中,对任务队列进行查看并处理,看目前都有哪些事件,是处于那个优先级得,如果是最低优先级,就只发送一帧数据就行了, -如果是不同优先级,按照优先级顺序发送事件,但感觉这样会使得程序更复杂,本来发送就很快,感觉没必要这样搞*/ -const Mb26EventInfo mb26_event_info[] = { - {kMb26PowerOnEvent, MB26_PRIORITY_HIGHEST, "上电心跳事件", Mb26_Send_Power_On}, - {kMb26PowerDownEvent, MB26_PRIORITY_HIGH, "掉电事件", Mb26_Send_Power_Off}, - {kMb26SelfCheckEvent, MB26_PRIORITY_MEDIUM, "自检事件", Mb26_Send_Self_Check}, - {kMb26HeartbeatEvent, MB26_PRIORITY_LOWEST, "定时心跳事件", Mb26_Send_Heartbeat}, - {kMb26TempAnomalyEvent, MB26_PRIORITY_LOWEST, "温度异常事件", Mb26_Send_Temp_Anomaly}, - {kMb26AlarmEvent, MB26_PRIORITY_LOWEST, "报警触发事件", Mb26_Send_Alarm}, - {kMb26AlarmRcyEvent, MB26_PRIORITY_LOWEST, "报警解除事件", Mb26_Send_Alarm_Recover}, - {kMb26FaultEvent, MB26_PRIORITY_LOWEST, "传感器故障事件", Mb26_Send_Fault}, - {kMb26FaultRcyEvent, MB26_PRIORITY_LOWEST, "传感器故障解除事件", Mb26_Send_Fault_Recover}, - {kMb26TimeCalibrationEvent, MB26_PRIORITY_LOWEST, "时间校准事件", Mb26_Send_Time_Calibration}, - {kMb26SilenceEvent, MB26_PRIORITY_LOWEST, "消音事件", Mb26_Send_Silence}, - {kMb26ExceptionEvent, MB26_PRIORITY_LOWEST, "异常事件", Mb26_Send_Exception}, - {kMb26ValveStatusEvent, MB26_PRIORITY_LOWEST, "电磁阀状态改变事件", Mb26_Send_Valve_Status}, - {kMb26FanStatusEvent, MB26_PRIORITY_LOWEST, "风机状态改变事件", Mb26_Send_Fan_Status}, - {kMb26DeviceFailureEvent, MB26_PRIORITY_LOWEST, "设备失效事件", Mb26_Send_Device_Failure}}; - -/** - * 处理MB26设备的事件 - * @param mb26_recv_event 接收到的MB26事件标志 - * @return - */ -int Mb26_Process_Events(Mb26Event mb26_recv_event, struct at_device *device, void *param) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)param; - const Mb26EventInfo *event = RT_NULL; - - for (size_t i = 0; i < sizeof(mb26_event_info) / sizeof(Mb26EventInfo); ++i) - { - // 检查当前事件是否在接收到的事件标志中 - if (mb26_recv_event == mb26_event_info[i].event_flag) - { - event = &mb26_event_info[i]; - break; - } - } - - // 处理该事件 - if (event) - { - // 打印事件的名称 - LOG_D("%s上报\n", event->event_name); - - // 如果事件有关联的发送函数,则调用该发送函数 - if (event->send_func) - { - int result = event->send_func(device, mb26_ops); - if (result != RT_EOK) - { - LOG_E("mb26 send cmd failed\n"); - Mb26_Reset(device); // 重启模组 - rt_thread_mdelay(5000); - if (mb26_conncet_tcp_flag != 1) - { - if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接 - { - LOG_D("mb26 connect tcp success\n"); - Reset_Mb26_Life_Timer(); - // 重启后重新尝试发送 - result = event->send_func(device, mb26_ops); - if (result != RT_EOK) - { - LOG_E("mb26 send cmd after module reset failed\n"); - - // Flash_Set_WorkDuration(work_duration); // 重启前保存参数 - // NVIC_SystemReset(); // 直接重启系统 - - Mb26_Reset(device); - rt_thread_mdelay(5000); - } - } - else - { - LOG_E("mb26 connect tcp failed\n"); - } - } - } - else - return RT_EOK; - } - } - // 函数执行完毕,返回0 - return RT_EOK; -} - -// 比较帧头和帧尾 -int Compare_HeaderToTail(struct Mb26_Ops *ops) -{ - // 比较帧头 - for (int i = 0; i < 3; i++) - { - if (ops->frame->header[i] != ops->recv->header[i]) - { - LOG_E("ops->frame->header[%x] != ops->recv->header[%x]\n", ops->frame->header[i], ops->recv->header[i]); - - return -1; - } - } - - // 比较帧尾 - for (int i = 0; i < 3; i++) - { - if (ops->frame->tail[i] != ops->recv->tail[i]) - { - LOG_E("ops->frame->tail[%x] != ops->recv->tail[%x]\n", ops->frame->tail[i], ops->recv->tail[i]); - - return -2; - } - } - if (ops->recv->recv_data.res_num != RESPONSE_CODE_SUCCESS) // 判断是否为成功响应 - { - LOG_E("ops->recv->recv_data.res_num[%x] != RESPONSE_CODE_SUCCESS\n", ops->recv->recv_data.res_num); - - return -3; - } - return RT_EOK; -} - -void Handle_Server_Reply(struct Mb26_Ops *ops) -{ - if (ops->recv->recv_data.event_type == INSTRUCTION_HEART_BEAT) - { - LOG_D("mb26 send data success\n"); - } -} - -void Handle_Self_Check(struct Mb26_Ops *ops) -{ - LOG_D("服务器下发自检指令\n"); - char imei[16] = {0}; - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - LOG_D("imei:%s\n", imei); - _Self_Check_Mode(); - rt_thread_mdelay(100); - - char temp[32] = "0"; - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - LOG_D("temp: %s", temp); - - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_SELF_CHECK, temp, RESPONSE_CODE_SUCCESS); - - Send_Laser_Alarm_Event(SysControl.status); // 自检完要恢复当前系统状态,恢复现场 -} - -void Handle_Mute(struct Mb26_Ops *ops) -{ - LOG_D("服务器下发消音指令\n"); - - char imei[16] = {0}; - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - char temp[32] = "0"; - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - - Send_Laser_Alarm_Event(KMuteEvent); - rt_thread_mdelay(100); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_MUTE, temp, RESPONSE_CODE_SUCCESS); -} - -void Handle_Close_Valve(struct Mb26_Ops *ops) -{ - LOG_D("服务器下发关闭阀门指令\n"); - - char imei[16] = {0}; - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - char temp[32] = "0"; - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - - emv_state_flag = 1; - rt_thread_mdelay(20); - emv_state_flag = 0; - // rt_uint8_t ret = BSP_Set_Emv_Status(0); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); -} - -void Handle_Open_Valve(struct Mb26_Ops *ops) -{ - LOG_D("服务器下发打开阀门指令\n"); - - // char imei[16] = {0}; - // Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - // char temp[32] = "0"; - // String2Hex(temp, imei); // 将字符串转为十六进制字符串 - - // // rt_uint8_t ret = BSP_Set_Emv_Status(1); - // emv_state_flag = 1; // 电磁阀动作 - // rt_thread_mdelay(20); - // emv_state_flag = 0; - - // ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_OPEN_VALVE, temp, RESPONSE_CODE_SUCCESS); -} - -void Handle_Open_Relay(struct Mb26_Ops *ops) -{ - LOG_D("服务器下发打开继电器指令\n"); - - char imei[16] = {0}; - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - char temp[32] = "0"; - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - relay_state_flag = 1; - rt_thread_mdelay(10); - // rt_uint8_t ret = BSP_Set_Relay_Status(0); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_OPEN_RELAY, temp, RESPONSE_CODE_SUCCESS); -} - -void Handle_Close_Relay(struct Mb26_Ops *ops) -{ - LOG_D("服务器下发关闭继电器指令\n"); - - char imei[16] = {0}; - char temp[32] = "0"; - - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - - relay_state_flag = 0; - rt_thread_mdelay(100); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_CLOSE_RELAY, temp, RESPONSE_CODE_SUCCESS); -} - -void Handle_Query_Params(struct Mb26_Ops *ops) -{ - rt_uint8_t data[10] = {0}; - char str[64] = {0}; - LOG_D("服务器下发查询系统参数\n"); - - rt_memcpy(data, (rt_uint8_t *)FLASH_HW_VER_ADDR, sizeof(sys_config_info) - 50); - LOG_D("hw_ver:%02x sw_ver:%02x alarm_low:%02x alarm_high:%02x temp_alarm:%02x nb_upload_cycle:%dmin retry:%02x emagnetic:%02X relay_switch:%02X\n", - data[0], data[1], data[2], data[3], data[4], ((data[5]) | (data[6] << 8)), data[7], data[8], data[9]); - - rt_sprintf(str, "0000000000%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", - data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9]); - rt_thread_mdelay(100); // 释放下线程 - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_QUERY_PARAMS, str, RESPONSE_CODE_SUCCESS); -} - -int Handle_Config_Params(struct Mb26_Ops *ops) -{ - char data_buf[32] = {0}; - rt_uint8_t recv_data[16] = {0}; - rt_uint8_t flash_info[16] = {0}; - char imei[16] = {0}; - char temp[32] = "0"; - - LOG_D("服务器下发配置参数\n"); - - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - - rt_memset(data_buf, '0', 32); - rt_memcpy(recv_data, (ops->recv->recv_data.res_data + 5), sizeof(sys_config_info) - 50); - rt_memcpy(flash_info, (rt_uint8_t *)FLASH_HW_VER_ADDR, sizeof(sys_config_info) - 50); - - LOG_D("hw_ver:%02x sw_ver:%02x alarm_low:%02x alarm_high:%02x temp_alarm:%02x nb_upload_cycle:%d min retry:%02x emagnetic:%02X relay_switch:%02X\n", - flash_info[0], flash_info[1], flash_info[2], flash_info[3], flash_info[4], (flash_info[5] | (flash_info[6] << 8)), flash_info[7], flash_info[8], recv_data[9]); - LOG_D("recv_data: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n", - recv_data[0], recv_data[1], recv_data[2], recv_data[3], recv_data[4], - recv_data[5], recv_data[6], recv_data[7], recv_data[8], recv_data[9], - recv_data[10], recv_data[11], recv_data[12], recv_data[13], recv_data[14], recv_data[15]); - LOG_D("data:%s\n", data_buf); - - for (rt_uint8_t i = 0; i < (sizeof(sys_config_info) - 50); i++) - { - LOG_D("recv_data[%d] = %d", i, recv_data[i]); - if (recv_data[i] != flash_info[i]) - { - if ((recv_data[2] > 25) || (recv_data[2] < 5)) /*家报的报警设定值应在5%~25%之间*/ - { - if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_ACTION_FAILURE) == RT_EOK) - { - LOG_W("recv_data[3] :%d", recv_data[3]); - LOG_W("配置参数超出范围,请核实后重试\n"); - } - return RT_EOK; - } - else // 如果没有超出,再写入信息 - { - if (BSP_Flash_Write_Info(recv_data, sizeof(sys_config_info) - 50) != 0) - { - rt_uint16_t nb_upload_time = (uint16_t)Flash_Get_SysCfg(kNbUploadCycleId); - unsigned long timeout = nb_upload_time * 60 * RT_TICK_PER_SECOND; - // rt_timer_stop(mb26_timer); - rt_timer_control(mb26_timer, RT_TIMER_CTRL_SET_TIME, (void *)&timeout); // 更新上报周期 - // rt_timer_control(mb26_timer, RT_TIMER_CTRL_GET_TIME, &timeout); - // LOG_D("timeout:%d", timeout/1000/60); - // rt_timer_start(mb26_timer); - LOG_D("上报周期由%dmin更新为%dmin", ((flash_info[5] << 8) | flash_info[6]), nb_upload_time); - if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_SUCCESS) == RT_EOK) - { - LOG_D("配置参数写入成功\n"); - } - return RT_EOK; - } - else - { - LOG_D("配置参数写入失败\n"); - if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_ACTION_FAILURE) == RT_EOK) - { - LOG_D("写入失败响应成功\n"); - } - return RT_ERROR; - } - } - } - } - if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_SUCCESS) == RT_EOK) - { - LOG_D("配置参数没有变化\n"); - } - return RT_EOK; -} - -void Handle_Time_Calibration_Data(struct Mb26_Ops *ops) -{ - rt_uint8_t data[10] = {0}; - TsRtcDateTime rtc_dt; - char imei[16] = {0}; - char temp[32] = "0"; - - LOG_D("时间校准数据\n"); - - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - - rt_memcpy(data, ops->recv->recv_data.res_data, sizeof(data)); - - // 提取后4个字节作为时间戳 - time_t timestamp = (data[6] << 24) | (data[7] << 16) | (data[8] << 8) | data[9]; - Timestamp_To_Rtc_DateTime(timestamp, &rtc_dt); - // 打印结果 - LOG_I("时间: %04d-%02d-%02d %02d:%02d:%02d (星期%d)\n", - rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second, rtc_dt.week); - RTC_SetTime(rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, 0); /* Setup Time */ - rt_thread_mdelay(100); // 释放下线程 - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_TIME_CALIBRATION, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_TIME_CALIBRATION, temp, RESPONSE_CODE_SUCCESS); -} - -//下发修改服务器地址指令 -void Handle_Sever_Addr_Set(struct Mb26_Ops *ops) -{ - rt_uint8_t data[6] = {0}; - char imei[16] = {0}; - char temp[32] = "0"; - - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - rt_memcpy(data, (ops->recv->recv_data.res_data + 9), FLASH_SERVER_LEN); - 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]); - Flash_Set_Sever_Data(data); - if(Flash_Get_Sever_Data(&sever_info) != RT_EOK) - { - LOG_E("服务器地址修改失败\n"); - } - else - { - LOG_D("服务器地址修改成功\n"); - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_SEVER_ADDR, temp, RESPONSE_CODE_SUCCESS); - } - -} - -void Handle_Error(struct Mb26_Ops *ops, rt_err_t ret) -{ - LOG_E("数据帧解析失败,错误码: %d", ret); - - char imei[16] = {0}; - char temp[32] = "0"; - - Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); - String2Hex(temp, imei); // 将字符串转为十六进制字符串 - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, ops->recv->cmd, temp, RESPONSE_CODE_PARSE_FAIL); -} - -void Handle_Instruction_Down(struct Mb26_Ops *ops) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)ops; - - switch (mb26_ops->recv->recv_data.event_type) - { - case INSTRUCTION_DOWN_SELF_CHECK: - Handle_Self_Check(mb26_ops); - break; - case INSTRUCTION_DOWN_MUTE: - Handle_Mute(mb26_ops); - break; - case INSTRUCTION_DOWN_CLOSE_VALVE: - Handle_Close_Valve(mb26_ops); - break; - case INSTRUCTION_DOWN_OPEN_VALVE: - Handle_Open_Valve(mb26_ops); - break; - case INSTRUCTION_DOWN_OPEN_RELAY: - Handle_Open_Relay(mb26_ops); - break; - case INSTRUCTION_DOWN_CLOSE_RELAY: - Handle_Close_Relay(mb26_ops); - break; - case INSTRUCTION_DOWN_QUERY_PARAMS: - Handle_Query_Params(mb26_ops); - break; - case INSTRUCTION_DOWN_CONFIG_PARAMS: - Handle_Config_Params(mb26_ops); - break; - case INSTRUCTION_DOWN_TIME_CALIBRATION: - Handle_Time_Calibration_Data(mb26_ops); - break; - case INSTRUCTION_DOWN_SEVER_ADDR: - Handle_Sever_Addr_Set(mb26_ops); - break; - } -} - -void Handle_Time_Calibration(struct Mb26_Ops *ops) -{ - rt_uint8_t data[10] = {0}; - LOG_D("服务器下发时间校准数据\n"); - rt_memcpy(data, ops->recv->recv_data.res_data, sizeof(data)); - TsRtcDateTime rtc_dt; - // 提取后4个字节作为时间戳 - time_t timestamp = (data[6] << 24) | (data[7] << 16) | (data[8] << 8) | data[9]; - Timestamp_To_Rtc_DateTime(timestamp, &rtc_dt); - // 打印结果 - LOG_I("时间: %04d-%02d-%02d %02d:%02d:%02d (星期%d)\n", - rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second, rtc_dt.week); - RTC_SetTime(rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second); /* Setup Time */ - ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, INSTRUCTION_DOWN_TIME_CALIBRATION, MB26_DEFIENE_DATA, RESPONSE_CODE_SUCCESS); -} - -void Handle_Cmd_Type(struct Mb26_Ops *ops) -{ - struct Mb26_Ops *mb26_ops = (struct Mb26_Ops *)ops; - - switch (mb26_ops->recv->cmd) - { - case CMD_TYPE_SERVER_REPLY: - Handle_Server_Reply(mb26_ops); - break; - case CMD_TYPE_INSTRUCTION_DOWN: - Handle_Instruction_Down(mb26_ops); - break; - case CMD_TYPE_TIME_CALIBRATION: - Handle_Time_Calibration(mb26_ops); - break; - default: - mb26_ops->Resp(mb26_ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_MB26, ops->recv->cmd, MB26_DEFIENE_DATA, RESPONSE_CODE_PARSE_FAIL); - break; - } -} - -void Analyze_Recv_Frame(struct at_device *device, struct Mb26_Ops *ops) -{ - rt_err_t ret = RT_EOK; - Reset_Mb26_Life_Timer(); // 只要数据,则重置定时器,不管数据是否正确 - - ret = Compare_HeaderToTail(ops); - if (ret == RT_EOK) - { - Handle_Cmd_Type(ops); - } - else - { - Handle_Error(ops, ret); - } -} - -/* -上电模式 -发送一包数据后,转换到检测模式 120分钟发送一次数据 -当有事件发生时,发送一包事件数据包 -*/ -static void Mb26_Send_Thread_Entry(void *param) -{ - rt_uint16_t cnt = 0; - rt_err_t result = RT_EOK; - rt_uint32_t mb26_recv_event; - LOG_D("mb26 thread entry\n"); - - struct Mb26_Ops *ops = (struct Mb26_Ops *)param; - struct at_device_mb26 *mb26 = &_dev; - struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, mb26->device_name); - RT_ASSERT(device); - - if (ops->init(ops, PROTOCOL_VERSION) != RT_EOK) - { - LOG_E("mb26 init failed\n"); - } - else - { - LOG_D("mb26 init success\n"); - while (cnt < 5000)//等待激光器进入正常工作状态 - { - if (SysControl.status == kNormalDetectionEvents) - { - break; - } - cnt++; - rt_thread_mdelay(10); - } - rt_completion_wait(&mb26_init_complate, RT_WAITING_FOREVER); // wait for mb26 init finish - Mb26_Send_Event(kMb26PowerOnEvent); - } - while (1) - { - result = rt_event_recv(&at_device_event, - Mb26_Get_Event_Flag(kMb26PowerOnEvent) | - Mb26_Get_Event_Flag(kMb26HeartbeatEvent) | - Mb26_Get_Event_Flag(kMb26SelfCheckEvent) | - Mb26_Get_Event_Flag(kMb26SilenceEvent) | - Mb26_Get_Event_Flag(kMb26ExceptionEvent) | - Mb26_Get_Event_Flag(kMb26ValveStatusEvent) | - Mb26_Get_Event_Flag(kMb26FanStatusEvent) | - Mb26_Get_Event_Flag(kMb26TempAnomalyEvent) | - Mb26_Get_Event_Flag(kMb26PowerOnEvent) | - Mb26_Get_Event_Flag(kMb26PowerDownEvent) | - Mb26_Get_Event_Flag(kMb26AlarmEvent) | - Mb26_Get_Event_Flag(kMb26AlarmRcyEvent) | - Mb26_Get_Event_Flag(kMb26FaultEvent) | - Mb26_Get_Event_Flag(kMb26FaultRcyEvent) | - Mb26_Get_Event_Flag(kMb26DeviceFailureEvent) | - Mb26_Get_Event_Flag(kMb26TimeCalibrationEvent), - RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, - RT_WAITING_FOREVER, &mb26_recv_event); // 这个事件一般是设备端发生了变化,发送到服务器时调用 - - if (result == RT_EOK) - { - LOG_D("mb26 recv event OK\n"); - if (mb26_conncet_tcp_flag != 1) - { - if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接 - { - LOG_D("mb26 connect tcp success\n"); - rt_timer_start(mb26_life_timer); - } - else - { - LOG_E("mb26 connect tcp failed\n"); - } - } - if (mb26_conncet_tcp_flag) - { - Reset_Mb26_Life_Timer(); - if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26PowerOnEvent)) - { - result = Mb26_Process_Events(kMb26PowerOnEvent, device, ops); // 当上电心跳包发送不成功时,其他事件不启动 - if (result) - { - power_on_send_flag = 0; - rt_timer_start(mb26_power_error_timer); // 启动重连定时器, 3min一次,直到发送成功 - LOG_E("mb26 send data failed result = [%d]\n", result); - } - else - { - rt_timer_start(mb26_timer); // 当上电心跳包发送成功时, 开始心跳包周期发送 - power_on_send_flag = 1; - Mb26_Send_Event(kMb26TimeCalibrationEvent); // 上电网络连接成功时,更新下时间 - rt_timer_start(mb26_upload_timer); - } - } - if (power_on_send_flag) - { - if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26HeartbeatEvent)) - { - result = Mb26_Process_Events(kMb26HeartbeatEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26TimeCalibrationEvent)) - { - Time_Calibration(device); - // result = Mb26_Process_Events(kMb26TimeCalibrationEvent, device, ops); - // if (result) - // { - // LOG_E("mb26 send data failed result = [%d]\n", result); - // } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26AlarmEvent)) - { - result = Mb26_Process_Events(kMb26AlarmEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26AlarmRcyEvent)) - { - result = Mb26_Process_Events(kMb26AlarmRcyEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26FaultEvent)) - { - if (device_state_flag != 1) // 当设备失效时,只上报失效信息 - { - result = Mb26_Process_Events(kMb26FaultEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26FaultRcyEvent)) - { - result = Mb26_Process_Events(kMb26FaultRcyEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26SelfCheckEvent)) - { - result = Mb26_Process_Events(kMb26SelfCheckEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26SilenceEvent)) - { - result = Mb26_Process_Events(kMb26SilenceEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26ExceptionEvent)) - { - result = Mb26_Process_Events(kMb26ExceptionEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26ValveStatusEvent)) - { - result = Mb26_Process_Events(kMb26ValveStatusEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26FanStatusEvent)) - { - result = Mb26_Process_Events(kMb26FanStatusEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26TempAnomalyEvent)) - { - result = Mb26_Process_Events(kMb26TempAnomalyEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26PowerDownEvent)) - { - result = Mb26_Process_Events(kMb26PowerDownEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - mb26_event_initialized = RT_FALSE; // 当接收到掉电事件时,发送完成后删除事件,不再接收其他事件 - rt_event_detach(&at_device_event); - } - else if (mb26_recv_event & Mb26_Get_Event_Flag(kMb26DeviceFailureEvent)) - { - result = Mb26_Process_Events(kMb26DeviceFailureEvent, device, ops); - if (result) - { - LOG_E("mb26 send data failed result = [%d]\n", result); - } - } - } - rt_thread_mdelay(1); // 释放下线程 - } - } - } -} - -static void Mb26_Recv_Thread_Entry(void *parameter) -{ - struct Mb26_Ops *ops = (struct Mb26_Ops *)parameter; - struct at_device_mb26 *mb26 = &_dev; - struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, mb26->device_name); - RT_ASSERT(device); - rt_err_t ret; - - LOG_D("mb26 recv thread entry\n"); - - while (1) - { - ret = rt_sem_take(mb26_recv_sem, RT_WAITING_FOREVER); // 这个主要用来处理的数据 - if (ret == RT_EOK) - { - rt_timer_start(mb26_life_timer); - /*对数据帧进行分析,判断所处的是对服务器响应还是指令下发*/ - Analyze_Recv_Frame(device, ops); - } - } -} - -static void Mb26_Life_Thread_Entry(void *parameter) -{ - - struct at_device_mb26 *mb26 = &_dev; - struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, mb26->device_name); - RT_ASSERT(device); - rt_err_t ret; - - LOG_D("mb26_life_thread entry\n"); - - while (1) - { - ret = rt_sem_take(mb26_life_sem, RT_WAITING_FOREVER); - if (ret == RT_EOK) - { - if (mb26_conncet_tcp_flag) - { - device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_DISCONN, RT_NULL); - LOG_D("close mb26 tcp connect\n "); - } - } - } -} - -// 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接 -static void Mb26_Upload_Timer_Cb(void *parameter) -{ - Mb26_Send_Event(kMb26TimeCalibrationEvent); // 更新下时间 -} - -int BSP_Mb26_Thread_Init(void) -{ - rt_err_t ret; - - Mb26_Event_Init(); - rt_uint32_t nb_upload_time = (uint16_t)Flash_Get_SysCfg(kNbUploadCycleId); - unsigned long timeout = nb_upload_time * 60 * RT_TICK_PER_SECOND; - LOG_I("上报服务器周期:%d分钟", nb_upload_time); - mb26_mutex = rt_mutex_create("mb26_mutex", RT_IPC_FLAG_FIFO); - if (mb26_mutex == RT_NULL) - { - LOG_E("mb26_mutex create failed"); - } - mb26_recv_sem = rt_sem_create("mb26_recv", 0, RT_IPC_FLAG_FIFO); - if (mb26_recv_sem == RT_NULL) - { - LOG_E("mb26_recv_sem create failed"); - } - - mb26_life_sem = rt_sem_create("mb26_life", 0, RT_IPC_FLAG_FIFO); - if (mb26_life_sem == RT_NULL) - { - LOG_E("mb26_life_sem create failed"); - } - // 创建定时器 - mb26_timer = rt_timer_create("heartbeat", - Mb26_Ht_Timer_Cb, // 回调函数 - RT_NULL, // 参数 - timeout, // 定时周期(120分钟) - RT_TIMER_FLAG_PERIODIC); // 周期性定时器 - - if (mb26_timer == RT_NULL) - { - rt_kprintf("创建定时器失败\n"); - return -1; - } - mb26_life_timer = rt_timer_create("mb26_life", - Mb26_Life_Timer_Cb, - RT_NULL, - 30 * RT_TICK_PER_SECOND, - RT_TIMER_FLAG_ONE_SHOT); - if (mb26_life_timer == RT_NULL) - { - rt_kprintf("创建定时器失败\n"); - return -1; - } - mb26_power_error_timer = rt_timer_create("mb26_error_timer", - Mb26_Error_Timer_Cb, - RT_NULL, - 3 * 60 * RT_TICK_PER_SECOND, // (3分钟) - RT_TIMER_FLAG_PERIODIC); - mb26_upload_timer = rt_timer_create("mb26_upload_timer", - Mb26_Upload_Timer_Cb, - RT_NULL, - 24 * 60 * RT_TICK_PER_SECOND, // - RT_TIMER_FLAG_PERIODIC); - // 创建定时器 - mb26_heartbeat_check_timer = rt_timer_create("mb26_check_hb", - Mb26_Heartbeat_check_Timer_Cb, - RT_NULL, - timeout * 3, // 3个定时心跳没有发送,就重启发送 - RT_TIMER_FLAG_PERIODIC); - - if (mb26_heartbeat_check_timer != RT_NULL) - { - rt_timer_start(mb26_heartbeat_check_timer); - } - ret = rt_thread_init(&mb26_thread, - "mb26_send_thread", - Mb26_Send_Thread_Entry, - &mb26_ops, - &mb26_thread_stack[0], - sizeof(mb26_thread_stack), - MB26_THREAD_PRIORITY, - MB26_THREAD_TICKS); - rt_thread_startup(&mb26_thread); - - ret = rt_thread_init(&mb26_recv_thread, - "mb26_recv_thread", - Mb26_Recv_Thread_Entry, - &mb26_ops, - &mb26_recv_thread_stack[0], - sizeof(mb26_recv_thread_stack), - MB26_RECV_THREAD_PRIORITY, - MB26_RECV_THREAD_TICKS); - rt_thread_startup(&mb26_recv_thread); - - ret = rt_thread_init(&mb26_life_thread, - "mb26_life_thread", - Mb26_Life_Thread_Entry, - &mb26_ops, - &mb26_life_thread_stack[0], - sizeof(mb26_life_thread_stack), - MB26_LIFE_THREAD_PRIORITY, - MB26_LIFE_THREAD_TICKS); - rt_thread_startup(&mb26_life_thread); - - return ret; -} -INIT_APP_EXPORT(BSP_Mb26_Thread_Init); - -static int mb26_device_register(void) -{ - struct at_device_mb26 *mb26 = &_dev; - - return at_device_register(&(mb26->device), - mb26->device_name, - mb26->client_name, - AT_DEVICE_CLASS_MB26, - (void *)mb26); -} -INIT_COMPONENT_EXPORT(mb26_device_register); - -#endif // NB_MODULE_SWITCH diff --git a/bsp/src/bsp_ml307.c b/bsp/src/bsp_ml307.c new file mode 100644 index 0000000..4eec543 --- /dev/null +++ b/bsp/src/bsp_ml307.c @@ -0,0 +1,1617 @@ +/* + * @Author: mbw + * @Date: 2024-11-30 15:46:21 + * @LastEditors: mbw && 1600520629@qq.com + * @LastEditTime: 2024-12-02 17:55:07 + * @FilePath: \ble_bjq_ch303rct6_ml307\bsp\src\bsp_ml307.c + * @Description: + * + * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + */ +#include +#include "drv_gpio.h" +#include "bsp_ml307.h" +#include "user_sys.h" +#include "bsp_flash.h" +#include "stddef.h" +#include "bsp_rtc.h" + +#define LOG_TAG "ml307" +#include + +#if IOT_MODULE_SWITCH == 1 +#define ML307_THREAD_STACK_SIZE (4096) +#define ML307_RECV_THREAD_STACK_SIZE (4096) +#define ML307_LIFE_THREAD_STACK_SIZE (1024) +#define ML307_THREAD_PRIORITY 25 +#define ML307_THREAD_TICKS 50 +#define ML307_RECV_THREAD_PRIORITY 24 +#define ML307_RECV_THREAD_TICKS 10 + +#define ML307_LIFE_THREAD_PRIORITY 26 +#define ML307_LIFE_THREAD_TICKS 10 + + +// static rt_uint32_t ml307_status = 0; +ALIGN(RT_ALIGN_SIZE) +static char ml307_thread_stack[ML307_THREAD_STACK_SIZE]; +static struct rt_thread ml307_thread; + +ALIGN(RT_ALIGN_SIZE) +static char ml307_recv_thread_stack[ML307_RECV_THREAD_STACK_SIZE]; +static struct rt_thread ml307_recv_thread; + +ALIGN(RT_ALIGN_SIZE) +static char ml307_life_thread_stack[ML307_LIFE_THREAD_STACK_SIZE]; +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; // 上电失败情况下启动定时器 +/*生命周期窗口定时器,用于管理tcp连接的断开*/ +static rt_timer_t ml307_life_timer; +static rt_timer_t ml307_heartbeat_check_timer; // 用于检测定时器是否工作 +rt_uint8_t ml307_conncet_tcp_flag; +Ml307EventIndex ml307_event_index; + +rt_uint8_t power_on_send_flag = 0; +rt_mutex_t ml307_mutex; +int BSP_Ml307_Init(struct Ml307_Ops *ops, rt_uint8_t version); +int BSP_Ml307_Update(struct Ml307_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type); +int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type); +int Data_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 Ml307_Recv_Data(struct Ml307_Ops *ops, char *data); + +static struct DataBody body; +static struct Ml307DataFrame frame; +static struct Ml307RecvData ml307_recv; + +struct Ml307_Ops ml307_ops = { + .body = &body, + .frame = &frame, + .recv = &ml307_recv, + .init = BSP_Ml307_Init, + .update_data = BSP_Ml307_Update, + .send = Ml307_Send_Data, + .Resp = Data_Resp, + // .Recv = Ml307_Recv_Data,//,没用到 +}; + +static struct at_device_ml307 _dev = { + ML307_SAMPLE_DEIVCE_NAME, + ML307_SAMPLE_CLIENT_NAME, + + ML307_ENABLE_3_8_V, + ML307_PWR_PIN, + ML307_RST_PIN, + ML307_USIM_DECT_PIN, + ML307_SAMPLE_RECV_BUFF_LEN, +}; + +static rt_uint32_t ml307_event_flags[kMl307MaxEventcnt] = {0}; +static rt_bool_t ml307_event_initialized = RT_FALSE; // 是否初始化完成 + +typedef enum +{ + + ML307_PRIORITY_LOWEST, // 4、优先级最低(定时心跳、浓度异常、报警触发、报警解除、传感器故障触发 传感器故障解除) + ML307_PRIORITY_MEDIUM, // 2、优先级第三高 自检触发 + ML307_PRIORITY_HIGH, // 1、优先级第二高 掉电 + ML307_PRIORITY_HIGHEST, // 0 优先级最高(设备上电时的定时心跳) +} Ml307Priority; + +typedef struct +{ + Ml307Event event_flag; + Ml307Priority priority; + const char *event_name; + int (*send_func)(struct at_device *device, void *param); +} Ml307EventInfo; + +static void Ml307_Set_Event(Ml307Event event_type) +{ + if (event_type < kMl307MaxEventcnt) + { + ml307_event_flags[event_type] = (1 << event_type); + } +} + +void Ml307_Event_Init(void) +{ + rt_err_t ret = rt_event_init(&at_device_event, "ml307_event", RT_IPC_FLAG_PRIO); + if (ret == RT_EOK) + { + ml307_event_initialized = RT_TRUE; + for (Ml307Event event = kMl307HeartbeatEvent; event < kMl307MaxEventcnt; event++) + { + Ml307_Set_Event(event); + } + } + else + { + LOG_E("ml307_event init failed!"); + } +} + +rt_uint32_t Ml307_Get_Event_Flag(Ml307Event event_type) +{ + if (event_type < kMl307MaxEventcnt) + { + return ml307_event_flags[event_type]; + } + return 0; +} + +void Ml307_Send_Event(Ml307Event event_type) +{ + LOG_D("Send_Ml307_Event = %d", event_type); + ml307_event_index.last_event = ml307_event_index.current_event; + ml307_event_index.current_event = event_type; + if (ml307_event_initialized == RT_TRUE) + { + rt_event_send(&at_device_event, Ml307_Get_Event_Flag(event_type)); + } + else + { + LOG_E("ml307_event_initialized is false"); + } +} + +static rt_uint8_t last_value = 0; // 用于存储上次检测的值 +static rt_uint8_t current_value = 0; // 用于存储当前检测的值 +// 定义定时器回调函数 +static void Ml307_Ht_Timer_Cb(void *parameter) +{ + current_value++; + Ml307_Send_Event(kMl307HeartbeatEvent); +} + +// 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接 +static void Ml307_Life_Timer_Cb(void *parameter) +{ + rt_sem_release(ml307_life_sem); +} + +// 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接 +static void Ml307_Error_Timer_Cb(void *parameter) +{ + if (power_on_send_flag) // 上电成功时,停止定时器 + { + rt_timer_stop(ml307_power_error_timer); + } + else + { + Ml307_Send_Event(kMl307PowerOnEvent); + } +} + +static void Ml307_Heartbeat_check_Timer_Cb(void *parameter) +{ +// static rt_uint8_t relay_cnt = 0; + if (last_value == current_value) + { + // rt_timer_start(ml307_timer); // 重启一下定时器 + // relay_cnt++; + reboot();//三个心跳周期定时器都没启动,直接重启 + } + // else + // { + // if (current_value > 100) // 随便设一个不大于255的数就行 目的就是循环检测,不超 + // { + // last_value = current_value; + // current_value = 0; + // } + // } +} + +// 重置定时器 +void Reset_Ml307_Life_Timer(void) +{ + if (ml307_life_timer != RT_NULL) + { + // rt_timer_stop(ml307_life_timer);//启动这个时,他会自动清除以前的定时器,所以不必担心是否已经启动的问题,困扰我不少时间,点进去第一二句就是 + rt_timer_start(ml307_life_timer); + } +} + +int _Pack_Send(struct Ml307_Ops *ops, char *buf) +{ + char ml307_send_buf[512] = {0}; // 发送缓冲区,用于存储最终发送的数据 + // char byteArr1[512]; // 转换成字节值 + unsigned short crc16 = 0; // 存储CRC16校验和 + + struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ML307_SAMPLE_DEIVCE_NAME); + ASSERT(device); + crc16 = crc1021(buf, rt_strlen(buf)); + LOG_D("buf: %s", buf); + LOG_D("crc16: %X", crc16); + // 将数据、校验和及尾部标识添加到发送缓冲区中 + if (rt_snprintf(ml307_send_buf, sizeof(ml307_send_buf), + "%s%04X%02X%02X%02X", + buf, + crc16, + ops->frame->tail[0], + ops->frame->tail[1], + ops->frame->tail[2]) >= sizeof(ml307_send_buf)) + { + // 发生缓冲区溢出 + LOG_E("Buffer overflow in ml307_send_buf"); + return -RT_ERROR; + } + // 打印调试信息 + // LOG_D("ml307_send_buf: %s", ml307_send_buf); + rt_uint16_t data_len = rt_strlen(ml307_send_buf); + // 通过AT指令发送数据给ML307模块 + if (at_send_data(device, ml307_send_buf, data_len) != RT_EOK) + { + return -RT_ERROR; + } + + return RT_EOK; +} + +/** + * @brief 发送数据到ml307模块 + * + * 本函数根据提供的数据和参数构建一个格式化字符串,计算其CRC16校验和, + * 然后将该字符串发送给ML307模块 + *@param version 协议版本 + * @param data 要发送的十六进制数据字符串 + * @param len 数据字符串的十六进制数据格式长度 + * @param data_num 数据编号 + * @param cmd_num 命令编号 + * @return int 返回0表示成功,非零表示失败 + */ +static int _Send_Handle(struct Ml307_Ops *ops, rt_size_t data_num, rt_size_t cmd_num, const char *data) +{ + // 临时缓冲区,用于格式化数据 + char data_buf[512] = {0}; + rt_size_t data_len = rt_strlen(data); + + // 格式化数据,构建发送给ML307模块的数据包 + rt_int32_t len = rt_snprintf(data_buf, sizeof(data_buf), + "%02X%02X%02X%02X%04X%04X%02X%04X%s", + ops->frame->header[0], + ops->frame->header[1], + ops->frame->header[2], + ops->frame->version, // 协议版本 + ops->frame->manufacture, // 制造商ID + data_num, + cmd_num, + data_len/2, + data); + if (len < 0 || len >= sizeof(data_buf)) + { + LOG_E("Send Data buffer overflow"); + return -RT_ERROR; + } + + // LOG_D("data_buf: %s", data_buf); + + return _Pack_Send(ops, data_buf); +} + +// 初始化函数 +int BSP_Ml307_Init(struct Ml307_Ops *ops, rt_uint8_t version) +{ + if (ops->frame == RT_NULL) + { + LOG_E("Memory allocation failed"); + return -RT_ENOMEM; + } + rt_memset(ops->frame, 0, sizeof(struct Ml307DataFrame)); + + ops->frame->header[0] = 0x4A; + ops->frame->header[1] = 0x54; + ops->frame->header[2] = 0x34; + + ops->frame->version = version; + ops->frame->manufacture = DEVICE_MANUFACTURE; + + ops->frame->tail[0] = 0x42; + ops->frame->tail[1] = 0x4A; + ops->frame->tail[2] = 0x51; + + return RT_EOK; +} +// 更新函数 +int BSP_Ml307_Update(struct Ml307_Ops *ops, rt_uint8_t device_type, rt_uint8_t event_type) +{ + ops->body->device_type = device_type; + ops->body->event_type = event_type; + ops->body->hw = (rt_uint8_t)Flash_Get_SysCfg(kHwVerId); + ops->body->sw = (rt_uint8_t)Flash_Get_SysCfg(kSwVerId); + rt_memcpy(ops->body->imei, &ml307, sizeof(ml307_sys_info)); // 直接赋值结构体数据 +// rt_memcpy(&(ops->body->lel), &Sensor_device.Data, (rt_ubase_t)offsetof(TsH308Data, checksum)); // 复制除了校验码以外的数据 + ops->body->product_work_temperature = ops->body->temp; // 暂时定为激光器测量的环境温度 + ops->body->work_duration = work_duration; + ops->body->device_status = device_state_flag; +// ops->body->emv_status = emv_state_flag; +// ops->body->relay_status = relay_state_flag; + + return RT_EOK; +} + +int Ml307_Send_Data(struct Ml307_Ops *ops, rt_uint8_t data_num, rt_uint8_t cmd, rt_uint8_t device_type, rt_uint8_t event_type) +{ + int ret = 0; + char data_buf[512] = {0}; + char temp[3]; // 临时缓冲区,用于存储每个字节的十六进制表示 + + if (ops == NULL || ops->body == NULL) + { + // 处理 ops 或 ops->body 为 NULL 的情况 + return RT_ERROR; // 或者抛出异常,返回错误码等 + } + + if (sizeof(struct DataBody) == 0) + { + data_buf[0] = '\0'; // 确保 data_buf 被正确初始化 + return RT_ERROR; + } + + 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) + { + for (int i = 0; i < sizeof(struct DataBody); i++) + { + rt_snprintf(temp, sizeof(temp), "%02X", ((rt_uint8_t *)ops->body)[i]); + rt_memcpy(data_buf + i * 2, temp, 2); + } + rt_mutex_release(ml307_mutex); + ret = _Send_Handle(ops, data_num, cmd, data_buf); + if (ret != RT_EOK) + { + + return -ret; + } + rt_mutex_release(ml307_mutex); + } + + } + else + { + LOG_E("ml307_conncet_tcp_flag = 0"); + ret = -RT_ERROR; + } + return ret; +} + +int Data_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) +{ + if (ml307_conncet_tcp_flag != 1) + { + LOG_E("ml307_conncet_tcp_flag error"); + return -RT_ERROR; + } + + char data_buf[512] = {0}; + + rt_int32_t len = rt_snprintf(data_buf, sizeof(data_buf), "%02X%02X%30s%02X", device_type, event_type, data, res); + if (len < 0 || len >= sizeof(data_buf)) + { + LOG_E("Resp Data buffer overflow"); + return -RT_ERROR; + } + // LOG_D("data_buf: %s", data_buf); + return _Send_Handle(ops, data_num, cmd, data_buf); +} + +int Ml307_Recv_Data(struct Ml307_Ops *ops, char *data) +{ + // ops->body = (struct DataBody *)rt_malloc(sizeof(struct DataBody)); + // rt_memset(ops->body, 0, sizeof(struct DataBody)); + // rt_free(ops->body); + return RT_EOK; +} + +/***************************************发送处理函数************************************************ */ +/** + * 处理定时心跳事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Heartbeat(struct at_device *device, void *param) +{ + + struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; + int ret = 0; + + if ((device == RT_NULL) || (ml307_ops == RT_NULL)) + { + LOG_E("ml307 param error\n"); + return RT_ERROR; + } + ret = device->class->device_ops->control(device, AT_DEVICE_CTRL_GET_SIGNAL, RT_NULL); + if (ret != RT_EOK) + { + LOG_E("ml307 get signal failed\n"); + return -RT_ERROR; + } + ret = ml307_ops->send(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_DEVICE_DATA_REPORT, DEVICE_TYPE_ML307, EVENT_TYPE_HEARTBEAT); + if (ret != RT_EOK) + { + LOG_E("ml307 send data failed\n"); + return ret; + } + + return RT_EOK; +} + +/** + * 处理时间校准事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Time_Calibration(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_TIME_CALIBRATION, DEVICE_TYPE_ML307, EVENT_TYPE_TIME_CALIBRATION)) + { + LOG_E("ml307 send cmd[%X] failed\n", CMD_TYPE_TIME_CALIBRATION); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理报警事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Alarm(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_ALARM)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_ALARM); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理报警恢复事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Alarm_Recover(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_ALARM_RECOVER)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_ALARM_RECOVER); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理故障事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Fault(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_FAULT)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_FAULT); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理故障恢复事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Fault_Recover(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_FAULT_RECOVER)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_FAULT_RECOVER); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理自检事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Self_Check(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_SELF_CHECK)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_SELF_CHECK); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理消音事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Silence(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_SILENCE)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_SILENCE); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理异常事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Exception(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_EXCEPTION)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_EXCEPTION); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理电磁阀状态改变事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Valve_Status(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_STATUS)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_VALVE_STATUS); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理风扇状态改变事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Fan_Status(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_FAN_STATUS)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_FAN_STATUS); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理温度异常事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Temp_Anomaly(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_TEMP_ANOMALY)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_TEMP_ANOMALY); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 处理断电事件 + * @param device 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Power_Off(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_OFF)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_POWER_OFF); + return -RT_ERROR; + } + 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 设备结构体指针 + * @param param 操作结构体指针 + * @return 操作结果 + */ +int Ml307_Send_Device_Failure(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_DEVICE_FAILURE)) + { + LOG_E("ml307 send cmd[%X] failed\n", EVENT_TYPE_DEVICE_FAILURE); + return -RT_ERROR; + } + return RT_EOK; +} +/*这个【4、优先级最低当同时触发后,相同服务直接合并】暂时还没想好怎么做, +思路感觉就是得重新开一个线程,然后再开一个任务队列,将所有的事件,发送到任务队列 +在线程中,对任务队列进行查看并处理,看目前都有哪些事件,是处于那个优先级得,如果是最低优先级,就只发送一帧数据就行了, +如果是不同优先级,按照优先级顺序发送事件,但感觉这样会使得程序更复杂,本来发送就很快,感觉没必要这样搞*/ +const Ml307EventInfo ml307_event_info[] = { + {kMl307PowerOnEvent, ML307_PRIORITY_HIGHEST, "上电心跳事件", Ml307_Send_Power_On}, + {kMl307PowerDownEvent, ML307_PRIORITY_HIGH, "掉电事件", Ml307_Send_Power_Off}, + {kMl307SelfCheckEvent, ML307_PRIORITY_MEDIUM, "自检事件", Ml307_Send_Self_Check}, + {kMl307HeartbeatEvent, ML307_PRIORITY_LOWEST, "定时心跳事件", Ml307_Send_Heartbeat}, + {kMl307TempAnomalyEvent, ML307_PRIORITY_LOWEST, "温度异常事件", Ml307_Send_Temp_Anomaly}, + {kMl307AlarmEvent, ML307_PRIORITY_LOWEST, "报警触发事件", Ml307_Send_Alarm}, + {kMl307AlarmRcyEvent, ML307_PRIORITY_LOWEST, "报警解除事件", Ml307_Send_Alarm_Recover}, + {kMl307FaultEvent, ML307_PRIORITY_LOWEST, "传感器故障事件", Ml307_Send_Fault}, + {kMl307FaultRcyEvent, ML307_PRIORITY_LOWEST, "传感器故障解除事件", Ml307_Send_Fault_Recover}, + {kMl307TimeCalibrationEvent, ML307_PRIORITY_LOWEST, "时间校准事件", Ml307_Send_Time_Calibration}, + {kMl307SilenceEvent, ML307_PRIORITY_LOWEST, "消音事件", Ml307_Send_Silence}, + {kMl307ExceptionEvent, ML307_PRIORITY_LOWEST, "异常事件", Ml307_Send_Exception}, + {kMl307ValveStatusEvent, ML307_PRIORITY_LOWEST, "电磁阀状态改变事件", Ml307_Send_Valve_Status}, + {kMl307FanStatusEvent, ML307_PRIORITY_LOWEST, "风机状态改变事件", Ml307_Send_Fan_Status}, + {kMl307DeviceFailureEvent, ML307_PRIORITY_LOWEST, "设备失效事件", Ml307_Send_Device_Failure}}; + +/** + * 处理ML307设备的事件 + * @param ml307_recv_event 接收到的ML307事件标志 + * @return + */ +int Ml307_Process_Events(Ml307Event ml307_recv_event, struct at_device *device, void *param) +{ + struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)param; + const Ml307EventInfo *event = RT_NULL; + + for (size_t i = 0; i < sizeof(ml307_event_info) / sizeof(Ml307EventInfo); ++i) + { + // 检查当前事件是否在接收到的事件标志中 + if (ml307_recv_event == ml307_event_info[i].event_flag) + { + event = &ml307_event_info[i]; + break; + } + } + + // 处理该事件 + if (event) + { + // 打印事件的名称 + LOG_D("%s上报\n", event->event_name); + + // 如果事件有关联的发送函数,则调用该发送函数 + if (event->send_func) + { + int result = event->send_func(device, ml307_ops); + if (result != RT_EOK) + { + LOG_E("ml307 send cmd failed\n"); + Ml307_Reset(device); // 重启模组 + 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) // 打开连接 + { + Reset_Ml307_Life_Timer(); + // 重启后重新尝试发送 + result = event->send_func(device, ml307_ops); + if (result != RT_EOK) + { + LOG_E("ml307 send cmd after module reset failed\n"); + + // Flash_Set_WorkDuration(work_duration); // 重启前保存参数 + // NVIC_SystemReset(); // 直接重启系统 + + Ml307_Reset(device); + rt_thread_mdelay(5000); + } + } + else + { + LOG_E("ml307 connect tcp failed\n"); + } + } + } + else + return RT_EOK; + } + } + // 函数执行完毕,返回0 + return RT_EOK; +} + +// 比较帧头和帧尾 +int Compare_HeaderToTail(struct Ml307_Ops *ops) +{ + // 比较帧头 + for (int i = 0; i < 3; i++) + { + if (ops->frame->header[i] != ops->recv->header[i]) + { + LOG_E("ops->frame->header[%x] != ops->recv->header[%x]\n", ops->frame->header[i], ops->recv->header[i]); + + return -1; + } + } + + // 比较帧尾 + for (int i = 0; i < 3; i++) + { + if (ops->frame->tail[i] != ops->recv->tail[i]) + { + LOG_E("ops->frame->tail[%x] != ops->recv->tail[%x]\n", ops->frame->tail[i], ops->recv->tail[i]); + + return -2; + } + } + if (ops->recv->recv_data.res_num != RESPONSE_CODE_SUCCESS) // 判断是否为成功响应 + { + LOG_E("ops->recv->recv_data.res_num[%x] != RESPONSE_CODE_SUCCESS\n", ops->recv->recv_data.res_num); + + return -3; + } + return RT_EOK; +} + +void Handle_Server_Reply(struct Ml307_Ops *ops) +{ + if (ops->recv->recv_data.event_type == INSTRUCTION_HEART_BEAT) + { + LOG_D("ml307 send data success\n"); + } +} + +void Handle_Self_Check(struct Ml307_Ops *ops) +{ + LOG_D("服务器下发自检指令\n"); + char imei[16] = {0}; + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + LOG_D("imei:%s\n", imei); + _Self_Check_Mode(); + rt_thread_mdelay(100); + + char temp[32] = "0"; + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + LOG_D("temp: %s", temp); + + 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(SysControl.status); // 自检完要恢复当前系统状态,恢复现场 +} + +void Handle_Mute(struct Ml307_Ops *ops) +{ + LOG_D("服务器下发消音指令\n"); + + char imei[16] = {0}; + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + char temp[32] = "0"; + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + + Send_Laser_Alarm_Event(KMuteEvent); + rt_thread_mdelay(100); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_MUTE, temp, RESPONSE_CODE_SUCCESS); +} + +void Handle_Close_Valve(struct Ml307_Ops *ops) +{ + LOG_D("服务器下发关闭阀门指令\n"); + + char imei[16] = {0}; + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + char temp[32] = "0"; + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + + // emv_state_flag = 1; + // rt_thread_mdelay(20); + // emv_state_flag = 0; + // rt_uint8_t ret = BSP_Set_Emv_Status(0); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); +} + +void Handle_Open_Valve(struct Ml307_Ops *ops) +{ + LOG_D("服务器下发打开阀门指令\n"); + + // char imei[16] = {0}; + // Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + // char temp[32] = "0"; + // String2Hex(temp, imei); // 将字符串转为十六进制字符串 + + // // rt_uint8_t ret = BSP_Set_Emv_Status(1); + // emv_state_flag = 1; // 电磁阀动作 + // rt_thread_mdelay(20); + // emv_state_flag = 0; + + // ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_OPEN_VALVE, temp, RESPONSE_CODE_SUCCESS); +} + +void Handle_Open_Relay(struct Ml307_Ops *ops) +{ + LOG_D("服务器下发打开继电器指令\n"); + + char imei[16] = {0}; + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + char temp[32] = "0"; + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + // relay_state_flag = 1; + rt_thread_mdelay(10); + // rt_uint8_t ret = BSP_Set_Relay_Status(0); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_OPEN_RELAY, temp, RESPONSE_CODE_SUCCESS); +} + +void Handle_Close_Relay(struct Ml307_Ops *ops) +{ + LOG_D("服务器下发关闭继电器指令\n"); + + char imei[16] = {0}; + char temp[32] = "0"; + + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + + // relay_state_flag = 0; + rt_thread_mdelay(100); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CLOSE_RELAY, temp, RESPONSE_CODE_SUCCESS); +} + +void Handle_Query_Params(struct Ml307_Ops *ops) +{ + rt_uint8_t data[10] = {0}; + char str[64] = {0}; + LOG_D("服务器下发查询系统参数\n"); + + rt_memcpy(data, (rt_uint8_t *)FLASH_HW_VER_ADDR, sizeof(sys_config_info) - 50); + LOG_D("hw_ver:%02x sw_ver:%02x alarm_low:%02x alarm_high:%02x temp_alarm:%02x nb_upload_cycle:%dmin retry:%02x emagnetic:%02X relay_switch:%02X\n", + data[0], data[1], data[2], data[3], data[4], ((data[5]) | (data[6] << 8)), data[7], data[8], data[9]); + + rt_sprintf(str, "0000000000%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", + data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9]); + rt_thread_mdelay(100); // 释放下线程 + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_QUERY_PARAMS, str, RESPONSE_CODE_SUCCESS); +} + +int Handle_Config_Params(struct Ml307_Ops *ops) +{ + char data_buf[32] = {0}; + rt_uint8_t recv_data[16] = {0}; + rt_uint8_t flash_info[16] = {0}; + char imei[16] = {0}; + char temp[32] = "0"; + + LOG_D("服务器下发配置参数\n"); + + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + + rt_memset(data_buf, '0', 32); + rt_memcpy(recv_data, (ops->recv->recv_data.res_data + 5), sizeof(sys_config_info) - 50); + rt_memcpy(flash_info, (rt_uint8_t *)FLASH_HW_VER_ADDR, sizeof(sys_config_info) - 50); + + LOG_D("hw_ver:%02x sw_ver:%02x alarm_low:%02x alarm_high:%02x temp_alarm:%02x nb_upload_cycle:%d min retry:%02x emagnetic:%02X relay_switch:%02X\n", + flash_info[0], flash_info[1], flash_info[2], flash_info[3], flash_info[4], (flash_info[5] | (flash_info[6] << 8)), flash_info[7], flash_info[8], recv_data[9]); + LOG_D("recv_data: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n", + recv_data[0], recv_data[1], recv_data[2], recv_data[3], recv_data[4], + recv_data[5], recv_data[6], recv_data[7], recv_data[8], recv_data[9], + recv_data[10], recv_data[11], recv_data[12], recv_data[13], recv_data[14], recv_data[15]); + LOG_D("data:%s\n", data_buf); + + for (rt_uint8_t i = 0; i < (sizeof(sys_config_info) - 50); i++) + { + LOG_D("recv_data[%d] = %d", i, recv_data[i]); + if (recv_data[i] != flash_info[i]) + { + if ((recv_data[2] > 25) || (recv_data[2] < 5)) /*家报的报警设定值应在5%~25%之间*/ + { + if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_ACTION_FAILURE) == RT_EOK) + { + LOG_W("recv_data[3] :%d", recv_data[3]); + LOG_W("配置参数超出范围,请核实后重试\n"); + } + return RT_EOK; + } + else // 如果没有超出,再写入信息 + { + if (BSP_Flash_Write_Info(recv_data, sizeof(sys_config_info) - 50) != 0) + { + rt_uint16_t nb_upload_time = (uint16_t)Flash_Get_SysCfg(kIotUploadCycleId); + unsigned long timeout = nb_upload_time * 60 * RT_TICK_PER_SECOND; + // rt_timer_stop(ml307_timer); + rt_timer_control(ml307_timer, RT_TIMER_CTRL_SET_TIME, (void *)&timeout); // 更新上报周期 + // rt_timer_control(ml307_timer, RT_TIMER_CTRL_GET_TIME, &timeout); + // LOG_D("timeout:%d", timeout/1000/60); + // rt_timer_start(ml307_timer); + LOG_D("上报周期由%dmin更新为%dmin", ((flash_info[5] << 8) | flash_info[6]), nb_upload_time); + if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_SUCCESS) == RT_EOK) + { + LOG_D("配置参数写入成功\n"); + } + return RT_EOK; + } + else + { + LOG_D("配置参数写入失败\n"); + if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_ACTION_FAILURE) == RT_EOK) + { + LOG_D("写入失败响应成功\n"); + } + return RT_ERROR; + } + } + } + } + if (ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_CONFIG_PARAMS, temp, RESPONSE_CODE_SUCCESS) == RT_EOK) + { + LOG_D("配置参数没有变化\n"); + } + return RT_EOK; +} + +void Handle_Time_Calibration_Data(struct Ml307_Ops *ops) +{ + rt_uint8_t data[10] = {0}; + TsRtcDateTime rtc_dt; + char imei[16] = {0}; + char temp[32] = "0"; + + LOG_D("时间校准数据\n"); + + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + + rt_memcpy(data, ops->recv->recv_data.res_data, sizeof(data)); + + // 提取后4个字节作为时间戳 + time_t timestamp = (data[6] << 24) | (data[7] << 16) | (data[8] << 8) | data[9]; + Timestamp_To_Rtc_DateTime(timestamp, &rtc_dt); + // 打印结果 + LOG_I("时间: %04d-%02d-%02d %02d:%02d:%02d (星期%d)\n", + rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second, rtc_dt.week); + RTC_SetTime(rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, 0); /* Setup Time */ + rt_thread_mdelay(100); // 释放下线程 + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_TIME_CALIBRATION, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_TIME_CALIBRATION, temp, RESPONSE_CODE_SUCCESS); +} + +//下发修改服务器地址指令 +void Handle_Sever_Addr_Set(struct Ml307_Ops *ops) +{ + 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); // 将字符串转为十六进制字符串 + rt_memcpy(data, (ops->recv->recv_data.res_data + 9), FLASH_SERVER_LEN); + 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]); + Flash_Set_Sever_Addr_Info(data); + if(Flash_Get_Sever_Addr_Info(&sever_info) != RT_EOK) + { + LOG_E("服务器地址修改失败\n"); + } + else + { + LOG_D("服务器地址修改成功\n"); + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_SEVER_ADDR, temp, RESPONSE_CODE_SUCCESS); + } + +} + +void Handle_Error(struct Ml307_Ops *ops, rt_err_t ret) +{ + LOG_E("数据帧解析失败,错误码: %d", ret); + + char imei[16] = {0}; + char temp[32] = "0"; + + Get_Iot_Imei(imei, FLASH_NB_IMEI_LEN); + String2Hex(temp, imei); // 将字符串转为十六进制字符串 + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, ops->recv->cmd, temp, RESPONSE_CODE_PARSE_FAIL); +} + +void Handle_Instruction_Down(struct Ml307_Ops *ops) +{ + struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)ops; + + switch (ml307_ops->recv->recv_data.event_type) + { + case INSTRUCTION_DOWN_SELF_CHECK: + Handle_Self_Check(ml307_ops); + break; + case INSTRUCTION_DOWN_MUTE: + Handle_Mute(ml307_ops); + break; + case INSTRUCTION_DOWN_CLOSE_VALVE: + Handle_Close_Valve(ml307_ops); + break; + case INSTRUCTION_DOWN_OPEN_VALVE: + Handle_Open_Valve(ml307_ops); + break; + case INSTRUCTION_DOWN_OPEN_RELAY: + Handle_Open_Relay(ml307_ops); + break; + case INSTRUCTION_DOWN_CLOSE_RELAY: + Handle_Close_Relay(ml307_ops); + break; + case INSTRUCTION_DOWN_QUERY_PARAMS: + Handle_Query_Params(ml307_ops); + break; + case INSTRUCTION_DOWN_CONFIG_PARAMS: + Handle_Config_Params(ml307_ops); + break; + case INSTRUCTION_DOWN_TIME_CALIBRATION: + Handle_Time_Calibration_Data(ml307_ops); + break; + case INSTRUCTION_DOWN_SEVER_ADDR: + Handle_Sever_Addr_Set(ml307_ops); + break; + } +} + +void Handle_Time_Calibration(struct Ml307_Ops *ops) +{ + rt_uint8_t data[10] = {0}; + LOG_D("服务器下发时间校准数据\n"); + rt_memcpy(data, ops->recv->recv_data.res_data, sizeof(data)); + TsRtcDateTime rtc_dt; + // 提取后4个字节作为时间戳 + time_t timestamp = (data[6] << 24) | (data[7] << 16) | (data[8] << 8) | data[9]; + Timestamp_To_Rtc_DateTime(timestamp, &rtc_dt); + // 打印结果 + LOG_I("时间: %04d-%02d-%02d %02d:%02d:%02d (星期%d)\n", + rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second, rtc_dt.week); + RTC_SetTime(rtc_dt.year, rtc_dt.month, rtc_dt.day, rtc_dt.hour, rtc_dt.minute, rtc_dt.second); /* Setup Time */ + ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, INSTRUCTION_DOWN_TIME_CALIBRATION, ML307_DEFIENE_DATA, RESPONSE_CODE_SUCCESS); +} + +void Handle_Cmd_Type(struct Ml307_Ops *ops) +{ + struct Ml307_Ops *ml307_ops = (struct Ml307_Ops *)ops; + + switch (ml307_ops->recv->cmd) + { + case CMD_TYPE_SERVER_REPLY: + Handle_Server_Reply(ml307_ops); + break; + case CMD_TYPE_INSTRUCTION_DOWN: + Handle_Instruction_Down(ml307_ops); + break; + case CMD_TYPE_TIME_CALIBRATION: + Handle_Time_Calibration(ml307_ops); + break; + default: + ml307_ops->Resp(ml307_ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_ML307, ops->recv->cmd, ML307_DEFIENE_DATA, RESPONSE_CODE_PARSE_FAIL); + break; + } +} + +void Analyze_Recv_Frame(struct at_device *device, struct Ml307_Ops *ops) +{ + rt_err_t ret = RT_EOK; + Reset_Ml307_Life_Timer(); // 只要数据,则重置定时器,不管数据是否正确 + + ret = Compare_HeaderToTail(ops); + if (ret == RT_EOK) + { + Handle_Cmd_Type(ops); + } + else + { + Handle_Error(ops, ret); + } +} + +/* +上电模式 +发送一包数据后,转换到检测模式 120分钟发送一次数据 +当有事件发生时,发送一包事件数据包 +*/ +static void Ml307_Send_Thread_Entry(void *param) +{ + rt_uint16_t cnt = 0; + rt_err_t result = RT_EOK; + rt_uint32_t ml307_recv_event; + LOG_D("ml307 thread entry\n"); + + struct Ml307_Ops *ops = (struct Ml307_Ops *)param; + struct at_device_ml307 *ml307 = &_dev; + struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); + RT_ASSERT(device); + + if (ops->init(ops, PROTOCOL_VERSION) != RT_EOK) + { + LOG_E("ml307 init failed\n"); + } + else + { + LOG_D("ml307 init success\n"); + while (cnt < 5000)//等待激光器进入正常工作状态 + { + if (SysControl.status == kNormalDetectionEvents) + { + break; + } + cnt++; + rt_thread_mdelay(10); + } + rt_completion_wait(&ml307_init_complate, RT_WAITING_FOREVER); // wait for ml307 init finish + Ml307_Send_Event(kMl307PowerOnEvent); + } + while (1) + { + result = rt_event_recv(&at_device_event, + Ml307_Get_Event_Flag(kMl307PowerOnEvent) | + Ml307_Get_Event_Flag(kMl307HeartbeatEvent) | + Ml307_Get_Event_Flag(kMl307SelfCheckEvent) | + Ml307_Get_Event_Flag(kMl307SilenceEvent) | + Ml307_Get_Event_Flag(kMl307ExceptionEvent) | + Ml307_Get_Event_Flag(kMl307ValveStatusEvent) | + Ml307_Get_Event_Flag(kMl307FanStatusEvent) | + Ml307_Get_Event_Flag(kMl307TempAnomalyEvent) | + Ml307_Get_Event_Flag(kMl307PowerOnEvent) | + Ml307_Get_Event_Flag(kMl307PowerDownEvent) | + Ml307_Get_Event_Flag(kMl307AlarmEvent) | + Ml307_Get_Event_Flag(kMl307AlarmRcyEvent) | + Ml307_Get_Event_Flag(kMl307FaultEvent) | + Ml307_Get_Event_Flag(kMl307FaultRcyEvent) | + Ml307_Get_Event_Flag(kMl307DeviceFailureEvent) | + Ml307_Get_Event_Flag(kMl307TimeCalibrationEvent), + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_FOREVER, &ml307_recv_event); // 这个事件一般是设备端发生了变化,发送到服务器时调用 + + if (result == RT_EOK) + { + LOG_D("ml307 recv event OK\n"); + if (ml307_conncet_tcp_flag != 1) + { + if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接 + { + LOG_I("ml307 connect tcp success\n"); + rt_timer_start(ml307_life_timer); + } + else + { + LOG_E("ml307 connect tcp failed\n"); + } + } + if (ml307_conncet_tcp_flag) + { + Reset_Ml307_Life_Timer(); + if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307PowerOnEvent)) + { + result = Ml307_Process_Events(kMl307PowerOnEvent, device, ops); // 当上电心跳包发送不成功时,其他事件不启动 + if (result) + { + power_on_send_flag = 0; + rt_timer_start(ml307_power_error_timer); // 启动重连定时器, 3min一次,直到发送成功 + LOG_E("ml307 send data failed result = [%d]\n", result); + } + else + { + rt_timer_start(ml307_timer); // 当上电心跳包发送成功时, 开始心跳包周期发送 + power_on_send_flag = 1; + Ml307_Send_Event(kMl307TimeCalibrationEvent); // 上电网络连接成功时,更新下时间 + rt_timer_start(ml307_upload_timer); + } + } + if (power_on_send_flag) + { + if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307HeartbeatEvent)) + { + result = Ml307_Process_Events(kMl307HeartbeatEvent, 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); + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307AlarmEvent)) + { + result = Ml307_Process_Events(kMl307AlarmEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307AlarmRcyEvent)) + { + result = Ml307_Process_Events(kMl307AlarmRcyEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307FaultEvent)) + { + if (device_state_flag != 1) // 当设备失效时,只上报失效信息 + { + result = Ml307_Process_Events(kMl307FaultEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307FaultRcyEvent)) + { + result = Ml307_Process_Events(kMl307FaultRcyEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307SelfCheckEvent)) + { + result = Ml307_Process_Events(kMl307SelfCheckEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307SilenceEvent)) + { + result = Ml307_Process_Events(kMl307SilenceEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307ExceptionEvent)) + { + result = Ml307_Process_Events(kMl307ExceptionEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307ValveStatusEvent)) + { + result = Ml307_Process_Events(kMl307ValveStatusEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307FanStatusEvent)) + { + result = Ml307_Process_Events(kMl307FanStatusEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307TempAnomalyEvent)) + { + result = Ml307_Process_Events(kMl307TempAnomalyEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307PowerDownEvent)) + { + result = Ml307_Process_Events(kMl307PowerDownEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + ml307_event_initialized = RT_FALSE; // 当接收到掉电事件时,发送完成后删除事件,不再接收其他事件 + rt_event_detach(&at_device_event); + } + else if (ml307_recv_event & Ml307_Get_Event_Flag(kMl307DeviceFailureEvent)) + { + result = Ml307_Process_Events(kMl307DeviceFailureEvent, device, ops); + if (result) + { + LOG_E("ml307 send data failed result = [%d]\n", result); + } + } + } + rt_thread_mdelay(1); // 释放下线程 + } + } + } +} + +static void Ml307_Recv_Thread_Entry(void *parameter) +{ + struct Ml307_Ops *ops = (struct Ml307_Ops *)parameter; + struct at_device_ml307 *ml307 = &_dev; + struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); + RT_ASSERT(device); + rt_err_t ret; + + LOG_D("ml307 recv thread entry\n"); + + while (1) + { + ret = rt_sem_take(ml307_recv_sem, RT_WAITING_FOREVER); // 这个主要用来处理的数据 + if (ret == RT_EOK) + { + rt_timer_start(ml307_life_timer); + /*对数据帧进行分析,判断所处的是对服务器响应还是指令下发*/ + Analyze_Recv_Frame(device, ops); + } + } +} + +static void Ml307_Life_Thread_Entry(void *parameter) +{ + + struct at_device_ml307 *ml307 = &_dev; + struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, ml307->device_name); + RT_ASSERT(device); + rt_err_t ret; + + LOG_D("ml307_life_thread entry\n"); + + while (1) + { + ret = rt_sem_take(ml307_life_sem, RT_WAITING_FOREVER); + if (ret == RT_EOK) + { + if (ml307_conncet_tcp_flag) + { + device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_DISCONN, RT_NULL); + LOG_D("close ml307 tcp connect\n "); + } + } + } +} + +// 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接 +static void Ml307_Upload_Timer_Cb(void *parameter) +{ + Ml307_Send_Event(kMl307TimeCalibrationEvent); // 更新下时间 +} + +int BSP_Ml307_Thread_Init(void) +{ + rt_err_t ret; + + Ml307_Event_Init(); + rt_uint32_t nb_upload_time = (uint16_t)Flash_Get_SysCfg(kIotUploadCycleId); + unsigned long timeout = nb_upload_time * 60 * RT_TICK_PER_SECOND; + LOG_I("上报服务器周期:%d分钟", nb_upload_time); + ml307_mutex = rt_mutex_create("ml307_mutex", RT_IPC_FLAG_FIFO); + if (ml307_mutex == RT_NULL) + { + LOG_E("ml307_mutex create failed"); + } + ml307_recv_sem = rt_sem_create("ml307_recv", 0, RT_IPC_FLAG_FIFO); + if (ml307_recv_sem == RT_NULL) + { + 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) + { + LOG_E("ml307_life_sem create failed"); + } + // 创建定时器 + ml307_timer = rt_timer_create("heartbeat", + Ml307_Ht_Timer_Cb, // 回调函数 + RT_NULL, // 参数 + timeout, // 定时周期(120分钟) + RT_TIMER_FLAG_PERIODIC); // 周期性定时器 + + if (ml307_timer == RT_NULL) + { + rt_kprintf("创建定时器失败\n"); + return -1; + } + ml307_life_timer = rt_timer_create("ml307_life", + Ml307_Life_Timer_Cb, + RT_NULL, + 30 * RT_TICK_PER_SECOND, + RT_TIMER_FLAG_ONE_SHOT); + if (ml307_life_timer == RT_NULL) + { + rt_kprintf("创建定时器失败\n"); + return -1; + } + ml307_power_error_timer = rt_timer_create("ml307_error_timer", + Ml307_Error_Timer_Cb, + RT_NULL, + 3 * 60 * RT_TICK_PER_SECOND, // (3分钟) + RT_TIMER_FLAG_PERIODIC); + ml307_upload_timer = rt_timer_create("ml307_upload_timer", + Ml307_Upload_Timer_Cb, + RT_NULL, + 24 * 60 * RT_TICK_PER_SECOND, // + RT_TIMER_FLAG_PERIODIC); + // 创建定时器 + ml307_heartbeat_check_timer = rt_timer_create("ml307_check_hb", + Ml307_Heartbeat_check_Timer_Cb, + RT_NULL, + timeout * 3, // 3个定时心跳没有发送,就重启发送 + RT_TIMER_FLAG_PERIODIC); + + if (ml307_heartbeat_check_timer != RT_NULL) + { + rt_timer_start(ml307_heartbeat_check_timer); + } + 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, + "ml307_recv_thread", + Ml307_Recv_Thread_Entry, + &ml307_ops, + &ml307_recv_thread_stack[0], + sizeof(ml307_recv_thread_stack), + ML307_RECV_THREAD_PRIORITY, + ML307_RECV_THREAD_TICKS); + rt_thread_startup(&ml307_recv_thread); + + ret = rt_thread_init(&ml307_life_thread, + "ml307_life_thread", + Ml307_Life_Thread_Entry, + &ml307_ops, + &ml307_life_thread_stack[0], + sizeof(ml307_life_thread_stack), + ML307_LIFE_THREAD_PRIORITY, + ML307_LIFE_THREAD_TICKS); + rt_thread_startup(&ml307_life_thread); + + return ret; +} +INIT_APP_EXPORT(BSP_Ml307_Thread_Init); + +static int ml307_device_register(void) +{ + struct at_device_ml307 *ml307 = &_dev; + + return at_device_register(&(ml307->device), + ml307->device_name, + ml307->client_name, + AT_DEVICE_CLASS_ML307, + (void *)ml307); +} +INIT_COMPONENT_EXPORT(ml307_device_register); + +#endif // IOT_MODULE_SWITCH diff --git a/libraries/hal_drivers/drv_adc.c b/libraries/hal_drivers/drv_adc.c index 12a0239..571da36 100644 --- a/libraries/hal_drivers/drv_adc.c +++ b/libraries/hal_drivers/drv_adc.c @@ -29,7 +29,7 @@ static ADC_HandleTypeDef adc_config[] = .Init.ADC_ContinuousConvMode = DISABLE, \ .Init.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None, \ .Init.ADC_DataAlign = ADC_DataAlign_Right, \ - .Init.ADC_NbrOfChannel = 1, \ + .Init.ADC_IotrOfChannel = 1, \ }, #endif @@ -41,7 +41,7 @@ static ADC_HandleTypeDef adc_config[] = .Init.ADC_ContinuousConvMode = DISABLE, \ .Init.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None, \ .Init.ADC_DataAlign = ADC_DataAlign_Right, \ - .Init.ADC_NbrOfChannel = 1, \ + .Init.ADC_IotrOfChannel = 1, \ } #endif }; diff --git a/libraries/hal_libraries/ch32v303_hal/include/ch32v30x_adc.h b/libraries/hal_libraries/ch32v303_hal/include/ch32v30x_adc.h index b0034ed..63b23e8 100644 --- a/libraries/hal_libraries/ch32v303_hal/include/ch32v30x_adc.h +++ b/libraries/hal_libraries/ch32v303_hal/include/ch32v30x_adc.h @@ -42,7 +42,7 @@ typedef struct uint32_t ADC_DataAlign; /* Specifies whether the ADC data alignment is left or right. This parameter can be a value of @ref ADC_data_align */ - uint8_t ADC_NbrOfChannel; /* Specifies the number of ADC channels that will be converted + uint8_t ADC_IotrOfChannel; /* Specifies the number of ADC channels that will be converted using the sequencer for regular channel group. This parameter must range from 1 to 16. */ diff --git a/libraries/hal_libraries/ch32v303_hal/include/ch32v30x_usb.h b/libraries/hal_libraries/ch32v303_hal/include/ch32v30x_usb.h index 2fb5475..56b42d1 100644 --- a/libraries/hal_libraries/ch32v303_hal/include/ch32v30x_usb.h +++ b/libraries/hal_libraries/ch32v303_hal/include/ch32v30x_usb.h @@ -783,7 +783,7 @@ typedef struct __attribute__((packed)) _USB_HUB_DESCR { uint8_t bDescLength; uint8_t bDescriptorType; - uint8_t bNbrPorts; + uint8_t bIotrPorts; uint8_t wHubCharacteristicsL; uint8_t wHubCharacteristicsH; uint8_t bPwrOn2PwrGood; diff --git a/libraries/hal_libraries/ch32v303_hal/source/ch32v30x_adc.c b/libraries/hal_libraries/ch32v303_hal/source/ch32v30x_adc.c index 54ed35e..4f0538c 100644 --- a/libraries/hal_libraries/ch32v303_hal/source/ch32v30x_adc.c +++ b/libraries/hal_libraries/ch32v303_hal/source/ch32v30x_adc.c @@ -163,7 +163,7 @@ void ADC_Init(ADC_TypeDef *ADCx, ADC_InitTypeDef *ADC_InitStruct) tmpreg1 = ADCx->RSQR1; tmpreg1 &= RSQR1_CLEAR_Mask; - tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1); + tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_IotrOfChannel - (uint8_t)1); tmpreg1 |= (uint32_t)tmpreg2 << 20; ADCx->RSQR1 = tmpreg1; } @@ -186,7 +186,7 @@ void ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct) ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; - ADC_InitStruct->ADC_NbrOfChannel = 1; + ADC_InitStruct->ADC_IotrOfChannel = 1; } /********************************************************************* diff --git a/packages/at_device-2.1.0/at_device.h b/packages/at_device-2.1.0/at_device.h index f30caf7..6a5033e 100644 --- a/packages/at_device-2.1.0/at_device.h +++ b/packages/at_device-2.1.0/at_device.h @@ -55,7 +55,7 @@ extern "C" { #define AT_DEVICE_CLASS_L610 0X15U #define AT_DEVICE_CLASS_ML305 0X16U #define AT_DEVICE_CLASS_ML307 0X17U -#define AT_DEVICE_CLASS_MB26 0X18U +#define AT_DEVICE_CLASS_MB26 0X18U /* Options and Commands for AT device control opreations */ #define AT_DEVICE_CTRL_POWER_ON 0x01L diff --git a/rt-thread/include/rtdef.h b/rt-thread/include/rtdef.h index 442ee58..a9741e1 100644 --- a/rt-thread/include/rtdef.h +++ b/rt-thread/include/rtdef.h @@ -113,8 +113,8 @@ typedef unsigned int rt_size_t; /**< Type for size numbe #endif /* RT_USING_ARCH_DATA_TYPE */ typedef int rt_bool_t; /**< boolean type */ -typedef long rt_base_t; /**< Nbit CPU related date type */ -typedef unsigned long rt_ubase_t; /**< Nbit unsigned CPU related data type */ +typedef long rt_base_t; /**< Iotit CPU related date type */ +typedef unsigned long rt_ubase_t; /**< Iotit unsigned CPU related data type */ typedef rt_base_t rt_err_t; /**< Type for error number */ typedef rt_uint32_t rt_time_t; /**< Type for time stamp */ diff --git a/rt-thread/rtconfig.h b/rt-thread/rtconfig.h index c5792d3..e6498ad 100644 --- a/rt-thread/rtconfig.h +++ b/rt-thread/rtconfig.h @@ -149,7 +149,7 @@ #define AT_SW_VERSION_NUM 0x10301 /* end of Network */ -#define NB_MODULE_SWITCH 0 // 开启NB物联网功能 +#define IOT_MODULE_SWITCH 1 // 开启NB物联网功能 /* Utilities */ // #define TEST_ENABLE //打开所有的终端测试程序 @@ -198,18 +198,14 @@ /* end of CYW43439 WiFi */ /* end of Wi-Fi */ -// #define PKG_USING_AT_DEVICE -// #define AT_DEVICE_USING_MB26 -// #define AT_DEVICE_MB26_INIT_ASYN // -// #define AT_DEVICE_MB26_SAMPLE -// #define MB26_SAMPLE_CLIENT_NAME "uart1" -// #define MB26_SAMPLE_RECV_BUFF_LEN 512 -// #define PKG_USING_AT_DEVICE_LATEST_VERSION -// #define PKG_AT_DEVICE_VER_NUM 0x99999 /* IoT Cloud */ +#define AT_DEVICE_USING_ML307 +#define AT_DEVICE_ML307_INIT_ASYN // +#define ML307_SAMPLE_CLIENT_NAME "uart3" +#define ML307_SAMPLE_RECV_BUFF_LEN 512 /* end of IoT Cloud */ /* end of IoT - internet of things */ @@ -258,11 +254,6 @@ #define PKG_VSNPRINTF_DEFAULT_FLOAT_PRECISION 6 #define PKG_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9 #define PKG_VSNPRINTF_LOG10_TAYLOR_TERMS 4 -// #define RT_VSNPRINTF_FULL_REPLACING_SPRINTF -// #define RT_VSNPRINTF_FULL_REPLACING_SNPRINTF -// #define RT_VSNPRINTF_FULL_REPLACING_PRINTF -// #define RT_VSNPRINTF_FULL_REPLACING_VSPRINTF -// #define RT_VSNPRINTF_FULL_REPLACING_VSNPRINTF #define PKG_USING_RT_VSNPRINTF_FULL_LATEST_VERSION /* end of enhanced kernel services */ @@ -387,7 +378,8 @@ #define BSP_USING_GPIO #define BSP_USING_UART #define BSP_USING_UART1 -// #define BSP_USING_UART2 +// #define BSP_USING_UART2 +#define BSP_USING_UART3 // #define BSP_USING_UART4 // #define BSP_USING_UART5 #define LSI_VALUE 40000