网络自适应

This commit is contained in:
2584532475@qq.com committed 2024-09-10 11:51:07 +08:00
1 parent a589e89e33
commit 0f40dd8b17
68 files changed
+7062 -2678

No files matched your search

+19 -99
View File
@@ -1,5 +1,6 @@
#include "data.h"
#include <rtthread.h>
#include <stdbool.h>
@@ -9,28 +10,19 @@
******************************************/
volatile const char _makeData[] = __DATE__; //12字节,编译日期
volatile const char _makeTime[] = __TIME__; //9字节
volatile const char cBootv[] = "Ver3.0.0"; //获取时添加上面两个时间信息,最大长度64字节
//第一个字节环境变量修改时增加序号 第二个字节
volatile const char cBootv[] = "Ver5.0.11"; //
char _versionTemp[64];
int g_cat1_log_enable = 0 ;
<<<<<<< HEAD
const StrIndex_t cDownDataType[] =
{
{"run", DownRun},
{"stop", DownStop},
{"open", DownOpen},
{"close", DownClose},
{"reg_ans", DownRegistAns},
{"heart_ans", DownHeartAns},
{"update", DownUpdate},
{"reboot", DownReboot},
{"config", DownConfig},
{"read", DownRead},
{"fact", DownFact}
=======
const StrIndex_t cDownDataType[] =
{
{"run",DownRun} ,
{"stop",DownStop} ,
{"open",DownOpen} ,
@@ -42,22 +34,13 @@ const StrIndex_t cDownDataType[] =
{"config",DownConfig},
{"read",DownRead} ,
{"fact",DownFact}
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
};
const StrIndex_t cSiteType[] =
{
<<<<<<< HEAD
{"sluice", SiteSluice},
{"flow", SiteFlow},
{"press", SiteSee},
{"auto", SiteColl}, // 自动化采集站
{"trans", SiteServer},
{"level", SiteLevel},
{"skew", SiteSkew} //测斜仪
=======
{"sluice",SiteSluice} ,
{"flow",SiteFlow} ,
{"press",SiteSee} ,
@@ -65,25 +48,17 @@ const StrIndex_t cSiteType[] =
{"trans",SiteServer} ,
{"level",SiteLevel},
{"skew",SiteSkew} //测斜仪
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
};
const StrIndex_t cMotorType[] =
{
<<<<<<< HEAD
{"mg1000", MT_MG_1000},
{"qh100", MT_QH_V100},
{"qh200", MT_QH_V200},
{"zs100", MT_ZS_V100},
{"jz200", MT_JZ_V200}, // 金志 4-20 ma
=======
{"mg1000",MT_MG_1000} ,
{"qh100", MT_QH_V100} ,
{"qh200", MT_QH_V200} ,
{"zs100", MT_ZS_V100} ,
{"jz200", MT_JZ_V200} , // 金志 4-20 ma
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
{"dy100", MT_DY_V100}, // 大禹锥型阀
{"kg100", MT_KG_V100}, // 开关量模块
{"kr100", MT_KR_V100}, // 闸位计
@@ -93,7 +68,7 @@ const StrIndex_t cMotorType[] =
const StrIndex_t c4851Type[] =
{
<<<<<<< HEAD
{"mg1000", ST_MG_1000},
{"qh100", ST_QH_V100},
{"qh200", ST_QH_V200},
@@ -102,14 +77,7 @@ const StrIndex_t c4851Type[] =
{"kg100", ST_KG_V100},
{"at100", ST_AT_V100},
{"kr100", ST_KR_V100},
=======
{"mg1000",ST_MG_1000} ,
{"qh100",ST_QH_V100} ,
{"qh200",ST_QH_V200} ,
{"dy100",ST_DY_V100} ,
{"kg100",ST_KG_V100} ,
{"at100",ST_AT_V100} ,
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
};
const StrIndex_t cU485Type[] =
@@ -118,7 +86,7 @@ const StrIndex_t cU485Type[] =
};
// 485 2 通道
<<<<<<< HEAD
const StrIndex_t c4852Type[] =
{
{"rds600", ST_RDS_600},
@@ -127,49 +95,12 @@ const StrIndex_t c4852Type[] =
{"zkjszk", ST_ZK_JSZK},
{"djx100", ST_DJX_100},
{"rds300", ST_RDS_300},
{"mi600", ST_MI_600} // 测斜仪
=======
const StrIndex_t c4852Type[] =
{
{"rds600",ST_RDS_600} ,
{"tds300",ST_TDS_300} ,
{"ht100",ST_HT_V100} ,
{"zkjszk",ST_ZK_JSZK},
{"djx100",ST_DJX_100},
{"rds300",ST_RDS_300},
{"mi600",ST_MI_600} // 测斜仪
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
{"mi600", ST_MI_600}, // 测斜仪
{"ht200", ST_HT_V200} // 华天压力计
};
const ParShallInfo_t ParShallTale[] =
{
{.w = 0, .c = 0, .m = 0},
{.w = 0.152, .c = 0.381, .m = 1.58 , .minLeve = 0.03, .maxLeve = 0.45, .minFlow = 1.5 / 1000, .maxFlow = 100 / 1000},
{.w = 0.25, .c = 0.561, .m = 1.513 , .minLeve = 0.03, .maxLeve = 0.60, .minFlow = 3.0 / 1000, .maxFlow = 250 / 1000},
{.w = 0.30, .c = 0.679, .m = 1.521 , .minLeve = 0.03, .maxLeve = 0.75, .minFlow = 3.5 / 1000, .maxFlow = 400 / 1000},
{.w = 0.45, .c = 1.038, .m = 1.537 , .minLeve = 0.03, .maxLeve = 0.75, .minFlow = 4.5 / 1000, .maxFlow = 630 / 1000},
{.w = 0.60, .c = 1.403, .m = 1.548 , .minLeve = 0.05, .maxLeve = 0.75, .minFlow = 12.5 / 1000, .maxFlow = 850 / 1000},
{.w = 0.75, .c = 1.772, .m = 1.557 , .minLeve = 0.06, .maxLeve = 0.75, .minFlow = 25.0 / 1000, .maxFlow = 1100 / 1000},
{.w = 0.90, .c = 2.147, .m = 1.565 , .minLeve = 0.06, .maxLeve = 0.75, .minFlow = 30.0 / 1000, .maxFlow = 1250 / 1000},
{.w = 1.00, .c = 2.397, .m = 1.569 , .minLeve = 0.06, .maxLeve = 0.80, .minFlow = 30.0 / 1000, .maxFlow = 1500 / 1000},
{.w = 1.20, .c = 2.904, .m = 1.577 , .minLeve = 0.06, .maxLeve = 0.80, .minFlow = 35.0 / 1000, .maxFlow = 2000 / 1000},
{.w = 1.50, .c = 3.668, .m = 1.586 , .minLeve = 0.06, .maxLeve = 0.80, .minFlow = 45.0 / 1000, .maxFlow = 2500 / 1000},
{.w = 1.80, .c = 4.440, .m = 1.593 , .minLeve = 0.08, .maxLeve = 0.80, .minFlow = 80.0 / 1000, .maxFlow = 3000 / 1000},
{.w = 2.10, .c = 5.222, .m = 1.599 , .minLeve = 0.08, .maxLeve = 0.80, .minFlow = 95.0 / 1000, .maxFlow = 3600 / 1000},
{.w = 2.40, .c = 6.004, .m = 1.605 , .minLeve = 0.08, .maxLeve = 0.80, .minFlow = 100.0 / 1000, .maxFlow = 4000 / 1000},
{.w = 3.05, .c = 7.463, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.07, .minFlow = 0.16, .maxFlow = 8.28},
{.w = 3.66, .c = 8.859, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.37, .minFlow = 0.19, .maxFlow = 14.68},
{.w = 4.57, .c = 10.96, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.67, .minFlow = 0.23, .maxFlow = 25.04},
{.w = 6.10, .c = 14.45, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.31, .maxFlow = 37.97},
{.w = 7.62, .c = 17.94, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.38, .maxFlow = 47.16},
{.w = 9.14, .c = 21.44, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.46, .maxFlow = 56.33},
{.w = 12.19, .c = 28.43, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.60, .maxFlow = 74.70},
{.w = 15.24, .c = 35.41, .m = 1.6 , .minLeve = 0.09, .maxLeve = 1.83, .minFlow = 0.75, .maxFlow = 93.04},
} ;
@@ -179,14 +110,11 @@ WaterData_t WaterData[WATER_COUTN];
InclinometerData_t IncData[6]; // 测斜仪数据
SysData_t SysData;
<<<<<<< HEAD
SOFTRTC_t g_SoftRtc =
{
23, 10, 1, 0, 0, 0
=======
SOFTRTC_t g_SoftRtc = {
23,10,1,0,0,0
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
};
uint32_t g_ifconfig = 0;
@@ -208,10 +136,8 @@ int cMotorGetType (char * str)
int c4851GetType (char * str)
{
rt_kprintf ("485 option count:%d\r\n", sizeof (c4851Type) / sizeof (StrIndex_t)) ;
for (int i = 0; i < sizeof (c4851Type) / sizeof (StrIndex_t); i++)
{
rt_kprintf ("%s,%s\r\n", str, c4851Type[i].str) ;
if (rt_memcmp (str, c4851Type[i].str, rt_strlen (str)) == 0)
{
return c4851Type[i].index;
@@ -278,19 +204,13 @@ int cSiteType2Index (char * str)
/**********************************************
获取boot版本信息
**********************************************/
<<<<<<< HEAD
void *GetVersion (void)
{
int i = rt_sprintf (_versionTemp, "%s-%s %s", cBootv, _makeData, _makeTime);
_versionTemp[i] = 0;
return (void*) _versionTemp;
=======
void *GetVersion(void)
{
int i = rt_sprintf(_versionTemp,"%s-%s %s",cBootv, _makeData, _makeTime);
_versionTemp[i] = 0;
return (void*)_versionTemp;
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
}
+29 -29
View File
@@ -1,13 +1,26 @@
#ifndef _DATA_H
#define _DATA_H
#include <stdint.h>
#include "user_config.h"
#ifdef USER_MINLE_CHAN2
#define SLUICE_COUTN 1// 当前处理几口闸
#define SUBTOPIC_COUNT 2 // 订阅topic 数量
#else
#define SLUICE_COUTN 1// 当前处理几口闸
#define SUBTOPIC_COUNT 1 // 订阅topic 数量
#endif
#define WATER_COUTN 6// 当前接入n个流量计
#define SUBTOPIC_COUNT 1 // 订阅topic 数量
#define SLUCIE_EXEC_COUNT 20// 闸门异常时间
@@ -25,6 +38,7 @@
extern uint32_t g_ifconfig;
extern uint32_t g_ifupdate;
extern int g_cat1_log_enable ;
typedef struct StrIndex_t
{
@@ -70,6 +84,8 @@ typedef struct SluiceData_t
int32_t rload; // 右荷重 单位 kg
int32_t ecode; // 编码器原始数据
int32_t currt; // 设备电流
int32_t error; // 错误编码
int32_t state; // 状态
} SluiceData_t;
@@ -86,6 +102,7 @@ typedef struct SysData_t
int scram; // 急停被按下
char fileName[64]; // 文件名
int fileSize; // 文件大小
} SysData_t;
typedef struct SOFTRTC_t
@@ -96,11 +113,9 @@ typedef struct SOFTRTC_t
uint8_t hour;
uint8_t minutes;
uint8_t second;
<<<<<<< HEAD
} SOFTRTC_t;
=======
}SOFTRTC_t;
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
@@ -122,11 +137,9 @@ typedef struct WaterData_t
int32_t thisSpeed; // 流速
int32_t thisPress; // 压力
int32_t thisTemp; // 温度
<<<<<<< HEAD
int retry ; // 重试次数
=======
int retry ; // 重试次数
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
} WaterData_t;
@@ -173,6 +186,7 @@ typedef enum S4852Type_t
ST_DJX_100, // 丁家峡闸门 读取开度
ST_RDS_300, // 雷达流量计
ST_MI_600, // 鹦鸽嘴测斜仪
ST_HT_V200, // 华天压力计
} S4852Type_t;
@@ -194,11 +208,9 @@ typedef enum SiteType_t
SiteServer, // 串口服务器
SiteLevel, // 水位站
SiteSkew // 测斜仪
<<<<<<< HEAD
} SiteType_t;
=======
}SiteType_t;
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
typedef enum DownDataType_t
@@ -214,11 +226,8 @@ typedef enum DownDataType_t
DownConfig = 8, // 修改参数
DownRead = 9, // 读取参数
DownFact = 10, // 读取参数
<<<<<<< HEAD
} DownDataType_t;
=======
}DownDataType_t;
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
@@ -236,19 +245,13 @@ typedef struct TypeIndexMail_t
extern SluiceData_t SluiceData[SLUICE_COUTN];
extern WaterData_t WaterData[WATER_COUTN];
<<<<<<< HEAD
extern InclinometerData_t IncData[6];
extern SysData_t SysData;
extern const WaterLeveInfo_t LeveInfo;
extern const ParShallInfo_t ParShallTale[];
extern SOFTRTC_t g_SoftRtc;
=======
extern InclinometerData_t IncData[6];
extern SysData_t SysData;
extern const WaterLeveInfo_t LeveInfo;
extern const ParShallInfo_t ParShallTale[];
extern SOFTRTC_t g_SoftRtc;
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
int cMotorGetType (char * str);
@@ -269,11 +272,8 @@ int cDownType2Index (char * str);
int cSiteType2Index (char * str);
<<<<<<< HEAD
void *GetVersion (void);
=======
void *GetVersion(void);
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
#endif
+10 -20
View File
@@ -14,38 +14,30 @@ DIState_t MX_Din_Pull (int chann)
}
case 2:
{
<<<<<<< HEAD
ret = (DIState_t) HAL_GPIO_ReadPin (DI2_GPIO_Port, DI2_Pin);
=======
ret = (DIState_t)HAL_GPIO_ReadPin (DI2_GPIO_Port, DI2_Pin);
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
break;
}
case 3:
{
<<<<<<< HEAD
ret = (DIState_t) HAL_GPIO_ReadPin (DI3_GPIO_Port, DI3_Pin);
=======
ret = (DIState_t)HAL_GPIO_ReadPin (DI3_GPIO_Port, DI3_Pin);
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
break;
}
case 4:
{
<<<<<<< HEAD
ret = (DIState_t) HAL_GPIO_ReadPin (DI4_GPIO_Port, DI4_Pin);
=======
ret = (DIState_t)HAL_GPIO_ReadPin (DI4_GPIO_Port, DI4_Pin);
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
break;
break;
}
case 5:
{
<<<<<<< HEAD
ret = (DIState_t) HAL_GPIO_ReadPin (DI5_GPIO_Port, DI5_Pin);
=======
ret = (DIState_t)HAL_GPIO_ReadPin (DI5_GPIO_Port, DI5_Pin);
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
break;
}
case 6:
@@ -55,6 +47,4 @@ DIState_t MX_Din_Pull (int chann)
}
}
return ret;
}
}
+1 -4
View File
@@ -5,11 +5,8 @@ typedef enum DIState_t
{
DI_HIGH = 1,
DI_LOW = 0
<<<<<<< HEAD
} DIState_t;
=======
}DIState_t;
>>>>>>> 3a537f633c99d30fa3fe5d01105f6525a48d3d72
void DiInit (void);
DIState_t MX_Din_Pull (int chann);
+2 -1
View File
@@ -3,4 +3,5 @@
void MX_Dout_Push (int index, int pwm);
#endif
#endif
+58 -27
View File
@@ -14,7 +14,7 @@
#if !defined(LOG_TAG)
#define LOG_TAG "CAT1"
#define LOG_TAG "cat1"
#endif
#include <elog.h>
@@ -26,15 +26,19 @@ static char tcprxbbuff[1200];
static char tcptxbbuff[1200];
netDrv_t g_cat1Drv =
netDrvInfo_t g_cat1Drv =
{
0, // 信号值
"", // iccid
Init, // 状态
tcprxbbuff, // 接受缓存
0, // 接受数据长度
tcptxbbuff, // 发送数据缓存
0, // 发送数据长度
.Csq = 0, // 信号值
.Iccid = "", // iccid
.State = Init, // 状态
.rxbuff = tcprxbbuff, // 接受缓存
.rx_size = 0, // 接受数据长度
.txbuff = tcptxbbuff, // 发送数据缓存
.tx_size = 0,
.IsEnable = 1, // 发送数据长度
};
@@ -48,7 +52,7 @@ static void ec200_resp_csq_callback (char * data, uint16_t length)
p = strstr (data, "+CSQ:");
p = p + 6;
g_cat1Drv.Csq = atoi (p);
rt_kprintf ("CSQ: <<< <%d>\r\n", g_cat1Drv.Csq);
log_i ("CSQ: <<< <%d>", g_cat1Drv.Csq);
}
// 校准时间程序
@@ -75,7 +79,7 @@ static void ec200_resp_qlts_callback (char * data, uint16_t length)
p = p + 3; // p
k[5] = atoi (p); // 秒
k[5] = (k[5] + (k[5] / 10) * 6) ;
rt_kprintf ("20%02x-%02x-%02x %02x:%02x:%02x\r\n", k[0], k[1], k[2], k[3], k[4], k[5]);
log_i ("DateTime:20%02x-%02x-%02x %02x:%02x:%02x", k[0], k[1], k[2], k[3], k[4], k[5]);
}
@@ -87,7 +91,7 @@ static void ec200_resp_iccid_callback (char * data, uint16_t length)
p = p + 8;
rt_memset (SysData.iccid, 0, 32);
rt_memcpy (SysData.iccid, p, 20);
rt_kprintf ("ICCID: <<< <%d> [%s]\r\n", length, SysData.iccid);
log_i ("ICCID: [%s]", SysData.iccid);
}
static void ec200_resp_qird_callback (char * data, uint16_t length)
@@ -115,6 +119,9 @@ static void ec200_resp_qird_callback (char * data, uint16_t length)
}
// type 0 无需打包 1 需要重新打包
const struct
{
@@ -158,14 +165,20 @@ static CommRet_T cat1_sendcmd_and_responce (int time, char * tx, int size, char
{
MX_UART_Clear (&g_GSMDrv);
MX_UART_PutBuffer (&g_GSMDrv, tx, size);
//rt_kprintf ("%.*s", size, tx) ;
if (g_cat1_log_enable == 1)
{
elog_hexdump ("cat1tx", 16, tx, size);
}
//timeout = cat1list[i].waitms;
int timeout = time;
while (timeout--)
{
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_GSM_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_GSM_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 3, RT_NULL))
{
//rt_kprintf ("[%.*s]", g_GSMDrv.rx_size, g_GSMDrv.rx_buffer) ;
if (g_cat1_log_enable == 1)
{
elog_hexdump ("cat1rx", 16, g_GSMDrv.rx_buffer, g_GSMDrv.rx_size) ;
}
if (NULL != rt_strstr ( (char *) g_GSMDrv.rx_buffer, ack))
{
if (call != NULL)
@@ -176,7 +189,7 @@ static CommRet_T cat1_sendcmd_and_responce (int time, char * tx, int size, char
}
MX_UART_Clear (&g_GSMDrv);
}
rt_thread_mdelay (1);
//rt_thread_mdelay (3);
}
return RetErr; // 超时
}
@@ -200,15 +213,22 @@ static void thread_entry (void * argument)
rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
g_GSMDrv.rxdone = cat1_rx_done;
g_GSMDrv.BaudRate = 115200;
MX_UART_Init (&g_GSMDrv);
// 启动4G 模块电源
// 拉高4G 模块复位
while (1)
{
CAT1RST:
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_RESET); // 关闭4G 模块电源
// 初始化串口,打开模块电源
g_cat1Drv.State = Init;
MX_UART_Init (&g_GSMDrv);
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_RESET); // 关闭4G 模块电源
if (g_cat1Drv.IsEnable == false)
{
rt_thread_delay (3000);
goto CAT1RST;
}
//MX_UART_Init (&g_GSMDrv);
rt_thread_mdelay (3000);
HAL_GPIO_WritePin (GSM_PW_GPIO_Port, GSM_PW_Pin, GPIO_PIN_SET); // 开启4G
rt_thread_mdelay (100);
@@ -216,7 +236,8 @@ CAT1RST:
HAL_GPIO_WritePin (GSM_RST_GPIO_Port, GSM_RST_Pin, GPIO_PIN_RESET);
rt_thread_mdelay (100);
HAL_GPIO_WritePin (GSM_RST_GPIO_Port, GSM_RST_Pin, GPIO_PIN_SET);
rt_thread_mdelay (8000);
rt_thread_mdelay (10000);
log_d ("cat.1 init complete");
for (int i = 0; i < MAXSETP; i++)
{
retry = cat1list[i].retry;
@@ -231,22 +252,27 @@ CAT1RST:
retry--;
if (retry <= 0)
{
rt_kprintf ("Join Faild%d \r\n", i);
log_i ("Join Faild");
goto CAT1RST;
}
}
// 关机
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_CAT1_SHUT, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) // 需要发
{
goto CAT1RST;
}
}
}
rt_kprintf ("Join Success \r\n");
log_i ("Join Success ");
rt_sprintf (at_cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,0\r", ipaddr, ipport);
if (cat1_sendcmd_and_responce (15000, at_cmd, strlen (at_cmd), "+QIOPEN: 0,0", NULL) == RetSucc)
{
g_cat1Drv.State = Conn;
rt_kprintf ("Net is ready \r\n");
log_i ("connected %s:%d success", ipaddr, ipport);
}
else
{
rt_kprintf ("Net is Error \r\n");
log_i ("connected server error");
goto CAT1RST;
}
@@ -261,12 +287,12 @@ CAT1RST:
rt_thread_mdelay (10);
if (cat1_sendcmd_and_responce (1000, at_cmd, strlen (at_cmd), ">", NULL) != RetSucc)
{
rt_kprintf ("NET:+CME:ERROR QISEND\r\n");
log_i ("NET:+CME:ERROR QISEND\r\n");
goto CAT1RST;
}
if (cat1_sendcmd_and_responce (3000, g_cat1Drv.txbuff, g_cat1Drv.tx_size, "SEND OK", NULL) != RetSucc)
{
rt_kprintf ("NET:+CME:ERROR QPUSH\r\n");
log_i ("NET:+CME:ERROR QPUSH\r\n");
goto CAT1RST;
}
}
@@ -275,7 +301,12 @@ CAT1RST:
rt_thread_mdelay (300);
if (cat1_sendcmd_and_responce (1000, "AT+QIRD=0,1500\r\n", strlen ("AT+QIRD=0,1500\r\n"), "+QIRD:", ec200_resp_qird_callback) != RetSucc)
{
rt_kprintf ("NET:+CME:ERROR QIRD\r\n");
log_i ("NET:+CME:ERROR QIRD\r\n");
goto CAT1RST;
}
// 关机
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_CAT1_SHUT, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) // 需要发
{
goto CAT1RST;
}
// // 通过通道2上报数据
@@ -297,7 +328,7 @@ CAT1RST:
// }
// }
// }
}
rt_thread_mdelay (3000);
}
+24 -25
View File
@@ -28,23 +28,24 @@ static char tx_buffer[512];
static char rx_buffer[512];
// static int isenable = 0;
netDrv_t g_dtuDrv =
netDrvInfo_t g_dtuDrv =
{
0, // 信号值
"", // iccid
Init, // 状态
tx_buffer, // 接受缓存
0, // 接受数据长度
rx_buffer, // 发送数据缓存
0, // 发送数据长度
.Csq = 0, // 信号值
.Iccid = "", // iccid
.State = Init, // 状态
.txbuff = tx_buffer, // 接受缓存
.rx_size = 0, // 接受数据长度
.rxbuff = rx_buffer, // 发送数据缓存
.IsEnable = 0, // 发送数据长度
};
static void net_data_rxdone (void)
{
rt_event_send (gUartEvents, EVENT_UART_ETH1_RX);
//rt_kprintf("net_data_rxdone\r\n");
}
@@ -52,13 +53,19 @@ static void thread_entry (void * argument)
{
rt_kprintf ("%s was start!\r\n", __FILE__);
g_ETH1Drv.rxdone = net_data_rxdone;
// MX_UART_Init(&g_ETH1Drv);
MX_UART_Init (&g_ETH1Drv);
while (1)
{
MODE_RST:
g_dtuDrv.State = Init;
MX_UART_Init (&g_ETH1Drv);
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_RESET);
g_dtuDrv.State = Init;
if (g_dtuDrv.IsEnable == 0)
{
rt_thread_delay (3000);
goto MODE_RST;
}
//MX_UART_Init (&g_ETH1Drv);
// HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_RESET);
rt_thread_mdelay (1000);
HAL_GPIO_WritePin (ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET);
rt_thread_mdelay (1000);
@@ -70,24 +77,12 @@ MODE_RST:
// 准备要上报数据
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_TX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) //
{
//rt_kprintf("MODE_RST\r\n");
MX_UART_PutBuffer (&g_ETH1Drv, g_dtuDrv.txbuff, g_dtuDrv.tx_size);
// rt_kprintf("tx\r\n");
// for(int i =0; i <g_dtuDrv.tx_size;i++ )
// {
// rt_kprintf("%02X ",g_dtuDrv.txbuff[i]);
// }
// rt_kprintf("\r\n");
}
// 接受到数据
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_ETH1_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
{
// rt_kprintf ("ETH1Rx:%d\r\n", g_ETH1Drv.rx_size);
// for (int i = 0; i < g_ETH1Drv.rx_size; i++)
// {
// rt_kprintf ("%02X ", g_ETH1Drv.rx_buffer[i]);
// }
// rt_kprintf ("\r\n");
rt_memcpy (g_dtuDrv.rxbuff, g_ETH1Drv.rx_buffer, g_ETH1Drv.rx_size);
g_dtuDrv.rx_size = g_ETH1Drv.rx_size;
rt_event_send (gTrigEvents, EVENT_TRIG_NETMODE_RX1) ;
@@ -97,6 +92,10 @@ MODE_RST:
{
goto MODE_RST;
}
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_ETH_SHUT, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
{
goto MODE_RST;
}
rt_thread_delay (100);
// 读取IO 状态
}
+188 -74
View File
@@ -1,26 +1,63 @@
#include "jsonpacket.h"
#include "cjson.h"
#include <string.h>
#include <rtthread.h>
#include "data.h"
#include "jsonpacket.h"
#include <easyflash.h>
#include <stdlib.h>
#include "netdrv.h"
#include <stdio.h>
#define PROTO_VER "FF_V3.0"
extern char config_list[16][32];
extern int config_list_size;
static char number_str[32];
void * GetNumber (double k, int s)
{
//static char buff[32] = {0};
rt_memset (number_str, 0, 32);
switch (s)
{
case 0:
sprintf (number_str, "%f", k);
break;
case 1:
sprintf (number_str, "%.1f", k);
break;
case 2:
sprintf (number_str, "%.2f", k);
break;
case 3:
sprintf (number_str, "%.3f", k);
break;
case 4:
sprintf (number_str, "%.4f", k);
break;
case 5:
sprintf (number_str, "%.5f", k);
break;
case 6:
sprintf (number_str, "%.6f", k);
break;
}
return (void*) number_str;
}
// 5 分钟流量站数据上报
int Json5MinFlowDataPacket (uint8_t * buffer)
{
char *result, * packMsg = (char *) buffer;
cJSON *root = NULL;
char *json, * packMsg = (char *) buffer;
cJSON *root = NULL , *result = NULL;
double dbl[6] = {3.14, 3.12, 3.33, 3.20, 3.12, 3.20};
int length;
char * p;
root = cJSON_CreateObject();
result = cJSON_CreateObject();
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("stand")); // 功能码
p = ef_get_env ("site_type");
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
@@ -42,7 +79,7 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
dbl[i] = WaterData[i].thisSpeed;
}
cJSON * ArrNumSpeed = cJSON_CreateDoubleArray (dbl, 6);
cJSON_AddItemToObject (root, "thisspeed", ArrNumSpeed);
cJSON_AddItemToObject (result, "thisspeed", ArrNumSpeed);
// 瞬时流量
for (int i = 0; i < 6; i++)
@@ -50,7 +87,7 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
dbl[i] = WaterData[i].thisFlow;
}
cJSON * ArrNumFlow = cJSON_CreateDoubleArray (dbl, 6);
cJSON_AddItemToObject (root, "thisflow", ArrNumFlow);
cJSON_AddItemToObject (result, "thisflow", ArrNumFlow);
// 累计流量
for (int i = 0; i < 6; i++)
@@ -58,22 +95,22 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
dbl[i] = WaterData[i].ttWater;
}
cJSON * ArrNumTtflow = cJSON_CreateDoubleArray (dbl, 6);
cJSON_AddItemToObject (root, "ttflow", ArrNumTtflow);
cJSON_AddItemToObject (result, "ttflow", ArrNumTtflow);
// 当前水位
for (int i = 0; i < 6; i++)
{
dbl[i] = (double)WaterData[i].thisLevel/100;
dbl[i] = (double) WaterData[i].thisLevel / 100;
}
cJSON * ArrNumLeve = cJSON_CreateDoubleArray (dbl, 6);
cJSON_AddItemToObject (root, "thisLeve", ArrNumLeve);
cJSON_AddItemToObject (result, "thisLeve", ArrNumLeve);
// 当前压力
for (int i = 0; i < 6; i++)
{
dbl[i] = WaterData[i].thisPress;
}
cJSON * ArrNumPress = cJSON_CreateDoubleArray (dbl, 6);
cJSON_AddItemToObject (root, "thispress", ArrNumPress);
cJSON_AddItemToObject (result, "thispress", ArrNumPress);
// 当前温度
for (int i = 0; i < 6; i++)
@@ -81,136 +118,155 @@ int Json5MinFlowDataPacket (uint8_t * buffer)
dbl[i] = WaterData[i].ttWater;
}
cJSON * ArrNumTemp = cJSON_CreateDoubleArray (dbl, 6);
cJSON_AddItemToObject (root, "thistemp", ArrNumTemp);
cJSON_AddItemToObject (result, "thistemp", ArrNumTemp);
// 当前测斜方向
for (int i = 0; i < 6; i++)
{
dbl[i] = IncData[i].dir;
}
cJSON * ArrNumIncDir = cJSON_CreateDoubleArray (dbl, 6);
cJSON_AddItemToObject (root, "thisincdir", ArrNumIncDir);
cJSON_AddItemToObject (result, "thisincdir", ArrNumIncDir);
// 当前测斜数据
for (int i = 0; i < 6; i++)
{
dbl[i] = IncData[i].data;
}
cJSON * ArrNumIncData = cJSON_CreateDoubleArray (dbl, 6);
cJSON_AddItemToObject (root, "thisincdata", ArrNumIncData);
cJSON_AddItemToObject (result, "thisincdata", ArrNumIncData);
cJSON_AddItemToObject (root, "result", result);
//---------------------------------------------以下不准修改
result = cJSON_PrintUnformatted (root);
strcpy (packMsg, result);
cJSON_free (result);
json = cJSON_PrintUnformatted (root);
strcpy (packMsg, json);
cJSON_free (json);
cJSON_Delete (root);
length = rt_strlen (packMsg);
return length;
}
// 5分钟闸门站数据上报
int JsonRegistDataPacket (uint8_t * buffer)
{
char *result, * packMsg = (char *) buffer;
cJSON *root = NULL;
char * p;
int length;
root = cJSON_CreateObject();
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("regist")); // 功能码
p = ef_get_env ("site_type");
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
cJSON_AddItemToObject (root, "pver", cJSON_CreateString (PROTO_VER)); // 表示流量计
cJSON_AddItemToObject (root, "iccid", cJSON_CreateString (SysData.iccid)); // 表示流量计
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (VERSION)); // 表示流量计
p = ef_get_env ("net_drv");
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString (p)); // 表示流量计
p = ef_get_env ("iap_app_filename");
//uint32_t max_open = atoi (p);
cJSON_AddItemToObject (root, "filename", cJSON_CreateString (p)); // 表示电池电压
//// 闸门站注册包上报
//int JsonRegistDataPacket (uint8_t * buffer)
//{
// char *result, * packMsg = (char *) buffer;
// cJSON *root = NULL;
// char * p;
// int length;
// root = cJSON_CreateObject();
// cJSON_AddItemToObject (root, "func", cJSON_CreateString ("regist")); // 功能码
// p = ef_get_env ("site_type");
// cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
// cJSON_AddItemToObject (root, "pver", cJSON_CreateString (PROTO_VER)); // 表示流量计
// cJSON_AddItemToObject (root, "iccid", cJSON_CreateString (SysData.iccid)); // 表示流量计
// cJSON_AddItemToObject (root, "ver", cJSON_CreateString (VERSION)); // 表示流量计
// p = ef_get_env ("net_drv");
// cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString (p)); // 表示流量计
// p = ef_get_env ("iap_app_filename");
// //uint32_t max_open = atoi (p);
// cJSON_AddItemToObject (root, "filename", cJSON_CreateString (p)); // 表示电池电压
//---------------------------------------------以下不准修改
result = cJSON_PrintUnformatted (root);
strcpy (packMsg, result);
cJSON_free (result);
cJSON_Delete (root);
length = rt_strlen (packMsg);
return length;
}
// //---------------------------------------------以下不准修改
// result = cJSON_PrintUnformatted (root);
// strcpy (packMsg, result);
// cJSON_free (result);
// cJSON_Delete (root);
// length = rt_strlen (packMsg);
// return length;
//}
// 5分钟闸门站数据上报
// 一、均匀时段报(上行)
int Json5MinSluiceDataPacket (uint8_t * buffer)
{
char *result, * packMsg = (char *) buffer;
cJSON *root = NULL;
char *json, * packMsg = (char *) buffer;
cJSON *root = NULL, *result = NULL;
char * p;
int length;
root = cJSON_CreateObject();
result = cJSON_CreateObject();
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("stand")); // 功能码
p = ef_get_env ("site_type");
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
cJSON_AddItemToObject (root, "pver", cJSON_CreateString (PROTO_VER)); // 表示流量计
cJSON_AddItemToObject (root, "iccid", cJSON_CreateString (SysData.iccid)); // 表示流量计
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (VERSION)); // 表示流量计
p = ef_get_env ("net_drv");
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString (p)); // 表示流量计
cJSON_AddItemToObject (root, "ver", cJSON_CreateString (GetVersion())); // 表示流量计
//p = ef_get_env ("net_drv");
if (g_net_drv == Cat1) //
{
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString ("gsm")); // 表示流量计
}
else
{
cJSON_AddItemToObject (root, "netdrv", cJSON_CreateString ("eth")); // 表示流量计
}
p = ef_get_env ("iap_app_filename");
//uint32_t max_open = atoi (p);
cJSON_AddItemToObject (root, "filename", cJSON_CreateString (p)); // 表示电池电压
// 添加闸门相关数据
// 闸门当前开度
cJSON_AddItemToObject (root, "thisopen", cJSON_CreateNumber (SluiceData[0].gopen)); // 表示电池电压
cJSON_AddItemToObject (result, "thisopen", cJSON_CreateNumber (SluiceData[0].gopen)); // 表示电池电压
// 闸门最大开度
p = ef_get_env ("max_open");
uint32_t max_open = atoi (p);
cJSON_AddItemToObject (root, "maxopen", cJSON_CreateNumber (max_open));
cJSON_AddItemToObject (result, "maxopen", cJSON_CreateNumber (max_open));
// 闸门A路荷重
cJSON_AddItemToObject (root, "aload", cJSON_CreateNumber (SluiceData[0].lload));
cJSON_AddItemToObject (result, "aload", cJSON_CreateNumber (SluiceData[0].lload));
// 闸门B路荷重
cJSON_AddItemToObject (root, "bload", cJSON_CreateNumber (SluiceData[0].rload));
cJSON_AddItemToObject (result, "bload", cJSON_CreateNumber (SluiceData[0].rload));
// 闸前水位
cJSON_AddItemToObject (root, "thisleve", cJSON_CreateNumber (WaterData[0].thisLevel));
cJSON_AddItemToObject (result, "thisleve", cJSON_CreateString (GetNumber ( (float) WaterData[0].thisLevel / 100, 2)));
// 闸门瞬时流速
cJSON_AddItemToObject (root, "thisspeed", cJSON_CreateNumber (WaterData[0].thisSpeed));
cJSON_AddItemToObject (result, "thisspeed", cJSON_CreateString (GetNumber ( (float) WaterData[0].thisSpeed / 100, 2)));
// 闸门累计流量
cJSON_AddItemToObject (root, "thisflow", cJSON_CreateNumber (WaterData[0].thisFlow));
cJSON_AddItemToObject (result, "thisflow", cJSON_CreateString (GetNumber ( (float) WaterData[0].thisFlow / 100, 2)));
// 闸门瞬时流量
cJSON_AddItemToObject (root, "ttflow", cJSON_CreateNumber (WaterData[0].ttWater));
cJSON_AddItemToObject (result, "ttflow", cJSON_CreateString (GetNumber ( (float) WaterData[0].ttWater / 100, 2)));
// 闸门启动电流
cJSON_AddItemToObject (root, "current", cJSON_CreateNumber (SluiceData[0].currt));
cJSON_AddItemToObject (result, "current", cJSON_CreateNumber (SluiceData[0].currt));
// 闸门编码器最大值
p = ef_get_env ("max_ecode");
uint32_t max_code = atoi (p);
cJSON_AddItemToObject (root, "maxecode", cJSON_CreateNumber (max_code));
cJSON_AddItemToObject (result, "maxecode", cJSON_CreateNumber (max_code));
p = ef_get_env ("min_ecode");
uint32_t min_code = atoi (p);
// 闸门编码器最小值
cJSON_AddItemToObject (root, "minecode", cJSON_CreateNumber (min_code));
cJSON_AddItemToObject (result, "minecode", cJSON_CreateNumber (min_code));
cJSON_AddItemToObject (root, "result", result);
//---------------------------------------------以下不准修改
result = cJSON_PrintUnformatted (root);
strcpy (packMsg, result);
cJSON_free (result);
json = cJSON_PrintUnformatted (root);
strcpy (packMsg, json);
cJSON_free (json);
//cJSON_Delete (result);
cJSON_Delete (root);
length = rt_strlen (packMsg);
return length;
}
// 心跳包,需要应答
// 二、心跳数据上报(上行)
int JsonHeartDatapacket (uint8_t * buffer)
{
char *result, * packMsg = (char *) buffer;
cJSON *root = NULL;
int length;
char *p;
int state[4];
root = cJSON_CreateObject();
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("heart")); // 功能码
p = ef_get_env ("site_type");
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
cJSON_AddItemToObject (root, "ecdState", cJSON_CreateNumber (SysData.ecdState)); // 编码器状态
cJSON_AddItemToObject (root, "flowState", cJSON_CreateNumber (SysData.flowState)); // 流量计状态
cJSON_AddItemToObject (root, "ldState", cJSON_CreateNumber (SysData.ldState)); // 荷重仪状态
cJSON_AddItemToObject (root, "scram", cJSON_CreateNumber (SysData.scram)); // 荷重仪状态
state[0] = SluiceData[0].error;
state[1] = SluiceData[0].state;
state[2] = 0;
state[3] = 0;
cJSON * ArrNumPress = cJSON_CreateIntArray (state, 4);
cJSON_AddItemToObject (root, "state", ArrNumPress);
//cJSON_AddItemToObject (root, "state", cJSON_CreateNumber (SysData.ecdState)); // 编码器状态
// cJSON_AddItemToObject (root, "flowState", cJSON_CreateNumber (SysData.flowState)); // 流量计状态
// cJSON_AddItemToObject (root, "ldState", cJSON_CreateNumber (SysData.ldState)); // 荷重仪状态
// cJSON_AddItemToObject (root, "scram", cJSON_CreateNumber (SysData.scram)); // 荷重仪状态
//---------------------------------------------以下不准修改
result = cJSON_PrintUnformatted (root);
strcpy (packMsg, result);
@@ -220,8 +276,48 @@ int JsonHeartDatapacket (uint8_t * buffer)
return length;
}
// 四、下行命令应答(上行)
int JsonConfigReadDataPacket(uint8_t* buffer)
int JsonAckDownload (uint8_t* buffer, DownDataType_t dn)
{
char *result, * packMsg = (char *) buffer;
cJSON *root = NULL;
int length;
char *p;
root = cJSON_CreateObject();
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("ack")); // 功能码
switch (dn)
{
case DownUpdate:
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("update")); // 表示流量计
cJSON_AddItemToObject (root, "state", cJSON_CreateString ("ok")); // 表示流量计
break;
case DownConfig:
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("config")); // 表示流量计
cJSON_AddItemToObject (root, "state", cJSON_CreateString ("ok")); // 表示流量计
break;
case DownRun:
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("run")); // 表示流量计
cJSON_AddItemToObject (root, "state", cJSON_CreateString ("ok")); // 表示流量计
break;
case DownFact:
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("fact")); // 表示流量计
cJSON_AddItemToObject (root, "state", cJSON_CreateString ("ok")); // 表示流量计
break;
default:
break;
}
//---------------------------------------------以下不准修改
result = cJSON_PrintUnformatted (root);
strcpy (packMsg, result);
cJSON_free (result);
cJSON_Delete (root);
length = rt_strlen (packMsg);
return length;
}
// 十一、读取参数应答(上行)
int JsonConfigReadDataPacket (uint8_t* buffer)
{
char *result, * packMsg = (char *) buffer;
cJSON *root = NULL;
@@ -232,7 +328,7 @@ int JsonConfigReadDataPacket(uint8_t* buffer)
p = ef_get_env ("site_type");
cJSON_AddItemToObject (root, "site_type", cJSON_CreateString (p)); // 表示流量计
for (int i =0 ;i < config_list_size;i++)
for (int i = 0 ; i < config_list_size; i++)
{
p = ef_get_env (config_list[i]);
cJSON_AddItemToObject (root, config_list[i], cJSON_CreateString (p)); // 表示流量计
@@ -246,8 +342,26 @@ int JsonConfigReadDataPacket(uint8_t* buffer)
return length;
}
int JsonAckSuccPacket(char * buffer)
// 十四 、设备预警(上行)
// shangbao
int JsonWarning (char * buffer, char * type, int k)
{
rt_sprintf(buffer,"{\"state\":\"ok\"}");
char *result, * packMsg = (char *) buffer;
cJSON *root = NULL;
int length;
char *p;
root = cJSON_CreateObject();
cJSON_AddItemToObject (root, "func", cJSON_CreateString ("warn")); // 功能码
cJSON_AddItemToObject (root, "type", cJSON_CreateString ("load")); // 表示流量计
cJSON_AddItemToObject (root, "data", cJSON_CreateNumber (k)); // 表示流量计
//---------------------------------------------以下不准修改
result = cJSON_PrintUnformatted (root);
strcpy (packMsg, result);
cJSON_free (result);
cJSON_Delete (root);
length = rt_strlen (packMsg);
return length;
}
+43 -7
View File
@@ -3,16 +3,52 @@
#include <stdint.h>
// 5 分钟数据上报
////typedef enum AckType_t
////{
//// AckUpdate = 0,
//// AckRun = 0,
////}
//// 5 分钟数据上报
//int Json5MinFlowDataPacket (uint8_t * buffer);
//// 注册包数据 需要应答
//int JsonRegistDataPacket (uint8_t * buffer);
//// 心跳包,需要应答
//int JsonHeartDatapacket (uint8_t * buffer);
//int Json5MinSluiceDataPacket (uint8_t * buffer);
//int JsonConfigReadDataPacket (uint8_t* buffer);
//int JsonAckSuccPacket (char * buffer,char * type,int k);
// 5 分钟流量站数据上报
int Json5MinFlowDataPacket (uint8_t * buffer);
// 注册包数据 需要应答
int JsonRegistDataPacket (uint8_t * buffer);
// 心跳包,需要应答
int JsonHeartDatapacket (uint8_t * buffer);
// 一、均匀时段报(上行)
int Json5MinSluiceDataPacket (uint8_t * buffer);
int JsonConfigReadDataPacket(uint8_t* buffer);
int JsonAckSuccPacket(char * buffer);
// 二、心跳数据上报(上行)
int JsonHeartDatapacket (uint8_t * buffer);
// 四、下行命令应答(上行)
int JsonAckDownload (uint8_t* buffer, DownDataType_t dn);
// 十一、读取参数应答(上行)
int JsonConfigReadDataPacket (uint8_t* buffer);
// 十四 、设备预警(上行)
// shangbao
int JsonWarning (char * buffer, char * type, int k);
#endif
+43 -34
View File
@@ -1,3 +1,4 @@
#include "data.h"
#include "jsonunpack.h"
#include "cjson.h"
#include <string.h>
@@ -5,10 +6,17 @@
#include "data.h"
#include <easyflash.h>
#include <stdlib.h>
#include "data.h"
#include "os-app.h"
#include "main.h"
#if !defined(LOG_TAG)
#define LOG_TAG "json"
#endif
#include <elog.h>
char config_list[16][32] = {NULL};
int config_list_size = 0;
// 用于远程出厂设置时保留配置
@@ -25,29 +33,21 @@ void JsonUnPacket (int index, char *buff)
root = cJSON_Parse (packMsg);
DownDataType_t type = (DownDataType_t) 0;
char * p, *key, *value;
int list_size;
int list_size, data;
TypeIndexMail_t mail;
p = cJSON_GetStringValue (cJSON_GetObjectItem (root, "type"));
type = (DownDataType_t) cDownType2Index (p);
rt_kprintf("down :%s<%d>\r\n",p,type);
log_i ("down :%s<%d>\r\n", p, type);
switch (type)
{
case DownRun : // 开度提闸
// rt_kprintf ("open:%u mm/10\r\n", datak);
// //SluiceData[gMqttDrv.rx_index].opt = 1; // 执行操作闸门
// SluiceData[gMqttDrv.rx_index - 1].sopen = datak / 10;
// mail.Type = MAIL_SLUICE_OPT;
// mail.index = gMqttDrv.rx_index - 1;
// rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
// // 回复应答
// mail.Type = MAIL_COMM_SLACK;
// mail.index = gMqttDrv.rx_index;
// rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
data = cJSON_GetNumberValue (cJSON_GetObjectItem (root, "data"));
SluiceData[0].sopen = data; // 执行操作闸门
OsSendMail (gSluiceMail, MAIL_SLUICE_OPT, 0); // 操作0号闸门
OsSendMail (gTCommMail, MAIL_COMM_SLACK, 0); // 操作0号闸门
break;
case DownStop :
OsSendMail (gSluiceMail, MAIL_SLUICE_STP, 0);
break;
case DownOpen :
break;
@@ -58,21 +58,26 @@ void JsonUnPacket (int index, char *buff)
case DownHeartAns :
break;
case DownUpdate :
if (index != 0)
break;
rt_memset (SysData.fileName, 0, 32);
p = cJSON_GetStringValue (cJSON_GetObjectItem (root, "file"));
rt_sprintf (SysData.fileName, "%s", p) ;
// 启动升级线程
// 回复应答
mail.Type = MAIL_COMM_UPACK;
mail.index = index + 1; // 0通道用来升级的通道
OsSendMail (gTCommMail, MAIL_COMM_UPACK, index + 1); // 操作0号闸门
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
rt_thread_mdelay (2000); // 等待2s 进入升级线程
UpgradeThreadStart();
break;
case DownReboot :
if (index != 0)
break;
HAL_NVIC_SystemReset();
break;
case DownConfig: // 设置参数
if (index != 0)
break;
// 读取参数列表
list = cJSON_GetObjectItem (root, "list");
list_size = cJSON_GetArraySize (list);
@@ -85,34 +90,38 @@ void JsonUnPacket (int index, char *buff)
ef_set_env (key, value);
}
}
mail.Type = MAIL_COMM_ACK;
mail.index = index + 1; // 0通道用来升级的通道
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
OsSendMail (gTCommMail, MAIL_COMM_WRACK, index + 1); // 操作0号闸门
// mail.Type = MAIL_COMM_ACK;
// mail.index = index + 1; // 0通道用来升级的通道
// rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
break;
case DownRead: // 读取参数
if (index != 0)
break;
list = cJSON_GetObjectItem (root, "list");
config_list_size = cJSON_GetArraySize (list);
for (int i = 0; i < config_list_size; i++)
{
key = cJSON_GetStringValue (cJSON_GetArrayItem (list, i));
rt_sprintf(config_list[i],"%s",key);
rt_sprintf (config_list[i], "%s", key);
}
mail.Type = MAIL_COMM_READPARA;
mail.index = index + 1; // 0通道用来升级的通道
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
OsSendMail (gTCommMail, MAIL_COMM_READPARA, index + 1); // 操作0号闸门
// mail.Type = MAIL_COMM_READPARA;
// mail.index = index + 1; // 0通道用来升级的通道
// rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
// 读取参数列表
break;
case DownFact:
p = ef_get_env("device_id");
rt_sprintf(backdevice_id,"%s",p);
p = ef_get_env("net_drv") ;
rt_sprintf(backnetdrv,"%s",p);
if (index != 0)
break;
p = ef_get_env ("device_id");
rt_sprintf (backdevice_id, "%s", p);
p = ef_get_env ("net_drv") ;
rt_sprintf (backnetdrv, "%s", p);
ef_env_set_default();
ef_set_env("device_id",backdevice_id) ;
ef_set_env("net_drv",backnetdrv) ;
mail.Type = MAIL_COMM_ACK;
mail.index = index + 1; // 0通道用来升级的通道
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
ef_set_env ("device_id", backdevice_id) ;
ef_set_env ("net_drv", backnetdrv) ;
OsSendMail (gTCommMail, MAIL_COMM_FACACK, index + 1); // 操作0号闸门
break;
default:
break;
+48 -28
View File
@@ -79,19 +79,23 @@ char client_id_str[64] = {NULL};
static char device_id[32] = {NULL}; // 设备编码
static char user_topic[32] = {NULL}; // topic
static char mqtt_user[32] = {NULL}; // 设备编码
static char mqtt_pass[32] = {NULL}; // topic
static void net_data_rxdone (void)
{
rt_event_send (gUartEvents, EVENT_UART_ETH1_RX);
}
static int timerout_timer = 0;
static int MQTT_timerout_timer = 0;
static void timerouter (void * parameter)
{
timerout_timer ++;
if (timerout_timer > 90) // 超过90s 没有收到数据,重启网络
MQTT_timerout_timer ++;
if (MQTT_timerout_timer > 90) // 超过90s 没有收到数据,重启网络
{
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_RST);
timerout_timer = 0;
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_RST);//WXY 此处加切换网络
netdrv_switch();
MQTT_timerout_timer = 0;
}
}
@@ -101,7 +105,7 @@ static void thread_entry (void * argument)
int count = 0;
// 初始化串口驱动
rt_kprintf ("%s was start!\r\n", __FILE__);
log_i ("mqtt was start!");
timer = rt_timer_create ("timer", timerouter, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC); // 异常检测定时器
// 读取配置文件
char * p = ef_get_env ("device_id");
@@ -109,22 +113,29 @@ static void thread_entry (void * argument)
p = ef_get_env ("mqtt_topic");
rt_memcpy (user_topic, p, strlen (p));
int id = rand() % 1000;
//int id = rand() % 1000;
rt_sprintf (client_id_str, "GID_SLUICE_V2_220000%s", device_id) ;
rt_kprintf ("clinet:%s\r\n", client_id_str);
log_i ("client_id:%s", client_id_str);
connectData.clientID.cstring = client_id_str;
connectData.keepAliveInterval = 120;
connectData.cleansession = 1;
connectData.username.cstring = "admin";
connectData.password.cstring = "admin";
p = ef_get_env ("mqtt_user");
rt_memcpy (mqtt_user, p, strlen (p));
p = ef_get_env ("mqtt_pass");
rt_memcpy (mqtt_pass, p, strlen (p));
connectData.username.cstring = mqtt_user;
connectData.password.cstring = mqtt_pass;
rt_sprintf (sub_topic_str[0], "device/%s/tx/220000%s", "update", device_id);
rt_sprintf (pub_topic_str[0], "device/%s/rx/220000%s", "update", device_id);
// 读取设备编码
rt_sprintf (sub_topic_str[1], "device/%s/tx/220000%s", user_topic, device_id);
rt_sprintf (pub_topic_str[1], "device/%s/rx/220000%s", user_topic, device_id);
#if (SUBTOPIC_COUNT > 1)
rt_sprintf (sub_topic_str[2], "device/%s/tx/2200002308170002", user_topic);
rt_sprintf (pub_topic_str[2], "device/%s/rx/2200002308170002", user_topic);
rt_sprintf (sub_topic_str[2], "device/%s/tx/220000%s", "minle",device_id);
rt_sprintf (pub_topic_str[2], "device/%s/rx/220000%s", "minle",device_id);
#endif
for (int i = 0; i < SUBTOPIC_COUNT + 1; i++)
@@ -137,18 +148,20 @@ static void thread_entry (void * argument)
while (1)
{
MQTTINIT:
if (g_netDrv->State != Conn)
if (g_netDrv->State != Conn) // 等待网络模块注册成功
{
//rt_kprintf ("mqtt tcp-connected fail\r\n");
rt_thread_delay (1000); // 延迟3s 等待模块连接TCP 服务成功
goto MQTTINIT;
}
// 链接MQTT 服务器
rt_kprintf ("mqtt connected\r\n");
log_i ("connect to mqtt server");
mqtt_buflen = MQTTSerialize_connect (mqtt_buffer, MQTT_BUFF_LENGTH, &connectData);
netdrv_service_tx (mqtt_buffer, mqtt_buflen);
if (RT_EOK != rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 10000, RT_NULL))
{
netdrv_reset();// 切换到mqtt 驱动
goto MQTTINIT;
}
rt_thread_mdelay (10);
@@ -157,26 +170,31 @@ MQTTINIT:
unsigned char sessionPresent, connack_rc;
if (MQTTDeserialize_connack (&sessionPresent, &connack_rc, mqtt_buffer, MQTT_BUFF_LENGTH) != 1 || connack_rc != 0)
{
rt_kprintf ("Unable to connect, return code %d\n", connack_rc);
log_i ("Unable to connect, return code %d\n", connack_rc);
rt_thread_delay (3000);
netdrv_clear();
netdrv_reset();// 切换到mqtt 驱动
goto MQTTINIT;
}
}
else
{
rt_kprintf ("mqtt error");
log_i ("mqtt error");
netdrv_clear();
rt_thread_mdelay (3000);
// netdrv_switch();// 切换到mqtt 驱动
goto MQTTINIT;
}
netdrv_clear();
rt_kprintf ("connect to mqtt successful\n");
log_i ("connect to mqtt successful");
// 订阅topic
mqtt_buflen = MQTTSerialize_subscribe (mqtt_buffer, MQTT_BUFF_LENGTH, 0, message_id++, SUBTOPIC_COUNT + 1, subtopic, qos);
netdrv_service_tx (mqtt_buffer, mqtt_buflen);
if (RT_EOK != rt_event_recv (gTrigEvents, EVENT_TRIG_NETMODE_RX1, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 10000, RT_NULL))
{
netdrv_clear();
netdrv_reset();// 切换到mqtt 驱动
rt_thread_mdelay (3000);
goto MQTTINIT;
}
if (MQTTPacket_read (mqtt_buffer, MQTT_BUFF_LENGTH, netdrv_getdata) == SUBACK) /* wait for suback */
@@ -187,8 +205,10 @@ MQTTINIT:
MQTTDeserialize_suback (&submsgid, 1, &subcount, &granted_qos, mqtt_buffer, MQTT_BUFF_LENGTH);
if (granted_qos != 0)
{
rt_kprintf ("granted qos != 0, %d\n", granted_qos);
log_i ("granted qos != 0, %d\n", granted_qos);
netdrv_clear();
netdrv_reset();// 切换到mqtt 驱动
rt_thread_mdelay (3000);
goto MQTTINIT;
}
}
@@ -197,11 +217,12 @@ MQTTINIT:
rt_kprintf ("sub topic faild\r\n");
rt_thread_delay (1000);
netdrv_clear();
netdrv_reset();
goto MQTTINIT;
}
netdrv_clear();
rt_kprintf ("subtopic topic %s\r\n", subtopic[0].cstring);
log_i ("subtopic topic [%s]", subtopic[1].cstring);
rt_event_send (gTrigEvents, EVENT_TRIG_MQTT_SUB);
netdrv_clear();
rt_thread_delay (500);
@@ -226,16 +247,14 @@ MQTTINIT:
&payload_in, &payloadlen_in, mqtt_buffer, MQTT_BUFF_LENGTH);
rt_memcpy (gMqttDrv.rxbuff, payload_in, payloadlen_in) ;
gMqttDrv.rx_size = payloadlen_in;
//rt_memcpy(gMqttDrv.topic,receivedTopic.lenstring.data,receivedTopic.lenstring.len);
for (int var = 0; var < SUBTOPIC_COUNT + 1; ++var)
{
if (rt_memcmp (subtopic[var].cstring, receivedTopic.lenstring.data, receivedTopic.lenstring.len) == 0)
{
gMqttDrv.rx_index = var;
rt_kprintf ("recv from :%d,%*.s\r\n", gMqttDrv.rx_index, receivedTopic.lenstring.len, receivedTopic.lenstring.data);
break;
log_i ("recv from :%d", gMqttDrv.rx_index);
// break;
}
}
if (gMqttDrv.rx_index == 0) // 0 通道为升级通道
@@ -246,7 +265,7 @@ MQTTINIT:
{
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RX);
}
timerout_timer = 0;
MQTT_timerout_timer = 0;
}
netdrv_clear();
}
@@ -258,7 +277,8 @@ MQTTINIT:
}
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_MQTT_RST, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, 0, RT_NULL))
{
rt_kprintf ("mqtt conn lost\r\n");
log_i ("mqtt conn lost by timeout");
//netdrv_switch();// 切换到mqtt 驱动
netdrv_reset();
State = DISC;
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RST);
@@ -267,7 +287,8 @@ MQTTINIT:
// 网络链接丢失
if (g_netDrv->State != Conn)
{
rt_kprintf ("mqtt conn lost\r\n");
log_i ("mqtt conn lost by network\r\n");
//netdrv_switch();// 切换到mqtt 驱动
netdrv_reset();
State = DISC;
rt_event_send (gTrigEvents, EVENT_TRIG_COMM_RST);
@@ -283,7 +304,6 @@ MQTTINIT:
void MQTT_SendData (void)
{
// topic_index = index;
//// rt_memcpy(mqtt_payload,data,size);
//// mqtt_payload_size = size ;
@@ -313,7 +333,7 @@ void MQTTThreadStart (void)
void shell_mqtt_time (void)
{
rt_kprintf ("lost_timer:%u\r\n", timerout_timer) ;
rt_kprintf ("lost_timer:%u\r\n", MQTT_timerout_timer) ;
}
+142 -68
View File
@@ -9,80 +9,116 @@
#include "netdrv.h"
#include "dtu-board.h"
extern netDrv_t g_cat1Drv;
extern netDrv_t g_MJEth1Drv;
extern netDrv_t g_dtuDrv;
#if !defined(LOG_TAG)
#define LOG_TAG "netdrv"
#endif
#include <elog.h>
extern netDrvInfo_t g_cat1Drv;
extern netDrvInfo_t g_MJEth1Drv;
extern netDrvInfo_t g_dtuDrv;
netDrv_t * g_netDrv;
netDrvInfo_t * g_netDrv;
static int mysock = 0;
static int offset = 0;
netDrv_t g_net_drv = Cat1;// 0选择4G 上网 1:选择eth上网
// 使用4G 模块上网
static void netdrv_openCat1 (void)
{
g_dtuDrv.IsEnable = 0; // 打开4G
g_cat1Drv.IsEnable = 1;
g_netDrv = &g_cat1Drv; // 0 选择 dtu 上网
rt_event_send (gTrigEvents, EVENT_TRIG_ETH_SHUT) ;
}
// 使用Eth 模块上网
static void netdrv_openDtu (void)
{
g_dtuDrv.IsEnable = 1; // 打开4G
g_cat1Drv.IsEnable = 0;
g_netDrv = &g_dtuDrv; // 0 选择 dtu 上网
// 通知4g模块关机
rt_event_send (gTrigEvents, EVENT_TRIG_CAT1_SHUT) ;
}
void netdrv_init (void)
{
char * drv = ef_get_env ("net_drv"); // 读取网络类型
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
{
g_netDrv = &g_dtuDrv;
DTUThreadStart();
}
else if (rt_memcmp ("ec200", drv, 4) == 0)
{
g_netDrv = &g_cat1Drv;
CAT1ThreadStart();
if (g_net_drv == Dtu) // 4G 模块
{
netdrv_openDtu();
}
// else if (rt_memcmp ("eth", drv, 3) == 0)
// {
// g_netDrv = &g_MJEth1Drv;
// MJEth1ThreadStart();
// }
else
{
netdrv_openCat1();
}
DTUThreadStart(); // 启动线程
CAT1ThreadStart(); // 启动线程
}
void netdrv_service_tx (uint8_t * data, int length)
{
char * drv = ef_get_env ("net_drv"); // 读取网络类型
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
if (g_net_drv == Dtu)
{
dtu_service_tx ( (char *) data, length);
}
else if (rt_memcmp ("ec200", drv, 4) == 0)
else
{
cat1_service_tx ( (char *) data, length);
}
else if (rt_memcmp ("eth", drv, 3) == 0)
{
}
// 切换网络驱动
void netdrv_switch (void)
{
if (g_net_drv == Dtu)
{
log_i ("net work drv switch to cat1");
netdrv_openCat1();
g_net_drv = Cat1 ;
}
else
{
log_i ("net work drv switch to dtu");
netdrv_openDtu();
g_net_drv = Dtu ;
}
}
void netdrv_reset (void)
{
char * drv = ef_get_env ("net_drv"); // 读取网络类型
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
// char * drv = ef_get_env ("net_drv"); // 读取网络类型
// if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
// {
// dtu_netreset();
// }
// else if (rt_memcmp ("ec200", drv, 4) == 0)
// {
// //cat1_service_tx ( (char *) data, length);
// }
// else if (rt_memcmp ("eth", drv, 3) == 0)
// {
// }
// else
// {
// }
if (g_net_drv == Dtu)
{
dtu_netreset();
}
else if (rt_memcmp ("ec200", drv, 4) == 0)
{
//cat1_service_tx ( (char *) data, length);
}
else if (rt_memcmp ("eth", drv, 3) == 0)
{
}
else
{
@@ -94,9 +130,47 @@ void netdrv_reset (void)
int netdrv_getdata (unsigned char* buf, int count)
{
int tsize = 0;
char * drv = ef_get_env ("net_drv"); // 读取网络类型
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
// char * drv = ef_get_env ("net_drv"); // 读取网络类型
// if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
// {
// if (offset + count > g_netDrv->rx_size)
// {
// tsize = g_netDrv->rx_size - offset;
// rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
// }
// else
// {
// tsize = count;
// rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
// }
// }
// else if (rt_memcmp ("ec200", drv, 4) == 0)
// {
// if (offset + count > g_netDrv->rx_size)
// {
// tsize = g_netDrv->rx_size - offset;
// rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
// }
// else
// {
// tsize = count;
// rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
// }
// }
// else if (rt_memcmp ("eth", drv, 3) == 0)
// {
// }
// else
// {
// }
if (g_net_drv == Dtu)
{
//dtu_netreset();
if (offset + count > g_netDrv->rx_size)
{
tsize = g_netDrv->rx_size - offset;
@@ -107,28 +181,19 @@ int netdrv_getdata (unsigned char* buf, int count)
tsize = count;
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
}
}
else if (rt_memcmp ("ec200", drv, 4) == 0)
{
if (offset + count > g_netDrv->rx_size)
{
tsize = g_netDrv->rx_size - offset;
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
}
else
{
tsize = count;
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
}
}
else if (rt_memcmp ("eth", drv, 3) == 0)
{
}
else
{
if (offset + count > g_netDrv->rx_size)
{
tsize = g_netDrv->rx_size - offset;
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
}
else
{
tsize = count;
rt_memcpy (buf, &g_netDrv->rxbuff[offset], tsize);
}
}
offset += count;
return tsize;
@@ -138,19 +203,28 @@ int netdrv_getdata (unsigned char* buf, int count)
int netdrv_clear (void)
{
char * drv = ef_get_env ("net_drv"); // 读取网络类型
if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
// char * drv = ef_get_env ("net_drv"); // 读取网络类型
// if (rt_memcmp ("dtu", drv, 3) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
// {
// MX_UART_Clear (&g_ETH1Drv);
// }
// else if (rt_memcmp ("ec200", drv, 4) == 0)
// {
// //rt_memcpy(buf, &g_cat1Drv.rxbuff[offset], count);
// }
// else if (rt_memcmp ("eth", drv, 3) == 0)
// {
// }
// else
// {
// }
if (g_net_drv == Dtu)
{
MX_UART_Clear (&g_ETH1Drv);
}
else if (rt_memcmp ("ec200", drv, 4) == 0)
{
//rt_memcpy(buf, &g_cat1Drv.rxbuff[offset], count);
}
else if (rt_memcmp ("eth", drv, 3) == 0)
{
}
else
{
+19 -8
View File
@@ -10,7 +10,13 @@ typedef enum netDrvState_t
Idle // 空闲
} netDrvState_t;
typedef struct netDrv_t
typedef enum netDrv_t
{
Dtu = 0,
Cat1 = 1
} netDrv_t;
typedef struct netDrvInfo_t
{
int Csq;
char Iccid[20];
@@ -19,7 +25,10 @@ typedef struct netDrv_t
int rx_size; // 接受到的tcp 数据缓存
char * txbuff; // 发送的TCP 数据缓存
int tx_size;
} netDrv_t;
int IsEnable;
} netDrvInfo_t;
typedef enum CommRet_T
@@ -28,14 +37,16 @@ typedef enum CommRet_T
RetErr
} CommRet_T;
extern netDrv_t * g_netDrv;;
extern netDrvInfo_t * g_netDrv;
extern netDrv_t g_net_drv ;// 0选择4G 上网 1:选择eth上网
void netdrv_service_tx (uint8_t * data, int length);
int netdrv_getdata (uint8_t* buf, int count);
int netdrv_clear (void);
void netdrv_init (void);
void netdrv_reset (void); // 网络链接失败,通知驱动重新启动网络模块
extern void netdrv_service_tx (uint8_t * data, int length);
extern int netdrv_getdata (uint8_t* buf, int count);
extern int netdrv_clear (void);
extern void netdrv_init (void);
extern void netdrv_reset (void); // 网络链接失败,通知驱动重新启动网络模块
extern void netdrv_switch (void);
#endif
+82
View File
@@ -0,0 +1,82 @@
#include <stdint.h>
#include "aes.h"
#include <rtthread.h>
/*!
* AES computation context variable
*/
static aes_context AesContext;
/*!
* Encryption aBlock and sBlock
*/
static uint8_t aBlock[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static uint8_t sBlock[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void LoRaMacPayloadEncrypt (const uint8_t *buffer, uint16_t size, const uint8_t *key, uint8_t *encBuffer)
{
uint16_t i;
uint8_t bufferIndex = 0;
uint16_t ctr = 1;
rt_memset (AesContext.ksch, '\0', 240);
aes_set_key (key, 16, &AesContext);
// aBlock[5] = dir;
// aBlock[6] = ( address ) & 0xFF;
// aBlock[7] = ( address >> 8 ) & 0xFF;
// aBlock[8] = ( address >> 16 ) & 0xFF;
// aBlock[9] = ( address >> 24 ) & 0xFF;
// aBlock[10] = ( sequenceCounter ) & 0xFF;
// aBlock[11] = ( sequenceCounter >> 8 ) & 0xFF;
// aBlock[12] = ( sequenceCounter >> 16 ) & 0xFF;
// aBlock[13] = ( sequenceCounter >> 24 ) & 0xFF;
while (size >= 16)
{
aBlock[15] = ( (ctr) & 0xFF);
ctr++;
aes_encrypt (aBlock, sBlock, &AesContext);
for (i = 0; i < 16; i++)
{
encBuffer[bufferIndex + i] = buffer[bufferIndex + i] ^ sBlock[i];
}
size -= 16;
bufferIndex += 16;
}
if (size > 0)
{
aBlock[15] = ( (ctr) & 0xFF);
aes_encrypt (aBlock, sBlock, &AesContext);
for (i = 0; i < size; i++)
{
encBuffer[bufferIndex + i] = buffer[bufferIndex + i] ^ sBlock[i];
}
}
}
void LoRaMacPayloadDecrypt (const uint8_t *buffer, uint16_t size, const uint8_t *key, uint32_t address, uint8_t dir, uint32_t sequenceCounter, uint8_t *decBuffer)
{
LoRaMacPayloadEncrypt (buffer, size, key, decBuffer);
}
void netWorkAesInit (void)
{
char data[128] = {"8989098989098989"}, data1[128];
char key[] = {"8989098989890989"};
aes_set_key (key, 16, &AesContext);
LoRaMacPayloadEncrypt (data, 16, key, data1) ;
for (int i = 0; i < 32; i++)
{
rt_kprintf ("%02x", data1[i]);
}
rt_kprintf ("\r\n");
}
+7
View File
@@ -0,0 +1,7 @@
#ifndef _NEETWORK_CRYPTO_H
#define _NEETWORK_CRYPTO_H
void netWorkAesInit (void);
#endif
+14 -7
View File
@@ -10,6 +10,7 @@
static int g_syn_number = 0;
@@ -35,7 +36,6 @@ int PacketHeader (uint8_t func, char * data, int length, char * txbuff)
txbuff[tx_size++] = 0x00;
txbuff[tx_size++] = length;// 长度
txbuff[tx_size++] = _651_STX;
//dbg_printf ("sizeof (_651_U_Header_t):%d\r\n", tx_size);
for (int i = 0; i < length; i++)
{
@@ -99,6 +99,14 @@ int PakcetTimerUp (int k, char * tx_data)
tx_data[tx_size++] = 0xFF; // 要素1 闸前水位
tx_data[tx_size++] = 0x39; // 要素1 闸前水位
#ifdef USER_UNREAL_DATA // 使用虚拟数据上报
WaterData[0].thisSpeed = rand() % 36 / 10;
WaterData[0].thisFlow = rand() % 36 / 10;
WaterData[0].ttWater = 32567;
SluiceData[0].gopen = 835;
SluiceData[0].lload = 250;
WaterData[0].thisLevel = rand() % 36 / 10;
#endif
intk.data = WaterData[0].thisSpeed * 100;
tx_data[tx_size++] = intk.byte[3];
@@ -117,13 +125,13 @@ int PakcetTimerUp (int k, char * tx_data)
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
intk.data = SluiceData[k].gopen * 10;
intk.data = SluiceData[0].gopen * 10;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
intk.data = (SluiceData[k].lload + SluiceData[k].rload) * 10;
intk.data = (SluiceData[0].lload + SluiceData[0].rload) * 10;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
@@ -137,14 +145,14 @@ int PakcetTimerUp (int k, char * tx_data)
tx_data[tx_size++] = intk.byte[0];
// 要素7 电池电压
intk.data = 0 * 100;
intk.data = 12.3 * 100;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
tx_data[tx_size++] = intk.byte[0];
// 要素8 机箱温度
intk.data = 0 * 100;
intk.data = 25.6 * 100;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
@@ -171,8 +179,7 @@ int PacketSluiceUp (int k, char * tx_data)
tx_data[tx_size++] = 0x01;
tx_data[tx_size++] = 0x01;
// // 闸门开度
intk.data = SluiceData[k].gopen * 10;
rt_kprintf("gopen:%d\r\n");
intk.data = SluiceData[0].gopen * 10;
tx_data[tx_size++] = intk.byte[3];
tx_data[tx_size++] = intk.byte[2];
tx_data[tx_size++] = intk.byte[1];
+191 -37
View File
@@ -1,6 +1,10 @@
#include "usart-board.h"
#include "usart.h"
#include <rtthread.h>
#if !defined(LOG_TAG)
#define LOG_TAG "uart"
#endif
#include <elog.h>
#define UART_LPUART1_BUFF_SIZE 256 // 4853
#define UART_LPUART2_BUFF_SIZE 2400 // gsm
@@ -23,6 +27,11 @@ static char s_uart5_buff[UART_UART5_BUFF_SIZE];
static char s_uart6_buff[UART_UART6_BUFF_SIZE];
#define RXBUFFERSIZE 2400
uint8_t aDmaLp2RxBuffer[RXBUFFERSIZE];
uint8_t aDmaU4RxBuffer [RXBUFFERSIZE];
extern UART_HandleTypeDef hlpuart1;
extern UART_HandleTypeDef hlpuart2;
extern UART_HandleTypeDef huart1;
@@ -208,6 +217,7 @@ void MX_UART_Init (UartDrv_t *drv)
Error_Handler();
}
__HAL_UART_ENABLE_IT (&hlpuart1, UART_IT_RXNE);
__HAL_UART_ENABLE_IT (&hlpuart1, UART_IT_ORE);
break;
}
case G0_LPUART2 : // GSM
@@ -238,7 +248,16 @@ void MX_UART_Init (UartDrv_t *drv)
{
Error_Handler();
}
__HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_RXNE);
//__HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&hlpuart2, UART_IT_IDLE);
__HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_ORE);
// __HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_NE);
// __HAL_UART_ENABLE_IT (&hlpuart2, UART_IT_FE);
if (HAL_UART_Receive_DMA (&hlpuart2, (uint8_t *) aDmaLp2RxBuffer, RXBUFFERSIZE) != HAL_OK)
{
Error_Handler();
}
break;
case G0_UART1 : // 4853
huart1.Instance = USART1;
@@ -300,6 +319,7 @@ void MX_UART_Init (UartDrv_t *drv)
}
// 使能串口接受中断,用于接受数据
__HAL_UART_ENABLE_IT (&huart2, UART_IT_RXNE);
__HAL_UART_ENABLE_IT (&huart2, UART_IT_ORE);
break;
case G0_UART3: // 4852
huart3.Instance = USART3;
@@ -329,6 +349,7 @@ void MX_UART_Init (UartDrv_t *drv)
{
Error_Handler();
}
__HAL_UART_ENABLE_IT (&huart3, UART_IT_ORE);
__HAL_UART_ENABLE_IT (&huart3, UART_IT_RXNE);
break;
case G0_UART4: // ETH1
@@ -348,7 +369,13 @@ void MX_UART_Init (UartDrv_t *drv)
Error_Handler();
}
/* USER CODE BEGIN USART4_Init 2 */
__HAL_UART_ENABLE_IT (&huart4, UART_IT_RXNE);
//__HAL_UART_ENABLE_IT (&huart4, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
__HAL_UART_ENABLE_IT (&huart4, UART_IT_ORE);
if (HAL_UART_Receive_DMA (&huart4, (uint8_t *) aDmaU4RxBuffer, RXBUFFERSIZE) != HAL_OK)
{
Error_Handler();
}
break;
case G0_UART5: // 4851
huart5.Instance = USART5;
@@ -367,6 +394,7 @@ void MX_UART_Init (UartDrv_t *drv)
Error_Handler();
}
/* USER CODE BEGIN USART5_Init 2 */
__HAL_UART_ENABLE_IT (&huart5, UART_IT_ORE);
__HAL_UART_ENABLE_IT (&huart5, UART_IT_RXNE);
break;
case G0_UART6: // View
@@ -386,6 +414,7 @@ void MX_UART_Init (UartDrv_t *drv)
Error_Handler();
}
__HAL_UART_ENABLE_IT (&huart6, UART_IT_RXNE);
__HAL_UART_ENABLE_IT (&huart6, UART_IT_ORE);
break;
default:
break;
@@ -393,22 +422,34 @@ void MX_UART_Init (UartDrv_t *drv)
}
void MX_UART_IRQHandle (void)
void MX_UART2_LPUART2_IRQHandle (void)
{
uint8_t ret;
if (USART3->ISR & (1 << 5)) // 串口2
// if (LPUART2->ISR & USART_ISR_RXNE_RXFNE)
// {
//
// ret = LPUART2->RDR;
// if (g_GSMDrv.rx_buffer != NULL)
// {
// g_GSMDrv.rx_buffer[g_GSMDrv.rx_size++] = ret;
// g_GSMDrv.rx_timer = 30; // 30ms
// if (g_GSMDrv.rx_size > UART_LPUART2_BUFF_SIZE)
// g_GSMDrv.rx_size = 0;
// }
// } debug
if (LPUART2->ISR & USART_ISR_ORE)
{
ret = USART3->RDR;
if (g_U4852Drv.rx_buffer != NULL)
{
g_U4852Drv.rx_buffer[g_U4852Drv.rx_size++] = ret;
g_U4852Drv.rx_timer = 30; // 30ms
if (g_U4852Drv.rx_size > UART_UART3_BUFF_SIZE)
g_U4852Drv.rx_size = 0;
}
// rt_kprintf("ore:l2\r\n");
__HAL_UART_CLEAR_FLAG(&hlpuart2, UART_CLEAR_OREF);
}
if (USART2->ISR & (1 << 5)) // 串口2
if (USART2->ISR & USART_ISR_ORE)
{
//rt_kprintf("ore:2\r\n");
__HAL_UART_CLEAR_FLAG(&huart2, UART_CLEAR_OREF);
}
if (USART2->ISR & USART_ISR_RXNE_RXFNE) // 串口2
{
ret = USART2->RDR;
if (g_DebugDrv.rx_buffer != NULL)
@@ -419,18 +460,87 @@ void MX_UART_IRQHandle (void)
g_DebugDrv.rx_size = 0;
}
}
if (USART4->ISR & (1 << 5))
}
// 串口空闲终端处理函数
void MX_UART2_LPUART2_IDLE_IRQHandle(void)
{
uint16_t ret;
if (LPUART2->ISR & USART_ISR_IDLE) // 串口空闲中断
{
ret = USART4->RDR;
if (g_ETH1Drv.rx_buffer != NULL)
ret = UART_LPUART2_BUFF_SIZE - __HAL_DMA_GET_COUNTER(hlpuart2.hdmarx); // 接收到数据的长度
if (ret > 0)
{
g_ETH1Drv.rx_buffer[g_ETH1Drv.rx_size++] = ret;
g_ETH1Drv.rx_timer = 30; // 30ms
if (g_ETH1Drv.rx_size > UART_UART4_BUFF_SIZE)
g_ETH1Drv.rx_size = 0;
rt_memcpy(g_GSMDrv.rx_buffer,aDmaLp2RxBuffer,ret);
g_GSMDrv.rx_size = ret;
//g_GSMDrv.rxdone();
}
else
{
g_GSMDrv.rx_size = 0;
}
g_GSMDrv.rxdone();
__HAL_UART_CLEAR_FLAG(&hlpuart2, UART_CLEAR_IDLEF);
// 处理DMA 数据
}
// 处理DMA 数据
}
void MX_UART_IDLE_IRQHandle(void)
{
uint16_t ret;
if (USART4->ISR & USART_ISR_IDLE) // 串口空闲中断
{
ret = UART_UART4_BUFF_SIZE - __HAL_DMA_GET_COUNTER(huart4.hdmarx); // 接收到数据的长度
//log_i("MX_UART_IDLE_IRQHandle:%d",ret);
if (ret > 0)
{
rt_memcpy(g_ETH1Drv.rx_buffer,aDmaU4RxBuffer,ret);
g_ETH1Drv.rx_size = ret;
//g_ETH1Drv.rxdone();
}
else
{
g_ETH1Drv.rx_size = 0;
}
g_ETH1Drv.rxdone();
__HAL_UART_CLEAR_FLAG(&huart4, UART_CLEAR_IDLEF);
// 处理DMA 数据
}
// 处理DMA 数据
}
void MX_UART_IRQHandle (void)
{
uint8_t ret;
if (USART3->ISR & USART_ISR_RXNE_RXFNE) // 串口2
{
ret = USART3->RDR;
if (g_U4852Drv.rx_buffer != NULL)
{
g_U4852Drv.rx_buffer[g_U4852Drv.rx_size++] = ret;
g_U4852Drv.rx_timer = 30; // 30ms
if (g_U4852Drv.rx_size > UART_UART3_BUFF_SIZE)
g_U4852Drv.rx_size = 0;
}
}
if (USART5->ISR & (1 << 5))
// if (USART4->ISR & USART_ISR_RXNE_RXFNE)
// {
// ret = USART4->RDR;
// if (g_ETH1Drv.rx_buffer != NULL)
// {
// g_ETH1Drv.rx_buffer[g_ETH1Drv.rx_size++] = ret;
// g_ETH1Drv.rx_timer = 30; // 30ms
// if (g_ETH1Drv.rx_size > UART_UART4_BUFF_SIZE)
// g_ETH1Drv.rx_size = 0;
// }
// }
if (USART5->ISR & USART_ISR_RXNE_RXFNE)
{
ret = USART5->RDR;
if (g_U4851Drv.rx_buffer != NULL)
@@ -441,9 +551,10 @@ void MX_UART_IRQHandle (void)
g_U4851Drv.rx_size = 0;
}
}
if (USART6->ISR & (1 << 5))
if (USART6->ISR & USART_ISR_RXNE_RXFNE)
{
ret = USART6->RDR;
if (g_ViewDrv.rx_buffer != NULL)
{
g_ViewDrv.rx_buffer[g_ViewDrv.rx_size++] = ret;
@@ -452,8 +563,9 @@ void MX_UART_IRQHandle (void)
g_ViewDrv.rx_size = 0;
}
}
if (LPUART1->ISR & (1 << 5))
if (LPUART1->ISR & USART_ISR_RXNE_RXFNE)
{
ret = LPUART1->RDR;
if (g_ETH2Drv.rx_buffer != NULL)
@@ -464,25 +576,64 @@ void MX_UART_IRQHandle (void)
g_ETH2Drv.rx_size = 0;
}
}
if (LPUART2->ISR & (1 << 5))
if (USART3->ISR & USART_ISR_ORE)
{
ret = LPUART2->RDR;
if (g_GSMDrv.rx_buffer != NULL)
{
g_GSMDrv.rx_buffer[g_GSMDrv.rx_size++] = ret;
g_GSMDrv.rx_timer = 30; // 30ms
if (g_GSMDrv.rx_size > UART_LPUART2_BUFF_SIZE)
g_GSMDrv.rx_size = 0;
}
//rt_kprintf("ore:3\r\n");
__HAL_UART_CLEAR_FLAG(&huart3, UART_CLEAR_OREF);
}
if (USART4->ISR & USART_ISR_ORE)
{
//rt_kprintf("ore:4\r\n");
__HAL_UART_CLEAR_FLAG(&huart4, UART_CLEAR_OREF);
}
if (USART6->ISR & USART_ISR_ORE)
{
//rt_kprintf("ore:6\r\n");
__HAL_UART_CLEAR_FLAG(&huart6, UART_CLEAR_OREF);
}
if (USART5->ISR & USART_ISR_ORE)
{
//rt_kprintf("ore:5\r\n");
__HAL_UART_CLEAR_FLAG(&huart5, UART_CLEAR_OREF);
}
if (LPUART1->ISR & USART_ISR_ORE)
{
//rt_kprintf("ore:l1\r\n");
__HAL_UART_CLEAR_FLAG(&hlpuart1, UART_CLEAR_OREF);
}
}
void MX_UART_Clear (UartDrv_t * drv)
{
drv->rx_size = 0;
drv->rx_timer = 0;
if (drv->Id == G0_LPUART2)
{
if (HAL_UART_AbortReceive(&hlpuart2) != HAL_OK)
{
Error_Handler();
}
if (HAL_UART_Receive_DMA (&hlpuart2, (uint8_t *) aDmaLp2RxBuffer, RXBUFFERSIZE) != HAL_OK)
{
Error_Handler();
}
}
else if (drv->Id == G0_UART4)
{
if (HAL_UART_AbortReceive(&huart4) != HAL_OK)
{
Error_Handler();
}
if (HAL_UART_Receive_DMA (&huart4, (uint8_t *) aDmaU4RxBuffer, RXBUFFERSIZE) != HAL_OK)
{
Error_Handler();
}
}
else {
drv->rx_size = 0;
drv->rx_timer = 0;
}
}
void MX_UART_PutChar (UartDrv_t * drv, char ch)
@@ -518,6 +669,9 @@ void MX_UART_PutChar (UartDrv_t * drv, char ch)
}
}
void MX_UART_PutBuffer (UartDrv_t * drv, char *buff, int size)
{
for (int i = 0; i < size; i++)