1. URC 含义

URC 是 Unsolicited Result Code非请求结果码)的缩写。

  • 它是 modem(基带)在不需要 AP 主动请求的情况下向上层主动上报的消息
  • 典型例子:短信到达提示、网络状态变更、来电通知、信号质量变化等。
  • URC 一般以 AT 命令扩展的形式从 modem 发到 AP,例如串口、QMI、RIL 通道。
  • URC 通常以字符串或特定消息 ID 的形式携带信息,比如:
    +CMTI: "SM",3
    RING
    +CREG: 1,"1234","5678"
    
    这些信息不是某个 AT command 的直接响应,而是 modem 主动推送的。

2. 在 Android 中 modem URC 的处理流程

在 Android 平台,modem 与 Android Telephony Framework 通信主要通过 RIL(Radio Interface Layer)
URC 在 Android 中通常叫 Unsolicited Response(非请求消息),它的流程大致如下:

典型处理链路

Modem(基带模块)↓  (AT字符串, QMI, 或其它协议)
RIL Daemon (rild)     -->  Vendor RIL 实现↓
RILJ (Java层 Radio Interface Layer)↓
PhoneBase / GsmCdmaPhone / ServiceStateTracker 等↓
TelephonyManager / Broadcast / App
  1. modem --> Vendor RIL
    Modem 通过串口 / QMI / IPC 接口向 vendor RIL driver 上报 URC,vendor RIL driver 收到数据后,调用 RIL_onUnsolicitedResponse() 通知上层。
    mtk ril

  2. Vendor RIL --> rild (RIL Daemon)
    rild 进程读取并解析这些非请求 URC,然后通过 libril.so 提供的回调封装成 RadioIndication 发送给 Java 层。

  3. RILJ(Java层)
    在 frameworks/opt/telephony/RIL.java 中有很多处理 unsolicited 事件的 case,例如:

    case RIL_UNSOL_RESPONSE_NEW_SMS:if (RILJ_LOGD) unsljLogRet(response, ret);if (mSmsRegistrant != null) {mSmsRegistrant.notifyRegistrant(new AsyncResult(null, ret, null));}break;
    case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:pollCallsWhenSafe();break;
    

    这些就是 modem 上报 URC(短信、新呼叫、网络状态变更等)的处理入口。

  4. Telephony Framework --> Apps
    上层组件(ServiceStateTrackerGsmCdmaCallTrackerInboundSmsHandler 等)根据收到的 URC 更新状态并向应用广播,例如:

    • 短信到达:会发出 SMS_RECEIVED 广播。
    • 来电:触发 Telephony UI 更新,启动拨号界面。
    • 网络状态变更:通过 ServiceState 回调给 TelephonyManager

3. Android 上可以参考的功能代码

URC 在 Android 中处理方案可以参考 AOSP 源码,位置大概如下:

C/C++ 层(RIL Daemon 与 Vendor RIL 接口)

  • hardware/ril/libril/ril.cpp
    • 函数:RIL_onUnsolicitedResponse()
      用来把 modem 上报的 URC 往 Java 层送。
  • hardware/ril/libril/ 中的核心处理

Java 层(RILJ)

  • frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java
    • processUnsolicited() 方法:集中处理底层来的 URC
    • 不同的 case 对应不同的 RIL_UNSOL_* 常量。
  • frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
    • 处理网络注册相关的 URC
  • frameworks/opt/telephony/src/java/com/android/internal/telephony/InboundSmsHandler.java
    • 处理短信的 URC(RIL_UNSOL_RESPONSE_NEW_SMS
  • frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java
    • 处理来电(RIL_UNSOL_CALL_STATE_CHANGED

4. 一个简单的 URC 上报示例

假设 modem 收到一条新的短信,会发出 URC:

+CMTI: "SM",3

处理流程:

  1. modem 主动通过 AT 接口发送 +CMTI URC 给 RIL。
  2. Vendor RIL 在解析到 +CMTI 后调用:
    RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_NEW_SMS, pduData, pduLen);
    
  3. libril 通知 RILJ(Java 层):
    case RIL_UNSOL_RESPONSE_NEW_SMS:mSmsRegistrant.notifyRegistrant(new AsyncResult(null, ret, null));
    
  4. InboundSmsHandler 收到通知,存储短信并发 SMS_RECEIVED 广播给上层应用。

总结

  • URC:modem 主动通知上层的异步消息,RIL 叫 unsolicited response。
  • Android 中可参考:
    • C/C++:hardware/ril/libril/ril.cpp(RIL_onUnsolicitedResponse)
    • Java:RIL.javaprocessUnsolicited 逻辑
    • 各 tracker(ServiceStateTracker、CallTracker、InboundSmsHandler)的注册与处理。
  • 为了调试,可以开 modem log(AT 口)结合 adb logcat -b radio 看 u-r-c 相关日志。

URC 在 Android 处理的时序图
URC(Unsolicited Result Code)Android 处理流程时序图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96319.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96319.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96319.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VB.NET发送邮件给OUTLOOK.COM的用户,用OUTLOOK.COM邮箱账号登录给别人发邮件

在VB.NET中通过代码发送邮件时,确实会遇到邮箱服务的身份认证(Authentication)要求。特别是微软Outlook/Hotmail等服务,已经逐步禁用传统的“基本身份验证”(Basic Authentication),转而强制要求…

【网络运维】Shell:变量进阶知识

Shell 变量进阶知识 Shell 中的特殊变量 位置参数变量 Shell 脚本中常用的位置参数变量如下: $0:获取当前执行的 Shell 脚本文件名(包含路径时包括路径)$n:获取第 n 个参数值(n>9 时需使用 ${n}&#xf…

部署Qwen2.5-VL-7B-Instruct-GPTQ-Int3

模型下载 from modelscope import snapshot_download model_dir snapshot_download(ChineseAlpacaGroup/Qwen2.5-VL-7B-Instruct-GPTQ-Int3)相关包导入 import os import numpy as np import pandas as pd from tqdm import tqdm from datetime import datetime,timedelta fro…

sourcetree 拉取代码

提示:文章旨在于教授大家 sourcetree 拉取代码的方式,关于代码的提交合并等操作后续会补充。 文章目录前言一、sourcetree 安装二、http 与 ssh 拉取代码1.http 方式(1)生成 token(2)拼接项目的 url&#x…

epoll模型网络编程知识要领

1、程序初始化创建监听socket调用bind函数绑定ip地址、port端口号调用listen函数监听调用epoll_create函数创建epollfd调用epoll_ctrl函数将listenfd绑定到epollfd上,监测listenfd的读事件在一个无限循环中,调用epoll_wait函数等待事件发生2、处理客户端…

15-day12LLM结构变化、位置编码和投机采样

多头机制transformer结构归一化层选择 归一化层位置归一化层类型激活函数Llama2结构MoE架构 混合专家模型DeepSeek MLA为何需要位置编码目前的主流位置编码正余弦位置编码可学习位置编码ROPE旋转位置编码推导参考: https://spaces.ac.cn/archives/8265 https://zhua…

记录 docker容器打包成镜像 在其他服务器快速启动镜像和容器

我有个nginx服务器 需要在其他服务器直接部署使用 里面都是完整的 使用 docker ps 查看容器id 进行打包成镜像docker commit [容器ID或名称] 新镜像名:版本 docker commit 28f60e2206b2 my-nginx-custom:v1镜像保存成文件 docker save -o my-nginx-custom.tar my-nginx-custom:…

使用LLaMA-Factory对大模型进行微调-详解

书接上回 启动llama Factory可视化页面 llamafactory-cli webui 如果想后台运行 使用 nohup llamafactory-cli webui &浏览器访问 http://127.0.0.1:7860/配置项主要参数: 参考: https://docs.coreshub.cn/console/compute_platform/help/llama_factory/ 模型路径 : 解…

【AI】录制自动生成UI自动化脚本

命令行输入:npx playwright codegen https://myerp.dmyc.XXX.com:9443/打开的浏览器上操作,会自动录制,并生成自动化脚本

深度剖析字节跳动VeOmni框架

背景与设计动机 随着推荐系统和AI模型走向多模态、多任务的趋势,字节跳动面临着训练、迭代效率和系统复杂度的双重挑战。一方面,各类业务(如新闻推荐、短视频、图文广告、电商带货等)都需要处理文本、图像、视频、音频等多种输入模…

OCR库pytesseract安装保姆级教程

本文将介绍使用工具安装OCR库pytesseract的详细流程。 Anaconda安装教程参考Anaconda安装保姆级教程。 目录 一、工具安装 二、创建虚拟环境 三、安装pytesseract 总结 一、工具安装 点击链接前往官网codetou.com,下载安装最新版即可,本篇博客以抠头…

开源im即时通讯软件开发社交系统全解析:安全可控、功能全面的社交解决方案

在即时通讯与社交需求日益增长的今天,一款安全、稳定、功能全面的聊天软件成为不少团队和开发者的刚需。但市面上多数聊天 APP 要么依赖第三方插件,面临数据安全隐患和高额服务费;要么功能单一,难以满足复杂社交场景。今天给大家推…

残差神经网络(ResNet)

残差神经网络(Residual Neural Network,简称 ResNet)是深度学习领域的里程碑式模型,由何凯明等人在 2015 年提出,成功解决了深层神经网络训练中的梯度消失 / 爆炸问题,使训练超深网络(如 152 层…

学习嵌入式之驱动

一、基础搭建1.基础:c语言 软件编程语言 数据结构 软件编程思想2.驱动实现目标如果将Linux系统细致到开发板平台上? Liunx系统与硬件设备的适配3.自我能力的锻炼继续强化C语言锻炼大型代码阅读和分析能力学习大型项目的代码搭建和管理的能力…

在 Golang 中复用 HTTP 连接

问题提出最近在实现一个转发大模型调用请求的中转功能,涉及到要构造client发送请求的内容,一开始我每次都是新建一个client来发送请求,这样的代码实现存在一些问题——每次都要构造新的client,并且要重新建立连接。后面了解到在Go…

前端:el-upload文件上传与FormData 对象

<el-uploadclass"uploadDemo":limit"1"dragaccept".xls,.xlsx" <!-- 只保留Excel格式 -->:on-exceed"handleExceedFileLimit":on-change"handleChangeExcelFile":on-remove"handleRemoveExcelFile":bef…

自然处理语言NLP:One-Hot编码、TF-IDF、词向量、NLP特征输入、EmbeddingLayer实现、word2vec

文章目录自然语言处理&#xff08;NLP&#xff09;一、什么是自然语言处理&#xff08;NLP&#xff09;&#xff1f;二、NLP 的核心目标三、NLP 的主要应用方向&#xff08;应用场景&#xff09;四、NLP 的基本概念五、NLP 的基本处理流程1. 文本预处理2. 特征表示3. 模型选择与…

单词记忆-轻松记忆10个实用英语单词(13)

1. board含义&#xff1a;板子&#xff1b;董事会&#xff1b;登机 读音标注&#xff1a;/bɔːrd/ 例句&#xff1a;Write your name on the board. 译文&#xff1a;把你的名字写在板上。 衍生含义&#xff1a;董事会&#xff08;如“board of directors”&#xff09;&#…

Spring循环依赖源码调试详解,用两级缓存代替三级缓存

Spring循环依赖源码详解&#xff0c;改用两级缓存并实验 背景 最近一直在研究Spring的循环依赖&#xff0c;发现好像两级缓存也能解决循环依赖。 关于为何使用三级缓存&#xff0c;大致有两个原因 对于AOP的类型&#xff0c;保证Bean生命周期的顺序 对于有AOP代理增强的类型&am…

亚马逊BALL PIT球池外观专利侵权指控?不侵权意见书助力4条链接申诉成功!

儿童球池作为玩具品类中常见的一款产品&#xff0c;能够给儿童提供游乐的安全空间&#xff0c;深受亚马逊平台用户的喜爱。然而在近期&#xff0c;赛贝收到了部分亚马逊卖家的咨询&#xff0c;原因是他们在售的儿童球池产品链接被美国外观专利USD1009203S&#xff08;下称203专…