标签:加密 讲云 鸿蒙 如下 文档 所示 捐助 鉴权
鸿蒙项目云捐助第二十二讲云捐助项目物联网IoT鸿蒙端的代码实现
前面已介绍华为云IoT物联网的云操作和MQTT.fx的模拟器操作。这里通过华为云IoT官方文档实现鸿蒙ArkTS的端侧开发。根据的华为云Iot官方文档地址如下图所示。
这里在API参考文档中可以点击“应用侧HTTPS接口参考”,点击后界面如下图所示。
从设备侧HTTPS接口参考中看到,这里包括设备鉴权,设备信息上报和设备属性上报,这里我们分别介绍设备鉴权,设备属性上报。
一、鸿蒙ArkTS应用端侧Iot的HTTPS设备鉴权
这里的设备鉴权其实就是客户端获取tokens,可以从“应用侧HTTPS接口参考”中看到设备鉴权的相关文档,根据文档可以得知设备鉴权的原理,如下图所示。
通过API文档的说明会得知sign_type其值表示密码加密的方式,这个方式由两部分部分,第一部分是时间加密,第二部分是密码加密。API文档的下面有接口示例的请求方法。如下图所示。
这里有接口说明,同时还有接口的请求方式。同时需要注意,官主给出device_id在进行代码编写时需要更换成自己的device_id,参数中的sign_type赋给定值0, 参数中timestamp时间戳,最后的password表示的是时间戳和原始密码通过两重加密后的结果。
由文档得知,如果要实现设备鉴权,必须对密码进行时间戳和原始密码的双重加密,这里需要使用到鸿蒙的加密库@ohos.security.cryptoFramework,导入库语句在官方华为云文档的案例中如下图所示。
这里我们把鸿蒙云捐助中爱心捐助豆腐块功能条修改功能,使其可以支持“设备鉴权”和“属性上报”。如下图所示。
然后在Mine.ets组件中根据爱心捐助豆腐块的每一个子项的点击事件中判断每一个子项的文字,根据文字决定点击事件决定操作的内容是“设备鉴权”还是“属性上报”。如下图所示。
这里实现“设备鉴权”的逻辑,设备鉴权需要使用鸿蒙Next的加密厍,这个加密是时间的加密,计算时间使用dayjs,加密算法会对内容中的数据进行加密,首先实例化uint8Array的数组数据,然后调用uinit8Array的buffer缓存,如下图所示。
这时导入了三个模块,一个是时间加密的dayjs模块,一个是加密所用到的鸿蒙cryptoFramework模块,一个是缓存buffer模块。
引入模块后,进行设备鉴权需要配置一些参数,这里首先需要华为IOT平台产品实例设备连接的设备id,可以从华为IOT平台产品实例中所有设备中云捐助电子证件设备的详情中可以看到device_id,如下图所示。
这里将device_id复制到鸿蒙代码中,使用变量接收即可。如下图所示。
根据华为IOT开发的官方文档中鉴权的第二个参数sign_type固定为0,鉴权的第三个参数是时间戳的参数,这里将三个参数使用变量准备好。
这里鉴权的最后一个参数password,根据华为的IOT开发文档,就需要两重加密,第一重是HMAC加密,第二重 SHA256加密。第一重的HMAC加密的时间戳,第二重SHA256加密的是设备的原始密码。先使用HMAC加密时间戳。代码如下所示。
在代码中首先使用cryptoFramework模块的creatSymKeyGenerator方法指示出加密的方式是什么,然后需要实例化一个Uint8Array的数组,把加密的内容时间戳做为uint8的参数传入,传入的时间戳参数需要通过调用buff模块转成buff的缓存数据,最后调用加密方式的convertKey方法对数据进行加密。
这里官方在使用coverKey方法时加入一个异步的操作,这里我们也加给convertKey方法的返回加上await的导步处理,代码如下所示。
在调用方法前加入await,就需要在onClick方法中加入async的异步处理,代码如下所示。
接下来再去进行secret密码的加密,时间戳加上secret就是最终的密码,接下来继续加密secret,这里的serect加密的方式使用SHA256的方式,这种加密方式是通过createMac来完成,使用mac的init,update,最后是doFinal获取,得到的是一个两位16进制的数组,如下图所示的输出数据。
把这样的数值整合在一起,才是最终的密码。由于数组中每一索引的数字是两个16进制数构成,每一个索引的数字就是32位,即16乘以2,在鸿蒙IOT文档对密码的描述中,其固定长度为64位,如下图所示。
根据这样的规定,如果把数据中的两个相邻索引的数据两位两位放在一起就是64位的固定密码组件,因此,处理64位密码技术需要使用padStart的方法来填充,表示当数据不满足64位时需要填充。
在代码上首先把secret和时间戳的加密放在一起进行SHA256的加密,最终得到一个result变量接收的数组,代码如下图所示。
这里首先通过cryptoFramework模块调用createMac方法指定加密方式为SHA256,然后把加密的原始secret密码做为uint8的参数传入,传入的原始secret密码需要通过调用buff模块转成buff的缓存数据,转化后,由原指定加密方式SHA256的变量先使用mac.init初始化之前由时间戳产生的密码,然后把buff缓存中secret密码由mac执行update更新,最后实现mac的doFinal方法就可以得到一个32位加密数据的分隔数组。接下来遍历数组中的每一个32位数值,构建密码时对于不足64位的密码通过paddingStart进行补0实现。代码如下图所示。
这样就产生的设备鉴权的密码,接下来在文档中查找设备鉴权的接口。如下图所示。
在设备鉴权地址中需要使用到endpoint的内容,这里在文档中可以找到“平台对接信息”的链接,如下图所示。
这里点击“平台对接信息”的链接,在左栏“总览”中可以看到“接入信息”的按钮。如下图所示。
点击“接入信息”的按钮后,在接入信息显示中可以看到HTTPS的地址链接。如下图所示。
这里可以点击接入信息HTTPS对应后面的复制按钮,然后复制以鸿蒙请求代码中,鸿蒙根据请求地址,再加上之前的参数设置,使用http模块就可以实现设备鉴权的请求,如下图所示。
这里首先在代码上使用http模块的createHttp()方法建立http请求,得到请求变量后,调用变量的request方法请求文档中给定的地址进行鉴权,由于是post方式的请求,在request方法请求时需要使用extraData指定post请求的上传参数,这里需要提供device_id,sign_type,timestamp,password等4个参数,4个参数的值在之前的代码中已经通过变量获取。当request鉴权请求成功时在then方法中输出对应的信息。接下来,在组件中设置一个全局的access_token变量,有来接收鉴权获取的内容,如下图所示。
在鉴权成功后进行全局access_token的赋值,代码如下图所示。
项目页面预览后,点击“设备鉴权”可以看到服务器返回的结果,如下图所示。
完成设备鉴权后,需要进行属性上报的功能开发。
二、鸿蒙ArkTS应用端侧Iot的HTTPS属性上报
首先还是从MQTT.fx调测中找到属性上报的接口文档内容,如下图所示。
这里显示了上报的地址,在文档的下面有上报接口携带的数据格式描述,如下图所示。
官方文档指出,在上报内容时需要把access_token的值放在请求头的headers中,把接口请求的地址和内容通过http进行代码调用后,如下图所示。
这里使用之前的http模块createHttp方法建立的请求httpRequest1,然后调用request方法进行请求,请求的地址就是上报数据的地方,官方已给出的地址直接复制到接收变量url中,在request请求提交时,由于使用post方式,需要在extraData中指定携带的参数, service_id就是建立的华为云IOT产品实例的产品详情中的服务id,properties属性对应华为云IOT产品实例的产品详情中的服务对应的属性。后面还有headers中access_token的设置,不同的参数对应不同的华为云文档。如下图所示。
这里是华为IOT文档和参数之间的对应图。最终得到的请求数据属性上报的请求参数设置如下图所示。
request方法把请求参数提交到数据上报的接口后,在then方法中对获取结果进行解析,如下图所示。
项目页面预览后,点击“属性上报”可以看到服务器返回的结果,如下图所示。
在华为IOT物联网产品实例设备在线调试平台中也可以查看到上报的数据,如下图所示。
这里使用代码完成了华为IOT物联网平台的设备鉴权和属性上报,后续还会带来华为云操作在鸿蒙项目云捐助上的精彩,欢迎关注。
标签:加密,
讲云,
鸿蒙,
如下,
文档,
所示,
捐助,
鉴权
From: https://blog.csdn.net/play_big_knife/article/details/144665403