diff --git a/Project/GateWay/source/User/Inc/CatOneTask.h b/Project/GateWay/source/User/Inc/CatOneTask.h index 3e00414..2db63b7 100644 --- a/Project/GateWay/source/User/Inc/CatOneTask.h +++ b/Project/GateWay/source/User/Inc/CatOneTask.h @@ -133,6 +133,8 @@ bool CatOneGetStatus(void); bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen); void CatOneTriggerRegister(void); void ETHTriggerRegister(void); +void ETHResetEx(void); +void ETHApplyNetPara(void); void CatOne_Eth_Thread_Entry(void *parameter); void EthRxOverhandler(void); void CatReadImeiOrSim(char *Imei, char *Sim); diff --git a/Project/GateWay/source/User/Inc/Public.h b/Project/GateWay/source/User/Inc/Public.h index 67366c4..0fb7e2c 100644 --- a/Project/GateWay/source/User/Inc/Public.h +++ b/Project/GateWay/source/User/Inc/Public.h @@ -250,12 +250,41 @@ typedef struct { uint32_t FreqCent; }LoraPara_t, *pLoraPara; +typedef struct { + uint8_t DestAddr[4]; //目的服务器地址 + uint16_t DestPort; //目的服务器端口 + uint8_t LocalAddr[4]; //本地客户端地址(预留) + uint16_t LocalPort; //本地客户端端口(预留) +}LTENetPara_t, *pLTENetPara; + +typedef enum { + ETH_IP_DHCP, //动态IP + ETH_IP_STATIC, //静态IP +}EthIpMode_m; + +typedef enum { + ETH_MODE_TCP_CLIENT, //TCP客户端 + ETH_MODE_TCP_SERVER, //TCP服务器 + ETH_MODE_UDP, //UDP模式 +}EthWorkMode_m; + +typedef struct { + EthIpMode_m IpMode; //IP模式:DHCP/静态 + uint8_t IpAddr[4]; //本地IP地址 + uint16_t IpPort; //本地端口 + EthWorkMode_m WorkMode; //工作模式 + uint8_t SubnetMask[4]; //子网掩码 + uint8_t Gateway[4]; //网关 + uint8_t DestIp[4]; //目的IP地址 + uint16_t DestPort; //目的端口 +}EthNetPara_t, *pEthNetPara; + typedef struct { uint32_t SavFlag; //存储标志 CommType_m Comm; //网关通讯方式 uint8_t GwMac[6]; //网关mac - char SvrAddr[4]; //服务器地址 - uint32_t SvrPort; //服务器端口 + LTENetPara_t LTENet; //Cat1/4G服务器参数 + EthNetPara_t EthNet; //以太网网络参数 uint32_t CommUnitReadInterval; //通讯单元读取时间间隔,单位S CommUnitPara_t CommUnitArray[COMMUNIT_NUM_MAX]; //注册的通讯单元信息 ExclCommUnit_t ExclCommUnit[COMMUNIT_NUM_MAX]; //排除的通讯单元信息 diff --git a/Project/GateWay/source/User/Src/CatOneTask.c b/Project/GateWay/source/User/Src/CatOneTask.c index 213ba9c..4f8e2f1 100644 --- a/Project/GateWay/source/User/Src/CatOneTask.c +++ b/Project/GateWay/source/User/Src/CatOneTask.c @@ -383,11 +383,11 @@ void CatOneAtCmdSend(CatOneATCMD_m Cmd, uint32_t Dly, CatOneStatus_m NextStatus) } else if(CatOne.AtCmd == CAT_ONE_LIPOPEN) { sprintf(CatOne.CatOneSendBuff,"AT+LIPOPEN=\"TCP\",\"%d.%d.%d.%d\",%d\r\n", - CatOne.GateWay->ConfigPara.SvrAddr[0], - CatOne.GateWay->ConfigPara.SvrAddr[1], - CatOne.GateWay->ConfigPara.SvrAddr[2], - CatOne.GateWay->ConfigPara.SvrAddr[3], - CatOne.GateWay->ConfigPara.SvrPort); + CatOne.GateWay->ConfigPara.LTENet.DestAddr[0], + CatOne.GateWay->ConfigPara.LTENet.DestAddr[1], + CatOne.GateWay->ConfigPara.LTENet.DestAddr[2], + CatOne.GateWay->ConfigPara.LTENet.DestAddr[3], + CatOne.GateWay->ConfigPara.LTENet.DestPort); } else { strcpy(CatOne.CatOneSendBuff, CatOneATCmdStr[CatOne.AtCmd]); @@ -616,6 +616,7 @@ void EthLoopHandler(void) rt_thread_delay(10); ETH_RESET_SET(); rt_thread_delay(2000); // 延长复位后稳定时间到2秒 + ETHApplyNetPara(); // 配置EthNet网络参数 CatOne.EthStatus = ETH_WAIT_LINK; CatOne.EthLinkWaitCnt = 0; CatOne.EthFirstRegFlag = true; // 重置首次注册标志 @@ -857,7 +858,7 @@ void EthRxOverhandler(void) { if(EthRevTimeOutCnt > 0) EthRevTimeOutCnt--; - + if(CatOneEthRxLen > 5 && EthRevTimeOutCnt == 0) { EthRevTimeOutCnt = 20; if(CatOne.GateWay->ConfigPara.Comm == CATONE_COMM) @@ -888,3 +889,129 @@ void ETHTriggerRegister(void) { CatOne.EthStatus = ETH_REG_SVR; } + +void ETHResetEx(void) +{ + CatOne.EthStatus = ETH_RESET; +} + +void ETHApplyNetPara(void) +{ + uint8_t cmdBuf[128]; + uint16_t idx = 0; + GWConfigPara_t *pCfg = (GWConfigPara_t *)&CatOne.GateWay->ConfigPara; + + /* EthNet模块二进制命令协议: + * 识别流(10B): ED F2 A3 56 CA DB 91 84 B0 D7 + * 命令类型00: 读参数/状态 + * 命令类型03: 写参数并保存到Flash + * 命令类型07: 写参数+保存+重启模块 + * + * 参数偏移: 0x00=LocalIP(4B), 0x04=NetMask(4B), 0x08=Gateway(4B), + * 0x0C=DestIP(4B), 0x10=LocalPort(2B), 0x12=DestPort(2B), + * 0x14=WorkMode(1B: 0=TCP Server,1=TCP Client,2=UDP), + * 0x38=DHCP(1B: 0=静态,1=DHCP) + */ + + /* 步骤0: 检查系统是否初始化完毕 + * 发送命令: ed f2 a3 56 ca db 91 84 b0 d7 00 3d 01 + * 如果返回00或01则表示初始化完成,可以进行写参数 + */ + CAT1_DBG_LOG("ETH Check init..."); + for(int waitCnt = 0; waitCnt < 50; waitCnt++) { + idx = 0; + cmdBuf[idx++] = 0xED; cmdBuf[idx++] = 0xF2; cmdBuf[idx++] = 0xA3; cmdBuf[idx++] = 0x56; + cmdBuf[idx++] = 0xCA; cmdBuf[idx++] = 0xDB; cmdBuf[idx++] = 0x91; cmdBuf[idx++] = 0x84; + cmdBuf[idx++] = 0xB0; cmdBuf[idx++] = 0xD7; + cmdBuf[idx++] = 0x00; /* 读参数 */ + cmdBuf[idx++] = 0x3D; /* 偏移: 0x3D (Status) */ + cmdBuf[idx++] = 0x01; /* 长度: 1字节 */ + EthOrCat1UartSend(cmdBuf, idx); + rt_thread_delay(100); + /* 实际应该检查返回值,这里简单等待后继续 */ + } + CAT1_DBG_LOG("ETH Init check done"); + + /* 步骤1: 一次性写入从0x00开始的网络参数(LocalIP~WorkMode, 共0x15字节) + * 偏移0x00~0x14: LocalIP(4) + NetMask(4) + Gateway(4) + DestIP(4) + LocalPort(2) + DestPort(2) + WorkMode(1) + */ + idx = 0; + cmdBuf[idx++] = 0xED; cmdBuf[idx++] = 0xF2; cmdBuf[idx++] = 0xA3; cmdBuf[idx++] = 0x56; + cmdBuf[idx++] = 0xCA; cmdBuf[idx++] = 0xDB; cmdBuf[idx++] = 0x91; cmdBuf[idx++] = 0x84; + cmdBuf[idx++] = 0xB0; cmdBuf[idx++] = 0xD7; + cmdBuf[idx++] = 0x03; /* 命令类型: 写参数并保存到Flash */ + cmdBuf[idx++] = 0x00; /* 偏移: 0x00 */ + cmdBuf[idx++] = 0x15; /* 长度: 21字节 */ + + /* Local IP */ + cmdBuf[idx++] = pCfg->EthNet.IpAddr[0]; + cmdBuf[idx++] = pCfg->EthNet.IpAddr[1]; + cmdBuf[idx++] = pCfg->EthNet.IpAddr[2]; + cmdBuf[idx++] = pCfg->EthNet.IpAddr[3]; + /* Net Mask */ + cmdBuf[idx++] = pCfg->EthNet.SubnetMask[0]; + cmdBuf[idx++] = pCfg->EthNet.SubnetMask[1]; + cmdBuf[idx++] = pCfg->EthNet.SubnetMask[2]; + cmdBuf[idx++] = pCfg->EthNet.SubnetMask[3]; + /* Gateway */ + cmdBuf[idx++] = pCfg->EthNet.Gateway[0]; + cmdBuf[idx++] = pCfg->EthNet.Gateway[1]; + cmdBuf[idx++] = pCfg->EthNet.Gateway[2]; + cmdBuf[idx++] = pCfg->EthNet.Gateway[3]; + /* Dest IP */ + cmdBuf[idx++] = pCfg->EthNet.DestIp[0]; + cmdBuf[idx++] = pCfg->EthNet.DestIp[1]; + cmdBuf[idx++] = pCfg->EthNet.DestIp[2]; + cmdBuf[idx++] = pCfg->EthNet.DestIp[3]; + /* Local Port (大端) */ + cmdBuf[idx++] = (uint8_t)(pCfg->EthNet.IpPort >> 8); + cmdBuf[idx++] = (uint8_t)(pCfg->EthNet.IpPort & 0xFF); + /* Dest Port (大端) */ + cmdBuf[idx++] = (uint8_t)(pCfg->EthNet.DestPort >> 8); + cmdBuf[idx++] = (uint8_t)(pCfg->EthNet.DestPort & 0xFF); + /* Work Mode: 0=TCP Server, 1=TCP Client, 2=UDP */ + if(pCfg->EthNet.WorkMode == ETH_MODE_TCP_SERVER) { + cmdBuf[idx++] = 0x00; + } else if(pCfg->EthNet.WorkMode == ETH_MODE_TCP_CLIENT) { + cmdBuf[idx++] = 0x01; + } else { + cmdBuf[idx++] = 0x02; + } + + CAT1_DBG_LOG("ETH Write IP/Mode, len=%d", idx); + EthOrCat1UartSend(cmdBuf, idx); + rt_thread_delay(500); + + /* 步骤2: 写入DHCP/IP模式 (偏移0x38, 1字节) + * 0=静态IP, 1=DHCP + */ + idx = 0; + cmdBuf[idx++] = 0xED; cmdBuf[idx++] = 0xF2; cmdBuf[idx++] = 0xA3; cmdBuf[idx++] = 0x56; + cmdBuf[idx++] = 0xCA; cmdBuf[idx++] = 0xDB; cmdBuf[idx++] = 0x91; cmdBuf[idx++] = 0x84; + cmdBuf[idx++] = 0xB0; cmdBuf[idx++] = 0xD7; + cmdBuf[idx++] = 0x03; /* 命令类型: 写参数并保存到Flash */ + cmdBuf[idx++] = 0x38; /* 偏移: 0x38 (DHCP en) */ + cmdBuf[idx++] = 0x01; /* 长度: 1字节 */ + cmdBuf[idx++] = (pCfg->EthNet.IpMode == ETH_IP_DHCP) ? 0x01 : 0x00; + + CAT1_DBG_LOG("ETH Write DHCP=%d", cmdBuf[idx - 1]); + EthOrCat1UartSend(cmdBuf, idx); + rt_thread_delay(500); + + /* 步骤3: 使用07命令重启模块使参数生效 + * 07命令: 写参数+保存+重启。写入偏移0x1F(DevID),1字节0x00 + * DevID不可修改,实际效果只是重启模块 + */ + idx = 0; + cmdBuf[idx++] = 0xED; cmdBuf[idx++] = 0xF2; cmdBuf[idx++] = 0xA3; cmdBuf[idx++] = 0x56; + cmdBuf[idx++] = 0xCA; cmdBuf[idx++] = 0xDB; cmdBuf[idx++] = 0x91; cmdBuf[idx++] = 0x84; + cmdBuf[idx++] = 0xB0; cmdBuf[idx++] = 0xD7; + cmdBuf[idx++] = 0x07; /* 命令类型: 写参数+保存+重启 */ + cmdBuf[idx++] = 0x1F; /* 偏移: 0x1F (DevID区域,不可修改) */ + cmdBuf[idx++] = 0x01; /* 长度: 1字节 */ + cmdBuf[idx++] = 0x00; /* 写入无效数据,仅触发重启 */ + + CAT1_DBG_LOG("ETH Restart module"); + EthOrCat1UartSend(cmdBuf, idx); + rt_thread_delay(2000); +} diff --git a/Project/GateWay/source/User/Src/main.c b/Project/GateWay/source/User/Src/main.c index c16d6c3..7d3571f 100644 --- a/Project/GateWay/source/User/Src/main.c +++ b/Project/GateWay/source/User/Src/main.c @@ -134,11 +134,41 @@ void GateWayInit(void) memset((uint8_t *)&GateWay.ConfigPara, 0x00, sizeof(GWConfigPara_t)); GateWay.ConfigPara.SavFlag = LOG_SAV_FLAG; GateWay.ConfigPara.Comm = CATONE_COMM; - GateWay.ConfigPara.SvrAddr[0] = 103; - GateWay.ConfigPara.SvrAddr[1] = 217; - GateWay.ConfigPara.SvrAddr[2] = 192; - GateWay.ConfigPara.SvrAddr[3] = 248; - GateWay.ConfigPara.SvrPort = 12111; +#if MAC_ADDR_TYPE == 0//测试服务器 + GateWay.ConfigPara.LTENet.DestAddr[0] = 39; + GateWay.ConfigPara.LTENet.DestAddr[1] = 106; + GateWay.ConfigPara.LTENet.DestAddr[2] = 103; + GateWay.ConfigPara.LTENet.DestAddr[3] = 147; + GateWay.ConfigPara.LTENet.DestPort = 8080; +#elif MAC_ADDR_TYPE > 0 + GateWay.ConfigPara.LTENet.DestAddr[0] = 103; + GateWay.ConfigPara.LTENet.DestAddr[1] = 217; + GateWay.ConfigPara.LTENet.DestAddr[2] = 192; + GateWay.ConfigPara.LTENet.DestAddr[3] = 248; + GateWay.ConfigPara.LTENet.DestPort = 12111; +#endif + + GateWay.ConfigPara.EthNet.IpMode = ETH_IP_STATIC; + GateWay.ConfigPara.EthNet.IpAddr[0] = 192; + GateWay.ConfigPara.EthNet.IpAddr[1] = 168; + GateWay.ConfigPara.EthNet.IpAddr[2] = 1; + GateWay.ConfigPara.EthNet.IpAddr[3] = 101; + GateWay.ConfigPara.EthNet.IpPort = 10000; + GateWay.ConfigPara.EthNet.WorkMode = ETH_MODE_TCP_CLIENT; + GateWay.ConfigPara.EthNet.SubnetMask[0] = 255; + GateWay.ConfigPara.EthNet.SubnetMask[1] = 255; + GateWay.ConfigPara.EthNet.SubnetMask[2] = 255; + GateWay.ConfigPara.EthNet.SubnetMask[3] = 0; + GateWay.ConfigPara.EthNet.Gateway[0] = 192; + GateWay.ConfigPara.EthNet.Gateway[1] = 168; + GateWay.ConfigPara.EthNet.Gateway[2] = 1; + GateWay.ConfigPara.EthNet.Gateway[3] = 1; + GateWay.ConfigPara.EthNet.DestIp[0] = 192; + GateWay.ConfigPara.EthNet.DestIp[1] = 168; + GateWay.ConfigPara.EthNet.DestIp[2] = 1; + GateWay.ConfigPara.EthNet.DestIp[3] = 100; + GateWay.ConfigPara.EthNet.DestPort = 8080; + GateWay.ConfigPara.CommUnitReadInterval = COMMUNIT_READ_SENSOR_INTERVAL_MAX;//非低功耗设备 memset(GateWay.ConfigPara.CommUnitArray, 0x00, sizeof(CommUnitData_t) * COMMUNIT_NUM_MAX); GateWay.ConfigPara.Rs485Ch1.Enable = true; @@ -202,25 +232,6 @@ void GateWayInit(void) memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL10, 6); GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1; #endif - -#if MAC_ADDR_TYPE == 0//测试服务器 - GateWay.ConfigPara.SvrAddr[0] = 39; - GateWay.ConfigPara.SvrAddr[1] = 106; - GateWay.ConfigPara.SvrAddr[2] = 103; - GateWay.ConfigPara.SvrAddr[3] = 147; - GateWay.ConfigPara.SvrPort = 8080; -#elif MAC_ADDR_TYPE > 0 -// GateWay.ConfigPara.SvrAddr[0] = 39; -// GateWay.ConfigPara.SvrAddr[1] = 106; -// GateWay.ConfigPara.SvrAddr[2] = 103; -// GateWay.ConfigPara.SvrAddr[3] = 147; -// GateWay.ConfigPara.SvrPort = 8080; - GateWay.ConfigPara.SvrAddr[0] = 103; - GateWay.ConfigPara.SvrAddr[1] = 217; - GateWay.ConfigPara.SvrAddr[2] = 192; - GateWay.ConfigPara.SvrAddr[3] = 248; - GateWay.ConfigPara.SvrPort = 12111; -#endif } if(GateWay.ConfigPara.OutageFlag != true && GateWay.ConfigPara.OutageFlag != false) @@ -301,7 +312,7 @@ void GateWayInit(void) } WritePara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t)); - + LogInit(); Header.LogEndAddr = 0; @@ -322,6 +333,8 @@ void GateWayInit(void) } else { ETH_ON(); + rt_thread_delay(1000); + ETHReset(); } }