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