2 Commits

Author SHA1 Message Date
YuanHongbin e23a0d01ae feat(lora): 宽频信道表扩展为120信道(433.1MHz~492.6MHz)
- sx127x.h: 信道宏CH0~CH119, 基准433100000ul+500kHz步进(CH0=433.1MHz, CH119=492.6MHz)
- sx127x.h: SX1276_CHANNEL_MAX 46 -> 120, LoraSetChannel范围检查自动跟随
- sx127x.c: gdwSx1276ChannelTbl信道表扩为120项
- sx127x.c: LoraSetFreqCent频率校验范围改为433.1MHz~492.6MHz(原470.1下限会拒绝CH0~CH73)
- main.c: 频率校验失败回退默认值改为CH0(433.1MHz)
- 注意: 信道号与窄频版(develop)语义不同, 同编号对应不同频率, 两种固件设备互不相通
- 默认信道CH8在宽频下为437.1MHz
2026-09-08 10:21:32 +08:00
YuanHongbin 626f33a15e fix(register): 注册payload合法性校验,拦截串台乱码注册
- 新增RegPayloadValid校验: SensorN非0/PayloadLen与条目数匹配/传感器类型白名单(SensorTypeDataLen表内且非保留)/MAC非全0全FF且非网关MAC/注册帧GWMac非空时必须与本网关匹配
- 频偏串台误解调的乱码帧几乎必然被拦截(随机类型命中合法类型概率约0.03%), 不再占用注册表槽位
- GWMac为全0/全FF视为未填放行, 兼容老固件; 已注册设备重注册路径不受影响
2026-09-08 10:14:52 +08:00
4 changed files with 199 additions and 55 deletions
@@ -478,7 +478,14 @@ const uint32_t gdwSx1276ChannelTbl[SX1276_CHANNEL_MAX]={
CH10, CH11, CH12, CH13, CH14, CH15, CH16, CH17, CH18, CH19, CH10, CH11, CH12, CH13, CH14, CH15, CH16, CH17, CH18, CH19,
CH20, CH21, CH22, CH23, CH24, CH25, CH26, CH27, CH28, CH29, CH20, CH21, CH22, CH23, CH24, CH25, CH26, CH27, CH28, CH29,
CH30, CH31, CH32, CH33, CH34, CH35, CH36, CH37, CH38, CH39, CH30, CH31, CH32, CH33, CH34, CH35, CH36, CH37, CH38, CH39,
CH40, CH41, CH42, CH43, CH44, CH45 CH40, CH41, CH42, CH43, CH44, CH45, CH46, CH47, CH48, CH49,
CH50, CH51, CH52, CH53, CH54, CH55, CH56, CH57, CH58, CH59,
CH60, CH61, CH62, CH63, CH64, CH65, CH66, CH67, CH68, CH69,
CH70, CH71, CH72, CH73, CH74, CH75, CH76, CH77, CH78, CH79,
CH80, CH81, CH82, CH83, CH84, CH85, CH86, CH87, CH88, CH89,
CH90, CH91, CH92, CH93, CH94, CH95, CH96, CH97, CH98, CH99,
CH100, CH101, CH102, CH103, CH104, CH105, CH106, CH107, CH108, CH109,
CH110, CH111, CH112, CH113, CH114, CH115, CH116, CH117, CH118, CH119
}; };
//LORAPT_CHANNEL //LORAPT_CHANNEL
@@ -666,7 +673,7 @@ bool LoraSetRegPreamble(uint8_t RegPreamble)
} }
bool LoraSetFreqCent(uint32_t FreqCent) bool LoraSetFreqCent(uint32_t FreqCent)
{ {
if(FreqCent < 470100000 || FreqCent > 492600000) if(FreqCent < 433100000 || FreqCent > 492600000) //lora-wide: 433.1MHz~492.6MHz(与信道表匹配)
return false; return false;
LoRaPara.dwFreqHz = FreqCent; LoRaPara.dwFreqHz = FreqCent;
return true; return true;
+122 -48
View File
@@ -660,7 +660,7 @@ typedef enum{
LORAPT_MAX LORAPT_MAX
}Sx1276LoraParaType; }Sx1276LoraParaType;
#define SX1276_CHANNEL_MAX 46 #define SX1276_CHANNEL_MAX 120
#define LORA_SPI_NSS_SET() SPI2_NSS_SET() #define LORA_SPI_NSS_SET() SPI2_NSS_SET()
#define LORA_SPI_NSS_CLR() SPI2_NSS_CLR() #define LORA_SPI_NSS_CLR() SPI2_NSS_CLR()
@@ -758,54 +758,128 @@ typedef struct {
#endif #endif
/* /*
Lora频率:470100000ul + 500000*N, N=0~45, 共46个信道(470.1MHz~492.6MHz) Lora频率:433100000ul + 500000*N, N=0~119, 共120个信道(433.1MHz~492.6MHz) [lora-wide宽频版]
*/ */
#define CH0 (470100000ul + 0) //470.1MHz #define CH0 (433100000ul + 0) //433.1MHz
#define CH1 (470100000ul + 500000) #define CH1 (433100000ul + 500000)
#define CH2 (470100000ul + 1000000) #define CH2 (433100000ul + 1000000)
#define CH3 (470100000ul + 1500000) #define CH3 (433100000ul + 1500000)
#define CH4 (470100000ul + 2000000) #define CH4 (433100000ul + 2000000)
#define CH5 (470100000ul + 2500000) #define CH5 (433100000ul + 2500000)
#define CH6 (470100000ul + 3000000) #define CH6 (433100000ul + 3000000)
#define CH7 (470100000ul + 3500000) #define CH7 (433100000ul + 3500000)
#define CH8 (470100000ul + 4000000) #define CH8 (433100000ul + 4000000)
#define CH9 (470100000ul + 4500000) #define CH9 (433100000ul + 4500000)
#define CH10 (470100000ul + 5000000) #define CH10 (433100000ul + 5000000)
#define CH11 (470100000ul + 5500000) #define CH11 (433100000ul + 5500000)
#define CH12 (470100000ul + 6000000) #define CH12 (433100000ul + 6000000)
#define CH13 (470100000ul + 6500000) #define CH13 (433100000ul + 6500000)
#define CH14 (470100000ul + 7000000) #define CH14 (433100000ul + 7000000)
#define CH15 (470100000ul + 7500000) #define CH15 (433100000ul + 7500000)
#define CH16 (470100000ul + 8000000) #define CH16 (433100000ul + 8000000)
#define CH17 (470100000ul + 8500000) #define CH17 (433100000ul + 8500000)
#define CH18 (470100000ul + 9000000) #define CH18 (433100000ul + 9000000)
#define CH19 (470100000ul + 9500000) #define CH19 (433100000ul + 9500000)
#define CH20 (470100000ul + 10000000) #define CH20 (433100000ul + 10000000)
#define CH21 (470100000ul + 10500000) #define CH21 (433100000ul + 10500000)
#define CH22 (470100000ul + 11000000) #define CH22 (433100000ul + 11000000)
#define CH23 (470100000ul + 11500000) #define CH23 (433100000ul + 11500000)
#define CH24 (470100000ul + 12000000) #define CH24 (433100000ul + 12000000)
#define CH25 (470100000ul + 12500000) #define CH25 (433100000ul + 12500000)
#define CH26 (470100000ul + 13000000) #define CH26 (433100000ul + 13000000)
#define CH27 (470100000ul + 13500000) #define CH27 (433100000ul + 13500000)
#define CH28 (470100000ul + 14000000) #define CH28 (433100000ul + 14000000)
#define CH29 (470100000ul + 14500000) #define CH29 (433100000ul + 14500000)
#define CH30 (470100000ul + 15000000) #define CH30 (433100000ul + 15000000)
#define CH31 (470100000ul + 15500000) #define CH31 (433100000ul + 15500000)
#define CH32 (470100000ul + 16000000) #define CH32 (433100000ul + 16000000)
#define CH33 (470100000ul + 16500000) #define CH33 (433100000ul + 16500000)
#define CH34 (470100000ul + 17000000) #define CH34 (433100000ul + 17000000)
#define CH35 (470100000ul + 17500000) #define CH35 (433100000ul + 17500000)
#define CH36 (470100000ul + 18000000) #define CH36 (433100000ul + 18000000)
#define CH37 (470100000ul + 18500000) #define CH37 (433100000ul + 18500000)
#define CH38 (470100000ul + 19000000) #define CH38 (433100000ul + 19000000)
#define CH39 (470100000ul + 19500000) #define CH39 (433100000ul + 19500000)
#define CH40 (470100000ul + 20000000) #define CH40 (433100000ul + 20000000)
#define CH41 (470100000ul + 20500000) #define CH41 (433100000ul + 20500000)
#define CH42 (470100000ul + 21000000) #define CH42 (433100000ul + 21000000)
#define CH43 (470100000ul + 21500000) #define CH43 (433100000ul + 21500000)
#define CH44 (470100000ul + 22000000) #define CH44 (433100000ul + 22000000)
#define CH45 (470100000ul + 22500000) //492.6MHz #define CH45 (433100000ul + 22500000)
#define CH46 (433100000ul + 23000000)
#define CH47 (433100000ul + 23500000)
#define CH48 (433100000ul + 24000000)
#define CH49 (433100000ul + 24500000)
#define CH50 (433100000ul + 25000000)
#define CH51 (433100000ul + 25500000)
#define CH52 (433100000ul + 26000000)
#define CH53 (433100000ul + 26500000)
#define CH54 (433100000ul + 27000000)
#define CH55 (433100000ul + 27500000)
#define CH56 (433100000ul + 28000000)
#define CH57 (433100000ul + 28500000)
#define CH58 (433100000ul + 29000000)
#define CH59 (433100000ul + 29500000)
#define CH60 (433100000ul + 30000000)
#define CH61 (433100000ul + 30500000)
#define CH62 (433100000ul + 31000000)
#define CH63 (433100000ul + 31500000)
#define CH64 (433100000ul + 32000000)
#define CH65 (433100000ul + 32500000)
#define CH66 (433100000ul + 33000000)
#define CH67 (433100000ul + 33500000)
#define CH68 (433100000ul + 34000000)
#define CH69 (433100000ul + 34500000)
#define CH70 (433100000ul + 35000000)
#define CH71 (433100000ul + 35500000)
#define CH72 (433100000ul + 36000000)
#define CH73 (433100000ul + 36500000)
#define CH74 (433100000ul + 37000000)
#define CH75 (433100000ul + 37500000)
#define CH76 (433100000ul + 38000000)
#define CH77 (433100000ul + 38500000)
#define CH78 (433100000ul + 39000000)
#define CH79 (433100000ul + 39500000)
#define CH80 (433100000ul + 40000000)
#define CH81 (433100000ul + 40500000)
#define CH82 (433100000ul + 41000000)
#define CH83 (433100000ul + 41500000)
#define CH84 (433100000ul + 42000000)
#define CH85 (433100000ul + 42500000)
#define CH86 (433100000ul + 43000000)
#define CH87 (433100000ul + 43500000)
#define CH88 (433100000ul + 44000000)
#define CH89 (433100000ul + 44500000)
#define CH90 (433100000ul + 45000000)
#define CH91 (433100000ul + 45500000)
#define CH92 (433100000ul + 46000000)
#define CH93 (433100000ul + 46500000)
#define CH94 (433100000ul + 47000000)
#define CH95 (433100000ul + 47500000)
#define CH96 (433100000ul + 48000000)
#define CH97 (433100000ul + 48500000)
#define CH98 (433100000ul + 49000000)
#define CH99 (433100000ul + 49500000)
#define CH100 (433100000ul + 50000000)
#define CH101 (433100000ul + 50500000)
#define CH102 (433100000ul + 51000000)
#define CH103 (433100000ul + 51500000)
#define CH104 (433100000ul + 52000000)
#define CH105 (433100000ul + 52500000)
#define CH106 (433100000ul + 53000000)
#define CH107 (433100000ul + 53500000)
#define CH108 (433100000ul + 54000000)
#define CH109 (433100000ul + 54500000)
#define CH110 (433100000ul + 55000000)
#define CH111 (433100000ul + 55500000)
#define CH112 (433100000ul + 56000000)
#define CH113 (433100000ul + 56500000)
#define CH114 (433100000ul + 57000000)
#define CH115 (433100000ul + 57500000)
#define CH116 (433100000ul + 58000000)
#define CH117 (433100000ul + 58500000)
#define CH118 (433100000ul + 59000000)
#define CH119 (433100000ul + 59500000) //492.6MHz
/*Lora中心频率默认值(编译期用于频道表等) /*Lora中心频率默认值(编译期用于频道表等)
实际运行频率由Boot参数区(BootPara_t.LoraFreq)配置, APP启动时覆盖ConfigPara.Lora.FreqCent*/ 实际运行频率由Boot参数区(BootPara_t.LoraFreq)配置, APP启动时覆盖ConfigPara.Lora.FreqCent*/
+63
View File
@@ -244,6 +244,63 @@ int CheckCommUnitExcl(GateWayPara GateWay, uint8_t *CommUnitMac)
} }
return -1; return -1;
} }
/*****************************************************************************************
* 函数名称: RegPayloadValid
* 功能描述: 注册请求payload合法性校验,拦截频偏串台误解调的乱码帧,避免乱码设备占用注册表
* 参 数: GateWay, 网关句柄
CUHeader, 注册帧头
PayLoad, 注册负载数据
* 返 回 值: 合法返回true, 非法返回false
*****************************************************************************************/
static bool RegPayloadValid(GateWayPara GateWay, CommUnitFrameHeader CUHeader, uint8_t *PayLoad)
{
uint8_t SensorN = PayLoad[0];
int i, j;
bool MacEmpty;
/*空注册无意义*/
if(SensorN == 0) {
return false;
}
/*payload长度必须容纳N个传感器条目(每条目6字节)*/
if(CUHeader->PayloadLen < (uint16_t)(SensorN * 6 + 1)) {
return false;
}
/*通讯单元自身MAC不能为全0/全FF*/
MacEmpty = true;
for(i = 0; i < 6; i++) {
if(CUHeader->DevMac[i] != 0x00 && CUHeader->DevMac[i] != 0xFF) { MacEmpty = false; break; }
}
if(MacEmpty) {
return false;
}
/*注册帧GWMac若非空(全0/全FF视为未填)则必须与本网关匹配*/
MacEmpty = true;
for(i = 0; i < 6; i++) {
if(CUHeader->GWMac[i] != 0x00 && CUHeader->GWMac[i] != 0xFF) { MacEmpty = false; break; }
}
if(!MacEmpty && memcmp(CUHeader->GWMac, GateWay->ConfigPara.GwMac, 6) != 0) {
return false;
}
/*逐传感器: 类型必须在已知类型表内且非保留(数据长度>0), MAC非全0/全FF且不等于网关MAC*/
for(j = 0; j < SensorN; j++) {
uint16_t RegType = PayLoad[(j*6)+1] | (PayLoad[(j*6)+2] << 8);
if(RegType == 0x0000 || RegType >= sizeof(SensorTypeDataLen)/sizeof(SensorTypeDataLen[0])
|| SensorTypeDataLen[RegType] == 0) {
return false;
}
MacEmpty = true;
for(i = 0; i < 6; i++) {
uint8_t mac = PayLoad[(j*6)+1+i];
if(mac != 0x00 && mac != 0xFF) { MacEmpty = false; break; }
}
if(MacEmpty || memcmp(&PayLoad[(j*6)+1], GateWay->ConfigPara.GwMac, 6) == 0) {
return false;
}
}
return true;
}
/***************************************************************************************** /*****************************************************************************************
* 函数名称: CommUnitSendCmd * 函数名称: CommUnitSendCmd
* 功能描述: 网关下发通讯单元指令函数 * 功能描述: 网关下发通讯单元指令函数
@@ -611,6 +668,12 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData
if(PayLoad[0] > SENSOR_NUM_MAX) { if(PayLoad[0] > SENSOR_NUM_MAX) {
return -1; return -1;
} }
/*串台防护: 校验注册payload合法性, 拦截频偏误解调的乱码帧*/
if(!RegPayloadValid(GateWay, CUHeader, PayLoad)) {
MAIN_DBG_LOG("\r\nReg rejected: invalid payload (cross-band interference?) Mac:%02X-%02X-%02X-%02X-%02X-%02X\r\n",
CUHeader->DevMac[0], CUHeader->DevMac[1], CUHeader->DevMac[2], CUHeader->DevMac[3], CUHeader->DevMac[4], CUHeader->DevMac[5]);
return -1;
}
// if(CUHeader->PayloadLen < 2) // if(CUHeader->PayloadLen < 2)
// return -1; // return -1;
+1 -1
View File
@@ -235,7 +235,7 @@ void GateWayInit(void)
} }
if(LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent) == false) if(LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent) == false)
{ {
GateWay.ConfigPara.Lora.FreqCent = 470100000; GateWay.ConfigPara.Lora.FreqCent = 433100000; //lora-wide: 回退到CH0
LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent); LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent);
} }
if(LoraSetPower(GateWay.ConfigPara.Lora.ucPower) == false) { if(LoraSetPower(GateWay.ConfigPara.Lora.ucPower) == false) {