鸿蒙OpenHarmony【@ohos.net.vpnExtension (VPN 增强管理)】ArkTS API ...

打印 上一主题 下一主题

主题 848|帖子 848|积分 2544

三方VPN管理模块,支持三方VPN的启动和停止功能。
三方VPN是指由第三方提供的VPN服务,它们通常提供更多的功能和更广泛的网络连接选项,包括更多的安全和隐私功能,以及更全面的定制选项。
说明
本模块首批接口从 API version 11 开始支持。后续版本的新增接口,采取上角标单独标志接口的起始版本。
导入模块

  1. import { vpnExtension } from '@kit.NetworkKit';
复制代码
LinkAddress11+

type LinkAddress = connection.LinkAddress
获取网络链接信息。
体系能力:SystemCapability.Communication.NetManager.Core
类型说明[connection.LinkAddress]网络链路信息 RouteInfo11+

type RouteInfo = connection.RouteInfo
获取网络路由信息。
体系能力:SystemCapability.Communication.NetManager.Core
类型说明[connection.RouteInfo]网络路由信息 VpnExtensionContext11+

type VpnExtensionContext = _VpnExtensionContext
vpn扩展的上下文。它允许访问serviceExtension特定资源。
体系能力:SystemCapability.Ability.AbilityRuntime.Core
类型说明[_VpnExtensionContext]vpn扩展的上下文 vpnExtension.startVpnExtensionAbility

startVpnExtensionAbility(want: Want): Promise
启动新的三方vpn功能。
体系能力:SystemCapability.Ability.AbilityRuntime.Core
模子约束:此接口仅可在Stage模子下使用。
参数:
参数名类型必填说明want[Want]是指示要启动的信息。 返回值:
类型说明Promise无返回值的Promise对象。 错误码:
错误码 ID错误信息401If the input parameter is not valid parameter.16000001The specified ability does not exist.16000002Incorrect ability type.16000006Cross-user operations are not allowed.16000008The crowdtesting application expires.16000011The context does not exist.16000050Internal error.16200001The caller has been released. 示例:
Stage 模子示例:
  1. import { common, Want } from '@kit.AbilityKit';import { vpnExtension } from '@kit.NetworkKit';
  2. let context = getContext(this) as common.VpnExtensionContext;let want: Want = {  deviceId: "",  bundleName: "com.example.myvpndemo",  abilityName: "MyVpnExtAbility",};@Entry@Componentstruct Index {  @State message: string = 'Hello World'  build() {    Row() {      Column() {        Text(this.message)          .fontSize(50)          .fontWeight(FontWeight.Bold).onClick(() => {          console.info("btn click") })        Button('Start Extension').onClick(() => {          vpnExtension.startVpnExtensionAbility(want);        }).width('70%').fontSize(45).margin(16)        }.width('100%')    }.height('100%')  }}
复制代码
vpnExtension.stopVpnExtensionAbility

stopVpnExtensionAbility(want: Want): Promise
停止同一应用步调中的服务。
体系能力:SystemCapability.Ability.AbilityRuntime.Core
模子约束:此接口仅可在Stage模子下使用。
参数:
参数名类型必填说明want[Want]是指示要启动的信息 返回值:
类型说明Promise无返回值的Promise对象。 错误码:
错误码 ID错误信息401If the input parameter is not valid parameter.16000001The specified ability does not exist.16000002Incorrect ability type.16000006Cross-user operations are not allowed.16000011The context does not exist.16000050Internal error.16200001The caller has been released. 示例:
Stage 模子示例:
  1. import { common, Want } from '@kit.AbilityKit';import { vpnExtension } from '@kit.NetworkKit';
  2. let context = getContext(this) as common.VpnExtensionContext;let want: Want = {  deviceId: "",  bundleName: "com.example.myvpndemo",  abilityName: "MyVpnExtAbility",};@Entry@Componentstruct Index {  @State message: string = 'Hello World'  build() {    Row() {      Column() {        Text(this.message)          .fontSize(50)          .fontWeight(FontWeight.Bold).onClick(() => {          console.info("btn click") })        Button('Start Extension').onClick(() => {          vpnExtension.startVpnExtensionAbility(want);        }).width('70%').fontSize(45).margin(16)        Button('Stop Extension').onClick(() => {          console.info("btn end")          vpnExtension.stopVpnExtensionAbility(want);        }).width('70%').fontSize(45).margin(16)        }.width('100%')    }.height('100%')  }}
复制代码
vpnExtension.createVpnConnection

createVpnConnection(context: VpnExtensionContext): VpnConnection
创建一个 三方VPN 连接对象。
说明
调用createVpnConnection接口前,必要先调用startVpnExtensionAbility接口启用vpn功能。
体系能力:SystemCapability.Communication.NetManager.Vpn
模子约束:此接口仅可在Stage模子下使用。
参数:
参数名类型必填说明context[VpnExtensionContext]是指定 context。 返回值:
类型说明[VpnConnection]返回一个 VPN 连接对象。 错误码:
错误码 ID错误信息401Parameter error. 示例:
Stage 模子示例:
  1. import { vpnExtension, VpnExtensionAbility } from '@kit.NetworkKit';
  2. import { common, Want } from '@kit.AbilityKit';
  3. let context: vpnExtension.VpnExtensionContext;
  4. export default class MyVpnExtAbility extends VpnExtensionAbility {
  5.   onCreate(want: Want) {
  6.     let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
  7.     console.info("vpn createVpnConnection: " + JSON.stringify(VpnConnection));
  8.   }
  9. }
复制代码
VpnConnection

VPN 连接对象。在调用 VpnConnection 的方法前,必要先通过vpnExt.createVpnConnection创建 VPN 连接对象。
create

create(config: VpnConfig): Promise
使用 config 创建一个 vpn 网络,使用 Promise 方式作为异步方法。
体系能力:SystemCapability.Communication.NetManager.Vpn
参数:
参数名类型必填说明config[VpnConfig]是指定 VPN 网络的配置信息。 返回值:
类型说明Promise以 Promise 情势返回获取效果,返回指定虚拟网卡的文件描述符 fd。 错误码:
错误码 ID错误信息401Parameter error.2200001Invalid parameter value.2200002Operation failed. Cannot connect to service.2200003System internal error.2203001VPN creation denied, please check the user type.2203002VPN exist already, please execute destroy first. 示例:
  1. import { vpnExtension, VpnExtensionAbility } from '@kit.NetworkKit';
  2. import { common, Want } from '@kit.AbilityKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. let context: vpnExtension.VpnExtensionContext;
  5. export default class MyVpnExtAbility extends VpnExtensionAbility {
  6.   private tunIp: string = '10.0.0.5';
  7.   private blockedAppName: string = 'com.example.myvpndemo';
  8.   onCreate(want: Want) {
  9.     let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
  10.     console.info("vpn createVpnConnection: " + JSON.stringify(VpnConnection));
  11.     this.SetupVpn();
  12.   }
  13.   SetupVpn() {
  14.         class Address {
  15.             address: string;
  16.             family: number;
  17.             constructor(address: string, family: number) {
  18.                 this.address = address;
  19.                 this.family = family;
  20.             }
  21.         }
  22.         class AddressWithPrefix {
  23.             address: Address;
  24.             prefixLength: number;
  25.             constructor(address: Address, prefixLength: number) {
  26.                 this.address = address;
  27.                 this.prefixLength = prefixLength;
  28.             }
  29.         }
  30.         class Config {
  31.             addresses: AddressWithPrefix[];
  32.             mtu: number;
  33.             dnsAddresses: string[];
  34.             trustedApplications: string[];
  35.             blockedApplications: string[];
  36.             constructor(
  37.                 tunIp: string,
  38.                 blockedAppName: string
  39.             ) {
  40.                 this.addresses = [
  41.                     new AddressWithPrefix(new Address(tunIp, 1), 24)
  42.                 ];
  43.                 this.mtu = 1400;
  44.                 this.dnsAddresses = ["114.114.114.114"];
  45.                 this.trustedApplications = [];
  46.                 this.blockedApplications = [blockedAppName];
  47.             }
  48.         }
  49.         let config = new Config(this.tunIp, this.blockedAppName);
  50.         try {
  51.             let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
  52.             VpnConnection.create(config).then((data) => {
  53.                 hilog.error(0x0000, 'developTag', 'tunfd: %{public}s', JSON.stringify(data) ?? '');
  54.             })
  55.         } catch (error) {
  56.             hilog.error(0x0000, 'developTag', 'vpn setUp fail: %{public}s', JSON.stringify(error) ?? '');
  57.         }
  58.     }
  59. }
复制代码
protect

protect(socketFd: number): Promise
保护套接字不受 VPN 连接影响,通过该套接字发送的数据将直接基于物理网络收发,因此其流量不会通过 VPN 转发, 使用 Promise 方式作为异步方法。
体系能力:SystemCapability.Communication.NetManager.Vpn
参数:
参数名类型必填说明socketFdnumber是指定保护的 socketfd, 该文件描述符通过[getSocketFd]获取。 返回值:
类型说明Promise以 Promise 情势返回设定效果,失败返回错误码错误信息。 错误码:
错误码 ID错误信息401Parameter error.2200001Invalid parameter value.2200002Operation failed. Cannot connect to service.2200003System internal error.2203004Invalid socket file descriptor. 示例:
  1. import { vpnExtension, VpnExtensionAbility } from '@kit.NetworkKit';
  2. import { common, Want } from '@kit.AbilityKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. let g_tunnelFd = -1;
  5. let context: vpnExtension.VpnExtensionContext;
  6. export default class MyVpnExtAbility extends VpnExtensionAbility {
  7.   private vpnServerIp: string = '192.168.31.13';
  8.   onCreate(want: Want) {
  9.     let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
  10.     console.info("vpn createVpnConnection: " + JSON.stringify(VpnConnection));
  11.     this.CreateTunnel();
  12.     this.Protect();
  13.   }
  14.   CreateTunnel() {
  15.       g_tunnelFd = 8888;
  16.   }
  17.   Protect() {
  18.         hilog.info(0x0000, 'developTag', '%{public}s', 'vpn Protect');
  19.         let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
  20.         VpnConnection.protect(g_tunnelFd).then(() => {
  21.             hilog.info(0x0000, 'developTag', '%{public}s', 'vpn Protect Success');
  22.         }).catch((err : Error) => {
  23.             hilog.error(0x0000, 'developTag', 'vpn Protect Failed %{public}s', JSON.stringify(err) ?? '');
  24.         })
  25.   }
  26. }
复制代码
destroy

destroy(): Promise
销毁启动的 VPN 网络,使用 Promise 方式作为异步方法。
体系能力:SystemCapability.Communication.NetManager.Vpn
返回值:
类型说明Promise以 Promise 情势返回设定效果,失败返回错误码错误信息。 错误码:
错误码 ID错误信息401Parameter error.2200002Operation failed. Cannot connect to service.2200003System internal error. 示例:
  1. import { vpnExtension, VpnExtensionAbility } from '@kit.NetworkKit';
  2. import { common, Want } from '@kit.AbilityKit';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. let context: vpnExtension.VpnExtensionContext;
  5. export default class MyVpnExtAbility extends VpnExtensionAbility {
  6.   onCreate(want: Want) {
  7.     let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
  8.     console.info("vpn createVpnConnection: " + JSON.stringify(VpnConnection));
  9.     VpnConnection.destroy().then(() => {
  10.       console.info("destroy success.");
  11.     }).catch((error : BusinessError) => {
  12.       console.error("destroy fail" + JSON.stringify(error));
  13.     });
  14.   }
  15. }
复制代码
VpnConfig

三方VPN配置参数。
体系能力:SystemCapability.Communication.NetManager.Vpn
名称类型必填说明addressesArray<[LinkAddress]>是VPN 虚拟网卡的 IP 地址。routesArray<[RouteInfo]>否VPN 虚拟网卡的路由信息(现在最多可配置1024条路由)。dnsAddressesArray否DNS 服务器地址信息。searchDomainsArray否DNS 的搜索域列表。mtunumber否最大传输单元 MTU 值(单位:字节)。isIPv4Acceptedboolean否是否支持 IPV4, 默认值为 true。isIPv6Acceptedboolean否是否支持 IPV6, 默认值为 false。isInternalboolean否是否支持内置 VPN, 默认值为 false。isBlockingboolean否是否阻塞模式, 默认值为 false。trustedApplicationsArray否白名单信息, string 类型表示的包名。blockedApplicationsArray否黑名单信息, string 类型表示的包名。 示例:
  1. import { vpnExtension} from '@kit.NetworkKit';
  2. let vpnConfig: vpnExtension.VpnConfig = {
  3.   addresses: [],
  4.   routes: [{
  5.     interface: "eth0",
  6.     destination: {
  7.       address: {
  8.         address:'',
  9.         family:1,
  10.         port:8080
  11.       },
  12.       prefixLength:1
  13.     },
  14.     gateway: {
  15.       address:'',
  16.       family:1,
  17.       port:8080
  18.     },
  19.     hasGateway: true,
  20.     isDefaultRoute: true,
  21.   }],
  22.   mtu: 1400,
  23.   dnsAddresses: ["223.5.5.5", "223.6.6.6"],
  24.   trustedApplications: [],
  25.   blockedApplications: [],
  26. }
  27. let context: vpnExtension.VpnExtensionContext;
  28. function vpnCreate(){
  29.   let VpnConnection: vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
  30.   VpnConnection.create(vpnConfig).then((data) => {
  31.     console.info("vpn create " + JSON.stringify(data));
  32.   })
  33. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表