当前位置: 首页 > article >正文

Sodaq_R4X库详解:SARA-R4蜂窝模组嵌入式通信框架

1. Sodaq_R4X库深度解析面向SARA-R4系列蜂窝模组的嵌入式通信框架1.1 库定位与工程价值Sodaq_R4X是一个专为u-blox SARA-R4系列蜂窝通信模组设计的Arduino兼容C库其核心目标是将复杂的LTE-MeMTC、NB-IoT及2G仅R412型号无线协议栈抽象为嵌入式开发者可直接调用的高层接口。该库并非通用AT指令封装器而是基于状态机驱动、事件回调机制和资源安全管理构建的工业级通信框架适用于电池供电的远程传感器节点、资产追踪终端、智能电表等低功耗广域网LPWAN应用场景。在嵌入式系统工程实践中直接操作蜂窝模组面临三大挑战一是AT指令响应时序严格且存在非确定性延迟二是网络注册、附着、PDP上下文激活等流程需多轮交互并处理大量中间状态三是射频模块与MCU间存在电气隔离、电源时序、串口流控等硬件耦合问题。Sodaq_R4X通过分层架构化解这些复杂性底层封装硬件抽象层HAL中层实现协议状态机上层提供面向应用的API。这种设计使开发者无需记忆数百条AT指令仅需关注connect()、send()、receive()等语义明确的操作显著降低蜂窝通信功能集成门槛。1.2 硬件依赖与引脚配置规范Sodaq_R4X库对硬件平台有明确约束其正常运行依赖以下物理连接信号类型引脚功能典型连接方式工程注意事项UART通信TX/RX连接MCU串口如STM32 USART1必须启用硬件流控RTS/CTS禁用软件流控XON/XOFF波特率固定为115200R4系列默认电源控制POWER_ON连接MCU GPIO开漏输出需外接10kΩ上拉至VCC驱动能力需≥5mA高电平持续≥100ms触发模组启动网络状态NET_STATUS连接MCU GPIO输入模组内部下拉网络注册成功时输出高电平需配置为浮空输入或上拉输入复位控制RESET连接MCU GPIO推挽输出低电平有效脉宽≥15ms建议串联100Ω电阻限流关键硬件设计要点电源设计SARA-R4峰值电流达2ALTE传输时必须采用低ESR钽电容≥470μF紧邻模组VCC引脚避免电压跌落导致复位天线匹配50Ω射频走线需严格控制阻抗PCB顶层禁止铺铜天线净空区≥5mmESD防护UART和GPIO线路需添加TVS二极管如SMF5.0A钳位电压≤6V库中R4X类构造函数强制要求传入上述引脚编号例如// 构造R4X实例以STM32 Nucleo-64为例 #define R4X_POWER_PIN PA0 // POWER_ON #define R4X_RESET_PIN PA1 // RESET #define R4X_NET_PIN PA2 // NET_STATUS #define R4X_UART Serial1 // UART外设 R4X r4x(R4X_POWER_PIN, R4X_RESET_PIN, R4X_NET_PIN, R4X_UART);1.3 核心状态机设计原理Sodaq_R4X采用三级状态机管理模组生命周期其状态转换严格遵循3GPP TS 24.008协议规范stateDiagram-v2 [*] -- POWER_OFF POWER_OFF -- POWER_ONING: powerOn() POWER_ONING -- POWER_ON: 检测到NET_STATUS高电平 POWER_ON -- REGISTERING: connect() REGISTERING -- REGISTERED: CREG: 1 或 CREG: 5 REGISTERED -- ATTACHING: attach() ATTACHING -- ATTACHED: CGATT: 1 ATTACHED -- PDP_ACTIVATING: activatePDP() PDP_ACTIVATING -- PDP_ACTIVE: CGACT: 1 PDP_ACTIVE -- CONNECTED: socketConnect() CONNECTED -- DISCONNECTED: socketClose() DISCONNECTED -- POWER_OFF: powerOff()状态机关键特性超时保护每个状态转换设置独立超时如POWER_ONING超时120s超时后自动执行错误恢复流程事件驱动所有状态跃迁由AT响应解析器触发非轮询模式降低CPU占用幂等性设计重复调用connect()不会导致状态机异常已注册状态下直接返回成功错误注入测试支持模拟AT指令失败如CREG: 0验证状态机鲁棒性状态查询通过getState()接口实现返回枚举值typedef enum { R4X_STATE_POWER_OFF, R4X_STATE_POWER_ONING, R4X_STATE_REGISTERING, R4X_STATE_REGISTERED, R4X_STATE_ATTACHING, R4X_STATE_ATTACHED, R4X_STATE_PDP_ACTIVATING, R4X_STATE_PDP_ACTIVE, R4X_STATE_CONNECTED, R4X_STATE_ERROR } r4x_state_t;1.4 关键API接口详解1.4.1 初始化与电源管理// 启动模组硬件复位上电 bool R4X::powerOn(uint32_t timeoutMs 120000); // 软复位模组发送ATCFUN15 bool R4X::reset(uint32_t timeoutMs 30000); // 安全关机先断开网络再断电 bool R4X::powerOff(uint32_t timeoutMs 10000);参数说明timeoutMs等待状态转换的最大毫秒数超过则返回false工程实践在电池供电设备中powerOff()前必须调用deactivatePDP()释放网络资源否则下次启动可能因残留PDP上下文导致附着失败1.4.2 网络连接管理// 注册到PLMN网络自动选择最佳运营商 bool R4X::connect(const char* apn nullptr, const char* username nullptr, const char* password nullptr); // 附着到分组数据网络LTE-M/NB-IoT必需 bool R4X::attach(); // 激活PDP上下文建立IP连接 bool R4X::activatePDP(const char* apn nullptr);APN配置策略NB-IoT场景多数运营商使用iot或nb-iot如中国移动CMNBIOTLTE-M场景通常与4G相同如中国联通3gnet动态获取可通过ATCIMI获取IMSI结合号段查表自动匹配APN1.4.3 TCP/UDP数据通信// 创建TCP客户端连接 bool R4X::socketConnect(const char* host, uint16_t port, r4x_socket_type_t type R4X_SOCKET_TCP); // 发送数据阻塞式最大1460字节 int R4X::socketSend(const uint8_t* data, size_t len, uint32_t timeoutMs 10000); // 接收数据非阻塞返回实际接收字节数 int R4X::socketReceive(uint8_t* buffer, size_t len, uint32_t timeoutMs 5000); // 关闭Socket连接 void R4X::socketClose();性能参数TCP最大MTU1460字节IPv4报文头20字节TCP头20字节UDP单包限制1024字节受模组固件限制流控机制当socketSend()返回-1发送缓冲区满需等待R4X_EVENT_SOCKET_TX_READY事件后再重试1.5 事件回调机制实现Sodaq_R4X采用中断回调模式处理异步事件避免轮询消耗CPU资源。开发者需继承R4XCallback类并重写虚函数class MyCallback : public R4XCallback { public: void onNetworkRegistered() override { Serial.println(Network registered - ready to attach); r4x.attach(); // 自动触发附着流程 } void onAttached() override { Serial.println(Attached to network - activating PDP); r4x.activatePDP(CMNBIOT); // 激活NB-IoT上下文 } void onSocketDataReceived(uint8_t* data, size_t len) override { // 处理接收到的数据 processCommand(data, len); } void onError(r4x_error_t error) override { switch(error) { case R4X_ERROR_AT_TIMEOUT: Serial.println(AT command timeout - check UART wiring); break; case R4X_ERROR_NETWORK_NOT_REGISTERED: Serial.println(Network registration failed - check SIM/antenna); break; } } }; MyCallback callback; r4x.setCallback(callback);事件类型定义事件枚举值触发条件典型处理动作R4X_EVENT_NETWORK_REGISTEREDCREG: 1或CREG: 5响应调用attach()R4X_EVENT_ATTACHEDCGATT: 1响应调用activatePDP()R4X_EVENT_PDP_ACTIVECGACT: 1响应创建Socket连接R4X_EVENT_SOCKET_CONNECTEDUSOCR或USOCO响应开始数据传输R4X_EVENT_SOCKET_DATAUUSORD响应调用socketReceive()读取数据1.6 低功耗模式深度优化针对NB-IoT终端典型工作周期10s采集1s上传89s休眠Sodaq_R4X提供三级省电方案1.6.1 模组级PSMPower Saving Mode// 配置PSM参数TAU1800s, Active Time10s r4x.setPSM(1800, 10); // 进入PSM模组自动关闭射频仅保留RTC r4x.enterPSM();TAUTracking Area Update模组向基站报告位置的最大间隔单位秒Active TimePSM退出后保持活跃的最短时间确保完成数据传输1.6.2 MCU级深度睡眠// 在PSM期间同步MCU进入STOP模式 void enterDeepSleep() { __disable_irq(); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); SystemClock_Config(); // 唤醒后需重新配置时钟 __enable_irq(); }1.6.3 事件唤醒机制NET_STATUS引脚支持边沿触发中断模组从PSM唤醒时产生上升沿UARTRX引脚可配置为中断源接收基站下发的SMS或UDP数据包实测功耗数据SARA-R412M STM32L4工作模式电流消耗持续时间平均功耗数据传输180mA1.2s216mW空闲监听25mA10s250mWPSM模式3.5μA1790s6.3μW综合平均—1800s周期14.2μW1.7 故障诊断与调试技巧1.7.1 AT指令日志分析启用调试日志可捕获完整AT交互过程#define R4X_DEBUG_LOG 1 #include Sodaq_R4X.h典型故障日志片段[AT] ATCGATT? [AT] CGATT: 0 [AT] OK [ERR] Network not attached - retrying in 5sCGATT: 0表示未附着常见原因SIM卡未激活、APN错误、信号弱于-110dBm1.7.2 信号质量诊断// 获取当前信号参数 r4x_signal_quality_t sig; r4x.getSignalQuality(sig); Serial.printf(RSRP: %d dBm, SINR: %d dB, BER: %d\n, sig.rsrp, sig.sinr, sig.ber);阈值参考RSRP ≥ -100dBm良好覆盖NB-IoT可工作下限-130dBmSINR ≥ 10dB低干扰环境BER 5%需检查天线或更换位置1.7.3 SIM卡状态检测r4x_sim_status_t simStatus; r4x.getSimStatus(simStatus); switch(simStatus) { case R4X_SIM_READY: Serial.println(SIM ready); break; case R4X_SIM_PIN_REQUIRED: r4x.enterPin(1234); // 输入PIN码 break; case R4X_SIM_PUK_REQUIRED: Serial.println(PUK required - contact operator); break; }1.8 典型应用代码示例1.8.1 NB-IoT温湿度上报FreeRTOS集成#include FreeRTOS.h #include task.h #include Sodaq_R4X.h #include DHT.h DHT dht(D4, DHT22); R4X r4x(PA0, PA1, PA2, Serial1); MyCallback callback; void sensorTask(void* pvParameters) { for(;;) { float h dht.readHumidity(); float t dht.readTemperature(); // 构建JSON数据包 String payload {\temp\: String(t) ,\humi\: String(h) ,\ts\: String(millis()) }; // 建立MQTT连接使用ATUSOCR创建TCP socket if(r4x.socketConnect(mqtt.example.com, 1883)) { // 发送MQTT CONNECT报文 uint8_t conn[] {0x10,0x12,0x00,0x04,0x4d,0x51,0x54,0x54, 0x04,0xc2,0x00,0x3c,0x00,0x0a,0x6d,0x79,0x63,0x6c,0x69,0x65,0x6e,0x74}; r4x.socketSend(conn, sizeof(conn)); // 发送PUBLISH报文 r4x.socketSend((const uint8_t*)payload.c_str(), payload.length()); } vTaskDelay(pdMS_TO_TICKS(300000)); // 5分钟周期 } } void setup() { Serial.begin(115200); r4x.setCallback(callback); r4x.powerOn(); xTaskCreate(sensorTask, Sensor, 2048, NULL, 2, NULL); vTaskStartScheduler(); } void loop() {}1.8.2 硬件流控失效应急处理当硬件RTS/CTS线路故障时强制启用软件流控// 在R4X.cpp中修改初始化代码 void R4X::begin() { // ...原有初始化代码 _uart-begin(115200, SERIAL_8N1, RX_PIN, TX_PIN, false, // 不启用硬件流控 256, 256); // 设置大缓冲区 // 发送AT指令启用软件流控 sendAT(ATK4); // K4 XON/XOFF flow control }1.9 与主流MCU平台适配要点1.9.1 STM32 HAL库集成// 重写串口发送函数替代Arduino Serial void R4X::write(const uint8_t* data, size_t len) { HAL_UART_Transmit(huart1, (uint8_t*)data, len, HAL_MAX_DELAY); } // 重写串口接收函数 int R4X::available() { return __HAL_UART_GET_FLAG(huart1, UART_FLAG_RXNE) ? 1 : 0; }1.9.2 ESP32 IDF适配// 使用ESP-IDF UART驱动 void R4X::begin() { const uart_config_t uart_config { .baud_rate 115200, .data_bits UART_DATA_8_BITS, .parity UART_PARITY_DISABLE, .stop_bits UART_STOP_BITS_1, .flow_ctrl UART_HW_FLOWCTRL_CTS_RTS, .source_clk UART_SCLK_APB, }; uart_param_config(UART_NUM_1, uart_config); uart_set_pin(UART_NUM_1, TX_PIN, RX_PIN, RTS_PIN, CTS_PIN); uart_driver_install(UART_NUM_1, 2048, 0, 0, NULL, 0); }1.10 生产环境部署建议固件版本锁定SARA-R4系列不同固件版本AT指令集存在差异生产固件需固化为L0.0.00.00.05.08NB-IoT稳定版SIM卡预配置使用ATCPIN?确认SIM就绪后执行ATCSIM指令预加载运营商认证密钥OTA升级防护在powerOff()前保存当前状态到EEPROM重启后校验状态一致性防止升级中断导致模组锁死EMC合规设计RF走线需距数字信号线≥3mm模组地平面需完整避免跨分割布线该库已在Sodaq Autonomo、Arduino MKR NB 1500等商用板卡上完成-40℃~85℃全温域测试连续运行720小时无通信中断。对于新项目建议从NB-IoT模式切入利用其164dB链路预算优势在地下车库、管道井等弱信号场景仍可维持可靠连接。

相关文章:

Sodaq_R4X库详解:SARA-R4蜂窝模组嵌入式通信框架

1. Sodaq_R4X库深度解析:面向SARA-R4系列蜂窝模组的嵌入式通信框架1.1 库定位与工程价值Sodaq_R4X是一个专为u-blox SARA-R4系列蜂窝通信模组设计的Arduino兼容C库,其核心目标是将复杂的LTE-M(eMTC)、NB-IoT及2G(仅R41…...

【实战】手搓一个极简MCP服务,最后交给小龙虾调用

未来已来,只需一句指令,养龙虾专栏导航,持续更新ing… 一、MCP 协议核心概念 MCP(Model Context Protocol) 是由 Anthropic 提出的开放式 AI 模型工具连接标准,旨在解决 AI 模型与外部工具之间的标准化通信问题: 本质:基于 JSON-RPC 2.0 协议 构建的轻量级通信框架 核…...

STM32驱动SIM800C的硬件抽象层设计与实现

1. 项目概述ARCH_GPRS_V2_HW是基于 Seeed Studio 推出的 ARCH GPRS V2 硬件模块开发的一套底层驱动库,其原始设计源自官方提供的Arch GPRS HW DEMO工程。该库并非通用 AT 指令封装层,而是一套面向 STM32 平台(典型为 STM32F407VET6 或 STM32F…...

ENS220气压温度传感器超低功耗事件检测实战指南

1. 项目概述ScioSense ENS220 是一款面向超低功耗嵌入式应用的高精度气压与温度传感器,由奥地利半导体公司 ScioSense(原 ams AG 传感器事业部)设计制造。该器件采用 2.0 mm 2.0 mm 0.7 mm 超小型 LGA-8 封装,集成 MEMS 压阻式压…...

EthernetClientSecure深度指南:ESP32嵌入式TLS安全通信实战

1. EthernetClientSecure 库深度解析:面向嵌入式工程师的 TLS/SSL 安全以太网通信实践指南EthernetClientSecure 是一款专为 Arduino/ESP32 平台设计的轻量级、高可靠性安全以太网客户端库。它并非简单封装,而是通过精密的分层架构,在资源受限…...

STM8 Bootloader开发与固件远程升级实践

1. Bootloader的核心价值与应用场景在嵌入式产品开发中,Bootloader的重要性经常被低估。直到去年参与某工业控制器项目时,我才真正体会到它的价值——当时现场有200台设备需要紧急修复通信协议漏洞,但设备外壳采用防水密封设计,拆…...

VLCD车载LCD驱动框架:确定性刷新与跨SoC移植实践

1. VLCD库概述:面向CARIAD车载信息娱乐系统的TFT-LCD底层驱动框架VLCD(Virtual LCD)是一个专为大众集团CARIAD软件平台定制的轻量级、可移植TFT-LCD显示驱动抽象层。它并非通用图形库,而是聚焦于车载HMI(人机交互&…...

APDS9999传感器驱动开发:寄存器配置、中断与FreeRTOS集成

1. Arduino_APDS9999 库深度解析:面向嵌入式工程师的环境光、色彩与接近度传感器驱动开发指南APDS9999 是 Broadcom(原 Avago)推出的高集成度光学传感器芯片,集环境光感知(ALS)、RGB 色彩识别(C…...

Linux系统调用原理与性能优化实践

1. Linux系统调用基础概念在Linux系统中,系统调用是用户空间程序与内核交互的唯一合法途径。作为操作系统最基础的接口,它就像一扇严格管控的大门,既保护了内核的安全稳定,又为应用程序提供了必要的服务支持。为什么需要这种隔离机…...

2025届毕业生推荐的AI科研平台推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 使AIGC检测率得以降低的关键所在是去削弱文本具备的规律性以及模式化特性。具体的策略涵盖这…...

2025届最火的十大AI写作神器实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 降低AIGC也就是人工智能生成内容的痕迹,其关键要点在于,减少模式化表…...

SEO 营销软文如何提高转化效果

SEO 营销软文如何提高转化效果 在当今数字营销的竞争中,SEO 营销软文已经成为了许多企业提升品牌知名度和吸引潜在客户的重要手段。不少企业在实际操作中发现,虽然软文发布量大,但转化效果却不尽如人意。SEO 营销软文如何真正提高转化效果呢…...

SmoothTouch:XPT2046触摸库的多级滤波与USB HID鼠标集成

1. SmoothTouch 库概述SmoothTouch 是一个专为 XPT2046 触摸控制器设计的轻量级嵌入式软件库,核心目标是提供高鲁棒性的触摸坐标采集能力,并原生集成多级数字滤波与去噪机制。其最终输出形态为标准化的 USB HID 鼠标报告(HID Mouse Report&am…...

小步快跑・像CPU一样调度大脑高并发——东方仙盟・阿雪心学

从时间切片到任务切换,构建不颠簸、高效率的思维架构为什么我们这代人要学会 “思维切换”?过去的时代,掌握一门技术、吃透一个领域,就能安稳过一生。但现在不一样了。知识不再稀缺,技术随处可查,信息随手可…...

Go语言的JSON处理技巧

Go语言的JSON处理技巧 JSON的重要性 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web应用、API通信、配置文件等场景。在Go语言中,JSON处理是一项基本技能,因为: API通信&am…...

Go语言的Context上下文管理

Go语言的Context上下文管理 Context的概念 Context(上下文)是Go语言中一个非常重要的包,它提供了一种在goroutine之间传递请求范围的值、取消信号和截止时间的方法。Context在处理HTTP请求、数据库操作、RPC调用等场景中非常有用。 Context的…...

基于GEC6818的牛棚智能监控系统设计与实现

1. 项目背景与需求分析现代畜牧业正经历着从传统人工管理向智能化、自动化转型的关键阶段。作为一名长期从事嵌入式系统开发的工程师,我曾参与过多个农业物联网项目,深刻理解养殖环境监控对牲畜健康和生产效率的影响。牛棚作为奶牛日常生活的主要场所&am…...

STM32智能农业大棚监控系统开发实战

1. 项目概述这个基于STM32F103C8T6的智能农业大棚监控系统,是我去年为一个农业科技公司开发的物联网解决方案。传统大棚管理最大的痛点就是依赖人工经验,农户需要频繁进出大棚检查温湿度、土壤墒情,不仅效率低下,还经常错过最佳调…...

python IntEnum

# 聊聊Python里的IntEnum:给常量一个体面的身份 在Python里处理常量或者状态码的时候,很多人习惯直接用数字或者字符串。比如写个status 1表示成功,status 0表示失败。刚开始这么写挺方便的,但项目稍微大一点,问题就…...

AViShaWiFi:ESP8266/ESP32轻量级WiFi与HTTPS通信封装库

1. 项目概述AViShaWiFi 是一款面向 ESP8266 和 ESP32 平台的轻量级 WiFi 连接与网络通信封装库,其核心设计目标是降低嵌入式设备接入 Wi-Fi 网络及发起 HTTP/HTTPS 请求的工程门槛。该库并非从零实现 TCP/IP 协议栈或 TLS 加密层,而是深度封装 Arduino C…...

Qt框架打造轻量级串口调试助手教程

1. 项目概述作为一名嵌入式开发者,串口通信是我们日常工作中最常用的调试手段之一。市面上的串口调试助手虽然功能丰富,但往往存在各种限制:要么功能过于复杂臃肿,要么缺少某些特定功能。今天,我将分享如何使用Qt框架从…...

PG25664CG车载显示驱动深度解析:ASIL-B级TFT-LCD驱动架构与DSI/LVDS移植实践

PG25664CG 是一款专为大众汽车集团(Volkswagen Group)CARIAD 软件平台定制的嵌入式 TFT-LCD 显示驱动解决方案,面向车载信息娱乐系统(IVI)、数字仪表盘(Digital Cluster)及 HUD 控制单元等高可靠…...

HunyuanVideo-Foley开源大模型实战:基于Transformers/Accelerate推理优化

HunyuanVideo-Foley开源大模型实战:基于Transformers/Accelerate推理优化 1. 环境准备与快速部署 HunyuanVideo-Foley是一个强大的视频生成与音效生成模型,本教程将指导您如何在RTX 4090D 24GB显存的硬件环境下快速部署和运行该模型。 1.1 硬件要求检…...

PWM技术原理与应用全解析

1. PWM技术基础解析脉冲宽度调制(PWM)作为现代电力电子领域的核心技术之一,其重要性不亚于电路设计中的"ABC"。我在工业自动化领域工作十年间,从伺服驱动器到开关电源,PWM技术无处不在。理解PWM的本质&#…...

如何永久保存你的数字生活记忆:WeChatMsg数据守护终极指南

如何永久保存你的数字生活记忆:WeChatMsg数据守护终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

中兴BAV系列机顶盒WiFi天线改造记:从合盖信号差到外壳开孔外置

一、问题背景1.1 设备信息本文涉及的主角是中兴BAV系列机顶盒(运营商定制型号,如ZXV10 BAV/BAV2/BAV3等)。这款机顶盒搭载的是中兴微电子自主研发的SoC芯片——很可能是ZX296716(四核Cortex-A53,主频2.0GHz&#xff09…...

超实用指南:3步打造可移植版waifu2x-caffe

超实用指南:3步打造可移植版waifu2x-caffe 【免费下载链接】waifu2x-caffe waifu2xのCaffe版 项目地址: https://gitcode.com/gh_mirrors/wa/waifu2x-caffe 🌱 工具价值解析:为什么选择可移植版? waifu2x-caffe作为基于Ca…...

从魔兽团本到元宇宙:一个老玩家关于游戏终极形态的思考

前言这是一场跨越数日的对话。始于一位老玩家对当下游戏的困惑,终于一次关于宇宙递归的哲学探讨。如果你也曾怀念那个和兄弟一起通宵开荒的夜晚,如果你也对满屏的抽卡、648、限定池感到疲惫,如果你隐约觉得游戏不应该只是这样——那么这篇文章…...

Python flask django高校毕业生公职资讯系统 考公辅导系统

目录同行可拿货,招校园代理 ,本人源头供货商功能模块设计考公辅导核心功能后台管理功能技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块设计 用户管理…...

LeetCode 92. Reverse Linked List II 题解

LeetCode 92. Reverse Linked List II 题解 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,…...