前言

我这里拿到了文件互传的双端的日志,太长了,就不放出来了,我这里就放我自己分析的

source端(发送端)

文件传输过程详解

17:06:28.695  connectionChange          ← 连接状态变更(已连接)
17:06:28.699  SendFile in               ← 开始发送文件
17:06:28.701  SendFileStub (cmd:0)      ← SA服务端处理发送请求
17:06:28.702  SendManager::SendFile     ← 发送管理器启动
17:06:28.703  GetTrustedDeviceList      ← 获取可信设备列表
17:06:28.712  GetNetWorkId success      ← 获取网络ID成功

17:06:32.624  SyncSendTask sessionId=1  ← 同步发送任务(会话1)
17:06:32.675  OnSessionOpened_send      ← 会话1建立成功 (dataType=1, 控制通道)
17:06:32.732  OnMessageReceived_send    ← 收到对端响应 (dataLen=7)

17:06:39.015  OpenSessionAndSendFile    ← 等待打开文件传输会话
17:06:40.016  waiting 2000ms            ← 等待2秒
17:06:41.017  waiting 3000ms            ← 等待3秒
17:06:41.748  OnSessionOpened_send      ← 会话2建立成功 (dataType=3, 数据通道)

17:06:41.749  OnSending → sendChange    ← UI更新:发送中
17:06:43.036  OnSendFileProcess         ← 传输进度:451644/451644 ✅
17:06:43.037  OnSendFileFinished        ← 文件发送完成!
              file = IMG_1501837626_000.jpg
17:06:43.042  SetSendStopFlag           ← 设置停止标志
17:06:43.047  Disconnect                ← 主动断开连接
17:06:48.164  connectionChange          ← 连接已断开

双通道传输架构

日志中可以清晰看到 OpenHarmony 文件互传使用了双通道架构

会话 sessionId dataType 用途 建立时间
会话1 1 1 (控制通道) 传输控制信令、协商 17:06:32
会话2 2 3 (数据通道) 传输实际文件数据 17:06:41

流程:

控制通道(sessionId=1)建立 → 发送协商消息(dataLen=7) → 等待对端准备 → 数据通道(sessionId=2)建立 → 传输文件

完整流程图

用户操作                         系统行为
────────                        ────────
                                GetShareOpenTime 周期查询 ✅
                                ↓
用户点击"发送文件"  ←─────────── StartScan 扫描设备
                                ↓
                            OnDeviceFound ×15+ (发现设备) ✅
                                ↓
用户选择目标设备  ←──────────── StopScan
                                ↓
                            Connect → BindDevice
                                ↓
                            ❌ Auth Failed (status:8) 超时
                                ↓
                            ❌ Auth Failed (status:12) 异常
                                ↓
(接收端用户确认连接)  ←──────── authStateChange
                                ↓
                            ✅ Auth Success (status:7)
                                ↓
                            connectionChange (已连接)
                                ↓
用户选择文件发送  ←──────────── SendFile
                                ↓
                            建立控制通道 (sessionId=1, dataType=1)
                                ↓
                            发送协商消息 → 收到响应
                                ↓
                            等待1s → 2s → 3s
                                ↓
                            建立数据通道 (sessionId=2, dataType=3)
                                ↓
                            OnSending (传输中...)
                                ↓
                            OnSendFileProcess 451644/451644 ✅
                                ↓
                            OnSendFileFinished IMG_1501837626_000.jpg ✅
                                ↓
                            SetSendStopFlag
                                ↓
                            Disconnect (主动断开)
                                ↓
                            connectionChange (已断开)

Note

中间组网认证失败了两次,那个可能是测试那边没有在对端点确认链接导致超时了,不是错误。

sink端(接收端)

完整时间线

时间	事件	状态
20:03:16	CountdownTimer 开始(578秒)	✅
20:03:20~04:30	GetShareOpenTime 周期查询(每5秒)	✅
20:03:32	NAPI 模块加载 + CreateShareManager	✅
20:03:35	ConfirmConnect 确认连接	✅
20:03:53	authStateChange(第1次)	🔄 认证中
20:03:59	authStateChange(第2、3次)	🔄 认证中
20:04:05	connectionChange ×2	✅ 连接建立
20:04:09	OnSessionOpened_recv sessionId=1, dataType=1	✅ 控制通道建立
20:04:09	OnMessageReceived_recv 收到文件元信息	✅
20:04:09	OnSessionClosed_recv sessionId=1	✅ 控制通道关闭
20:04:17	OnSessionOpened_recv sessionId=2, dataType=3	✅ 数据通道建立
20:04:18	OnReceiveFileStarted 开始接收文件	✅
20:04:18	OnReceiveFileProcess 451644/451644	✅ 接收完成
20:04:18	OnReceiveFileFinished hash校验OK	✅
20:04:19	Handle media asset ok 媒体入库完成	✅
20:04:20	OnSessionClosed_recv sessionId=2	✅ 数据通道关闭
20:04:22	加载 fileshare 模块(图库应用)	✅
20:04:32	🔴 SCREEN_LOCKED → DisableShare failed	❌
20:04:32	ChangeUuid ×3	🔄 清理中

关键细节:文件接收过程

控制通道---接收文件元信息

20:04:09.636  OnSessionOpened_recv sessionId=1, dataType=1  ← 控制通道建立
20:04:09.687  OnMessageReceived_recv sessionId=1, dataLen=501

收到的JSON消息内容

{
  "deviceId": "b5cd1e6ebc24849c",
  "deviceName": "OpenHarmony 3.2",
  "files": [{
    "name": "Screenshot_1501837525983.jpg",
    "origFileName": "IMG_1501837626_000.jpg",
    "path": "/mnt/hmdfs/100/account/cloud_merge_view/files/Photo/16/IMG_1501837626_000.jpg",
    "size": 451644,
    "uri": "file://media/Photo/1/IMG_1501837626_000/Screenshot_1501837525983.jpg",
    "utd": "general.jpeg"
  }],
  "networkId": "3e3eac6b2808b5670dc1ae04104020bf419a8c25031cd2fae35f71377b8cc7ad",
  "shareType": 1
}

这里可以看到:

  • 发送端设备名:OpenHarmony 3.2
  • 文件:IMG_1501837626_000.jpg(451,644 字节)
  • 文件类型:general.jpeg
  • shareType=1 表示单文件分享

存储路径协商

20:04:09.694  ⚠️ GetHapTokenInfo error code: 12100001
20:04:09.694  ⚠️ GetStoragePath preferences failed, return default path
20:04:09.700  storage path = /mnt/hmdfs/100/account/device_view/local/files/Docs/Share

前面虽然获取HAP的token信息失败,但是降级处理走default成功了,不影响。

数据通道---文件传输

20:04:17.056  OnSessionOpened_recv sessionId=2, dataType=3  ← 数据通道建立
20:04:17.057  OnSending → sendChange                        ← UI更新:接收中

20:04:18.794  OnRenameFile → IMG_1501837626_000.jpg         ← 文件重命名确认
20:04:18.794  OnReceiveFileStarted sessionId=2              ← 开始接收
20:04:18.796  OnSending → sendChange                        ← UI更新

20:04:18.866  OnReceiveFileProcess 451644/451644            ← 接收进度100%
20:04:18.867  OnReceiveFileFinished sessionId=2             ← 接收完成
20:04:18.867  Check recv file hash ok ✅                    ← Hash校验通过

20:04:19.117  HandleMediaAsset share album id=11            ← 媒体入库
20:04:19.998  Handle media asset ok ✅                      ← 入库完成

20:04:20.025  OnSessionClosed_recv sessionId=2              ← 数据通道关闭

文件传输耗时极短:从 18.794 到 18.866,仅 72ms 就完成了 441KB 文件的接收。

屏幕锁定导致disableshare失败

这时候文件传输已经完毕,广播停止了,应该影响不大,后面我问一下。

20:04:32.621  OnReceiveEvent common event=usual.event.SCREEN_LOCKED  ← 屏幕锁定
20:04:32.621  DisableShare in                                         ← 尝试关闭共享
20:04:32.621  GetShareStatus (cmd:5)                                  ← 查询当前状态
20:04:32.622  ChangeUuid                                              ← 更新UUID
20:04:32.630  UnPublishDeviceDiscovery                                ← 取消设备发布
20:04:32.632  StopAdvertising publishId=4082                          ← 停止广播
20:04:32.633  ❌ DisableShare failed, ret 96929749                   ← 关闭共享失败!
20:04:32.633  ChangeUuid                                              ← 再次更新UUID

两端流程对照

阶段 Source(发送端) Sink(接收端)
准备 GetShareOpenTime 查询 CountdownTimer 倒计时 + GetShareOpenTime
初始化 StartScan 扫描 NAPI加载 + CreateShareManager
发现 OnDeviceFound ×15+
连接 Connect → BindDevice ConfirmConnect
认证 ❌ Failed ×2 → ✅ Success authStateChange ×3
连接建立 connectionChange ×2
控制通道 OnSessionOpened_send (id=1, type=1) OnSessionOpened_recv (id=1, type=1)
文件元信息 OnMessageReceived_send (dataLen=7) OnMessageReceived_recv (dataLen=501)
数据通道 OnSessionOpened_send (id=2, type=3) OnSessionOpened_recv (id=2, type=3)
文件传输 OnSendFileProcess 451644/451644 OnReceiveFileProcess 451644/451644
传输完成 OnSendFileFinished IMG_1501837626_000.jpg OnReceiveFileFinished hash ok ✅
媒体入库 HandleMediaAsset → ok ✅
断开 Disconnect OnSessionClosed_recv
后续 🔴 SCREEN_LOCKED → DisableShare failed

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐