声明: 以下枚举值基于Android Api 30

NetworkCapabilities这个类取代了旧版的TYPE_MOBILE网络选择,当一个更快没有风险的网络出现,且一个应用需要这个网络时,就切换到该网络,而不是继续连接WIFI;类似的,当一个应用需要批量上传文件,需要不计量网络的时候,应该切换到wifi传输。

1.网络能力枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// 该网络能连接到运营商MMSC服务器,可以用来接收和发送彩信
NET_CAPABILITY_MMS = 0,

// 该网络能连接到运营商SUPL服务器,用户可以接收到GPS信息
NET_CAPABILITY_SUPL = 1,

// 该网络能连接到运营商的DUN服务器或者以太网网关
NET_CAPABILITY_DUN = 2,

// 该网络能连接到运营商的FOTA服务器,专门用于OTA升级
NET_CAPABILITY_FOTA = 3,

// 该网络能连接到运营商的IMS服务器,用于网络注册和信令
NET_CAPABILITY_IMS = 4,

// 该网络能连接到运营商的CBS服务器,用于运营商特定的服务
NET_CAPABILITY_CBS = 5,

// 该网络能到达WIFI直连
NET_CAPABILITY_WIFI_P2P = 6,

// 该网络能连接到运营商的初始连接服务器
NET_CAPABILITY_IA = 7,

// 表示这是一个能够连接运营商的RCS服务器的网络,用于富通信服务。
NET_CAPABILITY_RCS = 8,

// 表示这是一个能够连接到运营商的XCAP服务器的网络,用于配置和控制。
NET_CAPABILITY_XCAP = 9,

// 表示这是一个能够到达运营商的紧急IMS服务器或其他服务的网络,用于紧急呼叫期间的网络信令。
NET_CAPABILITY_EIMS = 10,

// 表示此网络未定义
NET_CAPABILITY_NOT_METERED = 11,

// 表示此网络应能够访问互联网。
NET_CAPABILITY_INTERNET = 12,

// 表示此网络可用于一般用途
NET_CAPABILITY_NOT_RESTRICTED = 13,

// 表示用户已指示此网络的隐式信任
NET_CAPABILITY_TRUSTED = 14,

// 表示该网络不是VPN
NET_CAPABILITY_NOT_VPN = 15,

// 表示此网络上的连接已成功验证
NET_CAPABILITY_VALIDATED = 16,

// 表示该网络在上次探测时被发现有一个强制门户
NET_CAPABILITY_CAPTIVE_PORTAL = 17,

// 表示该网络不是漫游,Android 10新加
NET_CAPABILITY_NOT_ROAMING = 18,

// 此网络可供应用程序使用,而不是后台网络,以便于快速网络切换的网络
NET_CAPABILITY_FOREGROUND = 19,

// 表示该网络不是拥堵的。如果网络处于拥堵状态,应用应该将请求网络的行为延后一段时间,例如上报采集信息。
NET_CAPABILITY_NOT_CONGESTED = 20,

// 表示该网络当前没有挂起。
// 网络被挂起:IP地址和链接都是有效的,但是暂时不能传数据,例如进入隧道,蜂窝网络暂时进入暂时丢失状态。这种网络不会被挂起,仍然可以传输数据。
NET_CAPABILITY_NOT_SUSPENDED = 21,

// 表示通过此网络的流量由oem支付。例如,这个网络可以被系统应用程序用来上传遥测数据。
NET_CAPABILITY_OEM_PAID = 22,

// 表示这是一个能够访问运营商的关键任务服务器的网络。
NET_CAPABILITY_MCX = 23,

// 表示该网络用于测试,仅仅提供部分连接功能
NET_CAPABILITY_PARTIAL_CONNECTIVITY = 24,

// 此功能将为通常已计量但当前未计量的网络设置,例如,因为用户位于特定区域。此功能可以随时更改。当它被删除时,应用程序负责停止任何不应该在按流量计费的网络上发生的数据传输。
NET_CAPABILITY_TEMPORARILY_NOT_METERED = 25

2.网络传输类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 表示该网络使用蜂窝流量传输
TRANSPORT_CELLULAR = 0,

// 该网络使用wifi传输
TRANSPORT_WIFI = 1,

// 该网络使用蓝牙传输
TRANSPORT_BLUETOOTH = 2,

// 该网络使用以太网传输
TRANSPORT_ETHERNET = 3,

// 该网络使用VPN传输
TRANSPORT_VPN = 4,

// 该网络使用WIFI-AWARE传输
TRANSPORT_WIFI_AWARE = 5,

// 该网络使用LoWPAN传输
TRANSPORT_LOWPAN = 6,

// 测试虚拟网络接口
TRANSPORT_TEST = 7,

3.Apn参数组成

例:移动apn,把所有的属性都放在一起如下

apn carrier=”中国移动彩信 (China Mobile)”
mcc=”460”
mnc=”00”
apn=”cmwap”
proxy=”10.0.0.172”
port=”80”
mmsc=”http://mmsc.monternet.com”
mmsproxy=”10.0.0.172”
mmsport=”80”
user=”mms”
password=”mms”
type=”mms”
authtype=”1”
protocol=”IPV4V6”

其对应的属性定义如下:

Carrier:apn的名字,可为空,只用来显示apn列表中此apn的显示名字。
Mcc:由三位数组成。 用于识别移动用户的所在国家;
Mnc:由两位或三位组成。 用于识别移动用户的归属PLMN。 MNC的长度(两位或三位数)取决于MCC的值。
Apn:APN网络标识(接入点名称),是APN参数中的必选组成部分。此标识由运营商分配。
Proxy:代理服务器的地址
Port:代理服务器的端口号
Mmsc:MMS中继服务器/多媒体消息业务中心,是彩信的交换服务器。
Mmsproxy:彩信代理服务器的地址
Mmsport:彩信代理服务器的端口号
Protocol:支持的协议,不配置默认为IPV4。
User:用户
Password:密码
Authtype:apn的认证协议,PAP为口令认证协议,是二次握手机制。CHAP是质询握手认证协议,是三次握手机制。

None 0
PAP 1
CHAP 2
PAP or CHAP 3

Type: apn的接入点类型

Default 默认网络连接
Mms 彩信专用连接,此连接与default类似,用于与载体的多媒体信息服务器对话的应用程序
Supl 是Secure User Plane Location“安全用户面定位”的简写,此连接与default类似,用于帮助定位设备与载体的安全用户面定位服务器对话的应用程序
Dun Dial Up Networking拨号网络的简称,此连接与default连接类似,用于执行一个拨号网络网桥,使载体能知道拨号网络流量的应用程序
Hipri 高优先级网络,与default类似,但路由设置不同。只有当进程访问移动DNS服务器,并明确要求使用requestRouteToHost(int, int)才会使用此连接

注意:此表中的数据连接优先级是由低到高,即default数据连接的优先级最低,而hipri数据连接的优先级最高。比如:手机上网聊天,建立的是default数据连接。如果此时接到一条彩信,由于彩信的数据连接是mms,优先级比default高,所以会先断开default数据连接,建立mms数据连接,让手机先收到彩信。所以收发彩信的同时不能上网。(单条pdp连接的情况)

注:mnc的位数由mcc决定。比如,墨西哥334020,此国家的mnc为020,mccmnc的值都固定在了SIM卡保存的IMSI中,配置apn参数时mnc不可简洁为20,否则apn列表中将读取不到此国家的334020运营商的参数。

4.原生网络方案

UICC框架初识

AsyncChannel的工作机制

StateMachine状态机初识

ConnectivityService框架初识

路由配置信息的获取

ServiceStateTracker网络状态的处理