Skip to content

4 History (歷史) ​

手機向 Sesame5 發送歷史請求命令後,裝置會從 Flash 中回傳 最舊的一筆歷史紀錄。
若需要刪除該筆歷史,必須在讀取後再發送 刪除命令。
(僅仅读取不會刪除)

循序圖 ​

手機送出資料 ​

讀取歷史 ​

Byte10
Data0x01item code

item code : SSM2_ITEM_CODE_HISTORY (4)

0x01 : 讀取最舊的一筆歷史(不刪除)

刪除歷史 ​

讀取後如需刪除該筆歷史,發送 HISTORY_DELETE:

ByteN ~ 0
DatarecordId

item code : SSM2_ITEM_CODE_HISTORY_DELETE
recordId : 讀取時得到的歷史紀錄 ID(4 Bytes)

ssm5 回傳內容 ​

有歷史時 ​

ByteN ~ 3210
Datapayloadresitem_codetype
說明歷史資料內容結果指令編號推送類型

type : SSM2_OP_CODE_RESPONSE (0x07)

item code : SSM2_ITEM_CODE_HISTORY(4)

res : CMD_RESULT_SUCCESS (0x00)

payload 結構 ​

ByteN ~ 1615 ~ 98 ~ 543 ~ 0
Dataparammech_statuststypeid
說明歷史標籤、長度機械狀態timestamp歷史類型紀錄 ID (4B)

param ​

Byte可變1 ~ 0
DataValuetag
說明UUID等History Tag 類型

History Tag 類型 一覽 ​

TagValue說明
0x0000NFC 卡卡片開鎖
0x0001指紋指紋開鎖
0x0002密碼密碼開鎖
0x0003人臉人臉開鎖
0x0004手掌手掌開鎖
0x0005TouchPro 裝置 UUIDTouchPro 關鎖
0x0006Touch 裝置 UUIDTouch 關鎖
0x0007Open Sensor 裝置 UUIDOpen Sensor 關鎖
0x0008FacePro 裝置 UUIDFacePro 關鎖
0x0009Face 裝置 UUIDFace 關鎖
0x000ARemote 裝置 UUIDRemote 開/關鎖
0x000BRemote nano 裝置 UUIDRemote nano 開/關鎖
0x000CBiz 使用者 UUIDBiz 開/關鎖
0x000DWeb API 使用者 UUIDWeb API 開/關鎖
0x000EAndroid 使用者 BLE UUIDAndroid BLE 開/關鎖
0x000FiOS 使用者 BLE UUIDiOS BLE 開/關鎖
0x0010Android 使用者 Wi-Fi UUIDAndroid IoT 開/關鎖
0x0011iOS 使用者 Wi-Fi UUIDiOS IoT 開/關鎖

沒有歷史時 ​

Byte210
Dataresitem_codetype
說明結果指令編號推送類型

type : SSM2_OP_CODE_RESPONSE (0x07)

item code : SSM2_ITEM_CODE_HISTORY(4)

res : CMD_RESULT_NOT_FOUND (0x05)

資料結構 (C 定義) ​

c

#pragma pack(1)
union ss5_his_param {
    int8_t data_length;
    int8_t data[32];
};
#pragma pack()

#pragma pack(1)
typedef struct {
    uint32_t id;                    /// 4 Bytes
    uint8_t type;                   /// 1 Bytes
    uint32_t ts;                    /// 4 Bytes
    mech_status_t mech_status;      /// 7 Bytes
    union ss5_his_param param;      /// 32 Bytes
} ssm_history;                      /// 4+1+4+7+32 = 48 Bytes
#pragma pack()

iOS、Android、ESP32 範例 ​

Android 範例 ​

kotlin
private fun readHistoryCommand() {
    if (isReadHistoryCommandRunning) {
        L.d("hcia", "[ss5][his][read] readHistoryCommand is already running")
        return
    }
    val isConnectNET = isInternetAvailable()
    sendCommand(SesameOS3Payload(SesameItemCode.history.value, byteArrayOf(0x01)), DeviceSegmentType.cipher) { res -> // 01: 从设备读取最旧的历史记录
        L.d("hcia", "[ss5][his][ResultCode]:" + res.cmdResultCode)
        val hisPaylaod = res.payload
        if (res.cmdResultCode == SesameResultCode.success.value) {
            // 改为 uuid 格式的 hisTag, APP不再兼容旧固件的历史记录, 若有客诉历史记录问题, 请升级锁的固件。
            if (isConnectNET && !isConnectedByWM2) {
                CHAccountManager.postSS5History(deviceId.toString().uppercase(), hisPaylaod.toHexString()) {
                    // 成功上传历史记录到云端后, 通过蓝牙删除这条历史记录, SS5固件会在它的Flash里删除掉这条历史记录。
                    val recordId = hisPaylaod.sliceArray(0..3)
                    it.onSuccess {
                        L.d("hcia", "[+]SSM2_ITEM_CODE_HISTORY_DELETE: ${recordId.toBigLong().toInt()}")
                        sendCommand(SesameOS3Payload(SesameItemCode.SSM2_ITEM_CODE_HISTORY_DELETE.value, recordId), DeviceSegmentType.cipher) { res ->
                            L.d("hcia", "[-]SSM2_ITEM_CODE_HISTORY_DELETE: ${res.cmdResultCode}")
                        }
                    }
                    it.onFailure { exception ->
                        L.d("hcia", "[ss5][history]postSS5History: $exception")
                    }
                }
            }
        }
        isReadHistoryCommandRunning = false
    }
}

iOS 範例 ​

swift
    func readHistoryCommand(_ result: @escaping (CHResult<CHEmpty>))  {
        L.d("[ss5][history] readHistoryCommand <=")
        URLSession.isInternetReachable { isInternetReachable in
//            L.d("[ss5][history] 連網?",isInternetReachable)
            self.sendCommand(.init( .history, "01".hexStringtoData())) { (result) in // 01: 从设备读取最旧的历史记录
                if result.cmdResultCode == .success {
                    guard isInternetReachable && !self.isConnectedByWM2 else { return }
                    self.postProcessHistory(result.data.copyData) { res in
                        if case .success(_) = res  {
                            let recordId = result.data.copyData[0...3].copyData
                            self.sendCommand(.init(SesameItemCode.historyDelete, recordId)) { response in
                                if response.cmdResultCode == .success  { L.d("[ss5][history]歷史删除成功") }
                            }
                        }
                    }
                } else {
                    (self.delegate as? CHSesame5Delegate)?.onHistoryReceived(device: self, result: .failure(self.errorFromResultCode(result.cmdResultCode)))
                    self.isHistory = false
                }
            }
        }
    }

ESP 範例 ​

c
// todo