蓝牙门锁

更新时间:2023-06-12 06:43:52下载pdf

使用说明

类名 说明
TuyaOptimusSdk 初始化 SDK 入口,用来获取门锁管理类
ITuyaLockManager 门锁管理类,可以获取不同类型的门锁类
ITuyaBleLock 蓝牙门锁类,所有蓝牙门锁相关方法都在其中

示例代码

通过设备 ID 创建蓝牙门锁类。

// 初始化 SDK,仅需要调用一次
TuyaOptimusSdk.init(getApplicationContext());
// 获取 ITuyaLockManager
ITuyaLockManager tuyaLockManager = TuyaOptimusSdk.getManager(ITuyaLockManager.class);
// 创建 ITuyaBleLock
ITuyaBleLock tuyaLockDevice = tuyaLockManager.getBleLock(your_device_id);

名词解释

名词列表 说明
门锁劫持 指将特定的指纹、密码等,设置为劫持密码,当用户被劫持,并使用该密码开锁时,门会打开。同时,门锁将开门报警信息发送至家人手机或物业管理系统。
门锁成员 门锁成员分为 家庭成员非家庭成员
  • 家庭成员:涂鸦智能生活 App SDK 中的家庭成员概念。门锁 SDK 将对应的门锁密码编号与该账号关联起来。相关管理操作,请参考 家庭管理
  • 非家庭成员:即为门锁设备单独的成员,仅跟随设备关联。用户可以创建并分配,门锁 SDK 将对应的门锁密码编号与该成员关联起来。
lockUserId 创建门锁成员时,云端为设备分配的固件成员 ID,代表着固件内记录的用户 ID。
userId 创建门锁成员时,云端分配的数据库记录 ID,代表着用户的唯一 ID。
dpCode 设备功能的标识符。每个设备功能都有名称和编号,请参考下文 门锁功能列表

门锁成员

本小节主要介绍门锁成员中 非家庭成员 的管理操作。

获取门锁成员

接口说明

/**
 * get lock users
 */
public void getLockUsers(final ITuyaResultCallback<List<BLELockUser>> callback)

BLELockUser 数据模型

字段 类型 描述
userId String 用户 ID
lockUserId Integer 门锁中的用户 ID
userContact String 联系方式
nickName String 昵称
avatarUrl String 头像 URL
userType Integer 用户类型
  • 10:管理员
  • 20:普通家庭用户
  • 30:门锁用户
supportUnlockTypes List 支持的解锁类型,可以查看 TuyaUnlockType 中的解锁方式
effectiveTimestamp Long 用户生效时间戳,单位 ms
invalidTimestamp Long 用户失效时间戳,单位 ms

示例代码

tuyaLockDevice.getLockUsers(new ITuyaResultCallback<List<BLELockUser>>() {
    @Override
    public void onError(String code, String message) {
        Log.e(TAG, "get lock users failed: code = " + code + "  message = " + message);
    }

    @Override
    public void onSuccess(List<BLELockUser> user) {
        Log.i(TAG, "get lock users success: lockUserBean = " + user);
    }
});

创建门锁成员

创建非家庭成员,以供后续开锁记录关联操作。

该接口创建的是非家庭成员。有关家庭成员的管理,请参考 家庭管理

蓝牙门锁

接口说明

/**
 * add lock user
 *
 * @param userName           userName
 * @param allowedUnlock      Whether allowed unlock with bluetooth
 * @param permanent          Whether the user is permanent
 * @param effectiveTimestamp User effective time
 * @param invalidTimestamp   User invalid time
 * @param avatarFile         avatar
 * @param callback           callback
 */
void addLockUser(final String userName, boolean allowedUnlock, boolean permanent, long effectiveTimestamp, long invalidTimestamp, File avatarFile, final ITuyaResultCallback<Boolean> callback);

参数说明

参数 说明
userName 用户名称
allowedUnlock 是否允许用户使用蓝牙开锁
unlockType 解锁方式,可查看 TuyaUnlockType
permanent 是否是永久用户
effectiveTimestamp 非永久用户(permanent 取值为 false 的用户)的生效时间戳,单位 ms
invalidTimestamp 非永久用户(permanent 取值为 false 的用户)的失效时间戳,单位 ms
avatarFile 用户头像文件

示例代码

tuyaLockDevice.addLockUser("your_user_name", true, true, 0, 0, null, new ITuyaResultCallback<Boolean>() {
    @Override
    public void onError(String code, String message) {
        Log.e(TAG, "add lock user failed: code = " + code + "  message = " + message);
    }

    @Override
    public void onSuccess(Boolean result) {
        Log.i(TAG, "add lock user success");
    }
});

更新门锁成员

更新门锁成员信息,包括用户名、头像、解锁密码对应关系等。更新门锁成员会和硬件进行交互,请保持门锁设备的蓝牙连接。

蓝牙门锁

接口说明

/**
 * update lock user
 *
 * @param userId             userId
 * @param userName           userName
 * @param allowedUnlock      Whether allowed unlock with bluetooth
 * @param permanent          Whether the user is permanent
 * @param effectiveTimestamp User effective time
 * @param invalidTimestamp   User invalid time
 * @param avatarFile         avatar
 * @param callback           callback
 */
void updateLockUser(final String userId, boolean allowedUnlock, final String userName, final boolean permanent, long effectiveTimestamp, long invalidTimestamp, File avatarFile, final ITuyaResultCallback<Boolean> callback);

参数说明

参数 说明
userId 用户 ID
allowedUnlock 是否允许用户使用蓝牙开锁
userName 用户名称
permanent 是否是永久用户
effectiveTimestamp 非永久用户(permanent 取值为 false 的用户)的生效时间戳,单位 ms
invalidTimestamp 非永久用户(permanent 取值为 false 的用户)的失效时间戳,单位 ms
avatarFile 用户头像文件

示例代码

tuyaLockDevice.updateLockUser("your_user_id", true, "your_user_name", true, 0, 0, null, new ITuyaResultCallback<Boolean>() {
    @Override
    public void onError(String code, String message) {
        Log.e(TAG, "update lock user failed: code = " + code + "  message = " + message);
    }

    @Override
    public void onSuccess(Boolean aBoolean) {
        Log.i(TAG, "update lock user success");
    }
});

删除门锁成员

删除门锁成员会和硬件进行交互,会删除该用户下所有的开锁方式、密码等,需要门锁保持蓝牙连接。

蓝牙门锁

接口说明

/**
 * delete lock user
 * @param user user bean
 * @param callback  callback
 */
public void deleteLockUser(BLELockUser user, final ITuyaResultCallback<Boolean> callback)

蓝牙连接

蓝牙门锁需要 App 开启蓝牙后,部分功能才能正常使用。

查询蓝牙连接状态

接口说明

SDK 在正常情况下会自动连接,通常使用以下方法进行门锁连接状态判断。

/**
 *  @return if lock online, return true
 */
public boolean isBLEConnected() 

示例代码

boolean online = tuyaLockDevice.isBLEConnected();

门锁连接蓝牙

接口说明

如果查询结果显示门锁未连接蓝牙,调用此接口可以连接到门锁。

/**
 * connect to lock
 *
 * @param connectListener callback BLE lock connect status
 */
public void connect(ConnectListener connectListener)

参数说明

ConnectListener 为设备连接状态回调,其中的 onStatusChanged 将返回连接状态。

示例代码

tuyaLockDevice.connect(new ConnectListener() {
    @Override
    public void onStatusChanged(boolean online) {
        Log.i(TAG, "onStatusChanged  online: " + online);
    }
});

动态密码

在门锁上输入获取到的动态密码即可开锁,动态密码有效时间为五分钟。

接口说明

public void getDynamicPassword(final ITuyaResultCallback<String> callback)

参数说明

参数 说明
callback 接口回调

示例代码

tuyaLockDevice.getDynamicPassword(new ITuyaResultCallback<String>() {
    @Override
    public void onError(String code, String message) {
        Log.e(TAG, "get lock dynamic password failed: code = " + code + "  message = " + message);
    }

    @Override
    public void onSuccess(String dynamicPassword) {
        Log.i(TAG, "get lock dynamic password success: dynamicPassword = " + dynamicPassword);
    }
});

蓝牙解锁和落锁

蓝牙解锁

蓝牙门锁

接口说明

/**
 * unlock the door
 */
public void unlock(String lockUserId)

参数说明

参数 说明
lockUserId 门锁设备中的用户 ID。所有用户在门锁中都会有一个对应的用户 ID。ID 从 1 开始,每添加一个新用户则 ID 自动加一。

示例代码

// "1"是当前用户在门锁设备中的 ID
tuyaLockDevice.unlock("1");

蓝牙落锁

蓝牙门锁

接口说明

蓝牙门锁与 App 连接后,可调用此接口落锁。

/**
 * lock the door
 */
public void lock()

示例代码

tuyaLockDevice.lock();

是否支持远程开门

接口说明

是否支持远程开门。

/**
 * Whether to support remote unlock
 * @param callback callback
 */
void isRemoteUnlockAvailable(IResultCallback callback);

示例代码

tuyaLockDevice.isRemoteUnlockAvailable(new IResultCallback() {
    @Override
    public void onError(String code, String message) {
        Log.e(TAG, "get remote unlock available failed: code = " + code + "  message = " + message);
    }

    @Override
    public void onSuccess() {
        Log.i(TAG, "get remote unlock available success");
    }
});

门锁记录

获取告警记录

接口说明

/**
 * get alarm records
 * @param offset page number
 * @param limit item count
 * @param callback callback
 */
void getAlarmRecords(int offset, int limit, final ITuyaResultCallback<Record> callback);

参数说明

参数 说明
offset 返回的记录页码数
limit 返回的记录条目数

Record 数据模型

字段 类型 描述
totalCount Integer 总条目
hasNext Boolean 是否有下一页
datas List 记录数据内容

DataBean 字段说明

字段 类型 描述
userId String 成员 ID
userName String 用户昵称
unlockType String 解锁类型
devId String 设备 ID
createTime Long 该记录的时间戳
tags Integer 标位
  • 0:表示其他
  • 1:表示劫持报警
unlockRelation UnlockRelation 解锁类型和解锁密码编号的关系实例,如不是开锁记录,可为空

示例代码

tuyaLockDevice. getAlarmRecords(0, 10, new ITuyaResultCallback<Record>() {
    @Override
    public void onError(String code, String message) {
        Log.e(TAG, "get lock records failed: code = " + code + "  message = " + message);
    }

    @Override
    public void onSuccess(Record recordBean) {
        Log.i(TAG, "get lock records success: recordBean = " + recordBean);
    }
});

获取开锁记录

接口说明

/**
 * get unlock records
 * @param unlockTypes unlock type list
 * @param offset page number
 * @param limit item count
 * @param callback callback
 */
void getUnlockRecords(int offset, int limit, final ITuyaResultCallback<Record> callback);

参数说明

参数 说明
offset 返回的记录页码数
limit 返回的记录条目数

示例代码

tuyaLockDevice.getUnlockRecords(0, 10, new ITuyaResultCallback<Record>() {
    @Override
    public void onError(String code, String message) {
        Log.e(TAG, "get unlock records failed: code = " + code + "  message = " + message);
    }

    @Override
    public void onSuccess(Record recordBean) {
        Log.i(TAG, "get unlock records success: recordBean = " + recordBean);
    }
});

解锁方式管理

解锁方式管理包括了添加、修改、删除解锁方式的接口。

添加解锁方式

下图为添加解锁方式的交互过程:
蓝牙门锁

获取解锁方式

接口说明

/**
 * get unlock mode by unlockType
 *
 * @param unlockType unlock type {@link com.tuya.smart.optimus.lock.api.TuyaUnlockType}
 * @param callback callback
 */
void getUnlockModeList(String unlockType, final ITuyaResultCallback<ArrayList<UnlockMode>> callback);

UnlockMode 数据模型

字段 类型 描述
userId String 用户 ID
lockUserId Integer 门锁中的用户 ID
userName String 用户昵称
unlockAttr Integer 解锁方式属性
  • 0:普通密码
  • 1:劫持密码
userType Integer 用户类型
  • 10:管理员
  • 20:普通用户
  • 30:门锁用户
unlockModeId String 当前解锁方式在服务端的 ID
unlockId String 当前解锁方式在门锁中的 ID
unlockName String 当前解锁方式的名称
unlockType String 解锁方式类型,参考 TuyaUnlockType

示例代码

tuyaLockDevice.getUnlockModeList(TuyaUnlockType.PASSWORD, new ITuyaResultCallback<ArrayList<UnlockMode>>() {
    @Override
    public void onSuccess(ArrayList<UnlockMode> result) {
        Log.i(TAG, "getUnlockModeList  onSuccess: " + result);
    }

    @Override
    public void onError(String errorCode, String errorMessage) {
        Log.e(TAG, "getUnlockModeList failed: code = " + errorCode + "  message = " + errorMessage);
    }
});

解锁方式监听

添加、修改、删除开锁方式的接口均为异步调用,监听结果从该接口返回。

接口说明

void setUnlockModeListener(UnlockModeListener unlockModeListener);

其中 UnlockModeListener 中代码如下:

public interface UnlockModeListener {

    /**
     * 解锁方式参数丢失
     */
    int FAILED_STATUS_ILLEGAL_ARGUMENT = -1;
    /**
     * 当前操作不支持此开锁方式
     */
    int FAILED_STATUS_NOT_SUPPORT_UNLOCK_TYPE = -2;
    /**
     * 控制指令发送失败
     */
    int FAILED_STATUS_SEND_ERROR = -3;
    /**
     * 请求服务端失败
     */
    int FAILED_STATUS_REQUEST_SERVER_ERROR = -4;
    /**
     * 指纹不完整
     */
    int FAILED_STATUS_FINGERPRINT_INCOMPLETE = -5;
    /**
     * 服务端响应失败
     */
    int FAILED_STATUS_SERVER_RESPONSE_FAILED = -6;
    /**
     * 门锁响应失败
     */
    int FAILED_STATUS_LOCK_RESPONSE_FAILED = -7;
    /*----以下状态为门锁中定义,创建开锁方式失败的返回码----*/
    int FAILED_STATUS_TIMEOUT = 0x00;
    int FAILED_STATUS_FAILED = 0x01;
    int FAILED_STATUS_REPEAT = 0x02;
    int FAILED_STATUS_LOCK_ID_EXHAUSTED = 0x03;
    int FAILED_STATUS_PASSWORD_NOT_NUMBER = 0x04;
    int FAILED_STATUS_PASSWORD_WRONG_LENGTH = 0x05;
    int FAILED_STATUS_NOT_SUPPORT = 0x06;
    int FAILED_STATUS_ALREADY_ENTERED = 0x07;
    int FAILED_STATUS_ALREADY_BOUND_CARD = 0x08;
    int FAILED_STATUS_ALREADY_BOUND_FACE = 0x09;
    int FAILED_STATUS_PASSWORD_TOO_SIMPLE = 0x0A;
    int FAILED_STATUS_WRONG_LOCK_ID = 0xFE;

    /**
     * 开门方式添加、删除、修改的回调方法
     *
     * @param devId              设备 ID
     * @param userId             用户 ID
     * @param unlockModeResponse 响应数据
     */
    void onResult(String devId, String userId, UnlockModeResponse unlockModeResponse);
}

参数说明

字段 类型 描述
unlockMethod String 当前操作门锁的方法类型,其值有以下三个:
/** 添加开锁方式  */
public static final String UNLOCK_METHOD_CREATE = “unlock_method_create”;
/** 修改开锁方式 */
public static final String UNLOCK_METHOD_MODIFY = “unlock_method_modify”;
/** 删除开锁方式 */
public static final String UNLOCK_METHOD_DELETE = “unlock_method_delete”;
unlockType String 解锁方式类型,参考 TuyaUnlockType
stage Integer 当前操作门锁所处的阶段,其值定义在 BleLockConstant中,详情如下:
int STAGE_AFTER = -2;   // 操作门锁完成之后,和服务端同步数据
int STAGE_BEFORE = -1; // 与门锁交互之前,如发送命令、和服务端交互
int STAGE_START = 0x00; // 开始录入解锁方式
int STAGE_CANCEL = 0xFE;// 解锁方式录入取消
int STAGE_FAILED = 0xFD;// 解锁方式录入失败
int STAGE_ENTERING = 0xFC;// 解锁方式录入中
int STAGE_SUCCESS = 0xFF;// 解锁方式录入成功
lockUserId Integer 在门锁中的用户 ID
unlockId Integer 当前解锁方式在门锁中的 ID
unlockModeId String 当前解锁方式在服务端的 ID
admin Boolean 用户是否是管理员
times Integer 密码有效次数
  • 0:永久有效
  • 1~254:实际有效次数
  • 其他数字:密码无效
status Integer 失败的状态码,详情请参考 UnlockModeListener
failedStage Integer 失败发生的阶段,即 stageSTAGE_FAILED 时,该参数有效

示例代码

tuyaLockDevice.setUnlockModeListener(new UnlockModeListener() {
  @Override
  public void onResult(String devId, String userId, UnlockModeResponse unlockModeResponse) {
    Log.i(TAG, "UnlockModeListener devId: " + devId);
    Log.i(TAG, "UnlockModeListener userId: " + userId);
    Log.i(TAG, "UnlockModeListener unlockType: " + unlockModeResponse.unlockType);
    Log.d(TAG, "UnlockModeListener: " + unlockModeResponse);
    if (unlockModeResponse.success) {
      if (TextUtils.equals(unlockModeResponse.unlockMethod, UnlockModeResponse.UNLOCK_METHOD_CREATE)) {
        Log.i(TAG, "Create unlock mode success");
      } else if (TextUtils.equals(unlockModeResponse.unlockMethod, UnlockModeResponse.UNLOCK_METHOD_MODIFY)) {
        Log.i(TAG, "Modify unlock mode success");
      } else if (TextUtils.equals(unlockModeResponse.unlockMethod, UnlockModeResponse.UNLOCK_METHOD_DELETE)) {
        Log.i(TAG, "Delete unlock mode success");
      }
    } else if (unlockModeResponse.stage == BleLockConstant.STAGE_FAILED) {
      if (TextUtils.equals(unlockModeResponse.unlockMethod, UnlockModeResponse.UNLOCK_METHOD_CREATE)) {
        Log.w(TAG, "Create unlock mode failed.");
        Log.w(TAG, "Create unlock mode failed reason: " + unlockModeResponse.status);
        Log.w(TAG, "Create unlock mode failed stage: " + unlockModeResponse.failedStage);
      } else if (TextUtils.equals(unlockModeResponse.unlockMethod, UnlockModeResponse.UNLOCK_METHOD_MODIFY)) {
        Log.w(TAG, "Modify unlock mode failed.");
        Log.w(TAG, "Modify unlock mode failed reason: " + unlockModeResponse.status);
        Log.w(TAG, "Modify unlock mode failed stage: " + unlockModeResponse.failedStage);
      } else if (TextUtils.equals(unlockModeResponse.unlockMethod, UnlockModeResponse.UNLOCK_METHOD_DELETE)) {
        Log.w(TAG, "Delete unlock mode failed.");
        Log.w(TAG, "Delete unlock mode failed reason: " + unlockModeResponse.status);
        Log.w(TAG, "Delete unlock mode failed stage: " + unlockModeResponse.failedStage);
      }
    }
  }
});

添加开锁方式

接口说明

按解锁类型给用户添加解锁方式。添加时,请保持门锁的蓝牙连接状态。

/**
 * Add unlock method.
 *
 * @param unlockType TuyaUnlockType {@link com.tuya.smart.optimus.lock.api.TuyaUnlockType}
 * @param user       BLELockUser {@link com.tuya.smart.sdk.optimus.lock.bean.ble.BLELockUser}
 * @param name       Unlock mode name.
 * @param password   Unlock mode password. If it is not the password unlock method, this field can be null
 * @param times      Number of times the unlock mode can be used. The value range is 0 to 254, 0 means unlimited times, and 1 ~ 254 is the actual number of times.
 * @param isHijack   Hijack flag. If it is true, a hijacking alarm will be triggered when unlocking with this unlock mode.
 */
void addUnlockMode(final String unlockType, final BLELockUser user, String name, String password, int times, boolean isHijack);

参数说明

字段 描述
unlockType 解锁方式类型,参考 TuyaUnlockType
user 用户的数据模型(BLELockUser
name 解锁方式名称
password 解锁密码
  • 解锁方式为密码类型时,必填
  • 解锁方式为其他时,选填
times 密码有效次数
  • 0:永久有效
  • 1~254:实际有效次数
  • 其他数字:密码无效
isHijack 劫持标记,设置为 true 时,表示使用该密码解锁将触发劫持告警

示例代码

以下代码片段演示了给家庭用户添加密码:

tuyaLockDevice.getHomeUsers(new ITuyaResultCallback<List<BLELockUser>>() {
    @Override
    public void onSuccess(List<BLELockUser> result) {
        Log.i(TAG, "getHomeUsers  onSuccess: " + result);
        // add password unlock mode
        tuyaLockDevice.addUnlockMode(TuyaUnlockType.PASSWORD, result.get(0), "test_unlock_mode1", "431232", 0, false);
    }

    @Override
    public void onError(String errorCode, String errorMessage) {
        Log.e(TAG, "getHomeUsers failed: code = " + errorCode + "  message = " + errorMessage);
    }
});

更新开锁方式信息

接口说明

更新开锁方式的名称,以及修改劫持标记。调用该接口时,由于只和云端通信不与门锁交互,因此,不需要设备保持蓝牙连接。

/**
 * Update name and hijack flag of the unlocking method. Only update server information, not communicate with door lock device
 *
 * @param unlockMode UnlockMode bean {@link com.tuya.smart.sdk.optimus.lock.bean.ble.UnlockMode}
 * @param name       Unlock mode name
 * @param isHijack   Hijack flag. If it is true, a hijacking alarm will be triggered when unlocking with this unlock mode.
 */
void updateUnlockModeServerInfo(UnlockMode unlockMode, String name, boolean isHijack);

参数说明

字段 描述
unlockMode 解锁方式数据模型
name 解锁方式名称
isHijack 劫持标记,设置为 true 时,表示使用该密码解锁将触发劫持告警

示例代码

tuyaLockDevice.getUnlockModeList(TuyaUnlockType.FINGERPRINT, new ITuyaResultCallback<ArrayList<UnlockMode>>() {
    @Override
    public void onSuccess(ArrayList<UnlockMode> result) {
        Log.i(TAG, "getUnlockModeList  onSuccess: " + result);
        for (UnlockMode unlockMode : result) {
            if (TextUtils.equals(unlockMode.unlockName, "test_unlock_mode1")) {
                tuyaLockDevice.updateUnlockModeServerInfo(unlockMode, "test_unlock2", false);// rename unlock mode
            }
        }
    }

    @Override
    public void onError(String errorCode, String errorMessage) {
        Log.e(TAG, "getUnlockModeList failed: code = " + errorCode + "  message = " + errorMessage);
    }
});

删除开锁方式

接口说明

删除指定的开锁方式前,请保持门锁的蓝牙连接状态。

/**
 * Delete unlockMode.
 *
 * @param unlockMode unlockMode
 */
void deleteUnlockMode(UnlockMode unlockMode);

示例代码

tuyaLockDevice.deleteUnlockMode(unlockMode);

取消指纹录入

接口说明

指纹解锁方式一般需要录入四到五次指纹,如果录入过程中需要取消,可以调用此接口。取消前,请保持门锁的蓝牙连接状态。

/**
 * Cancel fingerprint entry.
 * <p>
 * The fingerprint entry process will be repeated multiple times and can be cancelled during the entry process.
 *
 * @param user BLELockUser {@link com.tuya.smart.sdk.optimus.lock.bean.ble.BLELockUser}
 */
void cancelFingerprintUnlockMode(final BLELockUser user);

解锁方式更新密码

接口说明

设置密码类型的解锁方式之后,支持更新密码。包括更新密码名称、密码、解锁次数和劫持标记。更新前,请保持门锁的蓝牙连接状态。

仅密码类型的解锁方式支持调用此接口。

/**
 * Update the name, password, validity period and other information of the unlocking method
 *
 * @param unlockMode UnlockMode bean {@link com.tuya.smart.sdk.optimus.lock.bean.ble.UnlockMode}
 * @param name       Unlock mode name
 * @param password   Unlock mode password. If it is not the password unlock method, this field can be null
 * @param times      Number of times the unlock mode can be used. The value range is 0 to 254, 0 means unlimited times, and 1 ~ 254 is the actual number of times.
 * @param isHijack   Hijack flag. If it is true, a hijacking alarm will be triggered when unlocking with this unlock mode.
 */
void updatePasswordUnlockMode(UnlockMode unlockMode, String name, String password, int times, boolean isHijack);

参数说明

字段 描述
unlockMode 解锁方式数据模型
name 解锁方式名称
password 解锁密码
  • 解锁方式为密码类型时,必填
  • 解锁方式为其他时,选填
times 密码有效次数
  • 0:永久有效
  • 1~254:实际有效次数
  • 其他数字:密码无效
isHijack 劫持标记,设置为 true 时使用该密码解锁将触发劫持告警

示例代码

tuyaLockDevice.getUnlockModeList(TuyaUnlockType.PASSWORD, new ITuyaResultCallback<ArrayList<UnlockMode>>() {
    @Override
    public void onSuccess(ArrayList<UnlockMode> result) {
        Log.i(TAG, "getUnlockModeList  onSuccess: " + result);
        for (UnlockMode unlockMode : result) {
            if (TextUtils.equals(unlockMode.unlockName, "test_password")) {
                tuyaLockDevice.updatePasswordUnlockMode(unlockMode, "test_password", "131232", 0, false);// modify password
            }
        }
    }

    @Override
    public void onError(String errorCode, String errorMessage) {
        Log.e(TAG, "getUnlockModeList failed: code = " + errorCode + "  message = " + errorMessage);
    }
});

临时密码

临时密码是门锁中临时生效的密码。临时密码分为一次性的临时密码和周期性的临时密码。

  • 一次性密码是使用一次就失效的密码。
  • 周期性密码是在指定的时间周期内使用的密码,过期失效。

添加临时密码

添加临时密码的的交互过程如下所示:

蓝牙门锁

注册临时密码的监听

临时密码的添加、修改、删除通过统一的监听回调,首先您需要注册此监听。

接口说明

/**
 * Set temporary password listener
 *
 * @param temporaryPasswordListener temporary password listener
 */
void setTemporaryPasswordListener(TemporaryPasswordListener temporaryPasswordListener);

参数说明

字段 描述
temporaryPasswordListener 临时密码添加、修改、删除的监听

监听详情

public interface TemporaryPasswordListener {

    /**
     * 临时密码创建
     */
    String TEMPORARY_PASSWORD_CREATE = "temporary_password_creat";
    /**
     * 临时密码修改
     */
    String TEMPORARY_PASSWORD_MODIFY = "temporary_password_modify";
    /**
     * 临时密码删除
     */
    String TEMPORARY_PASSWORD_DELETE = "temporary_password_delete";

    /*----添加、删除、修改失败的错误码----*/
    /**
     * illegal argument
     */
    int FAILED_STATUS_ILLEGAL_ARGUMENT = -1;
    /**
     * Device not support such method
     */
    int FAILED_STATUS_NOT_SUPPORT_UNLOCK_TYPE = -2;
    /**
     * Command send to device failed
     */
    int FAILED_STATUS_SEND_FAILED = -3;
    /**
     * Request server failed
     */
    int FAILED_STATUS_REQUEST_SERVER_FAILED = -4;
    /**
     * Device offline
     */
    int FAILED_STATUS_DEVICE_OFFLINE = -5;
    /**
     * Server response failed
     */
    int FAILED_STATUS_SERVER_RESPONSE_FAILED = -6;
    /** Lock response failed */
    int FAILED_STATUS_LOCK_RESPONSE_FAILED = 1;
    /** Lock sequence number exhausted */
    int FAILED_STATUS_SEQUENCE_NUMBER_EXHAUSTED = 2;

    /**
     * 开门方式添加、删除、修改的回调方法
     *
     * @param sn 密码对应的序列号
     */
    void onSuccess(String type, int sn);

    /**
     * 临时密码添加、删除、修改的回调方法
     *
     * @param type       调用的类型,添加、删除、修改
     * @param resultCode 响应码
     */
    void onFailed(String type, int resultCode);
}

示例代码

tuyaLockDevice.setTemporaryPasswordListener(new TemporaryPasswordListener() {
    @Override
    public void onSuccess(String type, int sn) {
        switch (type) {
            case TemporaryPasswordListener.TEMPORARY_PASSWORD_CREATE:
                Log.i(TAG, "temporary password create success, passsword sequence number: " + sn);
                break;
            case TemporaryPasswordListener.TEMPORARY_PASSWORD_MODIFY:
                Log.i(TAG, "temporary password modify success, passsword sequence number: " + sn);
                break;
            case TemporaryPasswordListener.TEMPORARY_PASSWORD_DELETE:
                Log.i(TAG, "temporary password delete success, passsword sequence number: " + sn);
                break;
        }
    }

    @Override
    public void onFailed(String type, int resultCode) {
        switch (type) {
            case TemporaryPasswordListener.TEMPORARY_PASSWORD_CREATE:
                Log.w(TAG, "temporary password create failed, resultCode: " + resultCode);
                break;
            case TemporaryPasswordListener.TEMPORARY_PASSWORD_MODIFY:
                Log.w(TAG, "temporary password modify failed, resultCode: " + resultCode);
                break;
            case TemporaryPasswordListener.TEMPORARY_PASSWORD_DELETE:
                Log.w(TAG, "temporary password delete failed, resultCode: " + resultCode);
                break;
        }
    }
});

获取临时密码

获取临时密码的列表,分为获取 一次性密码列表周期性临时密码列表 两种。

接口说明

/**
 * @param availTimes 区分一次性密码或周期性密码, 0 为周期性密码,1 为一次性密码
 */
public void getTempPasswordList(int availTimes, final ITuyaDataCallback<List<TempPasswordBeanV3>> dataCallback);

TempPasswordBeanV3 数据模型

字段 描述 类型
effective 临时密码的生效状态
  • 1:待生效
  • 2:待下发
  • 3:使用中
  • 4:待删除
  • 5:已过期
Integer
availTimes 区分一次性密码或周期性密码
  • 0 为周期性密码
  • 1 为一次性密码
Integer
passwordId 临时密码在服务端的 ID Integer
sn 临时密码在门锁中的序列号 Integer
name 临时密码名称 String
scheduleBean 密码可用周期,如果是一次性密码请忽略此字段 ScheduleBean
phone 手机号码,如果购买了短信提醒服务,请让用户填写 String
effectiveTime 密码生效时间戳,13 位 Long
invalidTime 密码失效时间戳,13 位 Long

ScheduleBean 字段说明

字段 描述 类型
allDay 密码是否全天有效。如果此值为 true,则 effectiveTimeinvalidTime 字段无需设置。 Boolean
effectiveTime 密码生效时间,一天中的第多少分钟生效 Integer
invalidTime 密码失效时间,一天中的第多少分钟失效 Integer
dayOfWeeks 密码在一周中的星期几可用。 Set

示例代码

// 获取周期性临时密码
tuyaLockDevice.getTempPasswordList(0, new ITuyaDataCallback<List<TempPasswordBeanV3>>() {
    @Override
    public void onSuccess(List<TempPasswordBeanV3> result) {
        Log.i(TAG, "getTempPasswordList  onSuccess: " + result);
    }

    @Override
    public void onError(String errorCode, String errorMessage) {
        Log.e(TAG, "getTempPasswordList failed: code = " + errorCode + "  message = " + errorMessage);
    }
});
// 获取一次性临时密码
tuyaLockDevice.getTempPasswordList(1, new ITuyaDataCallback<List<TempPasswordBeanV3>>() {
    @Override
    public void onSuccess(List<TempPasswordBeanV3> result) {
        Log.i(TAG, "getTempPasswordList  onSuccess: " + result);
    }

    @Override
    public void onError(String errorCode, String errorMessage) {
        Log.e(TAG, "getTempPasswordList failed: code = " + errorCode + "  message = " + errorMessage);
    }
});

验证临时密码

校验临时密码参数的有效性。

接口说明

/**
 * @param availTimes    区分一次性密码或周期性密码。`0`:周期性密码;`1`:一次性密码
 * @param name          临时密码名称
 * @param password      密码
 * @param scheduleBean  密码可用周期。对于一次性密码,此字段可为空
 * @param phone         手机号。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
 * @param countryCode   国家码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
 * @param effectiveTime 密码生效时间戳,13 位
 * @param invalidTime   密码失效时间戳,13 位
 * @param callback      回调
 */
void validateTempPassword(int availTimes, String name, String password, ScheduleBean scheduleBean, String phone, String countryCode, long effectiveTime, long invalidTime, IResultCallback callback);

参数说明

字段 描述 是否可空
availTimes 区分一次性密码或周期性密码。0:周期性密码;1:一次性密码
name 临时密码名称
password 密码
scheduleBean 密码可用周期。对于一次性密码,此字段可为空
phone 手机号,如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
countryCode 国家码,如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
effectiveTime 密码生效时间戳,13 位
invalidTime 密码失效时间戳,13 位

其中,scheduleBean 中的字段如下:

字段 描述 类型
allDay 密码是否全天有效。如果此值为 true,则 effectiveTimeinvalidTime 字段无需设置。 Boolean
effectiveTime 密码生效时间,一天中的第多少分钟生效 int
invalidTime 密码失效时间,一天中的第多少分钟失效 int
dayOfWeeks 密码在一周中的星期几可用 Set

使用示例

tuyaLockDevice.validateTempPassword(1, "your_password_name", "111222", null, "", "", System.currentTimeMillis(), System.currentTimeMillis() + 24 * 60 * 60 * 1000, new IResultCallback() {
    @Override
    public void onError(String code, String message) {
        Log.e(TAG, "validate temp password failed: code = " + code + "  message = " + message);
    }

    @Override
    public void onSuccess() {
        Log.i(TAG, "validate temp password success");
    }
});

创建临时密码

创建临时密码,分为创建一次性密码和周期性密码。

接口说明

/**
 * @param availTimes    区分一次性密码或周期性密码, 0 为周期性密码,1 为一次性密码
 * @param name          临时密码名称
 * @param password      密码
 * @param scheduleBean  密码可用周期,一次性密码此字段可为空
 * @param phone         手机号码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
 * @param countryCode   国家码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
 * @param effectiveTime 密码生效时间戳,13 位
 * @param invalidTime   密码失效时间戳,13 位
 */
public void createTempPassword(final int availTimes, final String name, final String password, final ScheduleBean scheduleBean, final String phone, final String countryCode, final long effectiveTime, final long invalidTime);

参数说明

字段 描述 是否可空
availTimes 区分一次性密码或周期性密码
  • 0:周期性密码
  • 1:一次性密码
name 临时密码名称
password 密码
scheduleBean 密码可用周期,一次性密码此字段可为空
phone 手机号码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
countryCode 国家码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
effectiveTime 密码生效时间戳,13 位
invalidTime 密码失效时间戳,13 位

其中,scheduleBean 中的字段如下:

字段 描述 类型
allDay 密码是否全天有效。如果此值为 true,则 effectiveTimeinvalidTime 字段无需设置。 Boolean
effectiveTime 密码生效时间,一天中的第多少分钟生效 Integer
invalidTime 密码失效时间,一天中的第多少分钟失效 Integer
dayOfWeeks 密码在一周中的星期几可用。 Set

使用示例

  • 添加一次性密码:

    tuyaLockDevice.createTempPassword(1, "your_password_name", "111222", null, "", "", System.currentTimeMillis(), System.currentTimeMillis() + 24 * 60 * 60 * 1000);
    
  • 添加周期性密码:

    ScheduleBean scheduleBean = new ScheduleBean();
    scheduleBean.allDay = false; // false 表示密码非全天生效
    scheduleBean.effectiveTime = 480; // 一天中第 480 分钟生效,即 8 点生效
    scheduleBean.invalidTime = 1080; // 一天中第 1080 分钟生效,即 18 点失效
    // 添加一周中生效的天数
    scheduleBean.dayOfWeeks.add(ScheduleBean.DayOfWeek.MONDAY);
    scheduleBean.dayOfWeeks.add(ScheduleBean.DayOfWeek.TUESDAY);
    scheduleBean.dayOfWeeks.add(ScheduleBean.DayOfWeek.WEDNESDAY);
    scheduleBean.dayOfWeeks.add(ScheduleBean.DayOfWeek.THURSDAY);
    scheduleBean.dayOfWeeks.add(ScheduleBean.DayOfWeek.FRIDAY);
    scheduleBean.dayOfWeeks.add(ScheduleBean.DayOfWeek.SATURDAY);
    scheduleBean.dayOfWeeks.add(ScheduleBean.DayOfWeek.SUNDAY);
    tuyaLockDevice.createTempPassword(0, "your_password_name", "111222", scheduleBean, "", "", System.currentTimeMillis(), System.currentTimeMillis() + 24 * 60 * 60 * 1000);
    

修改临时密码

蓝牙门锁

接口说明

/**
 * @param availTimes    区分一次性密码或周期性密码, 0 为周期性密码,1 为一次性密码
 * @param passwordId    临时密码在服务端的 ID
 * @param sn            临时密码在门锁中的序列号
 * @param name          临时密码名称
 * @param scheduleBean  密码可用周期,一次性密码此字段可为空
 * @param phone         手机号码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
 * @param countryCode   国家码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
 * @param effectiveTime 密码生效时间戳,13 位
 * @param invalidTime   密码失效时间戳,13 位
 */
public void modifyTempPassword(final int availTimes, int passwordId, int sn, final String name, final ScheduleBean scheduleBean, final String phone, final String countryCode, final long effectiveTime, final long invalidTime);

参数说明

字段 描述 是否可空
availTimes 区分一次性密码或周期性密码,
  • 0:周期性密码
  • 1:一次性密码
passwordId 临时密码在服务端的 ID
sn 临时密码在门锁中的序列号
name 临时密码名称
scheduleBean 密码可用周期,如果是一次性密码此字段可为空
phone 手机号码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
countryCode 国家码。如果您已购买短信提醒服务,可让用户填写此字段。否则,请传空
effectiveTime 密码生效时间戳,13 位
invalidTime 密码失效时间戳,13 位

示例代码

  • 修改一次性密码:

    tuyaLockDevice.modifyTempPassword(1, 2202004, 2, "your_password_name", null, "", "", System.currentTimeMillis(), System.currentTimeMillis() + 24 * 60 * 60 * 1000);
    
  • 修改周期性密码:

    ScheduleBean scheduleBean = new ScheduleBean();
    scheduleBean.allDay = true; // 全天生效,无需设置一天中的生效时间。
    scheduleBean.effectiveTime = 0;
    scheduleBean.invalidTime = 0;
    scheduleBean.dayOfWeeks.add(ScheduleBean.DayOfWeek.FRIDAY);
    tuyaLockDevice.modifyTempPassword(0, 2202005, 3, "your_password_name", scheduleBean, "", "", System.currentTimeMillis(), System.currentTimeMillis() + 24 * 60 * 60 * 1000);
    

删除临时密码

蓝牙门锁

接口说明

/**
 * @param passwordId 临时密码在服务端的 ID
 * @param sn         临时密码在门锁中的序列号
 */
public void deleteTempPassword(int passwordId, int sn);

参数说明

字段 描述 是否可空
passwordId 临时密码在服务端的 ID
sn 临时密码在门锁中的序列号

示例代码

tuyaLockDevice.deleteTempPassword(2202004, 2);

门锁功能列表

功能名称 功能标识符(dpCode)
添加开门方式 unlock_method_create
删除开门方式 unlock_method_delete
修改开门方式 unlock_method_modify
冻结开门方式 unlock_method_freeze
解冻开门方式 unlock_method_enable
蓝牙解锁 bluetooth_unlock
蓝牙解锁反馈 bluetooth_unlock_fb
剩余电量 residual_electricity
电量状态 battery_state
童锁状态 child_lock
上提反锁 anti_lock_outside
指纹解锁 unlock_fingerprint
普通密码解锁 unlock_password
动态密码解锁 unlock_dynamic
卡片解锁 unlock_card
钥匙解锁 unlock_key
开关门事件 open_close
从门内侧打开门锁 open_inside
蓝牙解锁记录 unlock_ble
门被打开 door_opened
告警 alarm_lock
劫持报警 hijack
门铃呼叫 doorbell
短信通知 message
门铃选择 doorbell_song
门铃音量 doorbell_volume
门锁语言切换 language
显示屏欢迎词管理 welcome_words
按键音量 key_tone
门锁本地导航音量 beep_volume
反锁状态 reverse_lock
自动落锁开关 automatic_lock
单一解锁与组合解锁切换 unlock_switch
同步成员开门方式 synch_member
自动落锁延时设置 auto_lock_time
定时自动落锁 auto_lock_timer
指纹录入次数 finger_input_times
人脸识别解锁 unlock_face
开合状态 closed_opened
虹膜解锁 unlock_eye
掌纹解锁 unlock_hand
指静脉解锁 unlock_finger_vein
硬件时钟 RTC rtc_lock
自动落锁倒计时上报 auto_lock_countdown
手动落锁 manual_lock
落锁状态 lock_motor_state
锁帖电机转动方向 lock_motor_direction
冻结用户 unlock_user_freeze
解冻用户 unlock_user_enable
蓝牙锁临时密码添加 temporary password_creat
蓝牙锁临时密码删除 temporary password_delete
蓝牙锁临时密码修改 temporary password_modify
同步开门方式(数据量大) synch_method
临时密码解锁 unlock_temporary
电机扭力 motor_torque
组合开锁记录 unlock_double
离家布防开关 arming_mode
配置新免密远程解锁 remote_no_pd_setkey
新免密远程开门-带密钥 remote_no_dp_key
远程手机解锁上报 unlock_phone_remote
远程语音解锁上报 unlock_voice_remote
离线密码 T0 时间下发 password_offline_time
单条离线密码清空上报 unlock_offline_clear_single
离线密码清空上报 unlock_offline_clear
离线密码解锁上报 unlock_offline_pd