下发后,RIL就要发AT切换网络 原因分析 安卓系统问题,默认不支持LTE,需要修改安卓固件。
原因分析 Sim卡状态信息改变时,安卓上层没有监听到;非ril问题。
Android RIL 调试问题分析 ——数据频繁断开 1. 问题描述 2. 问题分析 2.1 RIL初分析 2.2 数据业务重试机制梳理和分析 2.3 网卡统计数据的分析 1. 问题描述 在使用SDX55模组和对应支持NSA/SA网络的RIL时,出现数据业务频繁断开重连现象,用户体验较差。 2. 问题分析 2.1 RIL初分析 从ril log中初步分析,可以得到数据频繁断开原因均一致,原因见以下log段: 07-31 15:06:42.594 D/DCT ( 1617): [0]Data // Wait a bit before trying the next APN, so that // we're not tying up the RIL . // It will set an additional "gsm.radioreset" property to tell // RIL
原因分析 模块注册状态广播后,安卓上层没有监听到;非ril问题。
在安卓如下目录下找到ServiceStateTracker.java文件做如下修改
RILD介绍 Android系统带的RIL机制,Android RIL提供了Android电话服务和无线电硬件之间的抽象层。 Android RIL在HAL(Hardware Abstract Layer)层(C++层)由三个部分组成: RILD是系统的守护进程,主要用于初始化LIBRIL以及启动厂商自定义的Vendor RIL ; LIBRIL被RILD初始化完成后,用于与Vendor RIL之间进行交互,负责接收、发送指令; Vendor RIL是第三方厂商自定义的一个库,用于向Modem发送指令或者接收来自LIBRIL或者 三者之间的关系图如下所示: 从这里可以看到,RILD在启动时,负责将LibRil以及Vendor RIL进行初始化,将相应的回调函数以及调用接口进行注册,LibRIL向vendor RIL提供了接口 RIL_Env,当Vendor有消息时,利用该回调返回;而Vendor RIL 同样提供了接口RIL_RadioFunctions,给LibRIl调用。
1 RIL(Radio Interface Layer) 简介 RIL是一款专门为嵌入式平台开发的无线通信模组(GSM/GPRS/CatM1/NB-Iot)管理软件。 它与其它大型框架(例如Android RIL、Wince RIL)不同的是,它被设计成应用于资源受限物联网终端设备(单片机+无线模组的方案),并提供物联网通信所需的基本功能,包含网络注册、连接管理、短信收发及 创建数量) RTOS及堆栈: RIL需要运行在两个任务中,每个任务的堆栈至少 256 Bytes 编译器:由于RIL使用了一些C99的特性(柔性数组、内联),所以编译器需要开启对C99的支持。 //创建RIL任务 ril_init(&adt, &cfg); //初始化RIL ril_use_device("EC21"); //选择模组型号 ril_open(); 更多详细的使用说明,请参考: http://moluo-tech.gitee.io/ril/#/ 来源:https://gitee.com/moluo-tech/ril 版权归原作者所有!
在初始化时使用dlopen打开librefrence_ril.so,从中取出并执行RIL_Init函数,得到RIL_RadioFunctions指针,通过RIL_register()函数注册到libril.so libril.so库中的RIL_Env接口注册到libreference-ril.so库,同时将libreference-ril.so库中的RIL_RadioFunctions接口注册到到libril.so }; 在hardware\ril\libril\ril.cpp中实现了RIL_Env的各个接口函数 1.RIL_onRequestComplete extern "C" void RIL_onRequestComplete reference-ril.c const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv) 接口 hardware\ril\libril\ril.cpp extern "C" void RIL_register (const RIL_RadioFunctions *callbacks) { int
这里,如果我们要计算第一个品种RIL1的lsmeans(最小二乘均值),我们需要: 即我们需要整体均值 + 品种RIL1的回归系数 + 地点的效应平均值 + 地点内区组效应品均值 + 品种RIL1和地点互作的效应品均值 手动计算RIL11的最小二乘均值 这里我们要计算RIL-11这个品种, 「整体均值」 coef = summary(m1)$coefficients coef["(Intercept)",1] 可以看到整体均值为 -11的效应值为:」 coef["RILRIL-11",1] ril11 = coef["RILRIL-11",1] RIL-11的效应值为4.2 「最后,RIL-11的最小二乘均值为:182.875 」 mu + loc + loc_rep + loc_ril11 + ril11 4. re2 = predict(m2,classify = "RIL")$pval %>% as.data.frame() head(re2) 这里用predict函数,计算RIL的lsmeans:
因此各个厂家的libreferece-ril.so不一样,这个动态库一般由modem制造商提供。 库libreference-ril.so放到device/rockchip/common/4g_modem/lib64/ 下面,重命名为libquectel-ril.so,并且在 将 PRODUCT_PROPERTY_OVERRIDES /libquectel-ril.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libquectel-ril.so 如下图 图片 修改vendor.rild.libpath 的目的是 Android 11的rild会从此property获取ril库路径,其代码如下图所示 图片 图片 这段代码的意思是,rild启动时,优先从-l的参数取ril库的路径,如果取不到,就从vendor.rild.libpath 取到这个ril库的路径之后,通过dlopen打开,并通过dlsym调用里面的函数。 此外,移远的ril库使用qmi方式拨号时,需要有/dev/cdc-wdm0节点。
.❞ 该数据有62个重组自交系(RIL),在4个地点进行试验,随机区组,每个地点2个重复,每个小区种植20株,随机选择5株的表型平均值作为观测值。 2. # lme4 m1 = lmer(height ~ RIL + (1|location:RIL) + (1|location) + (1|location:rep), data=dat) summary (m1) re1 = emmeans(m1,"RIL") %>% as.data.frame() head(re1) 这里, RIL作为固定因子 地点和品种互作,作为随机因子 地点内区组,作为随机因子 然后通过emmeans计算RIL的预测均值。 使用asreml包进行blue值计算 library(asreml) m2 = asreml(height ~ RIL, random = ~ location + location:RIL + location
(特定设置) rild.libpath=/system/lib/libhtc_ ro.ril.ecc.HTC-WWE=999 ro.ril.ecc.HTC-ELL=92,93,94 ro.ril.enable.a52 .HTC-ITA=1 ro.ril.enable.a53.HTC-ITA=1 ro.ril.enable.a52=0 ro.ril.enable.a53=1 ro.ril.vmail.23415=1571 ,BT ro.ril.hsdpa.category=8 (hsdpa全称High Speed Downlink Packet Access中文意思:高速下行分组接入,设置的数越大传输越快) ro.ril.htcmaskw1 .bitmask=429496 ro.ril.htcmaskw1=14449 ro.ril.def.agps.mode=2 (打开AGPS服务支持,可改为ro.ril.def.agps.mode=0 改后能省电但 GPS定位速度会变慢) ro.ril.gprsclass=12 (GPRS设置) # For HSDPA low throughput (HSDPA低输量) ro.ril.disable.power.collapse
.❞ 该数据有62个重组自交系(RIL),在4个地点进行试验,随机区组,每个地点2个重复,每个小区种植20株,随机选择5株的表型平均值作为观测值。 2. 使用asreml计算BLUE值(定义残差同质) library(asreml) m1 = asreml(height ~ RIL, random = ~ location + location:RIL 使用asreml计算BLUE值(定义残差异质) m2 = asreml(height ~ RIL, random = ~ location + location:RIL + location:rep,residual 计算最优模型的BLUE值 re2 = predict(m2,classify = "RIL")$pval %>% as.data.frame() head(re2) 7. 更复杂的模型:定义品种与地点互作异质 m3 = asreml(height ~ RIL, random = ~ location + at(location):RIL + location:rep,residual
Phone的继承关系与PhoneFactory(GsmCdmaPhone、ImsPhone、SipPhone) Phone进程的启动 Phone对象的初始化(DefaultPhoneNotifier和RIL Phone对象的数量 int numPhones = TelephonyManager.getDefault().getPhoneCount(); //创建networkMode、PhoneProxy、RIL sCommandsInterfaces[i] = new RIL(context, networkModes[i], cdmaSubscription, i); } ...... for (int i 回忆第2小节创建GsmCdmaPhone对象时 sPhoneNotifier = new DefaultPhoneNotifier(); sCommandsInterfaces[i] = new RIL PhoneConstants.PHONE_TYPE_GSM, TelephonyComponentFactory.getInstance()); 先初始化了DefaultPhoneNotifier和RIL
grep -Ril artful /etc/* 包含或排除搜索中的特定文件名称 使用grep命令也可以只包含特定的文件作为搜索的一部分。 下一个例子将在/etc目录下找到包含字符串bash的扩展名为.conf的所有文件: grep -Ril bash /etc/*.conf 或者 grep -Ril --include=\*.conf bash /etc/* 同样,使用--exclude选项,我们可以排除任何特定的文件名: grep -Ril --exclude=\*.conf bash /etc/* 从搜索中排除特定的目录 与文件一样,grep
access mode to ‘read and write (rw)’ using command: remount rw Example: #remount rw #cp /sdcard/libsec-ril.so remount ro mv Move file or directory Syntax: mv [options] source dest Example: #mv /system/lib/libsec-ril.so directory permission Syntax: chmod [-R] mode[,mode] …. file Example: #chmod 0644 /system/lib/libsec-ril.so rm Remove file or directory Syntax: rm [options] file Example: #rm /system/lib/libsec-ril.so 4.
strcmp(tag, "HTC_RIL") || (!strncmp(tag, "RIL", 3)) || (!
管理、SIM 卡和搜网模块,以及获取 RIL Adapter 服务。 RIL Adapter通信代码目录 12\ 3.2.2.3 Answer事件在core_servicel中的处理这部分的代码会调用 core 对应的 Answer 函数,消息就会传递到负责核心服务与 RIL Adapter 通信交互的 tel_ril 3.2.2.4 Answer事件在ril_adapter中的处理从目前的代码调用来看有可能是从 vendor 调用 hril_hdf 的 dispatch,然后传递消息到 ril_adapter 中下边为 char vendorLibPath[PARAMETER_ZISE] = {0}; 5\. // Pointer to ril init function in vendor ril 6\
案例演示 参考我的另外一个项目RIL(Radio Interface Layer) 使用步骤 1.定义AT控制器、通信适配器接口(包含URC回调函数表,接口缓冲区URC) static at_obj_t socket_send_handler(at_work_ctx_t *e) { struct socket_info *i = (struct socket_info *)e->params; struct ril_sock - socket * @param[in] buf - 数据缓冲区 * @param[in] len - 缓冲区长度 */ static bool hl8518_sock_send(ril_obj_t *r, struct ril_sock *s, const void *buf, unsigned int len) { struct socket_info
现在我们从理论上进行讨论,安卓包含了不同的层,其中一层是RIL,也就是无线接口层(Radio Interface Layer)。 为了避免纠结太多细节,我不会花力气描述与rild守护进程或者Vendor RIL通信的RIL Java子层。 那些命令可以让应用通过RIL进行调用,也可以用于RIL传输给modem,它们根据制造商modem固件的限制,会有许多不同。当然,许多制造商也为他们自己的modem制定了自定义的命令。