鸿蒙ets实现强制蜂窝网络

在用户同时开启 wifi/cellular 时,期望强行使用 cellular 访问网络,这是个比较常规的诉求。 鸿蒙提供了大量的 ets 网络基础库,本来以为能简单实现这个能力,却有些令人不解的坑。 作为基建来说,规避 ets 而直接使用 C++ 可能才是最优解。

获取蜂窝网络 IP

第一个坑就是connection.getAllNets()接口在 wifi/cellular 同时开启时并不会返回 cellular 的NetHandle,仅开启 cellular 才能拿到其NetHandle

但发现监听NetConnectionnetConnectionPropertiesChange事件后,在网络不变化时,仅开启 wifi 会回调、仅开启 cellular 不回调、wifi/cellular 同时开启时会回调两个网卡的NetHandle

这两个接口诡异的表现,结合起来却恰恰能拿到 cellular 的 NetHandle

Socket 指定本地 IP

第二个坑是socket.TCPSocketbind操作是个虚假接口,意味着它并不会使用你传入的 IP 去绑定,难以理解设计者的初衷,经过与鸿蒙侧的沟通,这似乎不是必须解决的问题,也给不出有效解决方案。

看遍 ets 网络文档,发现一些可行性。

socket.TLSSocket是支持bind指定 IP 的,当它却不支持指定网卡(也就是NetHandle),无法构建成功。 而socket.TCPSocket是支持指定网卡的,且提供了一个将 TCP 升级到 TLS 的接口:constructTLSSocketInstance(tcpSocket: TCPSocket)

是的,又是一些诡异的设计和表现,但恰好能结合以实现我们的诉求,伪代码如下:

scss 复制代码
    // 创建 TCP
    let tcp: socket.TCPSocket = socket.constructTCPSocketInstance();
    // TCP bind 目标网卡 IP(虽然 bind 在底层什么都没做,但这一步仍然要做,不然后面 NetHandle bind 也可能出问题)
    await tcp.bind({ address: cellular_ip });
    // 把 TCP bind 到目标网卡(让 TCP 请求时使用目标网卡)
    await handle.bindSocket(tcp);
    // TCP 进行连接(不连接无法升级到 TLS)
    await tcp.connect(options);
    // TCP 升级到 TLS
    let tlsSocket = socket.constructTLSSocketInstance(tcp);
    // TLS 发起连接
    await tlsSocket.connect(this.attr.connectOptions);
    // 监听端口(必须在连接成功之后)
    listenSocket(tlsSocket);
    // 发送数据
    await tlsSocket.send(data);
相关推荐
2501_919749034 分钟前
华为鸿蒙免费语音记录APP—小羊回响
华为·harmonyos·鸿蒙
less_121386 分钟前
HarmonyOS WPS Open SDK:旧 HAR 迁移到统一接口联调指南
华为·sdk·harmonyos·wps·鸿蒙开发·文档编辑
yuhulkjv3357 分钟前
告别复制粘贴式降级:纳米AI鸿蒙版导出word格式为何绕不开“AI 导出鸭”
人工智能·ai·word·harmonyos·ai导出鸭
HwJack201 小时前
鸿蒙 Accessibility Kit 全景解析:无障碍开发从哪里下手
microsoft·华为·harmonyos
大锅盖12 小时前
HarmonyOS 6.1.1 AI字幕新特性深度解析:从AICaptionComponent四大新增字段到K歌社交舞台黑霓虹紫深色架构全链路实战
人工智能·架构·harmonyos
m0_749690232 小时前
【寻迹校园 HarmonyOS NEXT 实战 38】34%/44%/22% 三栏工作台:超宽屏失物匹配的主从详情设计
华为·harmonyos·arkts·状态管理·大屏适配·主从详情
星辰徐哥2 小时前
鸿蒙金融理财全栈项目——生态合作、用户运营、数据变现
金融·harmonyos·用户运营
OH_TPC14 小时前
HarmonyOS APP开发---“启动秀“应用引导页App,需要用到这个库
华为·harmonyos·鸿蒙
lilian23316 小时前
Harmony os 技术实战|拼豆制图43:压缩字符矩阵上线前如何拦住错位图纸
开发语言·前端·华为·矩阵·harmonyos
贾伟康18 小时前
【中国方言题库|15】HarmonyOS ArkTS 本地状态持久化实战:让保存、删除和页面返回后的数据即时一致
harmonyos·arkts·数据持久化·appstorage·preferences