feat(eth): 完善YOXO1007以太网模块配置和调试命令

This commit is contained in:
2026-06-17 12:30:57 +08:00
parent 626a486945
commit dd8018e9bb
4 changed files with 204 additions and 33 deletions
@@ -133,6 +133,8 @@ bool CatOneGetStatus(void);
bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen); bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen);
void CatOneTriggerRegister(void); void CatOneTriggerRegister(void);
void ETHTriggerRegister(void); void ETHTriggerRegister(void);
void ETHResetEx(void);
void ETHApplyNetPara(void);
void CatOne_Eth_Thread_Entry(void *parameter); void CatOne_Eth_Thread_Entry(void *parameter);
void EthRxOverhandler(void); void EthRxOverhandler(void);
void CatReadImeiOrSim(char *Imei, char *Sim); void CatReadImeiOrSim(char *Imei, char *Sim);
+31 -2
View File
@@ -250,12 +250,41 @@ typedef struct {
uint32_t FreqCent; uint32_t FreqCent;
}LoraPara_t, *pLoraPara; }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 { typedef struct {
uint32_t SavFlag; //存储标志 uint32_t SavFlag; //存储标志
CommType_m Comm; //网关通讯方式 CommType_m Comm; //网关通讯方式
uint8_t GwMac[6]; //网关mac uint8_t GwMac[6]; //网关mac
char SvrAddr[4]; //服务器地址 LTENetPara_t LTENet; //Cat1/4G服务器参数
uint32_t SvrPort; //服务器端口 EthNetPara_t EthNet; //以太网网络参数
uint32_t CommUnitReadInterval; //通讯单元读取时间间隔,单位S uint32_t CommUnitReadInterval; //通讯单元读取时间间隔,单位S
CommUnitPara_t CommUnitArray[COMMUNIT_NUM_MAX]; //注册的通讯单元信息 CommUnitPara_t CommUnitArray[COMMUNIT_NUM_MAX]; //注册的通讯单元信息
ExclCommUnit_t ExclCommUnit[COMMUNIT_NUM_MAX]; //排除的通讯单元信息 ExclCommUnit_t ExclCommUnit[COMMUNIT_NUM_MAX]; //排除的通讯单元信息
+132 -5
View File
@@ -383,11 +383,11 @@ void CatOneAtCmdSend(CatOneATCMD_m Cmd, uint32_t Dly, CatOneStatus_m NextStatus)
} }
else if(CatOne.AtCmd == CAT_ONE_LIPOPEN) { else if(CatOne.AtCmd == CAT_ONE_LIPOPEN) {
sprintf(CatOne.CatOneSendBuff,"AT+LIPOPEN=\"TCP\",\"%d.%d.%d.%d\",%d\r\n", sprintf(CatOne.CatOneSendBuff,"AT+LIPOPEN=\"TCP\",\"%d.%d.%d.%d\",%d\r\n",
CatOne.GateWay->ConfigPara.SvrAddr[0], CatOne.GateWay->ConfigPara.LTENet.DestAddr[0],
CatOne.GateWay->ConfigPara.SvrAddr[1], CatOne.GateWay->ConfigPara.LTENet.DestAddr[1],
CatOne.GateWay->ConfigPara.SvrAddr[2], CatOne.GateWay->ConfigPara.LTENet.DestAddr[2],
CatOne.GateWay->ConfigPara.SvrAddr[3], CatOne.GateWay->ConfigPara.LTENet.DestAddr[3],
CatOne.GateWay->ConfigPara.SvrPort); CatOne.GateWay->ConfigPara.LTENet.DestPort);
} }
else { else {
strcpy(CatOne.CatOneSendBuff, CatOneATCmdStr[CatOne.AtCmd]); strcpy(CatOne.CatOneSendBuff, CatOneATCmdStr[CatOne.AtCmd]);
@@ -616,6 +616,7 @@ void EthLoopHandler(void)
rt_thread_delay(10); rt_thread_delay(10);
ETH_RESET_SET(); ETH_RESET_SET();
rt_thread_delay(2000); // 延长复位后稳定时间到2秒 rt_thread_delay(2000); // 延长复位后稳定时间到2秒
ETHApplyNetPara(); // 配置EthNet网络参数
CatOne.EthStatus = ETH_WAIT_LINK; CatOne.EthStatus = ETH_WAIT_LINK;
CatOne.EthLinkWaitCnt = 0; CatOne.EthLinkWaitCnt = 0;
CatOne.EthFirstRegFlag = true; // 重置首次注册标志 CatOne.EthFirstRegFlag = true; // 重置首次注册标志
@@ -888,3 +889,129 @@ void ETHTriggerRegister(void)
{ {
CatOne.EthStatus = ETH_REG_SVR; 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);
}
+37 -24
View File
@@ -134,11 +134,41 @@ void GateWayInit(void)
memset((uint8_t *)&GateWay.ConfigPara, 0x00, sizeof(GWConfigPara_t)); memset((uint8_t *)&GateWay.ConfigPara, 0x00, sizeof(GWConfigPara_t));
GateWay.ConfigPara.SavFlag = LOG_SAV_FLAG; GateWay.ConfigPara.SavFlag = LOG_SAV_FLAG;
GateWay.ConfigPara.Comm = CATONE_COMM; GateWay.ConfigPara.Comm = CATONE_COMM;
GateWay.ConfigPara.SvrAddr[0] = 103; #if MAC_ADDR_TYPE == 0//测试服务器
GateWay.ConfigPara.SvrAddr[1] = 217; GateWay.ConfigPara.LTENet.DestAddr[0] = 39;
GateWay.ConfigPara.SvrAddr[2] = 192; GateWay.ConfigPara.LTENet.DestAddr[1] = 106;
GateWay.ConfigPara.SvrAddr[3] = 248; GateWay.ConfigPara.LTENet.DestAddr[2] = 103;
GateWay.ConfigPara.SvrPort = 12111; 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;//非低功耗设备 GateWay.ConfigPara.CommUnitReadInterval = COMMUNIT_READ_SENSOR_INTERVAL_MAX;//非低功耗设备
memset(GateWay.ConfigPara.CommUnitArray, 0x00, sizeof(CommUnitData_t) * COMMUNIT_NUM_MAX); memset(GateWay.ConfigPara.CommUnitArray, 0x00, sizeof(CommUnitData_t) * COMMUNIT_NUM_MAX);
GateWay.ConfigPara.Rs485Ch1.Enable = true; GateWay.ConfigPara.Rs485Ch1.Enable = true;
@@ -202,25 +232,6 @@ void GateWayInit(void)
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL10, 6); memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL10, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1; GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#endif #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) if(GateWay.ConfigPara.OutageFlag != true && GateWay.ConfigPara.OutageFlag != false)
@@ -322,6 +333,8 @@ void GateWayInit(void)
} }
else { else {
ETH_ON(); ETH_ON();
rt_thread_delay(1000);
ETHReset();
} }
} }