ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ZeroTierOne Android SDK 集成:6 步把跨网设备拉进同一个虚拟局域网

ZeroTierOne Android SDK 集成:6 步把跨网设备拉进同一个虚拟局域网 ZeroTierOne Android SDK 集成6 步把跨网设备拉进同一个虚拟局域网【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne你的笔记本在办公室内网手机在咖啡店 Wi-Fi 上两台设备分属 10.0.1.x 和 192.168.50.x 两个网段屏幕共享 App 一直转圈。ZeroTierOne 的思路是拉一根看不见的网线把所有设备拽进同一个虚拟局域网之后它们就像插在同一个交换机上跨运营商、跨地域直接互通。而 SDK 集成就是让你不用引导用户装客户端直接在自己的 Android App 里内嵌这套虚拟网络能力。SDK 长什么样先认识两个角色你打交道的主要是Node类它是全部业务操作的入口JNI 层则负责把 Java 方法翻译成 C 核心实现。分工大致是这样┌──────────────────────────────────┐ │ 你的 AppJava │ │ com.zerotierone.sdk.Node │ ← init / join / 收发都在这里 ├──────────────────────────────────┤ │ JNI 胶水层 [java/jni/] │ ← 参数转换、对象缓存 ├──────────────────────────────────┤ │ C 核心node/ osdep/ │ ← 交换、加密、路由的真正实现 └──────────────────────────────────┘Node.java源码在 java/src/com/zerotier/sdk/Node.java读不懂 C 也完全没关系你只需要认识这张图。环境版本要求与两个环境变量怎么配动手前先对一下清单缺什么补什么项目版本要求JDK8 及以上Android NDKr21 及以上Android SDKAPI 21 及以上构建工具ANT另外要设置两个环境变量详见 java/README.md变量指向NDK_BUILD_LOCNDK 里ndk-build脚本的完整路径ANDROID_PLATFORMandroid.jar所在目录集成六步走第 1 步引入 so 库目的让 Java 能找到本地代码。做法把编译产物libZeroTierOneJNI.so放进app/src/main/jniLibs/并在加载处写一行static { System.loadLibrary(ZeroTierOneJNI); }完成标志App 启动加载类时不抛UnsatisfiedLinkError。第 2 步创建 Node 实例目的拿到操作入口。做法用当前时间戳构造一个Nodelong now System.currentTimeMillis(); Node node new Node(now);完成标志拿到可用的node对象此时还未就绪。第 3 步init 初始化7 个监听器各管一摊目的把存储、发包、回调全部接好。做法实现 7 个接口传给init每个监听器一句话监听器一句话职责DataStoreGetListener从你的持久化存储里读节点数据DataStorePutListener把节点数据写回存储PacketSender把 ZeroTier 包真正发到物理网络上EventListener接收状态变化与非致命错误通知VirtualNetworkFrameListener收到虚拟局域网里其他设备发来的以太网帧VirtualNetworkConfigListener网络被创建、删除或配置变更时通知PathChecker可选检查网络路径质量可传 null调用长这样pathChecker 可以为 nullResultCode r node.init(getListener, putListener, sender, eventListener, frameListener, configListener, null);完成标志r ResultCode.OK。第 4 步join 加入网络目的让你的设备上交换机。做法拿一个 64 位虚拟网络 ID 调joinlong nwid 0x1234567890ABCDEF; // 虚拟网络 ID node.join(nwid);完成标志随后VirtualNetworkConfigListener回调收到该网络的配置。第 5 步帧与包的收发目的让虚拟流量真正流动。做法物理网络收到 UDP 包时喂给processWirePacket要把帧发给虚拟局域网里的其他设备时调processVirtualNetworkFramenode.processWirePacket(now, localSocket, remoteAddr, packetData, nextDeadline); node.processVirtualNetworkFrame(now, nwid, srcMac, dstMac, etherType, 0, frameData, nextDeadline);完成标志两端设备互相 ping 通。第 6 步定时跑后台任务目的让心跳、路径检测等周期工作运转。做法按每次返回的nextDeadline定期调用node.processBackgroundTasks(now, nextDeadline);完成标志nextDeadline持续有值更新链路保持稳定。避坑指南现象首次 init 卡了几秒。→原因第一次要生成节点身份。→处理UI 上给个加载态别当成卡死。现象多个 Node 行为互相串台。→原因监听器实例被共用。→处理每个 Node 必须配自己的一套监听器实例。现象断网、错误悄无声息。→原因状态与错误都走 EventListener没人消费。→处理认真处理每一种事件别吞掉。现象App 退出后内存不释放。→原因没调 close。→处理退出前执行node.close()之后再不能复用该对象。进阶速览多播组按需订阅和退订node.multicastSubscribe(nwid, groupMac); node.multicastUnsubscribe(nwid, groupMac);Moon 是给特定地理区域装加速器的加入与移除node.orbit(moonWorldId, moonSeed); node.deorbit(moonWorldId);想动手就先把源码拉下来按上面六步走一遍git clone https://gitcode.com/GitHub_Trending/ze/ZeroTierOneAndroid 篇到这里iOS 端的接入姿势我们下一篇见。【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表