From 4e45de919cc297d416156bdb99120c688ad5136f Mon Sep 17 00:00:00 2001 From: YuanHongbin <975559679@qq.com> Date: Tue, 14 Jul 2026 10:13:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(sensor):=20=E6=96=B0=E5=A2=9ELora=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=E8=B4=A8=E9=87=8F=E6=9F=A5=E8=AF=A2=E6=8C=87=E4=BB=A4?= =?UTF-8?q?(0x09)=E5=8F=8A=E5=A4=9A=E9=A1=B9Bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 COMM_UNIT_CMD_GET_SIGNAL(0x09): 传感器可查询与网关的Lora信号质量,无需注册,回应SNR/RSSI各1字节,回应后打印日志并刷新CommErrCnt/在线状态。CommUnitCmdSend对GET_SIGNAL豁免注册检查。culs命令新增传感器在线状态显示。Bug修复: CatSendErrCnt清零、Mac索引修正、时间同步指针修正、HIS_DATA break补全、Ch2校准标志修正、RS485离线通知格式修正、LoraSetFreqCent参数修正 --- .../source/Module/GateWay_Debug/DebugCmd.c | 4 ++- Project/GateWay/source/Module/sx127x/sx127x.h | 1 + Project/GateWay/source/User/Inc/Public.h | 1 + Project/GateWay/source/User/Src/CatOneTask.c | 1 + Project/GateWay/source/User/Src/LoraTask.c | 14 +++++----- Project/GateWay/source/User/Src/Public.c | 27 ++++++++++++++----- Project/GateWay/source/User/Src/RS485Task.c | 9 ++++--- Project/GateWay/source/User/Src/main.c | 2 +- 8 files changed, 40 insertions(+), 19 deletions(-) diff --git a/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.c b/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.c index c2ccec5..af390b6 100644 --- a/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.c +++ b/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.c @@ -515,7 +515,9 @@ void DebugCmdLsCommUnit(int argc, char *argv[]) for(int j = 0; j < GateWay->ConfigPara.CommUnitArray[i].SensorN; j++) { DBG_LOG("%04X ", GateWay->ConfigPara.CommUnitArray[i].SensorType[j]); } - DBG_LOG("\r\n\r\n"); + DBG_LOG("\r\n"); + DBG_LOG("Online: %s\r\n", GateWay->ConfigPara.CommUnitArray[i].CommStatus ? "Yes" : "No"); + DBG_LOG("\r\n"); } } if(CUCnt ==0) { diff --git a/Project/GateWay/source/Module/sx127x/sx127x.h b/Project/GateWay/source/Module/sx127x/sx127x.h index f48c040..6a6f701 100644 --- a/Project/GateWay/source/Module/sx127x/sx127x.h +++ b/Project/GateWay/source/Module/sx127x/sx127x.h @@ -825,6 +825,7 @@ void SX1276LoRaWriteRx(void); void SX1276LoRaWriteSleep(bool Sleep); Sx1276StateType_t SX1276LoRaReadStatus(void); void SX1276LoCalcRssiSnr(int16_t *pswRssi, int8_t *psbSnr); +void SX1276Read(uint8_t ucAddr, uint8_t *pucData); void Sx1276LoRaSleep(void); void Sx1276LoRaWakeup(void); int GetSx1276RxRetValue(void); diff --git a/Project/GateWay/source/User/Inc/Public.h b/Project/GateWay/source/User/Inc/Public.h index 16ed63d..c99a779 100644 --- a/Project/GateWay/source/User/Inc/Public.h +++ b/Project/GateWay/source/User/Inc/Public.h @@ -56,6 +56,7 @@ typedef enum { COMM_UNIT_CMD_SET_SENSOR_COLL_TIME = 5, COMM_UNIT_CMD_TIME_SYNC, COMM_UNIT_CMD_CONT_LASER = 8,//ָ + COMM_UNIT_CMD_GET_SIGNAL, //0x09 ѯLoraź COMM_UNIT_CMD_END, }CommUnitCmd_m; diff --git a/Project/GateWay/source/User/Src/CatOneTask.c b/Project/GateWay/source/User/Src/CatOneTask.c index 696643d..2595576 100644 --- a/Project/GateWay/source/User/Src/CatOneTask.c +++ b/Project/GateWay/source/User/Src/CatOneTask.c @@ -508,6 +508,7 @@ void CatOneLoopHandler(void) case CAT_ONE_WAIT_SEND: result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 1000); if(result == RT_EOK) { + CatSendErrCnt = 0; CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff); CatOne.Cat1Status = CAT_ONE_SEND_DATA; } diff --git a/Project/GateWay/source/User/Src/LoraTask.c b/Project/GateWay/source/User/Src/LoraTask.c index 134a091..9ad546a 100644 --- a/Project/GateWay/source/User/Src/LoraTask.c +++ b/Project/GateWay/source/User/Src/LoraTask.c @@ -142,15 +142,15 @@ void Lora_Thread_Entry(void *parameter) if(UnitCommSendFlag == false && UnitCommReadDelayCnt >= GateWay->ConfigPara.CommUnitReadInterval) { if(SendUnitCommIdx < COMMUNIT_NUM_MAX) { if(GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RegFlag && - GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[2] == 0x01) { + GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][2] == 0x01) { GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RevNewDataFlag = false; Debug_Printf("Lora Read CommUnit: %02X:%02X:%02X:%02X:%02X:%02X\r\n", - GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0], - GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[1], - GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[2], - GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[3], - GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[4], - GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[5]); + GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][0], + GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][1], + GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][2], + GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][3], + GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][4], + GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][5]); CommUnitCmdSend(GateWay, GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0], COMM_UNIT_CMD_READ, NULL, 0, Sx1276LoRaSendBuffer); UnitCommSendFlag = true; } diff --git a/Project/GateWay/source/User/Src/Public.c b/Project/GateWay/source/User/Src/Public.c index b5d5b7f..cd58bcd 100644 --- a/Project/GateWay/source/User/Src/Public.c +++ b/Project/GateWay/source/User/Src/Public.c @@ -5,6 +5,7 @@ #include "spiflash.h" #include "CatOneTask.h" #include +#include "sx127x.h" //Ӧݳ const uint8_t SensorTypeDataLen[] = { @@ -256,7 +257,7 @@ void CommUnitCmdSend(GateWayPara GateWay, uint8_t *CommUnitMac, CommUnitCmd_m Cm } else { int ret = CheckCommUnitReg(GateWay, CommUnitMac); - if(ret < 0) + if(ret < 0 && Cmd != COMM_UNIT_CMD_GET_SIGNAL) return; memcpy(CUHeader->DevMac, CommUnitMac, 6); //CUHeader->DevType = GateWay->ConfigPara.CommUnitArray[ret].CUType; @@ -496,12 +497,12 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData if(check != crc16) return -1; - if((CUHeader->Cmd != COMM_UNIT_CMD_REG) && (memcmp(GateWay->ConfigPara.GwMac, CUHeader->GWMac, 6) != 0)) + if((CUHeader->Cmd != COMM_UNIT_CMD_REG && CUHeader->Cmd != COMM_UNIT_CMD_GET_SIGNAL) && (memcmp(GateWay->ConfigPara.GwMac, CUHeader->GWMac, 6) != 0)) return -1; CommUnitIdx = CheckCommUnitReg(GateWay, CUHeader->DevMac);//жǷע豸 if(CommUnitIdx < 0) { - if(CUHeader->Cmd != COMM_UNIT_CMD_REG){//жǷע + if(CUHeader->Cmd != COMM_UNIT_CMD_REG && CUHeader->Cmd != COMM_UNIT_CMD_GET_SIGNAL){//жǷע return -1; } ExclCommUnit = CheckCommUnitExcl(GateWay, CUHeader->DevMac);//жǷDZų豸 @@ -842,6 +843,19 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t)); break;} + case COMM_UNIT_CMD_GET_SIGNAL:{ + int16_t Rssi; + int8_t Snr; + uint8_t SignalPayload[2]; + SX1276LoCalcRssiSnr(&Rssi, &Snr); + SignalPayload[0] = (uint8_t)Snr; + SignalPayload[1] = (uint8_t)(Rssi & 0xFF); + CommUnitCmdSend(GateWay, CUHeader->DevMac, COMM_UNIT_CMD_GET_SIGNAL, SignalPayload, 2, Response); + MAIN_DBG_LOG("\r\nCUMac:%02X-%02X-%02X-%02X-%02X-%02X, RX(Dev->GW): SNR:%d, RSSI:%d\r\n", + CUHeader->DevMac[0], CUHeader->DevMac[1], CUHeader->DevMac[2], CUHeader->DevMac[3], CUHeader->DevMac[4], CUHeader->DevMac[5], + Snr, Rssi); + break;} + default: break; } @@ -897,13 +911,13 @@ int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen) if(GateWay->ConfigPara.Rs485Ch1.Enable == true) { //ڲͨѶԪ if(GateWay->ConfigPara.Rs485Ch1.CommUnitEnable == true) - CommUnitCmdSend(GateWay, CommUintMac, COMM_UNIT_CMD_TIME_SYNC, &rData[14], 4, GateWay->ConfigPara.Rs485Ch1.RS485Send); + CommUnitCmdSend(GateWay, CommUintMac, COMM_UNIT_CMD_TIME_SYNC, (uint8_t *)&NCHeader->Timestamp, 4, GateWay->ConfigPara.Rs485Ch1.RS485Send); else RS485CmdSend(GateWay, 1, &SCPara); } if(GateWay->ConfigPara.Rs485Ch2.Enable == true) { if(GateWay->ConfigPara.Rs485Ch2.CommUnitEnable == true) - CommUnitCmdSend(GateWay, CommUintMac, COMM_UNIT_CMD_TIME_SYNC, &rData[14], 4, GateWay->ConfigPara.Rs485Ch2.RS485Send); + CommUnitCmdSend(GateWay, CommUintMac, COMM_UNIT_CMD_TIME_SYNC, (uint8_t *)&NCHeader->Timestamp, 4, GateWay->ConfigPara.Rs485Ch2.RS485Send); else RS485CmdSend(GateWay, 2, &SCPara); } @@ -958,7 +972,7 @@ int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen) CommUnitCmdSend(GateWay, CommUintMac, COMM_UNIT_CMD_CAIL, NULL, 0, GateWay->ConfigPara.Rs485Ch1.RS485Send); } if(GateWay->ConfigPara.Rs485Ch2.Enable == true) { - if(GateWay->ConfigPara.Rs485Ch1.CommUnitEnable == true) + if(GateWay->ConfigPara.Rs485Ch2.CommUnitEnable == true) RS485CmdSend(GateWay, 2, &SCPara); else CommUnitCmdSend(GateWay, CommUintMac, COMM_UNIT_CMD_CAIL, NULL, 0, GateWay->ConfigPara.Rs485Ch2.RS485Send); @@ -1100,6 +1114,7 @@ int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen) } } + break; case NET_COMM_CMD_ADD_UNIT:{ if(*Data == 1) { //¼ɹ MAIN_DBG_LOG("Adding CommUnit succeeded...\r\n"); diff --git a/Project/GateWay/source/User/Src/RS485Task.c b/Project/GateWay/source/User/Src/RS485Task.c index 8107b30..e848dbd 100644 --- a/Project/GateWay/source/User/Src/RS485Task.c +++ b/Project/GateWay/source/User/Src/RS485Task.c @@ -422,10 +422,11 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP if(GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus) { GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus = 0; MegData[0] = 7; - MegData[1] = COMM_UNIT_CMD_READ; - memcpy(&MegData[2], GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].Mac[0], 6); - MegData[8] = GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus; - CatOneEthSendQueue(MegData, 9); //Ϣ + MegData[1] = 0; + MegData[2] = COMM_UNIT_CMD_READ; + memcpy(&MegData[3], GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].Mac[0], 6); + MegData[9] = GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus; + CatOneEthSendQueue(MegData, 10); //Ϣ } } SCPara->SendUnitCommIdx++; diff --git a/Project/GateWay/source/User/Src/main.c b/Project/GateWay/source/User/Src/main.c index 971f8a4..63c8252 100644 --- a/Project/GateWay/source/User/Src/main.c +++ b/Project/GateWay/source/User/Src/main.c @@ -263,7 +263,7 @@ void GateWayInit(void) if(LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent) == false) { GateWay.ConfigPara.Lora.FreqCent = 433100000; - LoraSetFreqCent(GateWay.ConfigPara.Lora.ucChannel); + LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent); } if(LoraSetPower(GateWay.ConfigPara.Lora.ucPower) == false) { GateWay.ConfigPara.Lora.ucPower = 20;