Android URC 介紹及源碼案例參考

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專…