更新记录

1.0.0(2026-08-25)

1.0.0

  • 首次发布。
  • 支持 uni-app 与 uni-app x。
  • 支持 Android、iOS、HarmonyOS。
  • 提供扫描、初始化、开关锁、密码、IC 卡、指纹、人脸和 WiFi 等 38 项门锁能力。
  • 提供统一错误码、持续事件监听和平台能力检测。

平台兼容性

uni-app(5.15)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- × × -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(5.15)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 ×

HF TTLock 通通锁蓝牙门锁插件使用说明

hf-ttlock 是面向 uni-app 与 uni-app x 的 UTS API 插件,用于在 Android、iOS 和 HarmonyOS App 中通过蓝牙操作兼容的 TTLock 门锁。插件提供扫描、初始化、开关锁、时间、电量、操作记录、密码、IC 卡、指纹、人脸、WiFi、远程开锁开关等 38 项能力。

本插件是第三方 UTS 封装,不是 TTLock 官方产品。插件只封装端侧 SDK,不包含 TTLock 云平台账号、网关远程开锁、业务服务器或门锁数据托管服务。

运行环境

项目类型 / 授权 Android iOS HarmonyOS
uni-app 普通授权版(加密) 支持 支持 不支持发行
uni-app 源码授权版 支持 支持 支持
uni-app x 普通授权版(加密) 支持 支持 支持
uni-app x 源码授权版 支持 支持 支持
  • 推荐使用 HBuilderX 5.23 或更高版本。
  • 最低要求为 HBuilderX、uni-app 或 uni-app x 5.15。
  • Android 5.0(API 21)及以上。
  • iOS 11.0 及以上。
  • HarmonyOS API 17(HarmonyOS 5.0.5)及以上。
  • 仅支持 App,不支持 Web、小程序和快应用。
  • 普通 uni-app 的 Vue 2 项目可用于 Android 和 iOS;普通 uni-app 如需发行 HarmonyOS,应使用 Vue 3。

普通 uni-app 的加密付费插件目前不能发行到 HarmonyOS。如需在普通 uni-app 项目中使用 HarmonyOS 实现,请购买源码授权版。具体规则以 DCloud UTS 插件发布说明 为准。

安装插件

  1. 将插件安装到项目的 uni_modules 目录。
  2. 确认插件目录为 uni_modules/hf-ttlock
  3. 在 HBuilderX 中重新运行或构建 App。
  4. 真机调试前完成蓝牙权限、HarmonyOS ACL 权限及签名配置。

请从插件根目录导入 API,不要直接导入 utssdk 内部文件:

import {
  checkReady,
  requestBleEnable,
  onScanLock,
  offScanLock,
  startScanLock,
  stopScanLock,
  initLock,
  getCapabilities,
  unlock,
  lock
} from '@/uni_modules/hf-ttlock'

所有异步 API 均使用 successfail 回调,不返回 Promise。

基本使用流程

1. 检查运行环境

checkReady({
  success(result) {
    console.log('运行平台:', result.platform)
    console.log('蓝牙状态:', result.isBleEnabled)
    console.log('SDK 状态:', result.sdkPrepared)

    if (!result.isBleEnabled) {
      requestBleEnable({
        success(enableResult) {
          console.log('蓝牙开启请求结果:', enableResult)
        },
        fail(error) {
          console.error(error.errCode, error.errMsg)
        }
      })
    }
  },
  fail(error) {
    console.error(error.errCode, error.errMsg)
  }
})

调用扫描前,应用还需要按系统要求申请蓝牙相关运行时权限。requestBleEnable 用于请求开启蓝牙,不能代替系统权限申请。

2. 扫描附近门锁

应先注册监听,再启动扫描:

onScanLock((event) => {
  if (event.event == 'deviceFound' && event.device != null) {
    const device = event.device
    console.log(device.scanId)
    console.log(device.deviceName)
    console.log(device.lockMac)
    console.log(device.rssi)
    console.log(device.isSettingMode)
  }

  if (event.event == 'failed' && event.error != null) {
    console.error(event.error.errCode, event.error.errMsg)
  }
})

startScanLock({
  timeout: 15000,
  success(result) {
    console.log('扫描已启动:', result.started)
  },
  fail(error) {
    console.error(error.errCode, error.errMsg)
  }
})

只允许初始化用户有权管理且处于设置模式的门锁。扫描结束或页面退出时停止扫描并取消监听:

stopScanLock({})
offScanLock()

3. 初始化门锁

把扫描结果中的 scanIdlockMac 传给 initLock

initLock({
  scanId: selectedDevice.scanId,
  lockMac: selectedDevice.lockMac,
  timeout: 20000,
  success(result) {
    console.log('门锁初始化成功:', result.lockMac)

    // 请立即把 result.lockData 和 result.lockMac 安全保存到业务系统。
    // 不要把 lockData 输出到生产日志或明文存储。
  },
  fail(error) {
    console.error(error.errCode, error.errMsg)
  }
})

lockData 是门锁鉴权所需的敏感数据。除初始化外,大多数门锁操作都需要显式传入以下上下文:

const context = {
  lockData: '初始化或业务服务器返回的 lockData',
  lockMac: 'AA:BB:CC:DD:EE:FF'
}

每次调用都传入对应门锁的上下文,可避免多把门锁并发使用时串用凭据。

4. 查询门锁能力

不同门锁型号和固件支持的功能可能不同。展示密码、人脸、WiFi、常开模式等入口前,建议先查询能力:

getCapabilities({
  context,
  success(result) {
    console.log('密码:', result.supportsPasscode)
    console.log('IC 卡:', result.supportsICCard)
    console.log('指纹:', result.supportsFingerprint)
    console.log('人脸:', result.supportsFace)
    console.log('WiFi:', result.supportsWifi)
    console.log('远程开锁开关:', result.supportsRemoteUnlockSwitch)
    console.log('常开模式:', result.supportsPassageMode)
  },
  fail(error) {
    console.error(error.errCode, error.errMsg)
  }
})

5. 开锁和关锁

unlock({
  context,
  timeout: 15000,
  success(result) {
    console.log('开锁成功:', result.lockMac)
    console.log('门锁时间:', result.lockTime)
    console.log('剩余电量:', result.electricQuantity)
  },
  fail(error) {
    console.error(error.errCode, error.errMsg, error.nativeCode)
  }
})

lock({
  context,
  success(result) {
    console.log('关锁成功:', result.lockMac)
  },
  fail(error) {
    console.error(error.errCode, error.errMsg)
  }
})

同一时刻只执行一个蓝牙门锁操作。不要并行调用开锁、关锁、凭证管理或配置类接口。

凭证录入示例

新增 IC 卡、指纹或人脸前,应注册统一的进度监听。以下示例录入一张有效期为 7 天的 IC 卡:

import {
  onCredentialProgress,
  offCredentialProgress,
  addICCard
} from '@/uni_modules/hf-ttlock'

onCredentialProgress((event) => {
  console.log(event.kind, event.event, event.currentCount, event.totalCount)

  if (event.event == 'completed' ||
      event.event == 'failed' ||
      event.event == 'cancelled') {
    offCredentialProgress()
  }
})

const startDate = Date.now()
const endDate = startDate + 7 * 24 * 60 * 60 * 1000

addICCard({
  context,
  startDate,
  endDate,
  success(result) {
    console.log('IC 卡编号:', result.cardNumber)
  },
  fail(error) {
    offCredentialProgress()
    console.error(error.errCode, error.errMsg)
  }
})

startDateendDatetimestamplockTime 均使用 Unix 毫秒时间戳。

WiFi 配置示例

scanWifiByLock 是让门锁扫描附近 WiFi,并非读取手机系统的 WiFi 列表。配置时,SSID 和密码会通过蓝牙发送给当前门锁。

import {
  scanWifiByLock,
  configWifi
} from '@/uni_modules/hf-ttlock'

scanWifiByLock({
  context,
  success(result) {
    console.log('门锁扫描到的网络:', result.networks)
  },
  fail(error) {
    console.error(error.errCode, error.errMsg)
  }
})

configWifi({
  context,
  ssid: 'WiFi 名称',
  password: 'WiFi 密码',
  success(result) {
    console.log('WiFi 配置完成:', result.ssid)
  },
  fail(error) {
    console.error(error.errCode, error.errMsg)
  }
})

请勿记录或上传 WiFi 密码。setRemoteUnlockSwitch 只配置门锁的远程开锁开关,不提供网关或云端远程开锁服务。

API 列表

功能分类 API
环境与能力 checkReadyrequestBleEnablegetCapabilities
扫描与初始化 onScanLockoffScanLockstartScanLockstopScanLockinitLock
门锁操作 unlocklockresetLockgetLockTimecalibrateLockTimegetOperationLoggetBattery
密码 createPasscoderesetPasscodesmodifyPasscodedeletePasscodegetAllValidPasscodes
凭证监听 onCredentialProgressoffCredentialProgress
IC 卡 addICCardmodifyICCardValiditygetAllValidICCardsdeleteICCardclearAllICCards
指纹 addFingerprintmodifyFingerprintValiditygetAllValidFingerprintsdeleteFingerprintclearAllFingerprints
人脸 addFacemodifyFaceValiditygetAllValidFacesdeleteFaceclearAllFaces
WiFi 与远程开锁开关 scanWifiByLockconfigWificonfigServergetWifiInfoconfigIPgetRemoteUnlockSwitchsetRemoteUnlockSwitch
其他 setPassageModestopBTService

完整参数和返回类型以插件中的 utssdk/interface.uts 为准。

权限配置

Android

插件声明以下权限:

  • Android 11 及以下:BLUETOOTHBLUETOOTH_ADMIN、定位权限。
  • Android 12 及以上:BLUETOOTH_SCANBLUETOOTH_CONNECTBLUETOOTH_ADVERTISE

蓝牙扫描和连接权限需要在运行时申请。旧版 Android 的 BLE 扫描与系统定位权限相关,应用应向用户说明权限用于发现和连接附近门锁。

iOS

插件提供以下用途说明键:

  • NSBluetoothAlwaysUsageDescription
  • NSBluetoothPeripheralUsageDescription

首次访问蓝牙时系统会展示用途说明。正式应用可在打包配置中使用更贴合业务的文案,但应准确说明蓝牙用途。

HarmonyOS

插件声明以下权限:

  • ohos.permission.ACCESS_BLUETOOTH
  • ohos.permission.PERSISTENT_BLUETOOTH_PEERS_MAC

PERSISTENT_BLUETOOTH_PEERS_MAC 是受限 ACL 权限。使用 HarmonyOS 版本前必须:

  1. 在 AppGallery Connect 中为实际应用包名申请该 ACL 权限。
  2. 审批通过后重新创建包含该权限的调试或发布 Profile。
  3. 确认调试 Profile 同时绑定当前证书和测试设备。
  4. 在 HBuilderX 中换用新 Profile 后重新构建。

Profile 未包含该权限时,即使项目编译成功,HAP 也可能因授权失败而无法安装。

错误码

所有失败回调返回实现 IUniError 的错误对象。常用字段包括 errCodeerrMsgoperationplatformnativeCode

错误码 含义 建议处理
9019001 参数不合法 检查必填字段、时间范围、端口和超时值
9019002 蓝牙权限被拒绝 说明用途后引导用户到系统设置授权
9019003 蓝牙关闭或不可用 请求或引导用户开启蓝牙
9019004 未找到门锁 靠近门锁,确认设置模式后重新扫描
9019005 存在进行中的蓝牙操作 等待当前操作结束后重试
9019006 操作超时 靠近门锁后进行有限次数重试
9019007 操作取消 恢复页面状态,通常无需提示为故障
9019008 门锁不支持该能力 使用 getCapabilities 隐藏或禁用入口
9019009 TTLock SDK 操作失败 记录非敏感上下文和 nativeCode 后提示重试
9019010 SDK 尚未就绪 先调用 checkReady 并等待初始化完成
9019011 门锁上下文缺失或无效 重新获取有效的 lockDatalockMac
9019012 当前平台不可用 检查平台、项目类型和授权版本

nativeCode 仅用于定位三方 SDK 错误,不应作为跨平台业务逻辑的唯一判断条件。

安全与使用注意事项

  • lockData 应按门锁密钥材料管理,使用系统安全存储或加密后端保存。
  • 不要把 lockData、门锁密码、WiFi 密码或完整错误详情写入日志、埋点和崩溃上报。
  • 不要仅使用门锁 MAC 作为身份认证依据。
  • 初始化、重置门锁、重置密码、清空凭证等高风险操作应增加业务权限校验和二次确认。
  • 扫描以及 IC 卡、指纹、人脸录入属于持续事件;页面退出、任务完成或失败后必须取消对应监听。
  • 门锁型号和固件决定具体功能是否可用,接入前请使用 getCapabilities 检查。
  • 插件自身不建立账号,也不会把业务数据上传到插件作者服务器;接入方仍需根据实际业务完成隐私合规评估和披露。

常见问题

扫描不到门锁

确认手机蓝牙和系统权限已开启,靠近门锁,并确认待初始化门锁处于设置模式。已初始化的门锁可能不会以可初始化状态出现。

收到 9019005

当前已有蓝牙操作正在执行。等待该操作成功、失败或超时后再发起下一项操作,不要并行发送命令。

HarmonyOS 编译成功但无法安装

重点检查签名 Profile 是否包含 ohos.permission.PERSISTENT_BLUETOOTH_PEERS_MAC,以及 Profile 是否绑定当前证书和测试设备。

某项凭证或 WiFi 功能不可用

先调用 getCapabilities。插件提供统一接口,但不能让门锁获得硬件或固件本身不支持的功能。

是否支持云端远程开锁

不支持。本插件负责手机与门锁之间的端侧蓝牙能力;云平台、网关、业务后台和远程开锁链路需要接入方另行实现。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android:BLUETOOTH、BLUETOOTH_ADMIN、ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION(Android 11及以下),BLUETOOTH_SCAN、BLUETOOTH_CONNECT、BLUETOOTH_ADVERTISE(Android 12及以上),用于发现、连接和操作附近的蓝牙门锁。 iOS:NSBluetoothAlwaysUsageDescription、NSBluetoothPeripheralUsageDescription,用于发现、连接和操作附近的蓝牙门锁。 HarmonyOS:ohos.permission.ACCESS_BLUETOOTH、ohos.permission.PERSISTENT_BLUETOOTH_PEERS_MAC,用于发现并连接蓝牙门锁。后者属于受限ACL权限,应用Profile也必须获批并包含该权限。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件本身不建立账号,不向插件作者服务器发送数据,也未内置插件作者服务器地址。插件及TTLock SDK会在设备本地处理蓝牙广播、设备名称、RSSI、门锁MAC、lockData、门锁时间、电量、操作记录及凭证编号。 用户主动配置WiFi时,会通过蓝牙将SSID和密码发送给所选门锁;配置服务器时,会将用户填写的服务器地址、端口或IP写入门锁。接入方应在自身App隐私政策中如实披露,并避免记录lockData、门锁密码和WiFi密码。第三方TTLock SDK的数据处理同时受其相关条款约束。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无。插件不包含广告SDK、广告位、推广弹窗,也不会展示广告。

暂无用户评论。