SX126x LoRa驱动开发实战:从寄存器配置到拉距测试
简介这份资源是面向嵌入式与物联网开发者的sx126x系列LoRa模块驱动代码包适用于基于STM32平台集成LoRa/LoRaWAN远距离无线通信功能的场景。包内共6个文件以3个.h头文件和3个.c源文件为主头文件负责寄存器定义、接口声明与硬件抽象层配置源文件则实现射频初始化、SPI数据收发、参数配置及协议交互等核心逻辑整体压缩包约29KB结构精简便于快速移植。内容围绕sx1262等芯片展开覆盖工作模式与频率、扩频因子设置、前向纠错、低功耗管理以及与LoRaWAN协议栈对接等关键环节可帮助开发者理解驱动分层设计与调试思路。目前已有672人学习下载适合需要快速搭建LoRa节点、验证射频通信链路的初中级嵌入式工程师参考使用。1. 从一次通信距离腰斩的排查说起LoRa模块sx126x驱动这件事很多人第一次接触是因为手里的模块“能发不能收”或者通信距离比标称值短了一大截。我最早做 sx126x 驱动时用的是某款常见的射频前端模组SPI 读写寄存器看起来都正常但实际拉距测试只有几百米远低于预期。后来用逻辑分析仪抓波形才发现问题出在驱动初始化时 TCXO 使能配置和 DIO3 电压设置不匹配导致晶振根本没起振芯片内部时钟跑的是 RC 振荡器频率偏差大接收灵敏度自然崩了。sx126x 是 Semtech 的 LoRa 收发器系列包括 sx1261、sx1262、sx1268 等型号区别主要在频段和是否支持 LoRa 之外的其他调制方式。驱动要干的事本质上是三件通过 SPI 配置寄存器、管理 DIO 中断、控制射频收发状态机。它适合做低功耗广域物联网的终端节点或网关比如远程抄表、环境监测、农业传感。如果你正在选型 LoRa 方案或者已经拿到模块但驱动跑不通这篇笔记会从寄存器操作讲到实际拉距测试的完整路径。2. sx126x 驱动架构与最小可运行初始化2.1 为什么不能直接抄 sx127x 的驱动sx127x 和 sx126x 虽然都是 LoRa 收发器但寄存器映射和命令集完全不同。sx127x 用寄存器地址直接读写sx126x 改成了命令式接口每个操作要先发命令码再跟参数和数据。比如设置频率sx127x 是写 RegFrfMsb/Mid/Lsb 三个寄存器sx126x 是发 SetRfFrequency 命令后面跟 4 字节频率值。更关键的是 sx126x 多了 TCXO 控制、DIO3 电压调节、PA 过流保护这些 sx127x 没有的配置项直接移植驱动必然翻车。我一般会先确认模块的硬件设计晶振是 TCXO 还是 XTALTCXO 的话供电电压是多少DIO3 有没有外部电路。这些信息决定了初始化时 SetDio3AsTcxoCtrl 命令的参数。如果模块用的是 XTAL就不需要发这个命令但要注意 XTAL 的负载电容配置否则频偏会很大。2.2 最小初始化序列与命令封装下面是一个基于 STM32 HAL 库的初始化代码片段覆盖了从复位到进入待机模式的最小路径。代码里用到的 spi_transfer 函数是底层 SPI 收发封装需要根据你的 MCU 平台实现。// sx126x 命令码定义 #define SX126X_CMD_SET_STANDBY 0x80 #define SX126X_CMD_SET_SLEEP 0x84 #define SX126X_CMD_SET_RF_FREQUENCY 0x86 #define SX126X_CMD_SET_PACKET_TYPE 0x8A #define SX126X_CMD_SET_DIO3_AS_TCXO_CTRL 0x97 #define SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL 0x9D #define SX126X_CMD_SET_MODULATION_PARAMS 0x8B #define SX126X_CMD_SET_PACKET_PARAMS 0x8C #define SX126X_CMD_SET_TX_PARAMS 0x8E #define SX126X_CMD_SET_BUFFER_BASE_ADDR 0x8F #define SX126X_CMD_SET_DIO_IRQ_PARAMS 0x08 #define SX126X_CMD_SET_RX 0x82 #define SX126X_CMD_SET_TX 0x83 #define SX126X_CMD_GET_IRQ_STATUS 0x12 #define SX126X_CMD_CLEAR_IRQ_STATUS 0x02 #define SX126X_CMD_WRITE_BUFFER 0x0E #define SX126X_CMD_READ_BUFFER 0x1E // 等待 BUSY 引脚拉低表示芯片准备好接收命令 static void sx126x_wait_busy(void) { uint32_t timeout 100000; while (HAL_GPIO_ReadPin(SX126X_BUSY_PORT, SX126X_BUSY_PIN) GPIO_PIN_SET) { if (--timeout 0) { // 超时处理检查硬件连接或复位时序 break; } } } // 发送命令无数据阶段 static void sx126x_cmd(uint8_t cmd) { sx126x_wait_busy(); HAL_GPIO_WritePin(SX126X_NSS_PORT, SX126X_NSS_PIN, GPIO_PIN_RESET); spi_transfer(cmd); HAL_GPIO_WritePin(SX126X_NSS_PORT, SX126X_NSS_PIN, GPIO_PIN_SET); } // 发送带参数的命令 static void sx126x_cmd_with_params(uint8_t cmd, uint8_t *params, uint8_t len) { sx126x_wait_busy(); HAL_GPIO_WritePin(SX126X_NSS_PORT, SX126X_NSS_PIN, GPIO_PIN_RESET); spi_transfer(cmd); for (uint8_t i 0; i len; i) { spi_transfer(params[i]); } HAL_GPIO_WritePin(SX126X_NSS_PORT, SX126X_NSS_PIN, GPIO_PIN_SET); } // 初始化函数 void sx126x_init(void) { // 硬件复位拉低 NRESET 至少 100us HAL_GPIO_WritePin(SX126X_NRESET_PORT, SX126X_NRESET_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(SX126X_NRESET_PORT, SX126X_NRESET_PIN, GPIO_PIN_SET); HAL_Delay(10); // 进入待机模式使用 RC 振荡器 uint8_t standby_cfg 0x00; sx126x_cmd_with_params(SX126X_CMD_SET_STANDBY, standby_cfg, 1); // 配置 TCXO 控制假设 TCXO 供电 1.8V启动延时 10ms // DIO3 输出电压 1.8V延时 10ms / 15.625us 640 uint8_t tcxo_params[4]; tcxo_params[0] 0x02; // DIO3 输出电压 1.8V tcxo_params[1] 0x00; // 延时高字节 tcxo_params[2] 0x02; // 延时中字节 tcxo_params[3] 0x80; // 延时低字节640 * 15.625us 10ms sx126x_cmd_with_params(SX126X_CMD_SET_DIO3_AS_TCXO_CTRL, tcxo_params, 4); // 设置 DIO2 为射频开关控制 uint8_t dio2_cfg 0x01; sx126x_cmd_with_params(SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, dio2_cfg, 1); // 设置频率470MHz频率步进 32MHz / 2^25 0.95367Hz // 470000000 / 0.95367 492830720 0x1D5C0000 uint8_t freq_params[4] {0x1D, 0x5C, 0x00, 0x00}; sx126x_cmd_with_params(SX126X_CMD_SET_RF_FREQUENCY, freq_params, 4); // 设置 LoRa 包类型 uint8_t packet_type 0x01; sx126x_cmd_with_params(SX126X_CMD_SET_PACKET_TYPE, packet_type, 1); // 设置调制参数SF7BW125kHzCR 4/5低数据速率优化关闭 uint8_t mod_params[8]; mod_params[0] 0x07; // SF7 mod_params[1] 0x04; // BW125kHz mod_params[2] 0x01; // CR 4/5 mod_params[3] 0x00; // 低数据速率优化关闭 sx126x_cmd_with_params(SX126X_CMD_SET_MODULATION_PARAMS, mod_params, 4); // 设置包参数前导码长度 8显式报头负载长度 16CRC 开启标准 IQ uint8_t pkt_params[6]; pkt_params[0] 0x00; // 前导码高字节 pkt_params[1] 0x08; // 前导码低字节 pkt_params[2] 0x00; // 显式报头 pkt_params[3] 0x10; // 负载长度 16 pkt_params[4] 0x01; // CRC 开启 pkt_params[5] 0x00; // 标准 IQ sx126x_cmd_with_params(SX126X_CMD_SET_PACKET_PARAMS, pkt_params, 6); // 设置发射参数功率 14dBmRamp 时间 200us uint8_t tx_params[2]; tx_params[0] 0x0E; // 14dBm tx_params[1] 0x04; // Ramp 200us sx126x_cmd_with_params(SX126X_CMD_SET_TX_PARAMS, tx_params, 2); // 设置缓冲区基地址 uint8_t buf_base[2] {0x00, 0x00}; sx126x_cmd_with_params(SX126X_CMD_SET_BUFFER_BASE_ADDR, buf_base, 2); }这段代码里最容易被忽略的是 sx126x_wait_busy 函数。sx126x 的 BUSY 引脚在芯片处理命令期间会保持高电平如果不等它拉低就发下一条命令SPI 数据会被丢弃表现为配置不生效。另一个坑是 TCXO 延时参数单位是 15.625us算错了会导致 TCXO 还没稳定就开始收发频偏严重。2.3 中断配置与收发状态机sx126x 的收发完成、超时、CRC 错误等事件都通过 DIO1 引脚输出中断。驱动里需要配置 SetDioIrqParams 命令把关心的事件映射到 DIO1然后在中断服务函数里读 GetIrqStatus 判断具体事件。// 配置中断TxDone、RxDone、CRC错误、超时都映射到 DIO1 void sx126x_config_irq(void) { uint8_t irq_params[8]; uint16_t irq_mask 0x0002 | 0x0004 | 0x0040 | 0x0200; // TxDone | RxDone | CRCErr | Timeout irq_params[0] (irq_mask 8) 0xFF; irq_params[1] irq_mask 0xFF; irq_params[2] (irq_mask 8) 0xFF; // DIO1 映射 irq_params[3] irq_mask 0xFF; irq_params[4] 0x00; // DIO2 不映射 irq_params[5] 0x00; irq_params[6] 0x00; // DIO3 不映射 irq_params[7] 0x00; sx126x_cmd_with_params(SX126X_CMD_SET_DIO_IRQ_PARAMS, irq_params, 8); } // 发送数据 void sx126x_send(uint8_t *data, uint8_t len) { // 写数据到缓冲区 sx126x_wait_busy(); HAL_GPIO_WritePin(SX126X_NSS_PORT, SX126X_NSS_PIN, GPIO_PIN_RESET); spi_transfer(SX126X_CMD_WRITE_BUFFER); spi_transfer(0x00); // 偏移地址 for (uint8_t i 0; i len; i) { spi_transfer(data[i]); } HAL_GPIO_WritePin(SX126X_NSS_PORT, SX126X_NSS_PIN, GPIO_PIN_SET); // 清除中断标志 uint8_t clear_params[2] {0xFF, 0xFF}; sx126x_cmd_with_params(SX126X_CMD_CLEAR_IRQ_STATUS, clear_params, 2); // 启动发送超时时间 0 表示不超时 uint8_t tx_params[3] {0x00, 0x00, 0x00}; sx126x_cmd_with_params(SX126X_CMD_SET_TX, tx_params, 3); } // 中断服务函数里调用 void sx126x_irq_handler(void) { uint8_t irq_status[2]; sx126x_wait_busy(); HAL_GPIO_WritePin(SX126X_NSS_PORT, SX126X_NSS_PIN, GPIO_PIN_RESET); spi_transfer(SX126X_CMD_GET_IRQ_STATUS); spi_transfer(0x00); // 状态字节占位 irq_status[0] spi_transfer(0x00); irq_status[1] spi_transfer(0x00); HAL_GPIO_WritePin(SX126X_NSS_PORT, SX126X_NSS_PIN, GPIO_PIN_SET); uint16_t status (irq_status[0] 8) | irq_status[1]; if (status 0x0002) { // TxDone发送完成可以切换到接收模式 } if (status 0x0004) { // RxDone接收完成读缓冲区 } if (status 0x0040) { // CRC 错误数据不可信 } // 清除中断 uint8_t clear_params[2] {0xFF, 0xFF}; sx126x_cmd_with_params(SX126X_CMD_CLEAR_IRQ_STATUS, clear_params, 2); }中断处理里有个细节GetIrqStatus 命令返回两个字节第一个字节是状态位第二个字节在 sx126x 里是保留的但 SPI 时序上必须读出来否则 NSS 拉高时机会错。另外清除中断要用 0xFF 0xFF 清所有标志只清单个标志在某些型号上会有残留。3. 射频参数配置与拉距测试方法3.1 扩频因子、带宽与灵敏度的取舍LoRa 的通信距离和速率是一对矛盾。扩频因子 SF 越大灵敏度越高但空中速率越低传输同样数据耗时越长。带宽 BW 越窄灵敏度越好但抗频偏能力越差。我一般按这个顺序选先确定距离需求再选 SF最后调 BW。参数组合灵敏度空中速率适用场景SF7 / BW125-123dBm5.47kbps近距离高速城市环境SF9 / BW125-129dBm1.76kbps中等距离郊区SF12 / BW125-137dBm0.29kbps远距离低速野外SF12 / BW500-134dBm1.17kbps远距离但需要一定速率实际配置时SF 和 BW 的组合会影响符号时间进而影响前导码检测和超时设置。比如 SF12/BW125 的符号时间是 32.768ms前导码 8 个符号就是 262ms接收方如果超时设得太短会漏掉前导码。3.2 拉距测试的步骤与记录表拉距测试不是拿着模块走远看还能不能通要有方法。我一般这样做第一步固定发射端设置固定功率和参数每隔一定时间发一包带序号的数据。第二步接收端移动记录每包数据的 RSSI 和 SNR。第三步走到丢包率超过 50% 的位置再往回走看恢复情况。# 接收端数据记录脚本示例通过串口读取模块输出的 RSSI/SNR import serial import csv import time ser serial.Serial(COM3, 115200, timeout1) records [] start_time time.time() while time.time() - start_time 600: # 记录 10 分钟 line ser.readline().decode(utf-8, errorsignore).strip() if line.startswith(RX): # 格式RX,seq,rssi,snr,payload parts line.split(,) if len(parts) 5: records.append({ time: time.time() - start_time, seq: int(parts[1]), rssi: int(parts[2]), snr: float(parts[3]), payload: parts[4] }) with open(range_test.csv, w, newline) as f: writer csv.DictWriter(f, fieldnames[time, seq, rssi, snr, payload]) writer.writeheader() writer.writerows(records) # 统计丢包率 if records: max_seq max(r[seq] for r in records) loss_rate 1 - len(records) / max_seq print(f丢包率: {loss_rate:.2%}) print(f平均 RSSI: {sum(r[rssi] for r in records) / len(records):.1f} dBm) print(f平均 SNR: {sum(r[snr] for r in records) / len(records):.1f} dB)这个脚本把接收到的每包数据记录到 CSV最后算丢包率和平均信号质量。RSSI 反映信号强度SNR 反映信号质量两者要结合看。有时候 RSSI 很高但 SNR 很差说明干扰大这时候换频点比加功率有效。3.3 发射功率与电流的平衡sx126x 的发射功率通过 SetTxParams 命令设置范围从 -9dBm 到 22dBm具体取决于模块的 PA 设计。功率每增加 3dBm电流大约增加一倍。电池供电的节点我一般设 14dBm 到 17dBm再高的话 PA 效率下降发热也明显。有个容易忽略的点sx126x 的 PA 有过流保护配置通过 SetPaConfig 命令设置。如果模块的 PA 匹配电路和默认配置不匹配会出现功率上不去或者谐波超标。常见做法是先用默认配置测如果功率不对再调 PaDutyCycle 和 HpMax。4. 驱动调试中常见的五个坑4.1 SPI 读写全返回 0xFF 或 0x00现象初始化后读寄存器返回值全是 0xFF 或 0x00配置不生效。原因SPI 模式不对。sx126x 要求 SPI 模式 0CPOL0CPHA0MSB 先行。有些 MCU 的 SPI 默认是模式 3直接接上去数据错位。解决检查 SPI 初始化代码确认 CPOL 和 CPHA 设置。另外 NSS 引脚必须由软件控制不能用硬件 NSS因为 sx126x 的命令时序要求 NSS 在命令期间保持低电平。4.2 BUSY 引脚一直高电平现象上电后 BUSY 引脚始终为高芯片不响应任何命令。原因复位时序不对。sx126x 要求 NRESET 拉低至少 100us然后拉高再等 10ms 才能发命令。有些模块的 NRESET 引脚有 RC 延时电路拉高后需要更长时间。解决用示波器看 NRESET 和 BUSY 的波形确认复位脉冲宽度。如果模块有 RC 电路把等待时间加到 20ms 甚至 50ms。4.3 能发送但接收不到数据现象发送端显示 TxDone接收端没有 RxDone 中断。原因频率配置不一致。sx126x 的频率步进是 32MHz / 2^25算频率值时如果取整方式不对收发双方会有几十 Hz 的偏差。LoRa 对频偏的容忍度取决于 BWBW125 时大概能容忍 ±25kHz但 SF12 时符号时间长频偏会导致解调失败。解决收发双方用同一个频率计算公式最好用浮点数算完再转整数。另外检查 TCXO 配置如果一方用 TCXO 另一方用 XTAL频偏会很大。4.4 通信距离远低于预期现象参数配置看起来都对但拉距只有几百米。原因天线匹配和阻抗控制。sx126x 的射频输出是差分信号需要巴伦转换成单端再接天线。如果巴伦选型不对或者 PCB 走线阻抗不是 50 欧姆功率会反射实际辐射功率大幅下降。解决用矢量网络分析仪测天线端口的驻波比正常应该小于 2。如果没有仪器换一个已知良好的模块对比测试排除硬件问题。4.5 低功耗模式下电流偏大现象进入 Sleep 模式后电流不是 datasheet 标的 1uA 左右而是几百 uA。原因DIO 引脚配置不对。sx126x 在 Sleep 模式下如果 DIO 引脚有外部上拉或下拉会形成漏电流。另外 TCXO 如果一直使能也会消耗电流。解决进入 Sleep 前把 DIO3 的 TCXO 控制关掉DIO 引脚设为高阻态。如果模块有外部射频开关也要确认开关的控制引脚在 Sleep 时是低功耗状态。5. 从驱动到产品几个值得固化的习惯驱动调通只是第一步要把它变成能稳定跑在现场的设备有几个习惯我一直在用。第一个习惯是给每个命令加超时和返回值检查。sx126x_wait_busy 不能死等要有超时退出否则芯片异常时整个系统卡死。我一般设 100ms 超时超时后记录错误码并尝试重新初始化。第二个习惯是保存一份寄存器配置快照。初始化完成后把关键寄存器的值读回来存到结构体里每次修改参数前先对比避免误改。这个习惯在调试多套参数时特别有用能快速定位是哪次修改引入了问题。第三个习惯是拉距测试用固定脚本不要手动记录。手动记录容易漏包而且时间戳不准。用脚本自动记录 CSV后期用 Python 或 Excel 分析能看出 RSSI 随距离变化的趋势判断是线性衰减还是突然断崖。第四个习惯是给射频参数做版本管理。SF、BW、功率、前导码长度这些参数每次修改都记录在配置文件里标注修改原因和测试结果。LoRa 的参数组合很多靠脑子记不住翻车往往是因为改了某个参数忘了改回来。最后一个习惯是留一个最小测试固件。这个固件只做一件事收到数据就原样发回去。现场排查时先烧最小固件确认硬件没问题再烧业务固件能快速区分是驱动问题还是应用逻辑问题。这些习惯看起来琐碎但能省下大量排查时间。sx126x 的驱动本身不复杂复杂的是射频相关的边界条件和硬件差异。把能固定的都固定下来剩下的变量越少问题越好定位。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

RTSP服务器C源码精读:从socket到RTP的协议落地实践

RTSP服务器C源码精读:从socket到RTP的协议落地实践

简介:本资源是一份面向嵌入式开发与流媒体服务初学者的RTSP服务器C语言源码详解包,聚焦RTSP协议实现原理与网络服务编程实践。资源包含414个文件,主体为167个C源码文件(含核心协议解析、RTP/RTCP传输、会话状态机等模块&#xff0…

2026/10/15 18:27:42 阅读更多 →
从零开发 AI Agent(三):接入真实大模型,实现 LLM 调用、Prompt 构建与多轮对话

从零开发 AI Agent(三):接入真实大模型,实现 LLM 调用、Prompt 构建与多轮对话

前言前两个阶段,我搭建了 Agent 的基础架构,并引入 IntentRecognizer、PathSelector、PathHandlerRegistry 和 ApplicationContainer,完成了从“识别用户意图”到“选择执行路径”的分层。第三阶段的目标,是让其中的 LLM 路径真正…

2026/10/15 18:27:42 阅读更多 →
Serilog 嵌套 Logger 延迟基准:`ForContext` 派生 Logger 的写路径开销实测与源码剖析

Serilog 嵌套 Logger 延迟基准:`ForContext` 派生 Logger 的写路径开销实测与源码剖析

后端可观测性 【免费下载链接】serilog Simple .NET logging with fully-structured events 项目地址: https://gitcode.com/gh_mirrors/se/serilog 点击查看 免费下载 本报告基于 Serilog 仓库 results/net4.5.2/NestedLoggerLatencyBenchmark-report-github.md 中…

2026/10/15 18:27:42 阅读更多 →

最新新闻

SAP系统拆分:注意事项与规避做法(下篇)

SAP系统拆分:注意事项与规避做法(下篇)

上篇梳理了拆分项目的风险:模块集成带来的牵连、数据关联被切断、自开发处理工作量被低估、停机窗口受交易时间表约束、合规敞口放大、跨部门协同吃紧、测试被压缩,以及源系统遗留数据的处理。 本篇说明相应的规避做法,按启动前、执行中、上线…

2026/10/15 19:05:56 阅读更多 →
豆包工作上线新功能,支持跨AI产品一键导入已有配置

豆包工作上线新功能,支持跨AI产品一键导入已有配置

近期,豆包工作持续更新,上线“数据导入与同步”功能,支持从其他AI产品一键导入数据,并推出“在新对话中继续”、消息注释和对话摘要侧栏等能力,进一步优化工作任务中的对话体验。据介绍,豆包工作的“数据导…

2026/10/15 19:05:56 阅读更多 →
氧化锆陶瓷电极原理是什么?氧化锆陶瓷电极精密加工厂家

氧化锆陶瓷电极原理是什么?氧化锆陶瓷电极精密加工厂家

氧化锆陶瓷电极之所以能在氧传感器、固体氧化物燃料电池和高温电化学装置中发挥关键作用,根本原因在于其独特的氧离子导电机制。很多用户搜索“氧化锆陶瓷电极原理是什么”,同时也希望找到氧化锆陶瓷电极精密加工厂家。一、氧化锆陶瓷的晶体结构与氧空位…

2026/10/15 19:05:56 阅读更多 →
Java UDP网络编程实战:从原理到C/S通信案例

Java UDP网络编程实战:从原理到C/S通信案例

1. 为什么我选择用UDP做这个C/S通信案例1.1 从一次局域网调试说起前阵子帮一个做物联网设备的朋友排查问题,他的设备端每隔一秒往服务器发一次状态心跳,用的是TCP长连接。设备数量一上来,服务器端就出现大量连接堆积,资源占用高得…

2026/10/15 19:05:56 阅读更多 →
C# USB摄像头稳定录制方案:AForge+FFmpeg工业级实践

C# USB摄像头稳定录制方案:AForge+FFmpeg工业级实践

简介:本资源是一份面向C#初学者与桌面应用开发者的USB摄像头调用实战项目,聚焦于Windows平台下视频录制与单帧图像保存的核心功能实现。资源提供DirectShow与Media Foundation双框架的代码实践路径,涵盖设备枚举、滤镜图构建、媒体流捕获、文…

2026/10/15 19:05:56 阅读更多 →
【ESP32笔记】ESP中的分区表

【ESP32笔记】ESP中的分区表

本节目标:看懂分区表 CSV 的每一列,会给工程添加自定义分区,并用 esp_partition API 完成擦除、写入、读取一、本节要解决的问题 ESP32 的程序不是"整个 bin 一股脑烧到某个固定地址",而是把整块 flash 划分成多个分区&…

2026/10/15 19:04:55 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →