【笔记】APN 配置参数 bitmask 数据转换(Android KaiOS)

一、参数说明

(一)APN配置结构对比

平台AndroidKaiOS
文件类型xmljson
结构每个<apn>标签是一条APN,包含完成的信息层级数组结构,使用JSON格式的数据。最外层是mcc,其次mnc,最后APN用数组形式配置(每个APN都是一个对象,不含mccmnc属性)。
Android: apns-conf.xml
<!-- Android: apns-conf.xml -->
<?xml version="1.0" encoding="utf-8"?>
<apns version="8"><apn carrier="T-Mobile US" mcc="001" mnc="01" apn="fast.t-mobile.com" user="" password="" server="" proxy="" port="" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" mmsproxy="" mmsport="" type="default,mms,supl,hipri,xcap,rcs" protocol="IPV6" roaming_protocol="IP" bearer_bitmask="" mvno_type="ecid" mvno_match_data="[4]4310260" class="" user_visible="true" user_editable="true" authtype="0"/>
</apns>
KaiOS: apns.json

特别需要注意格式(很容易出错),数组最后不用加逗号,注意大/中括号的首位一致性。

{
"202": {"10": [{"carrier":"Wind Internet","apn":"gint.b-online.gr","type":["default","supl"]},{"voicemail":"122","type":["operatorvariant"]},{"carrier":"Wind MMS","apn":"mnet.b-online.gr","mmsc":"http://192.168.200.95/servlets/mms","mmsproxy":"192.168.200.11","mmsport":"9401","type":["mms"]}],"01": [{"carrier":"Cosmote Wireless Internet","apn":"","type":["ia"]},{"voicemail":"123","type":["operatorvariant"]},{"carrier":"Cosmote Wireless Internet","apn":"internet","type":["default","supl"]},{"carrier":"Cosmote Mms","apn":"mms","mmsc":"http://mmsc.cosmote.gr:8002","mmsproxy":"10.10.10.20","mmsport":"8080","type":["mms"]}],"09": [{"carrier":"Q Internet","apn":"myq","type":["default","supl"]},{"voicemail":"122","type":["operatorvariant"]},{"carrier":"Q-Telecom MMS GPRS","apn":"q-mms.myq.gr","mmsc":"http://mms.myq.gr","mmsproxy":"192.168.80.134","mmsport":"8080","type":["mms"]}]
},
"001": {"01": [{"carrier":"Testing SIM default","apn":"test","type":["default"],"protocol":"IPV4V6","roaming_protocol":"IPV4V6","user_visible":"true"},{"carrier":"IMS","apn":"ims","type":["ims"],"protocol":"IPV4V6","roaming_protocol":"IPV4V6","user_visible":"true"},{"carrier":"XCAP","apn":"xcap","type":["xcap"],"protocol":"IPV4V6","roaming_protocol":"IPV4V6","user_visible":"true","authtype":"0"}]
}
}

(二)bearer配置值对比

  • 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20 (The original bearer value in Android,位运算)
  • 1048575(The original bearer value in KaiOS using decimalism)

二、代码解析

(一)Android

待完善

(二)KaiOS(DataCallManager.jsm)

1、bitmask的进制转换

可以参考PDN建立逻辑,gecko/dom/system/gonk/radio/DataCallManager.jsm

//DataCallManager.jsm//检查对应的rat是否包含在此APN bearer 配置中
// Check rat value include in the bit map or not.
function bitmaskHasTech(aBearerBitmask, aRadioTech) {if (aBearerBitmask == 0) {return true;} else if (aRadioTech > 0) {return (aBearerBitmask & (1 << (aRadioTech - 1))) != 0;}return false;
}//bearer十进制转成二进制
// Show the detail rat type.
function bitmaskToString(aBearerBitmask) {if (aBearerBitmask == 0 || aBearerBitmask === undefined) {return 0;}let val = "";for (let i = 1; i < RIL.GECKO_RADIO_TECH.length; i++) {if ((aBearerBitmask & (1 << (i - 1))) != 0) {val = val.concat(i + "|");}}return val;
}function bearerBitmapHasCdma(aBearerBitmask) {return (RIL_RADIO_CDMA_TECHNOLOGY_BITMASK & aBearerBitmask) != 0;
}

bitmaskToString接口中,将bitmask转化成String时,循环RIL.GECKO_RADIO_TECH的长度次,经过位运算转换成与Android原始配置的bearer_bitmask相同格式的bearer位符,用“|”间隔rat类型位。

是如何通过RIL调用ril_consts.js内的GECKO_RADIO_TECH?

DataCallManager.jsm 中定义RIL对象,并使用XPCOMUtils.defineLazyGetter()方法来实现懒加载,即在要使用时才加载和初始化对象(只有在第一次访问该对象时才会进行初始化和加载),避免不必要的性能开销和资源浪费。
RIL对象是通过ChromeUtils.import 方法从ril_consts.js文件中导入的,该对象由ril_consts.js文件中的代码创建和初始化的。

//DataCallManaer.jsm"use strict";//XPCOM 是一个用于 实现跨语言组件的技术框架。
//导入XPCOMUtils对象(工具库),简化和封装XPCOM组件的开发和使用。
//使用常量const来定义 XPCOMUtils 对象,以确保在运行时不会发生对象被重新赋值的情况。
const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"
);//定义RIL对象,后续调用 RIL.GECKO_RADIO_TECH
XPCOMUtils.defineLazyGetter(this, "RIL", function() {return ChromeUtils.import("resource://gre/modules/ril_consts.js");
});//ref RIL.GECKO_RADIO_TECH
const TCP_BUFFER_SIZES = [null,"4092,8760,48000,4096,8760,48000", // gprs"4093,26280,70800,4096,16384,70800", // edge"58254,349525,1048576,58254,349525,1048576", // umts"16384,32768,131072,4096,16384,102400", // is95a = 1xrtt"16384,32768,131072,4096,16384,102400", // is95b = 1xrtt"16384,32768,131072,4096,16384,102400", // 1xrtt"4094,87380,262144,4096,16384,262144", // evdo0"4094,87380,262144,4096,16384,262144", // evdoa"61167,367002,1101005,8738,52429,262114", // hsdpa"40778,244668,734003,16777,100663,301990", // hsupa = hspa"40778,244668,734003,16777,100663,301990", // hspa"4094,87380,262144,4096,16384,262144", // evdob"131072,262144,1048576,4096,16384,524288", // ehrpd"524288,1048576,2097152,262144,524288,1048576", // lte"122334,734003,2202010,32040,192239,576717", // hspa+"4096,87380,110208,4096,16384,110208", // gsm (using default value)"4096,87380,110208,4096,16384,110208", // tdscdma (using default value)"122334,734003,2202010,32040,192239,576717", // iwlan"122334,734003,2202010,32040,192239,576717", // ca
];//定义了一个常量RIL_RADIO_CDMA_TECHNOLOGY_BITMASK,用于表示CDMA射频技术类型的掩码值。
//RIL.GECKO_RADIO_TECH.indexOf 查找各个CDMA技术类型在GECKO_RADIO_TECH数组中的下标值,
//-1 的目的是得到对应的掩码位数,并将此转换成掩码值,
//使用按位左移(<<)运算符得到掩码值,
//各个掩码值按位或(|)操作得到最终的掩码值。
const RIL_RADIO_CDMA_TECHNOLOGY_BITMASK =(1 << (RIL.GECKO_RADIO_TECH.indexOf("is95a") - 1)) |(1 << (RIL.GECKO_RADIO_TECH.indexOf("is95b") - 1)) |(1 << (RIL.GECKO_RADIO_TECH.indexOf("1xrtt") - 1)) |(1 << (RIL.GECKO_RADIO_TECH.indexOf("evdo0") - 1)) |(1 << (RIL.GECKO_RADIO_TECH.indexOf("evdoa") - 1)) |(1 << (RIL.GECKO_RADIO_TECH.indexOf("evdob") - 1)) |(1 << (RIL.GECKO_RADIO_TECH.indexOf("ehrpd") - 1));// set to true in ril_consts.js to see debug messages
var DEBUG = RIL_DEBUG.DEBUG_RIL;   //调试用的log打印标识符

如上代码,CDMA技术类型对应的掩码值RIL_RADIO_CDMA_TECHNO如下:

is95a: 1 << (5-1) = 0x10
is95b: 1 << (6-1) = 0x20
1xrtt: 1 << (7-1) = 0x40
evdo0: 1 << (8-1) = 0x80
evdoa: 1 << (9-1) = 0x100
evdob: 1 << (14-1) = 0x2000
ehrpd: 1 << (15-1) = 0x4000

2、GECKO_RADIO_TECH 定义网络制式 (ril_consts.js)

在KaiOS中,RIL.GECKO_RADIO_TECH数组是在Gecko内核的代码中定义的,其实现位于Gecko代码库的"gecko/dom/system/gonk/radio/ril_consts.js"文件中。该文件定义了一系列RIL层的常量,包括射频技术类型、消息ID等。在该文件中,可以找到以下代码片段,其中定义了RIL.GECKO_RADIO_TECH数组的元素和顺序:

//GECKO_RADIO_TECH 数组定义射频技术(网络连接)
this.GECKO_RADIO_TECH = [null,"gprs",     //1 GPRS"edge",     //2 EDGE"umts",     //3 UMTS"is95a",    //4 IS-95A"is95b",    //5 IS-95B"1xrtt",    //6 cdma1x?一种CDMA2000射频技术,是CDMAOne技术的升级版(1x Radio Transmission Technology)"evdo0",    //7 EVDO-0"evdoa",    //8 EVDO-A"hsdpa",    //9"hsupa",    //10"hspa",     //11"evdob",    //12 EVDO-B"ehrpd",    //13 EVDO-D"lte",      //14 LTE"hspa+",    //15 HSPA+"gsm",      //16 GSM"tdscdma",  //17 TD-SCDMA"iwlan",    //18 iWLAN(wifi)"lte_ca",   //19 LTE_CA
];//定义遵循的协议类型
this.GECKO_PROFILE_INFO_TYPE_COMMON = 0;
this.GECKO_PROFILE_INFO_TYPE_3GPP = 1;
this.GECKO_PROFILE_INFO_TYPE_3GPP2 = 2;
3、DataCall 对 rat 的使用案例
  dataRegistrationChanged(aRadioTech) {let targetBearer;if (this.apnSetting.bearer === undefined) {targetBearer = 0;} else {targetBearer = this.apnSetting.bearer;}if (DEBUG) {this.debug("dataRegistrationChanged: targetBearer: " +bitmaskToString(targetBearer));}if (bitmaskHasTech(targetBearer, aRadioTech)) {// Ignore same rat type. Let handler process the retry.} else {if (DEBUG) {this.debug("dataRegistrationChanged: current APN do not support this rat reset DC. APN:" +JSON.stringify(this.apnSetting));// Clean the requestedNetworkInterfaces due to current DC can not support this rat under DC retrying state.// Let handler process the retry.let targetRequestedNetworkInterfaces = this.requestedNetworkInterfaces.slice();for (let networkInterface of targetRequestedNetworkInterfaces) {this.disconnect(networkInterface);}}},

gecko/koost/telephony/TelephonyBinderService.h

// Cover the GECKO_RADIO_TECH to NETWORK_TYPE_*
int32_t convertRadioTech(const nsAString& rat);

三、日志分析

追溯在PDN建立过程中,读取apn配置的bearer参数到DataCall使用的radio类型的bearer值变化情况。

四、方案开发

相关介绍:KaiOS 新增APN信息字段的代码实现-CSDN博客

在 APN Editor中实现bearer显示

代码模块:gaia/apps/settings/js/panels/apn_editor/apn_editor.js

/*** The apn editor module*/
'use strict';
define(function(require) { //eslint-disable-lineconst ApnEditorConst = require('panels/apn_editor_tct/apn_editor_const');const ApnEditorSession = require('panels/apn_editor_tct/apn_editor_session');const ApnUtils = require('modules/apn_tct/apn_utils');//以下三个常量都是从ApnEditorConst模块中导入的const { APN_PROPERTIES } = ApnEditorConst;const { APN_PROPERTY_DEFAULTS } = ApnEditorConst;const { VALUE_CONVERTERS } = ApnEditorConst;return function apnEditor(rootElement) {return new ApnEditor(rootElement);};
});
将kaios中十进制的bearer转换同Android原始配置的bitmask

测试代码

// 功能:将十进制bearer转换成1-20字符串(同Android)
function bitmaskToString(aBearerBitmask) {if (aBearerBitmask == 0 || aBearerBitmask === undefined) {return 0;}let val = "";for (let i = 1; i < 20; i++) {if ((aBearerBitmask & (1 << (i - 1))) != 0) {val = val.concat(i + "|");}}return val;
}//常量数组,定义rat
const GECKO_RADIO_TECH = [null,"gprs","edge","umts","is95a","is95b","1xrtt","evdo0","evdoa","hsdpa","hsupa","hspa","evdob","ehrpd","lte","hspa+","gsm","tdscdma","iwlan","lte_ca",
];//将1-20的bitmask转换成对应的网络制式
function bitmaskToRatString(aBitmask) {if (aBitmask == 0 || aBitmask === undefined) {return "unspecified";}let rat = "";let splitResult = aBitmask.split("|");console.log('splitResult = '+ splitResult);rat = splitResult.map(x => GECKO_RADIO_TECH[x]).join(",").slice(0,-1);//slice(startIndex,endIndex) 用于去掉最后一个逗号return rat;
}// 测试代码
let apnBearer = '312312';  //apn.json原始配置值
let targetBearer;  //1-20转换目标值
let bearerString = '';if (apnBearer === undefined) {targetBearer = 0;
} else {targetBearer = apnBearer;
}bearerString = bitmaskToString(targetBearer);// 输出结果
console.log('targetBearer = ' + targetBearer);
console.log('bearerString = '+ bearerString);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现-通达OA】通达OA video_file.php 任意文件下载漏洞

一、漏洞简介 通达OA video_file.php文件存在任意文件下载漏洞&#xff0c;攻击者通过漏洞可以读取服务器敏感文件。 二、影响版本 ● 通达OA2011 三、资产测绘 ● hunterapp.name"通达 OA" ● 特征 四、漏洞复现 GET /general/mytable/intel_view/video_file.…

Javaweb之SpringBootWeb案例之切入点表达式的详细解析

3.3 切入点表达式 从AOP的入门程序到现在&#xff0c;我们一直都在使用切入点表达式来描述切入点。下面我们就来详细的介绍一下切入点表达式的具体写法。 切入点表达式&#xff1a; 描述切入点方法的一种表达式 作用&#xff1a;主要用来决定项目中的哪些方法需要加入通知 …

带Alpha通道的TIFF文件在GeoServer发布PNG瓦片失败的问题

我在使用GeoServer发布Tiff切PNG瓦片切不了&#xff0c;但是JPG可以&#xff0c;用QGIS转坐标系之后可以&#xff0c;但是用ArcGIS转坐标系之后不可以&#xff0c;看GeoServer日志发现报错如下&#xff1a; org.geowebcache.GeoWebCacheException: Problem communicating with…

浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用

摘要&#xff1a;本文分析了木材加工企业的特点、现状及常见电气火灾隐患&#xff0c;提出了消灭电气火灾隐患的措施。结尾介绍了木材加工企业常用电气设备的选用及电气火灾监控系统在其低压配电系统的应用方案及产品选型。 关键词&#xff1a;木材加工企业&#xff1b;电气火…

redis 异步队列

//produceMessage.ts 模拟生产者 import Redis from ioredis; const redis new Redis(); // 生产者&#xff1a;将消息推送到队列 async function produceMessage(queueName:string, message:string) {try {await redis.rpush(queueName, message);console.log(Produced messa…

19个Web前端交互式3D JavaScript框架和库

JavaScript &#xff08;JS&#xff09; 是一种轻量级的解释&#xff08;或即时编译&#xff09;编程语言&#xff0c;是世界上最流行的编程语言。JavaScript 是一种基于原型的多范式、单线程的动态语言&#xff0c;支持面向对象、命令式和声明式&#xff08;例如函数式编程&am…

从零开始手写mmo游戏从框架到爆炸(十六)— 客户端指定回调路由与登录

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 我们这次来把注册、登录、选择英雄&#xff0c;进入主页-选择地图的功能完善。 在这之前&#xff0c;我们还要解决一个问题&#xff0c;就是服务端往客户端发消息的路由问题…

《基于CEEMDAN-小波包分析的隧道爆破信号去噪方法》论文思路

相比于小波降噪&#xff0c;小波包分析具有更高的频率分辨率&#xff0c;可以进一步消除高频部分存在的噪声余量&#xff0c;提高去噪精度 依据EEMD 分解的取值范围&#xff0c;利用“试错法”得到本次试验中CEEMDAN分解的特征参数为&#xff1a;正负高斯白噪声标准差为0.2&a…

Java Web(六)--XML

介绍 官网&#xff1a;XML 教程 为什么需要&#xff1a; 需求 1 : 两个程序间进行数据通信&#xff1f;需求 2 : 给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去读取它应当监听的端口号、还有连接数据库的用户名和密码。spring 中的…

二叉树及其练习题

文章目录 树概念及结构树的概念树的相关概念树的表示形式树的应用 二叉树概念及结构概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的基本操作二叉树的遍历前中后序遍历递归实现二叉树的基本操作 二叉树相关oj题 树概念及结构 树的概念 树是一种非线性的数据结构&#…

c++:蓝桥杯中的基础算法1(枚举,双指针)

枚举 基础概念&#xff1a; 枚举&#xff08;Enum&#xff09;是一种用户定义的数据类型&#xff0c;用于定义一个有限集合的命名常量。在C中&#xff0c;枚举类型可以通过关键字enum来定义。 下面是一个简单的枚举类型的定义示例&#xff1a; #include <iostream>enum…

【面试题】谈谈MySQL的索引

索引是啥 可以把Mysql的索引看做是一本书的目录&#xff0c;当你需要快速查找某个章节在哪的时候&#xff0c;就可以利用目录&#xff0c;快速的得到某个章节的具体的页码。Mysql的索引就是为了提高查询的速度&#xff0c;但是降低了增删改的操作效率&#xff0c;也提高了空间…

医疗在线问诊小程序:开启数字化医疗新篇章

随着科技的飞速发展&#xff0c;医疗行业正逐步向数字化转型。其中&#xff0c;医疗在线问诊小程序作为一种新型的医疗健康服务模式&#xff0c;为人们提供了更为便捷、高效的医疗咨询服务。本文将探讨医疗在线问诊小程序的发展背景、优势及应用场景&#xff0c;以期为医疗行业…

【HarmonyOS应用开发】三方库(二十)

三方库的基本使用 一、如何获取三方库 目前提供了两种途径获取开源三方库&#xff1a; 通过访问Gitee网站开源社区获取 在Gitee中&#xff0c;搜索OpenHarmony-TPC仓库&#xff0c;在tpc_resource中对三方库进行了资源汇总&#xff0c;可以供开发者参考。 通过OpenHarmony三…

小程序--模板语法

一、插值{{}}语法 1、内容绑定 <view>{{iptValue}}</view> 2、属性绑定 <switch checked"{{true}}" /> Page({data: {iptValue: 123} }) 二、简易双向数据绑定 model:value&#xff1a;支持双向数据绑定 注&#xff1a;仅input和textarea支持&a…

【Algorithms 4】算法(第4版)学习笔记 09 - 3.2 二叉查找树

文章目录 前言参考目录学习笔记1&#xff1a;二叉树与二叉搜索树定义1.1&#xff1a;二叉树定义1.2&#xff1a;二叉搜索树定义1.3&#xff1a;Java定义1.4&#xff1a;BST基本实现1.5&#xff1a;BST demo 演示1.5.1&#xff1a;节点搜索成功命中演示1.5.2&#xff1a;节点搜索…

SpringBoot+WebSocket实现即时通讯(二)

前言 紧接着上文《SpringBootWebSocket实现即时通讯&#xff08;一&#xff09;》 本博客姊妹篇 SpringBootWebSocket实现即时通讯&#xff08;一&#xff09;SpringBootWebSocket实现即时通讯&#xff08;二&#xff09;SpringBootWebSocket实现即时通讯&#xff08;三&…

第3.1章:StarRocks数据导入——Insert into 同步模式

一、概述 在StarRocks中&#xff0c;insert的语法和mysql等数据库的语法类似&#xff0c;并且每次insert into操作都是一次完整的导入事务。 主要的 insertInto 命令包含以下两种&#xff1a; insert into tbl select ...insert into tbl (col1, col2, ...) values (1, 2, ...…

day02_java基础_变量_数据类型等

零、今日内容 1 HelloWorld程序 2 idea使用 3 变量 4 数据类型 5 String 一、复习 班规班纪。。。。。 安装jdk JDK 是开发工具 JRE 是运行代码 JDK包含JRE 配置环境变量 二、HelloWorld程序 前提&#xff1a;JDK已经安装配置完毕&#xff0c;有了这些环境就敲代码 代码…

Vue路由组件练习

Vue 路由组件练习 1. 演示效果 2. 代码分析 2.1. 安装 vue-router 命令&#xff1a;npm i vue-router 应用插件&#xff1a;Vue.use(VueRouter) 2.2. 创建路由文件 在 src 文件夹下&#xff0c;创建router文件夹&#xff0c;并在该文件夹创建index.js文件 2.3. 导入依赖…