Nikon Smart GPS for HarmonyOS NEXT
NiLink 是一款为原生鸿蒙打造的摄影 GPS 辅助工具。通过蓝牙将手机实时位置持续发送给尼康相机,让拍下的每一张照片自动记录经纬度、海拔等信息,方便后期整理、行程追溯和创作分享。
Important
本应用为独立第三方开源项目,与尼康(Nikon)官方无任何合作、授权或隶属关系。提及的所有商标及型号仅用于说明适配范围,不代表官方背书。
鸿蒙设备在卓易通中运行 SnapBridge 存在功能异常,故开发本应用代替之。
扫描、配对、GPS 传输全流程自动化。用户只需要按照指引进行配对、连接,一切细节、断开重连等等都自动完成。
* Z 系列与 D 系列均已适配蓝牙时序。实际连接可靠性会受使用环境、尼康相机自身设计等限制。
拍摄时,相机接收到的位置信息(可在相机「连接至智能设备」-「位置数据」查看)由相机写入 RAW / JPG 照片的 EXIF 元数据。照片导入电脑或手机相册后自带地理坐标,地图模式自动归位;尼康 NEF / JPG 双格式均支持,不依赖云端,第三方软件均可读取。
每一台已配对相机都记录最近 2 小时的连接健康度,四级状态直观呈现(正常 / 偶发断连 / 定位异常 / 完全中断),拍摄期间连接稳定性心中有数。
连接页 GPS 卡内一键切换,按拍摄场景权衡精度与耗电:
| 模式 | 定位方式 | 更新 | 整机功耗* |
|---|---|---|---|
| 精确 | 卫星定位(GNSS 引擎工作) | 约 10 秒一次 | 约 1.0–1.15 W |
| 省电 | 网络定位(GNSS 引擎休眠) | 约 10 分钟保底 | 约 0.7–0.8 W |
| (对照)不运行应用 | — | — | 约 0.76–0.80 W |
* 熄屏静止整机均值,MatePad Pro 2024,两轮各 10–20 min 分段实测。
实测结论:GNSS 引擎开/关是功耗的主变量——省电档较精确档省 0.2–0.36 W(约 −25%),而省电档整机功耗与不运行应用噪声内不可分辨——即蓝牙连接与坐标下发的功耗成本同样淹没在噪声内,功耗大头始终在 GNSS 引擎。
可同时连接多台尼康相机,每台独立开关、独立管理,一台休眠或断线不影响另一台;多台共享同一份定位数据,互不干扰。
* 由于仅测试了 2 台设备同时连接,在连接更多设备时设置了提示。如需调整连接上限或提示阈值,可在代码中修改后重新构建。
尼康相机进入休眠后维持 BLE 低功耗连接,GPS 数据持续写入。若连接意外中断(深度休眠 / 超出距离),自动执行指数退避重连。
* 相机侧须开启「照相机关闭时发送」才能实现相机休眠唤醒。
基于 BLUETOOTH_INTERACTION + LOCATION 双长时任务,模式随连接状态动态调整,不依赖无声音频等取巧手段。针对长时任务被系统取消或挂起的极少数情况,回到前台还会自动重新拉起并弹窗说明中断原因。
- HDS 设计套件 — 沉浸光感、模糊标题栏、自适应背景材质等等
- 亮/暗主题跟随 — 自动跟随系统色彩模式
- 大屏适配 — 折叠屏展开 / 平板全屏铺满,无平行视界空白
- 纯 ArkTS 实现 — Blowfish 加密全程 ArkTS 运算,零原生依赖
针对使用中的细节,还进行了多处工程优化:
- 同相机多设备可区分 — 每次安装自动生成唯一配对名称(
HarmoNiLink-XXXX),写入相机并显示在相机端已配对列表,多台手机同时配对同一台相机时互不混淆;连接页可随时查看本机名称。 - 智能扫描分组 — 扫描时通过蓝牙广播中的服务特征(0xDE00)自动识别尼康相机并置顶分组,手机、耳机、打印机等其他设备收进折叠区——多相机、嘈杂环境一目了然,不再大海捞针。
- 配对冲突指引 — 当相机端正在等待另一台已配对设备时(多台手机配对过同一台相机),App 会提示在相机「已配对设备」中切换当前设备。
- 克制的评分引导 — 仅在应用真正交付价值后(首次成功下发 GPS 满一定时间、且近期连接健康)弹出邀请,并采取间隔策略确保一段时间内不再弹出。
- 相机开启蓝牙配对模式,手机开启蓝牙与定位功能,打开应用后按照页面指引完成相机的蓝牙搜索与配对
- 在连接页面打开对应相机的连接开关,应用会自动持续向相机下发 GPS 坐标信息。GPS 信息可以在相机「连接至智能设备」-「位置数据(智能设备)」中查看
- 相机拍摄照片时将自动记录获取到的位置信息到 RAW/JPG 的元数据,便于后期整理分类
| 平台 | 要求 |
|---|---|
| 手机 / 平板 | HarmonyOS NEXT(运行要求 API 23 / SDK 6.1.0 及以上;构建于 SDK 26.0.0 · API 26) |
| 相机 | 尼康 Z 系列(Z 6II、Z 7II、Z 8、Z 9、Z f 等)与 D 系列(D5600 等支持蓝牙接收定位信息的机型) |
✅ Z 6II、D5600 真机验证通过;其他型号欢迎测试反馈。
| 权限 | 用途 | 说明 |
|---|---|---|
| 蓝牙(发现附近设备) | 扫描、配对、连接相机 | 首次扫描时申请 |
| 位置(精确位置) | 向相机下发 GPS 坐标 | 首次扫描时申请,请在弹窗中选择精确位置 |
| 后台定位(始终允许) | 相机休眠 / 应用在后台时持续下发 GPS | 可选。首次授予定位权限后,应用会主动弹出系统授权引导,按提示即可设为「始终允许」,可随时跳过(会略微增加耗电);也可之后在系统设置中手动修改 |
后台定位未开启时:连接保持,但应用切到后台后 GPS 停止下发,回到前台自动恢复。
entry/src/main/ets/
├── ble/
│ ├── BleClient.ets — GATT 客户端
│ ├── BleEvent.ets — 会话级 BLE 事件定义
│ ├── BleScanner.ets — BLE 设备扫描
│ └── protocol/
│ ├── NikonPairingEngine.ets — 4 阶段配对握手
│ ├── PairingMessage.ets — 17 字节配对消息编解码
│ ├── BlowfishHasher.ets — Blowfish hash(纯 ArkTS)
│ ├── GeoPayloadGenerator.ets — 41 字节 GPS 载荷
│ └── TimePayloadGenerator.ets — 时间载荷
├── pages/
│ ├── MainPage.ets — 标签页容器
│ ├── PairingPage.ets — 扫描 & 配对
│ └── ConnectionPage.ets — 连接状态 & 设备管理
├── components/
│ ├── DeviceHealthSheet.ets — 设备信息 & 连接健康度看板
│ ├── AboutSheet.ets — 关于面板
│ └── CommentDialog.ets — 应用市场评价弹窗
├── service/
│ ├── CameraService.ets — 多相机连接 Hub(会话/共享扫描/互斥/状态广播)
│ ├── CameraSession.ets — 单相机会话:连接/握手/重连退避
│ ├── ConnectionTypes.ets — 共享连接状态定义(解耦 Hub 与页面的循环依赖)
│ ├── ClassicBonding.ets — 经典蓝牙绑定协调器
│ ├── GpsData.ets — 共享 GPS 状态对象(@Observed 响应式)
│ ├── GpsDispatcher.ets — GPS 单时钟分发(TIME/GEO 轮写)
│ ├── BackgroundTaskKeeper.ets — 长时任务生命周期 & 中断提醒
│ ├── PermissionsGateway.ets — 按需权限申请
│ ├── SlaHub.ets — 连接健康度追踪注册表
│ └── RatingPrompt.ets — 评分弹窗门槛
├── data/
│ ├── PreferencesRepository.ets — 已配对设备 & 控制器名称持久化
│ └── SlaTracker.ets — 健康度时间轴(2h 环形槽)
└── entryability/
└── EntryAbility.ets — 入口 & 生命周期
| 层 | 技术 |
|---|---|
| UI | ArkTS / ArkUI · @kit.UIDesignKit |
| BLE | @ohos.bluetooth.ble · @ohos.bluetooth.connection |
| 定位 | @kit.LocationKit |
| 后台 | backgroundTaskManager — BLUETOOTH_INTERACTION · LOCATION |
| 构建 | hvigor-ohos-plugin 6.26.4 · arm64-v8a |
Base UUID: 0000xxxx-3dd4-4255-8d62-6dc7b9bd5561
Service 0xDE00
├── 0x2000 (PAIR) 配对握手 — Blowfish 3 阶段 17 字节消息
├── 0x2002 (ID) 写入控制器名称(HarmoNiLink-XXXX)— 32 字节 ASCII
├── 0x2007 (GEO) 写入 41 字节 GPS 载荷
└── 0x2008 (NOT1) 通知通道 — 相机状态
- 加密:Blowfish/ECB/NoPadding · 密钥
FF FF AA 55 11 22 33 00 - Hash:自定义 CBC-MAC(Big-Endian 32-bit word 级)
- GEO 载荷:WGS-84 · 经纬度/海拔/卫星数/UTC · 41 字节
环境:DevEco Studio 或 Command Line Tools for HMOS,SDK 26.0.0(API 26),hvigor-ohos-plugin 6.26.4。构建产物兼容 API 23(SDK 6.1.0)及以上设备(compatibleSdkVersion 6.1.0(23))。
make hap # 开发调试 — 未签名 .hap
make app # 未签名 .app
make build # 两个都构建
make sign # 构建 + 双层签名 → .hap + .app(需先 cp .env.example .env 并填密码)
make clean # 清理构建产物产物 (make sign 后):
build/outputs/default/HarmoNiLink-default-signed.hap— 签名模块包build/outputs/default/HarmoNiLink-default-signed.app— 签名应用包
需要使用 API 24 工具链构建?检出到 v2.4.2 标签即可:
git checkout v2.4.2(最后一个以 SDK 6.1.1 · API 24 构建的版本,compatibleSdkVersion 相同)。
1.x — 单相机连接:围绕「一台手机对一台相机的稳定链路」迭代。实现基础功能,逐步补齐断连自动恢复、D 系列适配、扫描分组与稳定性优化,完成蓝牙接口升级。
- v1.0 — 初版发布,实现基础功能
- v1.1 — 业务模型优化,应用正式改名(NiLink)
- v1.2 — 连接名区别多机,权限交互改进
- v1.3 — 断连自动恢复,实现长时连接
- v1.4 — 尼康 D 系列支持,蓝牙连接优化
- v1.5 — 蓝牙扫描分组,尼康设备识别
- v1.6 — 业务稳定性优化,提升可用性
- v1.7 — 蓝牙接口升级,连接体验优化
2.x — 多相机并行:架构重构支持多台相机同时连接,界面全面改版,引入连接健康看板,打磨体验细节并加固后台连接,实现按场景省电。
- v2.1 — 多设备同时连接,单机稳定体验扩展
- v2.2 — 配对连接页面重构,交互焕新
- v2.3 — 连接健康看板,状态一目了然
- v2.4 — 体验细节打磨,后台连接加固
- v2.5 — GPS 功耗分级,实现按场景省电
本项目为独立重实现
由 skyblond 开发的 Android Kotlin 参考实现(AGPL-3.0)。本项目的协议流程、配对握手、载荷格式均基于其公开的协议分析重新实现。
由 Guo-Rong Koh 开发的 ESP32 多品牌相机遥控器(MIT)。最早逆向 Nikon BLE 智能设备协议并公开文档。
Mulan Permissive Software License v2 © 2026 octopustank



