鸿蒙ets实现强制蜂窝网络

作者:波儿菜日期:2025/11/23

在用户同时开启 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)

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

1    // 创建 TCP
2    let tcp: socket.TCPSocket = socket.constructTCPSocketInstance();
3    // TCP bind 目标网卡 IP(虽然 bind 在底层什么都没做,但这一步仍然要做,不然后面 NetHandle bind 也可能出问题)
4    await tcp.bind({ address: cellular_ip });
5    //  TCP bind 到目标网卡(让 TCP 请求时使用目标网卡)
6    await handle.bindSocket(tcp);
7    // TCP 进行连接(不连接无法升级到 TLS)
8    await tcp.connect(options);
9    // TCP 升级到 TLS
10    let tlsSocket = socket.constructTLSSocketInstance(tcp);
11    // TLS 发起连接
12    await tlsSocket.connect(this.attr.connectOptions);
13    // 监听端口(必须在连接成功之后)
14    listenSocket(tlsSocket);
15    // 发送数据
16    await tlsSocket.send(data);
17

鸿蒙ets实现强制蜂窝网络》 是转载文章,点击查看原文


相关推荐


计算机网络重要知识点
Eric_Makabaka2025/11/21

内容来源于飞天闪客,讲的非常通俗易懂。 网络是怎么传输的? https://www.bilibili.com/video/BV1tseyzCEoF?spm_id_from=333.788.videopod.sections&vd_source=c815609efed4d3ffbba6f23ca86d94ae 集线器(物理层) 两台电脑之间想要通信,可以直接通过一条网线进行连接。但是随着网线的增加,每台电脑的线太过混乱,不好管理。 所以就有了集线器这样的设备,把各自的网线都插到这


Docker 安装配置
ITVV2025/11/19

卸载旧版本(如有) sudo apt remove docker docker-engine docker.io containerd runc 安装依赖包 sudo apt update sudo apt install -y \ ca-certificates \ curl \ gnupg \ lsb-release 添加 Docker 官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL htt


Lua 的标准库
hubenchang05152025/11/18

#Lua 的标准库 #变量 _G - Lua 的全局环境,包含所有全局变量(包括 _G 自身);Lua 本身并不使用这个变量,改变它的值不会有任何作用 _VERSION - Lua 的版本,例如 "Lua 5.4" #基础函数 assert - 断言 collectgarbage - 垃圾收集 dofile - 执行文件中的 Lua 代码 error - 主动抛出错误,终止当前代码的执行 getmetatable - 获取元表 ipairs - 遍历数组 load - 加载一个代码块 l


SeqXGPT:Sentence-Level AI-Generated Text Detection —— 把大模型的“波形”变成测谎仪
only-code2025/11/17

1. 论文基本信息 标题:  SeqXGPT: Sentence-Level AI-Generated Text Detection 作者:  Pengyu Wang, Linyang Li, Ke Ren, Botian Jiang, Dong Zhang, Xipeng Qiu 年份:  2023 机构:  Fudan University, Shanghai Key Laboratory of Intelligent Information Processing 领域关键


Python 的内置函数 open
IMPYLH2025/11/16

Python 内建函数列表 > Python 的内置函数 open Python 的内置函数 open() 是用于打开文件的重要函数,它提供了与文件系统交互的基本接口。该函数返回一个文件对象(file object),可用于读取、写入或追加文件内容。 函数签名 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 主要参数说明 f


word表格操作疑难杂症处理
weixin_438338512025/11/14

1. 从excel 复制一个表格粘贴到word中,表格超出word的宽度 第一种方式:点表格左上角的按钮全选表格, 表格工具---自动调整---根据窗口调整表格 或者 根据内容调整表格。 第二种方式:设置 页边距 和 纸张大小,默认A4纸,可能大小就是不够 第三种方式: 粘贴表格对象 复制表格后,在word中不要直接粘贴,而是在word中空白处 右键 ,选择最后一个图标“选择性粘贴”,选择 wps表格对象---确定, 这样就是一模一样的粘贴过来了,但是word中无法直接编辑该


HarmonyOS Web组件深度解析:构建高性能JavaScript交互的实践与创新
万少-2025/11/13

HarmonyOS Web组件深度解析:构建高性能JavaScript交互的实践与创新 引言 在万物互联的时代,HarmonyOS作为分布式操作系统,其应用生态的构建离不开Web技术的深度融合。Web网页组件(Web组件)作为连接Web生态与原生应用的关键桥梁,其JavaScript交互能力直接决定了应用的体验边界。传统的WebView交互往往局限于简单的URL加载和基础脚本执行,但在HarmonyOS的分布式架构下,我们需要重新思考JavaScript交互的深度与广度。 本文将深入探讨Harm


开源 Objective-C IOS 应用开发(二)Xcode安装
ajassi20002025/11/12

文章的目的为了记录使用Objective-C 进行IOS app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。  推荐链接: 开源 Arkts 鸿蒙应用 开发(一)工程文件分析-CSDN博客 开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-CSDN博客 开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-CSDN博客 开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-C


三角洲行动-java游戏程序
程序编程- Java2025/11/10

以下是一个简化版的三角洲行动游戏程序,使用Java编写。 import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.Random; import javax.swing.*; public class DeltaForceAction extends JPanel implements ActionListener, KeyListener {     private st


跨平台游戏引擎 Axmol-2.9.1 发布
一线灵2025/11/8

Axmol 2.9.1 版本是一个以错误修复和功能改进为主的次要 LTS 长期支持版本,发布时间: 2025 年 11 月 2 日 🙏感谢所有对 axmol 项目的贡献者,包括财务赞助者:@scorewarrior(公司)、@peterkharitonov、@duong、@thienphuoc、@bingsoo、@asnagni、@paulocoutinhox 以及 历史赞助者 🙏我们衷心感谢 @scorewarrior(公司) 的鼎力支持——他们在 GitHub Sponsors 追加

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读