天天看點

#夏日挑戰賽#HarmonyOS門鎖品類的臨時密碼、照片編解碼工具技術項目背景邏輯實作

本文正在參加星光計劃3.0—夏日挑戰賽

項目背景

随着智能家居的普及,友善快捷的智能門鎖受到廣大消費者的歡迎,成為家居應用領域的一大熱門。在接入鴻蒙智聯智能門鎖領域時,我們的技術人員發現使用者在通過手機給智能門鎖設定臨時密碼,APP給門鎖下發加密後的密碼時,裝置固件目前尚無與之對應的解密工具,并且智能門鎖都具備拍照功能用于儲存異常情況的現場照片,所用模組無法直接将照片發送到三方服務儲存,這些還處于空白技術領域。

邏輯實作

技術人員通過了解行業情況,查閱大量相關技術資料,自研出專用的解密工具,成功實作了臨時密碼設定功能;自研出照片編解碼工具,利用智能家居雲作為中轉,實作了手機App照片實時檢視功能。接下來我們看所述技術難點是如何實作的。

部分截圖展示:

#夏日挑戰賽#HarmonyOS門鎖品類的臨時密碼、照片編解碼工具技術項目背景邏輯實作

一、臨時密碼設定流程

流程圖:

#夏日挑戰賽#HarmonyOS門鎖品類的臨時密碼、照片編解碼工具技術項目背景邏輯實作

流程說明:

1.智慧生活APP生成臨時密碼發送到智能家居雲儲存,APP加密算法采用RSA的PKSC8加密算法

2.智能家居雲下發密文給門鎖裝置

3.門鎖解密密文,擷取臨時密碼、有效時間,然後儲存到鎖内,臨時密碼有效時間最長為7天,最短為30分鐘

4.臨時密碼裝置設定成功,門鎖主動上報設定成功狀态

5.智能家居雲收到狀态後轉發狀态給APP

H5代碼實作片段:

  data() {
    return {
      TemporarypasswordObj: {
        Creationtime: '',
        action: '1',
        id: '001',
        sixteenbitSN: '',
        userpassword: '123456', // 管理者密碼        
        Temporarypassword: '888888', // 臨時密碼
        Availabletime: '', // 使用次數
        effectivedate: '',
        Failuretime: ''
      },
      publicKey: '',
    }
  },

  methods: {
      saveTemporaryPassword()  {
      // 建構密碼hash資料字元串
      let hashedData = this.TemporarypasswordObj.sixteenbitSN + 
                       this.TemporarypasswordObj.userpassword + 
                       this.TemporarypasswordObj.Creationtime
    
      // 進行哈希混淆
      let hashedDatastr = window.hilink.sha256Encrypt(hashedData)
    
      // 建構臨時密碼密文
      let encryptionstringstr =
        this.TemporarypasswordObj.Creationtime +
        this.TemporarypasswordObj.action +
        this.TemporarypasswordObj.id +
        hashedDatastr +
        this.TemporarypasswordObj.Temporarypassword +
        this.TemporarypasswordObj.Availabletime +
        this.TemporarypasswordObj.effectivedate +
        this.TemporarypasswordObj.Failuretime
      
      // 調用hilink接口進行RSA加密
      let cipherText = window.hilink.rsaEncrypt(encryptionstringstr, this.publicKey)
    
      // 發送臨時密碼
      this.sendCiphertext(cipherText)
    },
    sendCiphertext(cipherText) {
      try {
        let data = { remoteCode: { cipherText: cipherText } }
        window.hilink.setDeviceInfo('0', JSON.stringify(data), 'setInfocallback');
        window.setInfocallback = res => {
          let data = JSON.parse(res);
          if (data.errcode === 0) {
            console.log('臨時密碼發送成功');
          } else {
            console.log('臨時密碼發送失敗');
          }
        }
      } catch (e) {
        console.log(e)
      }
    }
  }
}

           

固件代碼片段:

{
    int ret;
    size_t olen = 0;
    size_t dec_len = 0;
    const char *pers = "simple_rsa";
    unsigned char *base_dec = NULL;

    mbedtls_rsa_context rsa;
    mbedtls_rsa_context tempctx;
    mbedtls_entropy_context entropy;
    mbedtls_ctr_drbg_context ctr_drbg;
    mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256);  // 初始化RSA結構體
    mbedtls_rsa_init(&tempctx, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256);  // 初始化RSA結構體
    mbedtls_entropy_init(&entropy);         // 初始化熵結構體
    mbedtls_ctr_drbg_init(&ctr_drbg);       // 初始化随機數結構體
    ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
                                    (const uint8_t *) pers, strlen(pers));  // 根據個性化字元串更新種子1
    assert_exit(ret == 0, ret);
    base_dec = rsa_global_hooks.rsa_allocate(BASE_DEC_LEN);
    if(base_dec == NULL){
        rsa_print_dbg("malloc base64 buff failed \r\n");
        goto err_exit;
    }
    memset(base_dec,0,BASE_DEC_LEN);
    ret = smartlock_rsa_readkeys(&tempctx);
    assert_exit(ret == 0, ret);
    ret = mbedtls_rsa_import( &rsa, &tempctx.N, &tempctx.P, &tempctx.Q, &tempctx.D, &tempctx.E);
    assert_exit(ret == 0, ret);
    ret = mbedtls_rsa_complete( &rsa );
    assert_exit(ret == 0, ret);
    mbedtls_base64_decode(base_dec,BASE_DEC_LEN,&dec_len,pchipertext,chiperlen);
    ret = mbedtls_rsa_pkcs1_decrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,
                                MBEDTLS_RSA_PRIVATE, &olen, base_dec, text, textlen);
    assert_exit(ret == 0, ret);
    text[olen] = 0;
    rsa_global_hooks.rsa_deallocate(base_dec);
    mbedtls_ctr_drbg_free(&ctr_drbg);
    mbedtls_entropy_free(&entropy);
    mbedtls_rsa_free(&tempctx);
    mbedtls_rsa_free(&rsa);
    return 0;
err_exit:
    rsa_global_hooks.rsa_deallocate(base_dec);
    mbedtls_ctr_drbg_free(&ctr_drbg);
    mbedtls_entropy_free(&entropy);
    mbedtls_rsa_free(&tempctx);
    mbedtls_rsa_free(&rsa);
    return -1;
}

           

二、照片上報展示

由于門鎖模組無法将圖檔上報到三方伺服器,隻能利用智能家居雲進行中轉,而智能家居雲profile字元串類型有長度限制,是以需要将資料拆包後分包發送,APP在收到資料後進行資料包合并,最後完成圖檔顯示。

工作流程:

#夏日挑戰賽#HarmonyOS門鎖品類的臨時密碼、照片編解碼工具技術項目背景邏輯實作

代碼實作片段

  <img :src="picSrc" width="400" height="300" />
</template>

<script>
export default {
  data() {
    return {
      picSrc: '',
      picBase64: '',
      index: 0,
    }
  },

  created() {
    this.deviceEvent()
  },

  method: {
    deviceEvent() {
      try {
        window.deviceEventCallback = event => {
          let eventJson = JSON.parse(event)
          if (eventJson.sid.indexOf('imagePack') > -1) {
            this.picBase64 += eventJson.data['image']
            this.index ++
          }
          if (this.index === 6) {
            this.picSrc = 'data:image/jpg;base64,' + this.picBase64
          }
        }
      } catch (e) {
        console.log(e)
      }
    }
  },
}
</script>

           

以上為智能門鎖的解決方案,該方案已轉化為鴻蒙智聯标準化認證,可廣泛應用于門鎖、保險箱等産品。

更多原創内容請關注軟通動力OpenHarmony學院

繼續閱讀