前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >HarmonyOS 开发实践——基于connection的网络连接管理能力

HarmonyOS 开发实践——基于connection的网络连接管理能力

原创
作者头像
小帅聊鸿蒙
发布2024-11-21 20:40:30
发布2024-11-21 20:40:30
1070
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记

场景描述

网络连接管理提供管理网络一些基础能力,包括获取默认激活的数据网络、获取所有激活数据网络列表、开启关闭飞行模式、获取网络能力信息等功能。

  • 场景一:应用内部获取当前使用网络类型为wifi / 移动数据 及当前网络可连接状态做业务处理
  • 场景二:应用侧需要知道用户当前连接网络状态并作对应的业务处理,如网络断开返回弹框提示、应用中是否按缓存数据展示图片等
  • 场景三:获取当前连接网卡链路地址、DNS地址等信息判断处理用户连接网络位置等应用侧能力

方案描述

场景一:

  应用内部获取当前使用网络类型为wifi / 移动数据 及当前网络可连接状态做业务处理

效果图

核心代码

代码语言:ts
复制
connection.getDefaultNet().then((netHandle: connection.NetHandle) => {
  connection.getNetCapabilities(netHandle).then((data: connection.NetCapabilities) => {
    console.log(JSON.stringify(data));
  })
});

场景二:

应用侧需要知道用户当前连接网络状态并作对应的业务处理,如网络断开返回弹框提示、应用中是否按缓存数据展示图片等

效果图

以wifi切换为例监听成功返回日志,可参考打印日志如图

方案

调用connection模块能力,使用前需要调用register开启监听,监听结束后需要调用unregister关闭当前监听请求

netLost(网络丢失) 与 netUnavailable(网络不可用)区别

核心代码

代码语言:ts
复制
//网络状态监听
netCon : connection.NetConnection  = connection.createNetConnection();
connTest(){
  //开启监听事件
  this.netCon.register((error: BusinessError) => {
    console.log(JSON.stringify(error));
  });
 
  //监听网络是否可用
  this.netCon.on('netAvailable', (data) => {
    console.log("1---- net status netAvailable" + JSON.stringify(data))
  })
 
  //网络切换监听
  this.netCon.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {
    console.log(JSON.stringify(data));
  });
 
  //网络丢失()
  this.netCon.on("netLost",(data) => {
    console.log("1---- net lost" + JSON.stringify(data))
  })
 
  //网络不可用()
  this.netCon.on('netUnavailable', (data) => {
    console.log("1---- net status netUnavailable" + JSON.stringify(data))
  })
 
  //取消监听
  this.netCon.unregister((error: BusinessError) => {
    console.log(JSON.stringify(error));
  });
}

场景三:

  获取当前连接网卡链路地址、DNS地址等信息判断处理用户连接网络位置等应用侧能力

效果图

方案

步骤:

1、如需要获取蜂窝网络信息,创建时需要添加关注

2、调用getConnectionProperties能力获取连接信息

核心代码

代码语言:ts
复制
//1、 指定蜂窝网络类型获取
 
// 关注蜂窝网络,需要传入相关网络特征,
let netConnectionCellular = netConn.createNetConnection({
  netCapabilities: {
    bearerTypes: [connection.NetBearType.BEARER_CELLULAR]
  }
});
 
try {
  const ipAddresses: string[] = []; // 使用数组来收集IP地址
  // 获取所有网络句柄
  const allNets =  connection.getAllNets();
 
  for (const net of allNets) { // 使用for...of循环
    // 获取当前网络句柄的能力信息
    const netCap =  connection.getConnectionProperties(net);
    if (!netCap.interfaceName.includes('wlan') && Array.isArray(netCap.dnses)) {
      // 确保netCap.dnses是一个数组,然后提取IP地址并添加到数组中
      const dnsAddresses = netCap.dnses.map(NetAddress => NetAddress.address);
      ipAddresses.push(...dnsAddresses);
    }
  }
  // 将IP地址数组转换为逗号分隔的字符串并返回
  return ipAddresses.join(',').toString();
} catch (error) {
  // 打印错误并抛出,或进行其他错误处理
  console.error('获取IP列表时出错:', error);
  // 抛出包含原始错误信息的错误
  throw new Error(`获取IP列表时出错: ${error.message}`);
}
 
 
-------
 
//2、默认网络获取
// 关注默认网络
let netConn = connection.createNetConnection();
 
connection.getDefaultNet().then((netHandle: connection.NetHandle) => {
  connection.getConnectionProperties(netHandle).then((data: connection.ConnectionProperties) => {
    console.log(JSON.stringify(data));
  })
});

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂鸿蒙开发;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景描述
  • 方案描述
    • 场景一:
    • 场景二:
    • 场景三:
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档