
ZeroTierOne SDK 集成教程5 步把全球虚拟组网装进 Android 应用【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOneZeroTierOne 是在现有公网上搭建全球虚拟以太网的工具人话各地设备互相可见像插在同一个交换机上。本文以 Android 平台为例走一遍 ZeroTierOne SDK 集成的完整路径从环境配置、Node 初始化到首次加入网络适合零基础的开发者。它能解决什么问题先对号入座看看你是不是这类场景你的 App 要和远端设备建立私有通道但公网 IP 不稳定手动打洞太麻烦你不想只满足于 TCP/UDP 套接字而是想要 LAN 级的以太网语义MAC 地址、组播、ARP你希望设备插上就能互通而不是每次连接都走一遍复杂的会话协商ZeroTierOne 的 Java SDK 把核心引擎用 JNI 包了一层你的 App 里相当于内置了一个虚拟交换机节点加入一个 64 位网络 ID 后帧数据按以太网规则转发。你只需要负责三件事——把物理网收来的 UDP 数据喂给 SDK、把虚拟网络帧交给业务层、周期性驱动后台任务。 动手前检查装什么、设什么先备齐四个组件缺一个编译都过不去组件版本要求用途JDK8编译 Java 层Android NDKr21编译 JNI 桥接层的原生代码Android SDKAPI 21目标运行平台ANT任意可用版本构建脚本调用编译时还要两个环境变量指错路径会直接报错变量应指向是否必填NDK_BUILD_LOCNDK 里ndk-build脚本的完整路径是ANDROID_PLATFORMandroid.jar所在目录如.../platforms/android-21是export NDK_BUILD_LOC/path/to/ndk/ndk-build export ANDROID_PLATFORM/path/to/sdk/platforms/android-21想自己编译整包的话用git clone https://gitcode.com/GitHub_Trending/ze/ZeroTierOne拉取仓库即可。编译产物是libZeroTierOneJNI.so放进你 App 的jniLibs目录就能用。源码层面你实际会打交道的东西很少Node 类 是全部业务入口JNI 桥接层 是原生实现需要重新构建时看一眼构建说明就够。 主线走通从加载库到首次连接主线就五步每步都有明确的完成标志。第一步加载原生库static { System.loadLibrary(ZeroTierOneJNI); }放在持有 SDK 引用的类里类加载时自动执行。第二步创建并初始化 Node构造函数收一个当前时间戳毫秒。init要收 7 个参数其中 6 个监听器必须是你自己实现的类最后一个PathChecker可以传null监听器被调用时要做的事DataStoreGetListener从本地持久化存储读数据DataStorePutListener往本地持久化存储写数据PacketSender把 ZeroTier 协议数据经物理网络发出去EventListener接收状态变更和非致命错误VirtualNetworkFrameListener接收虚拟网络进来的帧VirtualNetworkConfigListener网络创建/删除/配置变更时通知PathChecker路径质量探测可选Node node new Node(System.currentTimeMillis()); ResultCode r node.init(getL, putL, sender, eventL, frameL, configL, null); 第一次 init 可能耗时几秒——它要现场生成节点身份。别把慢当成卡死。第三步加入网络node.join(0x1234567890ABCDEF); // 换成你的 64 位网络 ID返回ResultCodeRESULT_OK码值 0即成功。已经是成员再调一次不会重复加入直接返回 OK。第四步打通双向数据通路SDK 自己不碰网络数据全靠你泵物理网收来的 UDP 报文 → 调processWirePacket传入本地 socket 号、远端地址、报文内容虚拟网络进来的帧 → 你的VirtualNetworkFrameListener会被回调把源/目的 MAC、以太类型、VLAN、帧体转交业务层你想发进虚拟网络的帧 → 调processVirtualNetworkFramelong[] deadline new long[1]; node.processWirePacket(now, localSocket, remoteAddr, packetBytes, deadline); node.processBackgroundTasks(now, deadline);那个deadline小数组是设计上的巧思所有入口都带这个出参每次调用后它会告诉你下一次该执行后台任务的时间。存下来用它做调度基准。第五步用返回状态确认走通init 返回 OK 之后调address()拿到本节点的 40 位 ZeroTier 地址再配合status()和peers()查看节点状态与已知对端。地址能正常取回说明节点已经上线主线完成。 进阶玩法按需加料这些不是主线的必经路用到哪个再回来查哪个。IPv4 场景组播订阅必须做对用 IPv4 时有一步特殊操作以广播 MAC0xffffffffffff为组播组对每个本地 IPv4 地址各订阅一次ADI 参数填该 IP主机字节序。这等于把 ARP 从广播乱发改造成精准组播——跳过这一步ARP 不会稳定工作。组播组的订与退multicastSubscribe(nwid, 组播MAC, adi)订阅multicastUnsubscribe(nwid, 组播MAC, adi)退订。退订时组播 MAC 传 0 表示退订全部。重复订阅同一个组没有副作用可以放心调。添加与移除 MoonMoon 人话说是骨干中转点帮不同区域的节点更省心地互通。orbit(moonWorldId, moonSeed)添加或更新一个 MoonmoonSeed可以为 0也可以是该 Moon 任一成员的 ZeroTier 地址SDK 会向它查询 Moon 定义deorbit(moonWorldId)移除。Moon 会持久化到数据存储的moons.d/目录重启后重新扫描并对每个 Moon 调一次orbit即可恢复。 排坑指南现象原因解法首次 init 明显偏慢数秒第一次运行要生成节点身份别按超时判失败给用户等待提示两个 Node 的回调互相串台监听器实例必须按 Node 唯一每个 Node 独立创建一套监听器实例ARP 解析时灵时不灵未对广播地址 各 IPv4 的 ADI 做组播订阅按进阶一节的写法逐地址订阅leave 之后上层还留着旧网络配置leave会发一次端口已删除回调第二参数为 null配置监听里处理好删除分支调过 close 后再用该 Node 直接异常Node 对象 close 后不可再用退出前调node.close()释放之后不再复用该对象收尾与延伸到这里你的 App 已经内置了一个全球虚拟组网节点环境配好、库加载、Node 初始化、加入网络、数据通路打通五步走完。后续想扩展组播、Moon 或状态观测直接对照进阶部分和源码注释即可。资源索引Node 类完整 APIJava SDK 源码目录JNI 桥接层源码构建与环境说明【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考