调制解调器代码如何与Android代码进行通信

我想知道Android调制解调器代码如何调用/传递消息到Android应用层的高层次的想法。 假设我们以SMS为例。 如果networking发送短信和调制解调器(如高通C代码parsing)如何传输到Android应用层?

是否总是有一个JNI调用? 作为调制解调器和Android的界面? 你可以请与我们分享信息。 谢谢

在AOSP / CAF / CM源(Android开源项目,CodeAurora论坛,分别为Cyanogenmod)中的几乎所有的Android源代码库中,都会有C代码,叫做rild (Radio Interface Layer Daemon)。 这通常在源代码树的/hardware/ril中find。

这个守护进程从Android启动时开始运行,并创build一个名为/dev/socket/rild/dev/socket/rild-debug 。 将有一个来自Qualcomm的专有库,HTC,它在启动时在运行时dynamic加载。 这是专有的库,反过来,通信到无线电固件。 然后rild挂钩回专利图书馆。

rild层,通过前面提到的套接字,Android层(在源码树, frameworks/base/telephony/com/android/internal/telephony/RIL.java )是如何通信的。

在Java方面,它打开读/写套接字,同时build立意图并通过此套接字为广播/接收事件设置代理。

例如,一个来电,专有的库,调用由rild设置的callback挂钩。 rild将标准通用AT Hayes调制解调器命令写入到Java端的套接字中,它读取和解释调制解调器命令,并且从那里, CALL_STATE_RINGING广播CALL_STATE_RINGING ,其中Phone应用程序(在源程序packages/apps/Phone )已经注册了一个接收器并且启动了用户界面,这就是你如何接听电话。

另一个例子,拨打电话,你在Android上拨号,意图得到创build,而电话pipe理器( 这是所有的根 ,这里,不能记得我的头顶,认为它在frameworks/base/core/java源代码树中的某个地方)接收意图,将其转换为AT Hayes调制解调器命令序列,将其写入套接字,然后rild调用对专有库的callback,私有库依次委托给无线电固件。

最后一个例子是,发送文本消息,从Messaging (在packages/apps/Mms源代码树中find)应用程序,你input的文本被推入意图, PhoneManager接收意图,将文本转换为GSM编码, (IIRC),被写出到套接字, rild依次调用回到专有库,专有库转而委派给无线电固件,并且文本现在已经离开了手机的域并且处于airwaves某处… :)除了在Android本身内发送广播消息外,只要在AndroidManifest.xml中使用并指定了READ_PHONE_STATE权限即可。

反过来说,反过来说,当接收到文本消息时,反过来,无线电固件接收一些字节,专有库调用对rild的callback,从而将字节写出到套接字。 在Java方面,它从中读取,并解码字节序列,如我们所知,将其转换为文本,用接收到消息的通知触发广播。 消息收发应用程序又为所述广播注册了接收者,并向通知栏发送一个意图,如“ 从+ xxxxxx收到新消息

意图可以在frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java

这就是电话系统如何工作,真正的美妙之处,它使用通用的AT Hayes调制解调器命令,从而简化和隐藏真正的专有机制。

对于高通,macros达电等公司而言,由于无线电话层embedded在SoC(片上系统)电路中,所以忘记了这个问题:

另外,为了方便起见,为什么闪存无线固件有些危险,有些手机提供这种function,闪动错误的固件(如不兼容或不适合手机),亲吻手机,并使用作为门挡或纸张重量! 🙂

应该指出,涉及的JNI机制是零。

这是从我的理解,它是如何工作的,从我可以告诉的是,无线电固件被加载到一个内存地址的地方空间的Linux内核已经保留的地址空间,并没有触摸它,就像在旧PC当DOS启动的时候,有一些保留的地址被BIOS使用,我想在这里类似,标记为保留的地址被固件所占用,在这个固件中专有的无线电通信库与之通话 – 而且由于磁带库正在运行内核拥有的地址空间,拥有根权限的root,它可以“交谈”,如果你想用旧的BASIC方言偷窥和捅,我猜你不会离得太远标记在那里,通过写入一定的字节序列的地址,无线电固件的行为,就像有一个中断向量表…这里猜测它是如何工作的。 🙂

继续从t0mm13b的说明,在谈到智能手机的时候,想起对SMS /电话的3层操作。

RIL(用户级别)< – > AP < – > CP

AP:应用程序处理器(您的Android操作系统运行的位置,可以考虑运行在此处理器上的游戏,歌曲,video,相机等)

CP:蜂窝处理器(实际上处理呼入/呼出/短信的空中接口,与networking塔等交互)

现在让我们来说说在CP端​​收到的数据(可能是互联网数据/短信/电话)。 现在AP和CP之间有一定的逻辑通道。 所以CP会根据数据types将收到的数据推送到相应的通道。 这些数据将由AP接收。 AP会将这些数据发送回RIL / App。 RIL将解码这些数据(特别是通话/短信数据)。 基于此,通知用户关于短信/通话。