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