Android中通过Socket直接与RILD进行通信
2015-08-11 14:42
531 查看
1 RIL_J与RIL_C通信
上层通常要和RILD通信,是通过Socket,在RIL_J***A层实现;沿着这样代码流程进行Framework——native:
Phone——RIL_J***A——>RIL_CPP
那么可不可以直接和RILD(RIL_CPP)进行通信呢?
肯定是可以的,因为通信使用的rild socket,只要通过这个socket就可以和RILD进行通信 ;
但实际中可靠的使用是不可行的,因为RILD在创建的时候,
设计初始化已经决定了RILD同时所支持的客户端的数量:
单卡仅支持一个客户端;
双卡实现方式代码提供了两种方式:
1)双卡两个RIL客户端对应一个RILD服务端,以标签SUB0和SUB1来区分,RILD中数据流程也对应两个实体;
2)一个RIL客户端对应一个RILD服务端,也就是双卡的话,就会有个多个RILD进程
因Phone进程的特殊性,常驻进程开机启动会和RILD建立连接,作为RILD客户端.
所以如果你通过socket与RILD建立连接,就会将原来的Phone与RILD的连接断开掉;
这样就可能会造成冲突,产生异常,除非你将自带的Phone删除掉;
通常第三方的拨号软件也都是在Phone的基础上实现的。
因为所有的上层代码都是通过Framework,再传递带C/C++层进行处理;
之前有一些做法是,从底层将需求发到上层,在通过上层正常的流程去调用,再传递到底层,
这本身就不是很合理的,但是却不得不这样做;
假如现在有这样一个需求,在不启动上层的情况下进行手机的功能测试,或者直接和RILD进行底层通信
比如网络通信功能,怎么做呢?
还得在底层C层直接通过socket与RILD层建立连接,进行通信;
下面就看看这个实现过程:
2 创建socket并连接
?
这里创建套接字是一个UNIX套接字,参数与网络套接字不同,
结构体用sockaddr_un,域参数应该是PF_LOCAL,通讯类型应该是SOCK_STREAM或SOCK_DGRAM
UNIX本地套接字可以参考下面文档:
http://zerocool60.blog.163.com/blog/static/35270508200772955536291/
3 向RILD发起连接
?
同样需要接收RILD传递来的消息,也需要按照这种格式进行,可以另起一个线程专门来负责接收RILD发送来的消息。
4 发送数据
?
看到RILD接收数据使用Parcel进行相关的解析,
因此数据发送的格式组织依然使用Parcel进行组织;
从上面可以看到数据读取和数据发送,都是先从数据长度开始,然后数据内容
这就是与RILD socket通信的数据格式,具体可以参考RILJ发送数据的格式。
与RILD socket通信的客户端限制权限只能为“Radio”,才可以与之进行通信。
这在RIL_CPP的listenCallback中有做限制。
但是这里如果将UID改为:setuid(AID_RADIO);时,
发现在创建socket时又会出错,不知如何解决,就纳闷了同样是radio权限为什么,
这里却不能打开rild socket。
仅仅是作为测试,于是使用include $(BUILD_EXECUTABLE)编译出来一个可执行文件
只能去更改RILD对于权限的要求。
在向rild发送了数据之后如果,程序立即就退出了,也会报相应的错误;
引起服务端报出:ECONNRESET 104错误 connection reset by peer对方复位连接;
所以要在函数中做一些延迟,不能立即结束程序运行。
在Android中使用Parcel类等某些类,需要在namespace android {}下才行。
namespace 是c++的一个标识符,表示定义一个全局空间。
android代码把整个android工程看作一个namespace。
所以要在同一个空间下才能引用。
5 实现代码片段
?
下面看几个具体的数据发送流程 和格式:
6 拨打电话
?
7 设置Radio状态
?
8 编译一个可执行二进制文件
生成到目录:/system/bin/sendAtadb push到手机/system/bin目录下,更改权限即可执行
?
相关文章推荐
- Android Universal Image Loader 源码分析(三)
- 关于Android Studio 和 Gradle的那些事儿
- Android 自定义标题栏
- Android Studio 快捷键
- 编译Android出错:Unable to execute dex: Java heap space
- android 自定义Dialog页面加载中效果的进度条 Dialog 边角 Dialog 棱角
- Android studio1.3.1 快捷键
- android inflater 用法
- android MediaPlayer API
- Android Studio 生成 ButterKnife 注入的插件
- android意图传递参数返回结果(六)
- 我的Android进阶之旅------>Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi")
- Android中Button设置drawablePadding没效果和设置selector后按下时没效果
- Android Universal Image Loader 源码分析(二)
- Android中自定义属性的格式详解
- android学习计划2
- Android使用SVG矢量创建很酷的动态效率!
- Android两种 旋转Bitmap方法
- 解决Android中的SQLite数据库并发访问
- 在android布局中使用include和merge标签