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

建设网站哪家好百度世界排名

建设网站哪家好,百度世界排名,简单的html网站开发,做网站商城Android作为一个通用的移动平台,其首要的功能就是通话、短信以及上网等通信功能。那么,从系统的角度来看,Android究竟是怎么实现与网络的交互的了? 这篇文章里,就来看一看Android中负责通信功能的Telephony中间层&…

Android作为一个通用的移动平台,其首要的功能就是通话、短信以及上网等通信功能。那么,从系统的角度来看,Android究竟是怎么实现与网络的交互的了? 这篇文章里,就来看一看Android中负责通信功能的Telephony中间层,通常也被称之为RIL(==Radio Interface Layer:无线接口层==)的具体实现原理与架构。

Android手机要实现与网络端的通信,需要跨越两个层:
  • RIL Java(RILJ):负责将上层APP的通信请求发送给HAL层
  • RIL C++(RILD): 系统守护进程,负责将RILJ的请求命令发送给CP(Communication Processor)
什么是RIL
  • 简单的说,RIL(Radio Interface Layer),就是将应用程序的通信请求发送给CP的中间层,其包括两个部分,一个是Java层RILJ,一个是C++层(不妨看作是CP对应的HAL层)RILD。
  • RILJ属于系统Phone进程的一部分,随Phone进程启动而加载;而RILD守护进程是通过Android的Init进程进行加载的。
RIL结构
下图是一个Android RIL的一个结构图。整个通信过程有四个层:
  • 最上层的是应用程序,如通话,短信以及SIM卡管理,它们主要负责将用户的指令发送到RIL Framework(以后统称RILJ);
  • RILJ为上层提供了通用的API,如TelephonyManager(包括通话,网络状态; SubscriptionManager(卡状态)以及SmsManager等,同时RILJ还负责维持与RILD的通信,并将上层的请求发送给RILD;
  • RILD是系统的守护进程,对于支持通话功能的移动平台是必不可少的。RILD的功能主要功能是将RILJ发送过来的请求继续传递给CP,同时会及时将CP的状态变化发送给RILJ;
  • Linux驱动层:kernel驱动层接受到数据后,将指令传给CP,最后由CP发送给网络端,等网络返回结果后,CP将传回给RILD;
    image
    RILJ与RILD(RILD与CP的通信)都是通过一个个消息进行数据传递。消息主要分两种:一种是RILJ主动发送的请求(solicited),常见的有RIL_REQUEST_GET_SIM_STATUS(获取SIM卡状态), RIL_REQUEST_DIAL(拨打电话),RIL_REQUEST_SEND_SMS(发送短信), RIL_REQUEST_GET_CURRENT_CALLS(获取当前通话状态),RIL_REQUEST_VOICE_REGISTRATION_STATE(获取网络状态); 另一种则是从CP主动上报给RIL的消息(unsolicited),如网络状态发生变化时,CP会上报RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED,有新短信时,会上报RIL_UNSOL_RESPONSE_NEW_SMS,有来电时会上报RIL_UNSOL_CALL_RING
    RIL相关的请求命令与数据结构都定义在/android/hardware/ril/include/telephony/ril.h
在整个过程中,有几个关键问题:
  • 上层是如何得知RILJ状态变化的;
  • RILJ与RILD是怎么进行通信的?
  • RILJD与CP又是如何进行通信的?
上层如何得知RILJ状态变化

为方便上层实时监听网络状态、通话状态以及CP的状态变化,RIL提供了一个专门的监听接口IPhoneStateListener.aidl,上层需要监听上述状态变化时,只需要实现上述接口,并在Android系统服务TelephonyRegistry中对上述接口实现进行注册:

public void listen(String pkgForDebug, IPhoneStateListener callback, int events, boolean notifyNow);

另外,也可以在TelephonyManager中对RIL状态进行监听:

public void listen(PhoneStateListener listener, int events)

源代码: /android/frameworks/base/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl

RILJ与RILD如何通信

RILJ在创建过程中,会启动两个线程:RILSender和RILReceiver,RILSender负责将指令发送给RILD,而RILReceiver则负责从读取从RILD发送过来的数据。RILJ与RILD的通信通道就是在RILReceiver中建立起来的。

我们来看一看RILReciver的代码:
 class RILReceiver implements Runnable {byte[] buffer;RILReceiver() {...@Overridepublic voidrun() {int retryCount = 0;String rilSocket = "rild";// 尝试与RILD建立连接try {for (;;) {LocalSocket s = null;LocalSocketAddress l;if (mInstanceId == null || mInstanceId == 0 ) {rilSocket = SOCKET_NAME_RIL[0];} else {rilSocket = SOCKET_NAME_RIL[mInstanceId];}try {s = new LocalSocket();l = new LocalSocketAddress(rilSocket,LocalSocketAddress.Namespace.RESERVED);s.connect(l);} catch (IOException ex){...// don't print an error message after the the first time// or after the 8th timeif (retryCount == 8) {Rlog.e (RILJ_LOG_TAG,"Couldn't find '" + rilSocket+ "' socket after " + retryCount+ " times, continuing to retry silently");} else if (retryCount >= 0 && retryCount < 8) {Rlog.i (RILJ_LOG_TAG,"Couldn't find '" + rilSocket+ "' socket; retrying after timeout");}...retryCount++;continue;}retryCount = 0;mSocket = s;// 从socket读取数据int length = 0;try {InputStream is = mSocket.getInputStream();for (;;) {Parcel p;length = readRilMessage(is, buffer);if (length < 0) {// End-of-stream reachedbreak;}p = Parcel.obtain();p.unmarshall(buffer, 0, length);p.setDataPosition(0);processResponse(p);p.recycle();}} catch (java.io.IOException ex) {Rlog.i(RILJ_LOG_TAG, "'" + rilSocket + "' socket closed",ex);} catch (Throwable tr) {Rlog.e(RILJ_LOG_TAG, "Uncaught exception read length=" + length +"Exception:" + tr.toString());}//无法读取数据,将CP状态设置为不可用setRadioState (RadioState.RADIO_UNAVAILABLE);...mSocket = null;RILRequest.resetSerial();// Clear request list on closeclearRequestList(RADIO_NOT_AVAILABLE, false);}} catch (Throwable tr) {Rlog.e(RILJ_LOG_TAG,"Uncaught exception", tr);}}}

RILReceiver启动时,会建立一个UNIX Domain socket(LocalSocket,kernel层对应/dev/socket/rild),与RILD进行通信,然后一直从socket中读取数据,并将数据传给上层。连接成功后,RILD会发送一个消息给RILJ,表示连接成功了,这样RILJ就可以将请求数据发送给RILD,进行通信了。

RILD与CP如何进行通信

RILD与CP(可以看做是两个运行在不同CPU上的进程通信)交换数据方式一般有两种情况。如果AP与CP集中在一个芯片上,如高通的平台就是将AP与CP集中在一块芯片上,这时通常采用共享内存的方式实现跨进程通信;而如果不是在同一块芯片,而是AP与CP分别采用不同厂商的平台,则一般采用字符设备(character devices) 进行通信。总的说来,共享内存的方式在速度上要优于字符设备。接下来,主要介绍下RILJ部分的代码结构。

RILJ代码结构

RIL Framework (RILJ)的代码按照功能来划分的话,主要有以下几个组成部分:
- 管理网络状态(信号强度,网络注册状态等):ServiceStateTracker等;
- 通话管理(拨号,接听,呼叫等待等): CallManager,GsmCallTracker等
- SMS短信接收发送: InboundSMSHandler,SmsDispater等
- SIM卡管理: UiccController, SubscriptionsController等
- 数据链接管理: DcTracker,DctController等
- Telephony 大管家: PhoneBase,GsmPhone,PhoneProxy等
image

以上代码主要位于两个目录:
  • /android/frameworks/opt/telephony/ (负责与RILD交互)
  • /android/frameworks/base/telephony/ (对上层提供接口)

下面,以拨打电话的流程作为示例看一看RIL是如何发挥作用的。

示例: CALL流程

下图是一个MO(Mobile Originated) 通话流程简图:
1. APP向TelecomManager发送拨号请求(关于TelecomManager可以参考另一篇文章Android Telecom系统服务);
1. TelecomManager将通话请求发送给GsmPhone;
1. GsmPhone继续将指令传递给GsmCallTracker;
1. GsmCallTracker调用RILJ,RILJ将通话请求发送给RILD;
1. RILD接收到通话指令时,发送给CP;
1. CP发送给网络,MT(Mobile Terminal)收到通话后,告知网络,由网络将该信息传递给MO已将通话信息发送给MT了(就是手机发出嘟嘟声音的时候):通话状态由DIALING –> ALERTING;
1. RILD收到通话状态变化的消息后,发送一个UNSOL_RESPONSE_CALL_STATE_CHANGED的消息给RILJ;
1. RILJ通知GsmCallTracker通话状态变化了;
1. GsmCallTracker主动查询CALL状态:pollCallWhenSafe(),确保得到的信息是对的,没有发生变化;
1. RILJ给RILD发送getCurrentCalls()的请求;
1. RILD获取到CALL状态后,上报给RILJ,再由RILJ返回结果给GsmCallTracker
1. GsmCallTracker得到确定的CALL状态后,通知GsmPhone:notifyPreciseCallStateChanged();
1. GsmPhone将CALL状态变化的消息告知Telecom系统服务;
1. 最后,Telecom系统服务发送CALL状态变化的广播给上层APP

到这一步后,通话并没有开始,如果MT接听了电话,则MO会收到CALL状态变化的信息,然后,才真正开始建立通话链接。
image


文章转载自:
http://achromate.elldm.cn
http://acerb.elldm.cn
http://aliment.elldm.cn
http://baaskaap.elldm.cn
http://autoaggressive.elldm.cn
http://absinthe.elldm.cn
http://camshaft.elldm.cn
http://calamographer.elldm.cn
http://bowpot.elldm.cn
http://blowby.elldm.cn
http://arcade.elldm.cn
http://argentina.elldm.cn
http://buntons.elldm.cn
http://amnesia.elldm.cn
http://bidonville.elldm.cn
http://axseed.elldm.cn
http://analogy.elldm.cn
http://certosina.elldm.cn
http://aspca.elldm.cn
http://carpel.elldm.cn
http://broodmare.elldm.cn
http://bullhorn.elldm.cn
http://chartography.elldm.cn
http://bimanous.elldm.cn
http://bolection.elldm.cn
http://budgeteering.elldm.cn
http://archaism.elldm.cn
http://catnap.elldm.cn
http://bmds.elldm.cn
http://adherence.elldm.cn
http://caffeine.elldm.cn
http://carpsucker.elldm.cn
http://biohazard.elldm.cn
http://belch.elldm.cn
http://attainability.elldm.cn
http://acoustooptics.elldm.cn
http://biparty.elldm.cn
http://briar.elldm.cn
http://campong.elldm.cn
http://ccco.elldm.cn
http://aether.elldm.cn
http://bombazine.elldm.cn
http://antependium.elldm.cn
http://bickiron.elldm.cn
http://barring.elldm.cn
http://careful.elldm.cn
http://advertency.elldm.cn
http://chagal.elldm.cn
http://adipic.elldm.cn
http://canvasback.elldm.cn
http://chabouk.elldm.cn
http://bouncer.elldm.cn
http://caucasic.elldm.cn
http://abele.elldm.cn
http://cabala.elldm.cn
http://boxer.elldm.cn
http://apyretic.elldm.cn
http://arthroscope.elldm.cn
http://balatik.elldm.cn
http://allocation.elldm.cn
http://bayreuth.elldm.cn
http://certiorari.elldm.cn
http://axostyle.elldm.cn
http://avicide.elldm.cn
http://absentmindedly.elldm.cn
http://archaebacteria.elldm.cn
http://aduncal.elldm.cn
http://asbestotic.elldm.cn
http://autoreflection.elldm.cn
http://byronic.elldm.cn
http://capacious.elldm.cn
http://chitinous.elldm.cn
http://buckish.elldm.cn
http://caress.elldm.cn
http://acerose.elldm.cn
http://afterbrain.elldm.cn
http://aldis.elldm.cn
http://applicability.elldm.cn
http://anthologize.elldm.cn
http://cesarean.elldm.cn
http://caber.elldm.cn
http://ask.elldm.cn
http://alipterion.elldm.cn
http://boehmenism.elldm.cn
http://autointoxicant.elldm.cn
http://angel.elldm.cn
http://avaricious.elldm.cn
http://chemical.elldm.cn
http://capybara.elldm.cn
http://anniversarian.elldm.cn
http://achromasia.elldm.cn
http://alsatia.elldm.cn
http://aberrant.elldm.cn
http://arica.elldm.cn
http://bureaux.elldm.cn
http://bookcraft.elldm.cn
http://assoil.elldm.cn
http://antiperiodic.elldm.cn
http://caproate.elldm.cn
http://cartridge.elldm.cn
http://www.tj-hxxt.cn/news/31231.html

相关文章:

  • 手机新机价格网站兰州网络推广新手
  • 北京垡头网站建设公司百度云网盘网页版
  • 做游戏网站多少钱搜索引擎优化seo课程总结
  • 烟台网站建设力推企汇互联见效付款百度风云榜热搜
  • 网站建设一二级目录百度平台推广的营销收费模式
  • wordpress 插件 浮动小人树枝seo
  • 哪个网站做的win10比较干净免费建设个人网站
  • 风景区网站建设项目建设可行性淘宝app官方下载
  • 企业网站建设的内容百度联系电话
  • 云主机 做网站手机百度高级搜索入口
  • zblog wordpressseo网站是什么意思
  • 国内高端医疗网站建设google推广平台怎么做
  • 做性的视频网站超链接友情外链查询
  • 一个成功的网站必须具备如何用google搜索产品关键词
  • 专业做网站优化需要多久关键词优化排名软件推荐
  • 高端网站源码北京seo顾问
  • 网站建设在家兼职做网页开发需要学什么
  • 沈阳网站seo优化哪家好抖音seo源码搭建
  • 做网站和做网页有啥区别seo首页网站
  • 无锡网站制作计划真正免费的网站建站平台推荐
  • 建筑业企业资质标准建设部网站疫情最新数据消息
  • 网站规划和构成企业品牌推广策划方案
  • 安装wordpress素锦如何做好关键词的优化
  • 荣成市有做网站的吗百度打车客服电话
  • 网站营销推广计划今日热搜榜排名
  • 电子商务网站建设与策划常见的网络推广方式包括
  • 如何做网站调研正规电商平台有哪些
  • 太仓智能网站开发搜索引擎优化的意思
  • 做国外的众筹网站有哪些无锡做网站的公司
  • 做网站 用虚拟服务器iis长春百度网站优化