LoRa 網關組網方案
現有需求:網關每6秒接收不同節點的數據,使用SX1262芯片。
以下是完整的組網方案:
1. 網絡架構設計
采用星型拓撲:
- 網關:作為中心節點,持續監聽多個信道
- 節點:分布在網關周圍,定時發送數據(每6秒)
- 區分網絡:通過網絡ID和信道分配隔離不同網絡
- 區分節點:通過設備地址識別
2. 關鍵區分機制
2.1 網絡隔離方案
方法 | 實現方式 | 優點 |
---|---|---|
網絡ID (NetID) | 數據包頭加入2字節網絡ID(0xAABB, 0xCCDD等) | 軟件實現簡單,靈活 |
信道分配 | 不同網絡使用不同頻率(如433.0MHz/433.2MHz/433.4MHz) | 物理隔離,抗干擾能力強 |
擴頻因子(SF) | 不同網絡使用不同SF(SF7/SF9/SF12) | 提高信道容量 |
同步字(SyncWord) | 設置自定義同步字(默認0x1424為私有) | 硬件級過濾 |
推薦組合:網絡ID + 信道分配
2.2 節點識別方案
// 數據包結構
typedef struct {uint16_t net_id; // 網絡ID (0xAABB)uint32_t dev_addr; // 設備地址 (0x11223344)uint8_t payload[50]; // 實際數據uint16_t crc; // CRC校驗
} lora_packet_t;
3. 網關實現方案
3.1 網關工作流程
3.2 關鍵代碼實現
網關初始化 (lora_gateway_init.c
):
#define MAX_NETWORKS 3
const uint32_t NETWORK_FREQS[MAX_NETWORKS] = {433000000, 433200000, 433400000};
const uint16_t NETWORK_IDS[MAX_NETWORKS] = {0xAABB, 0xCCDD, 0xEEFF};void Gateway_Init() {for(int i=0; i<MAX_NETWORKS; i++) {Radio.SetChannel(NETWORK_FREQS[i]);Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,LORA_SYMBOL_TIMEOUT, false, 0, true, 0, 0, false, true);Radio.Rx(0); // 連續接收模式}
}
數據接收處理 (gateway_rx_handler.c
):
void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) {lora_packet_t *pkt = (lora_packet_t*)payload;// 校驗網絡IDint valid_net = 0;for(int i=0; i<MAX_NETWORKS; i++) {if(pkt->net_id == NETWORK_IDS[i]) {valid_net = 1;break;}}if(!valid_net) return; // 丟棄其他網絡數據// 記錄設備信息printf("來自節點 %08X 的數據: RSSI=%d, SNR=%d\n", pkt->dev_addr, rssi, snr);// 處理有效載荷process_payload(pkt->payload);
}
4. 節點實現方案
4.1 節點工作流程
void Node_Runtime(uint32_t dev_addr) {while(1) {// 1. 隨機延遲(0-500ms)避免碰撞delay_ms(rand() % 500);// 2. 準備數據包lora_packet_t pkt = {.net_id = 0xAABB, // 所屬網絡ID.dev_addr = dev_addr,.payload = {...} // 傳感器數據};pkt.crc = RadioComputeCRC((uint8_t*)&pkt, sizeof(pkt)-2, CRC_TYPE_IBM);// 3. 發送數據Radio.Send((uint8_t*)&pkt, sizeof(pkt));// 4. 等待6秒delay_ms(6000);}
}
4.2 防碰撞機制
- 隨機延遲:每個節點在6秒周期內隨機選擇發送時間
- CSMA/CA(可選):
bool channel_free = RadioIsChannelFree(MODEM_LORA, 433000000, -90, 100); if(channel_free) Radio.Send(...);
5. 參數配置建議
參數 | 推薦值 | 說明 |
---|---|---|
頻率 | 433MHz/868MHz | 根據地區法規選擇 |
擴頻因子 | SF9 | 兼顧距離和容量 |
帶寬 | 125kHz | 標準配置 |
編碼率 | 4/8 | 提高抗干擾性 |
發射功率 | 20dBm | 最大功率(需符合當地法規) |
同步字 | 0xAABB | 自定義私有網絡 |
網絡ID長度 | 2字節 | 平衡效率和網絡容量 |
6. 抗干擾策略
-
頻率跳變(FHSS):
void Node_SendWithFHSS() {int channel = rand() % 8;RadioSetChannel(433000000 + channel*200000);Radio.Send(...); }
-
動態擴頻因子:
// 根據信號質量動態調整SF if(snr > -7.5) {Radio.SetSpreadingFactor(SF7); // 高速模式 } else {Radio.SetSpreadingFactor(SF12); // 長距離模式 }
-
重傳機制:
for(int retry=0; retry<3; retry++) {if(Radio.Send(...) == SUCCESS) break;delay_ms(100 * (retry+1)); }
部署建議
-
網絡規劃:
- 每個網絡使用獨立頻率+網絡ID組合
- 網關支持同時監聽3-8個信道(需硬件支持)
-
節點部署:
-
安全增強:
- AES-128加密載荷數據
- 動態設備地址分配
- 數據包簽名驗證
關鍵提示:實際部署前需進行頻譜掃描,選擇干擾最小的頻段,并根據距離要求調整SF和帶寬參數。