1e41f4b71Sopenharmony_ci# NetConnection开发指导 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci## 场景介绍 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ciNetConnection模块提供了常用网络信息查询的能力。 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## 接口说明 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ciNetConnection常用接口如下表所示,详细的接口说明请参考[NetConnection](../reference/apis-network-kit/_net_connection.md) 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci| 接口名 | 描述 | 13e41f4b71Sopenharmony_ci| -------- | -------- | 14e41f4b71Sopenharmony_ci| OH_NetConn_HasDefaultNet(int32_t \*hasDefaultNet) | 检查默认数据网络是否被激活,判断设备是否有网络连接,以便在应用程序中采取相应的措施。 | 15e41f4b71Sopenharmony_ci| OH_NetConn_GetDefaultNet(NetConn_NetHandle \*netHandle) | 获得默认激活的数据网络。 | 16e41f4b71Sopenharmony_ci| OH_NetConn_IsDefaultNetMetered(int32_t \*isMetered) | 检查当前网络上的数据流量使用是否被计量 | 17e41f4b71Sopenharmony_ci| OH_NetConn_GetConnectionProperties(NetConn_NetHandle \*netHandle, NetConn_ConnectionProperties *prop) | 获取netHandle对应的网络的连接信息。 | 18e41f4b71Sopenharmony_ci| OH_NetConn_GetNetCapabilities (NetConn_NetHandle \*netHandle, NetConn_NetCapabilities \*netCapacities) | 获取netHandle对应的网络的能力信息。 | 19e41f4b71Sopenharmony_ci| OH_NetConn_GetDefaultHttpProxy (NetConn_HttpProxy \*httpProxy) | 获取网络默认的代理配置信息。 如果设置了全局代理,则会返回全局代理配置信息。如果进程已经绑定到指定netHandle对应的网络,则返回网络句柄对应网络的代理配置信息。在其它情况下,将返回默认网络的代理配置信息。 | 20e41f4b71Sopenharmony_ci| OH_NetConn_GetAddrInfo (char \*host, char \*serv, struct addrinfo \*hint, struct addrinfo \*\*res, int32_t netId) | 通过netId获取DNS结果。 | 21e41f4b71Sopenharmony_ci| OH_NetConn_FreeDnsResult(struct addrinfo \*res) | 释放DNS结果内存。 | 22e41f4b71Sopenharmony_ci| OH_NetConn_GetAllNets(NetConn_NetHandleList \*netHandleList) | 获取所有处于连接状态的网络列表。 | 23e41f4b71Sopenharmony_ci| OHOS_NetConn_RegisterDnsResolver(OH_NetConn_CustomDnsResolver resolver) | 注册自定义dns解析器。<br/>**弃用:** 从API version 13开始废弃。<br/>**替代:** 推荐使用OH_NetConn_RegisterDnsResolver。| 24e41f4b71Sopenharmony_ci| OHOS_NetConn_UnregisterDnsResolver(void) | 去注册自定义dns解析器。<br/>**弃用:** 从API version 13开始废弃。<br/>**替代:** 推荐使用OH_NetConn_UnregisterDnsResolver。| 25e41f4b71Sopenharmony_ci| OH_NetConn_RegisterDnsResolver(OH_NetConn_CustomDnsResolver resolver) | 注册自定义dns解析器。 | 26e41f4b71Sopenharmony_ci| OH_NetConn_UnregisterDnsResolver(void) | 去注册自定义dns解析器。| 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci## 网络管理接口开发示例 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci### 开发步骤 31e41f4b71Sopenharmony_ci 32e41f4b71Sopenharmony_ci使用本文档涉及接口获取网络相关信息时,需先创建Native C++工程,在源文件中将相关接口封装,再在ArkTs层对封装的接口进行调用,使用hilog或者console.log等手段选择打印在控制台或者生成设备日志。 33e41f4b71Sopenharmony_ci 34e41f4b71Sopenharmony_ci本文以实现获取默认激活的数据网络为例,给出具体的开发指导。 35e41f4b71Sopenharmony_ci 36e41f4b71Sopenharmony_ci### 添加开发依赖 37e41f4b71Sopenharmony_ci 38e41f4b71Sopenharmony_ci**添加动态链接库** 39e41f4b71Sopenharmony_ci 40e41f4b71Sopenharmony_ciCMakeLists.txt中添加以下lib: 41e41f4b71Sopenharmony_ci 42e41f4b71Sopenharmony_ci```txt 43e41f4b71Sopenharmony_cilibace_napi.z.so 44e41f4b71Sopenharmony_cilibnet_connection.so 45e41f4b71Sopenharmony_ci``` 46e41f4b71Sopenharmony_ci 47e41f4b71Sopenharmony_ci**头文件** 48e41f4b71Sopenharmony_ci 49e41f4b71Sopenharmony_ci```c 50e41f4b71Sopenharmony_ci#include "napi/native_api.h" 51e41f4b71Sopenharmony_ci#include "network/netmanager/net_connection.h" 52e41f4b71Sopenharmony_ci#include "network/netmanager/net_connection_type.h" 53e41f4b71Sopenharmony_ci``` 54e41f4b71Sopenharmony_ci 55e41f4b71Sopenharmony_ci### 构建工程 56e41f4b71Sopenharmony_ci 57e41f4b71Sopenharmony_ci1、在源文件中编写调用该API的代码,并将结果封装成一个`napi_value`类型的值返回给 Node.js 环境。 58e41f4b71Sopenharmony_ci 59e41f4b71Sopenharmony_ci```C 60e41f4b71Sopenharmony_ci// Get the execution results of the default network connection. 61e41f4b71Sopenharmony_cistatic napi_value GetDefaultNet(napi_env env, napi_callback_info info) 62e41f4b71Sopenharmony_ci{ 63e41f4b71Sopenharmony_ci size_t argc = 1; 64e41f4b71Sopenharmony_ci napi_value args[1] = {nullptr}; 65e41f4b71Sopenharmony_ci napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 66e41f4b71Sopenharmony_ci int32_t param; 67e41f4b71Sopenharmony_ci napi_get_value_int32(env, args[0], ¶m); 68e41f4b71Sopenharmony_ci 69e41f4b71Sopenharmony_ci NetConn_NetHandle netHandle; 70e41f4b71Sopenharmony_ci if (param== 0) { 71e41f4b71Sopenharmony_ci param= OH_NetConn_GetDefaultNet(NULL); 72e41f4b71Sopenharmony_ci } else { 73e41f4b71Sopenharmony_ci param= OH_NetConn_GetDefaultNet(&netHandle); 74e41f4b71Sopenharmony_ci } 75e41f4b71Sopenharmony_ci 76e41f4b71Sopenharmony_ci napi_value result; 77e41f4b71Sopenharmony_ci napi_create_int32(env, param, &result); 78e41f4b71Sopenharmony_ci return result; 79e41f4b71Sopenharmony_ci} 80e41f4b71Sopenharmony_ci 81e41f4b71Sopenharmony_ci// Get the ID of the default network connection. 82e41f4b71Sopenharmony_cistatic napi_value NetId(napi_env env, napi_callback_info info) { 83e41f4b71Sopenharmony_ci int32_t defaultNetId; 84e41f4b71Sopenharmony_ci 85e41f4b71Sopenharmony_ci NetConn_NetHandle netHandle; 86e41f4b71Sopenharmony_ci OH_NetConn_GetDefaultNet(&netHandle); 87e41f4b71Sopenharmony_ci defaultNetId = netHandle.netId; // Get the default netId 88e41f4b71Sopenharmony_ci 89e41f4b71Sopenharmony_ci napi_value result; 90e41f4b71Sopenharmony_ci napi_create_int32(env, defaultNetId, &result); 91e41f4b71Sopenharmony_ci 92e41f4b71Sopenharmony_ci return result; 93e41f4b71Sopenharmony_ci} 94e41f4b71Sopenharmony_ci``` 95e41f4b71Sopenharmony_ci 96e41f4b71Sopenharmony_ci简要说明:这两个函数是用于获取系统默认网络连接的相关信息的。其中,GetDefaultNet是接收ArkTs端传入的测试参数,返回调用接口后对应的返回值,param可以自行调整;如果返回值为0,代表获取成功,401代表参数错误,201代表没有权限;而NetId函数则用于获取默认网络连接的ID。这些信息可以用于进一步的网络操作。 97e41f4b71Sopenharmony_ci 98e41f4b71Sopenharmony_ci 99e41f4b71Sopenharmony_ci2、将通过napi封装好的`napi_value`类型对象初始化导出,通过外部函数接口,将以上两个函数暴露给JavaScript使用。 100e41f4b71Sopenharmony_ci 101e41f4b71Sopenharmony_ci```C 102e41f4b71Sopenharmony_ciEXTERN_C_START 103e41f4b71Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports) 104e41f4b71Sopenharmony_ci{ 105e41f4b71Sopenharmony_ci // Information used to describe an exported attribute. Two properties are defined here: `GetDefaultNet` and `NetId`. 106e41f4b71Sopenharmony_ci napi_property_descriptor desc[] = { 107e41f4b71Sopenharmony_ci {"GetDefaultNet", nullptr, GetDefaultNet, nullptr, nullptr, nullptr, napi_default, nullptr}, 108e41f4b71Sopenharmony_ci {"NetId", nullptr, NetId, nullptr, nullptr, nullptr, napi_default, nullptr}}; 109e41f4b71Sopenharmony_ci napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 110e41f4b71Sopenharmony_ci return exports; 111e41f4b71Sopenharmony_ci} 112e41f4b71Sopenharmony_ciEXTERN_C_END 113e41f4b71Sopenharmony_ci``` 114e41f4b71Sopenharmony_ci 115e41f4b71Sopenharmony_ci3、将上一步中初始化成功的对象通过`RegisterEntryModule`函数,使用`napi_module_register`函数将模块注册到 Node.js 中。 116e41f4b71Sopenharmony_ci 117e41f4b71Sopenharmony_ci```C 118e41f4b71Sopenharmony_cistatic napi_module demoModule = { 119e41f4b71Sopenharmony_ci .nm_version = 1, 120e41f4b71Sopenharmony_ci .nm_flags = 0, 121e41f4b71Sopenharmony_ci .nm_filename = nullptr, 122e41f4b71Sopenharmony_ci .nm_register_func = Init, 123e41f4b71Sopenharmony_ci .nm_modname = "entry", 124e41f4b71Sopenharmony_ci .nm_priv = ((void*)0), 125e41f4b71Sopenharmony_ci .reserved = { 0 }, 126e41f4b71Sopenharmony_ci}; 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_ciextern "C" __attribute__((constructor)) void RegisterEntryModule(void) 129e41f4b71Sopenharmony_ci{ 130e41f4b71Sopenharmony_ci napi_module_register(&demoModule); 131e41f4b71Sopenharmony_ci} 132e41f4b71Sopenharmony_ci``` 133e41f4b71Sopenharmony_ci 134e41f4b71Sopenharmony_ci4、在工程的index.d.ts文件中定义两个函数的类型。 135e41f4b71Sopenharmony_ci 136e41f4b71Sopenharmony_ci- GetDefaultNet 函数接受一个数字参数 code,返回一个数字类型的值。 137e41f4b71Sopenharmony_ci- NetId 函数不接受参数,返回一个数字类型的值。 138e41f4b71Sopenharmony_ci 139e41f4b71Sopenharmony_ci```ts 140e41f4b71Sopenharmony_ciexport const GetDefaultNet: (code: number) => number; 141e41f4b71Sopenharmony_ciexport const NetId: () => number; 142e41f4b71Sopenharmony_ci``` 143e41f4b71Sopenharmony_ci 144e41f4b71Sopenharmony_ci5、在index.ets文件中对上述封装好的接口进行调用 145e41f4b71Sopenharmony_ci 146e41f4b71Sopenharmony_ci```ts 147e41f4b71Sopenharmony_ciimport testNetManager from 'libentry.so'; 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci@Entry 150e41f4b71Sopenharmony_ci@Component 151e41f4b71Sopenharmony_cistruct Index { 152e41f4b71Sopenharmony_ci @State message: string = ''; 153e41f4b71Sopenharmony_ci 154e41f4b71Sopenharmony_ci build() { 155e41f4b71Sopenharmony_ci Row() { 156e41f4b71Sopenharmony_ci Column() { 157e41f4b71Sopenharmony_ci Text(this.message) 158e41f4b71Sopenharmony_ci .fontSize(50) 159e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 160e41f4b71Sopenharmony_ci Button('GetDefaultNet').onClick(event => { 161e41f4b71Sopenharmony_ci this.GetDefaultNet(); 162e41f4b71Sopenharmony_ci }) 163e41f4b71Sopenharmony_ci Button('CodeNumber').onClick(event =>{ 164e41f4b71Sopenharmony_ci this.CodeNumber(); 165e41f4b71Sopenharmony_ci }) 166e41f4b71Sopenharmony_ci } 167e41f4b71Sopenharmony_ci .width('100%') 168e41f4b71Sopenharmony_ci } 169e41f4b71Sopenharmony_ci .height('100%') 170e41f4b71Sopenharmony_ci } 171e41f4b71Sopenharmony_ci 172e41f4b71Sopenharmony_ci GetDefaultNet() { 173e41f4b71Sopenharmony_ci let netid = testNetManager.NetId(); 174e41f4b71Sopenharmony_ci console.log("The defaultNetId is [" + netid + "]"); 175e41f4b71Sopenharmony_ci } 176e41f4b71Sopenharmony_ci 177e41f4b71Sopenharmony_ci CodeNumber() { 178e41f4b71Sopenharmony_ci let testParam = 0; 179e41f4b71Sopenharmony_ci let codeNumber = testNetManager.GetDefaultNet(testParam); 180e41f4b71Sopenharmony_ci if (codeNumber === 0) { 181e41f4b71Sopenharmony_ci console.log("Test success. [" + codeNumber + "]"); 182e41f4b71Sopenharmony_ci } else if (codeNumber === 201) { 183e41f4b71Sopenharmony_ci console.log("Missing permissions. [" + codeNumber + "]"); 184e41f4b71Sopenharmony_ci } else if (codeNumber === 401) { 185e41f4b71Sopenharmony_ci console.log("Parameter error. [" + codeNumber + "]"); 186e41f4b71Sopenharmony_ci } 187e41f4b71Sopenharmony_ci } 188e41f4b71Sopenharmony_ci} 189e41f4b71Sopenharmony_ci 190e41f4b71Sopenharmony_ci``` 191e41f4b71Sopenharmony_ci 192e41f4b71Sopenharmony_ci6、配置`CMakeLists.txt`,本模块需要用到的共享库是`libnet_connection.so`,在工程自动生成的`CMakeLists.txt`中的`target_link_libraries`中添加此共享库。 193e41f4b71Sopenharmony_ci 194e41f4b71Sopenharmony_ci注意:如图所示,在`add_library`中的`entry`是工程自动生成的`modename`,若要做修改,需和步骤3中`.nm_modname`保持一致; 195e41f4b71Sopenharmony_ci 196e41f4b71Sopenharmony_ci 197e41f4b71Sopenharmony_ci 198e41f4b71Sopenharmony_ci经过以上步骤,整个工程的搭建已经完成,接下来就可以连接设备运行工程进行日志查看了。 199e41f4b71Sopenharmony_ci 200e41f4b71Sopenharmony_ci## 测试步骤 201e41f4b71Sopenharmony_ci 202e41f4b71Sopenharmony_ci1、连接设备,使用DevEco Studio打开搭建好的工程 203e41f4b71Sopenharmony_ci 204e41f4b71Sopenharmony_ci2、运行工程,设备上会弹出以下所示图片: 205e41f4b71Sopenharmony_ci 206e41f4b71Sopenharmony_ci简要说明: 207e41f4b71Sopenharmony_ci 208e41f4b71Sopenharmony_ci- 在点击 `GetDefaultNet` 时,获取的是默认网络ID。 209e41f4b71Sopenharmony_ci- 在点击 `codeNumber` 时,获取的是接口返回的响应状态码。 210e41f4b71Sopenharmony_ci 211e41f4b71Sopenharmony_ci 212e41f4b71Sopenharmony_ci 213e41f4b71Sopenharmony_ci3、点击 `GetDefaultNet` 按钮,控制台会打印日志: 214e41f4b71Sopenharmony_ci 215e41f4b71Sopenharmony_ci 216e41f4b71Sopenharmony_ci 217e41f4b71Sopenharmony_ci4、点击 `codeNumber` 按钮,控制台会打印相应的响应状态码: 218e41f4b71Sopenharmony_ci 219e41f4b71Sopenharmony_ci