Commit Graph

13 Commits

Author SHA1 Message Date
km2023
00a17fbd6a fix(sdk): 同步 iOS — transferMedia 入口立即把 _transferProgress 归零
旧实现里 _transferProgress 只在 transferFile() 内部才置 0,但
transferMedia 要先走 validateMediaFormat → aniConverter.convert →
prepareTransfer 这条数秒级异步链,期间 StateFlow 还停留在上次结束
的 100。集成方一 collect 就看到旧值 100,体感像「上次进度被带过来」。

修法:transferMedia 在 ensureConnected() 后立即 _transferProgress.value = 0,
collector 立即收到 0;后续 transferFile() 内的 = 0 因 StateFlow 的
distinct-value 语义被天然跳过。

对齐 ios:ed7de42。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 16:04:44 +08:00
km2023
6bdfa4d39a feat(sdk): 同步 iOS — 日志等级 logLevel 配置化(默认 OFF)
BleLog 之前所有调用都无条件 Log.d/i/w/e,集成方没法关。新增
public enum BleLogLevel(OFF/ERROR/WARN/INFO/DEBUG),通过
DuooomiBleConfig.logLevel 传入,DuooomiBleSDK init 块第一行写入
BleLog.level。默认 OFF 保证对外集成默认静默。

frameIntervalMs 越界 warn 从 DuooomiBleConfig.init 挪到
DuooomiBleSDK init 内、level 设置之后,避免在 level 写入前丢日志。

平台差异:Android 没有 iOS 的 #if DEBUG 编译期消除;默认 OFF 已足够
静默,如需硬剥离 android.util.Log 可在宿主 ProGuard/R8 加
-assumenosideeffects(README 已说明)。

对齐 ios:6ed3c55。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 16:04:27 +08:00
km2023
b3fb02c270 feat(sdk): 同步 iOS — 帧间隔 frameIntervalMs 配置化(默认 35ms)
1:1 复刻 iOS:DuooomiBleConfig 加 frameIntervalMs,BleProtocolService
构造期注入,sendFrames 改用 coerceIn(0,500)。清掉 FRAME_INTERVAL_MS 常量。
demo 加 ConfigField + SharedPreferences 持久化。
越界 warn 字符串与 iOS 逐字一致。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 14:08:22 +08:00
km2023
69435512d5 feat(sdk): 同步 iOS — upgradeFirmware 下发前校验电量 ≥40%,不足抛 BatteryTooLow
1:1 复刻 iOS:OTA 烧录前主动 getDeviceInfo 取实时电量,<40% 抛
DuooomiBleError.BatteryTooLow(current,required)、不发任何字节。
错误消息字符串与 iOS 逐字一致;新增 MIN_BATTERY_FOR_UPGRADE=40。
协程版线性实现(无 callback 拆分)。README 同步错误处理/升级段。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 17:19:34 +08:00
km2023
8d83588e0b feat(sdk): 绑定时上报设备 log 到 update-metadata 并内聚双层绑定
1:1 复刻 iOS commit 4bc8fdb。

- bind(userId) 内聚为硬绑 + getVersion + 软绑 + updateMetadata 一次原子调用,
  软绑失败自动硬解绑回滚 + 清状态;集成方无需感知双层绑定
- fetchLatestFirmware 简化为对账上报 + checkUpgrade 两步,不再重复软绑
- VersionInfo 增加 log: JSONObject?,fromJson 用 optJSONObject 解析;
  SDK 暴露只读 versionLog: StateFlow<JSONObject?>,断连/解绑/软绑回滚时清空
- ShipmentSnDeviceService 新增 updateMetadata(sn, data: JSONObject),
  HttpHelper.post 已支持 JSONObject 作为 body 子节点透传
- 老固件不返回 log → versionLog == null → 自动跳过 updateMetadata,前向兼容
- 同步更新 .wiki/tech-architecture.md(状态清理表 + OTA 编排图)
  + product-decisions.md(新增决策条目)+ README.md(versionLog 状态)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:38:03 +08:00
km2023
c39d107520 feat(demo): SDK 暴露 rawJsonEvents 调试通道;Demo 日志显示 BLE 收发原始 JSON
- BleTypes.kt 新增 BleRawJsonEvent(TX/RX,含 cmd 名/十六进制类型/JSON 字符串),KDoc 标注调试用、非业务契约
- BleProtocolService.sendJSON 内 emit TX;新增 rawJsonEmitter 注入回调避免协议层反向依赖
- DuooomiBleSDK 公开 SharedFlow<BleRawJsonEvent>;handleIncomingMessage 入口尽力 UTF-8 解码 emit RX(非 JSON 字节流静默跳过)
- DemoScreen LaunchedEffect 订阅,前缀 → TX / ← RX 写入现有 logs 列表
- iOS 当前无对应通道,本通道为 Android Demo 调试增强

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 12:03:33 +08:00
km2023
e63865092c feat(sdk): 同步 iOS 改动 — owner→brand 重命名 + 硬绑前 brand 校验 + README 内部细节抹除
- DuooomiBleConfig.owner → brand(语义:设备品牌名),HTTP header x-owner 不变
- bind() 前置 verifyBrand:缺 deviceInfo 先 getDeviceInfo,与 config.brand 严格匹配,
  不一致主动 disconnect 并抛 DuooomiBleError.BrandMismatch
- README 抹除软绑/对账/UpgradeRecord 等内部实现细节,仅保留厂商面向的公开 API
  (功能代码完全保留:fetchLatestFirmware 内部三段串、unbind 软解、tryReportPendingUpgrade)
- README 顶部加 demo 优先验证提示

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 12:03:26 +08:00
km2023
0dbfab9519 fix: 流程对齐 iOS 严格 1:1(disconnect 不清 sn/firmwareUpgrade)
发现并修正以下 1:1 复刻偏离:

1. SDK:disconnect 行为
   - iOS:被动断开 / 主动 disconnect 都 **不清** sn / firmwareUpgrade
     · sn 仅在 unbind 成功 / fetchLatestFirmware 软绑失败回滚时清空
     · firmwareUpgrade 仅在 fetchLatestFirmware 成功时覆盖
   - 之前 Android 在两个 disconnect 入口都清,与 iOS 不一致;现已修正

2. Demo:otaFetchUserId / otaFetchSn 进入页面时的初始化
   - iOS:onAppear 时同步默认 userId / 当前 sdk.sn 到字段
   - Android:之前 bind 后才填,进入页面默认空;现已与 iOS 对齐

3. Demo:ConfigField 禁用自动大写 / 自动纠错
   - iOS 用 .autocapitalization(.none).disableAutocorrection(true)
   - Android 加 KeyboardOptions(autoCorrect=false, capitalization=None)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 16:38:37 +08:00
km2023
2dde274578 feat(sdk): OTA 升级流程对齐 expo + 秘钥本地化
主要改动(与 iOS SDK 1:1 对齐):
- 新增 fetchLatestFirmware/upgradeFirmware/tryReportPendingUpgrade
  三段 OTA 接口,对齐 expo bindDeviceWithOrchestration 行为
- bind 仅做硬绑+getVersion,软绑/对账上报/拉最新固件搬到
  fetchLatestFirmware 内部串;软绑失败自动硬解回滚
- unbind 改胖:硬解 + 软解(容错失败仅 warn)
- UpgradeRecord 复合主键 (sn, firmwareId) 持久化(SharedPreferences)
  + sn 级 in-flight 互斥
- 新增 sn / firmwareUpgrade / upgradeRecords StateFlow,集成方
  可观察对账上报结果(reported/outcome 状态)
- DuooomiBleConfig:删 firmwareIdentifier/firmwareStatus,
  改 owner/scanNamePrefix 为必填字段
- 新增 ShipmentSnDeviceService(软绑/软解 HTTP)+
  FirmwareUpgradeService(checkUpgrade/reportSuccess/reportFailure)
  + HttpHelper 共享 POST 工具
- 删 FirmwareInfo + FirmwareService + hasNewerFirmware(旧 API)
- 新增 FirmwareUpgradeCheckResult 模型(含 forceUpgrade 字段)
- BleClient 增加 service UUID 列表 log,便于固件兼容调试
- demo 秘钥移至本地 DemoSecrets.kt(gitignored),模板放 docs/
- demo 改造到新 OTA 流程 + 升级记录展示

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 15:42:04 +08:00
km2023
b4398518a9 feat: PlayMode 切换 + bind/unbind/setPlayMode 携带北京时间
主要改动(与 iOS SDK 1:1 对齐):
- 新增 BeijingTimeProvider:苏宁公开 API → header Date → 本地+8h 三级 fallback;
  5 秒缓存 + Mutex 单飞复用
- 新增 PlayMode enum (SINGLE=0, LOOP=1)
- DeviceInfo 增加可选 loop 字段(旧固件无此字段时为 null)
- DeviceInfoService.bind/unbind/setPlayMode 共用 payload,带 time 字段;
  loop == null 时严格省略 key(与 expo zod.optional 对齐)
- DuooomiBleSDK.setPlayMode(mode, userId):复用 BIND_DEVICE 命令通道,
  isActivated 守卫;成功后自动刷新 deviceInfo
- Demo 增加 Single / Loop 按钮(gated by isActivated)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 15:30:01 +08:00
km2023
ed34c59c35 feat: 增加媒体格式校验,支持 JPEG、PNG、GIF、MP4、WebM、WebP 格式 2026-04-20 16:19:10 +08:00
km2023
18c6f5e098 fix:sdk增加判断是否需要更新的方法 2026-04-13 18:36:59 +08:00
km2023
d655b13416 feat: implement Android BLE SDK with demo app
Complete Android port of duooomi-ios-sdk with 1:1 API parity.
Includes SDK library module and Jetpack Compose demo app.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 12:09:22 +08:00