OneNET 通用OTA - Fiddler 4

2019-06-27  本文已影响0人  後輪追前輪

本人是参考 OneNet 里 SOTA升级体验 (基于 ESP8266)做记录的 请先看一遍以便理解,部分已有步骤不在重复

一 流程总结:

1.查看access_key(在OneNET产品概况中)并用base64解码
2.用access_key的解码(key)1563120000\nsha1\nproducts/****\n2018-10-31(消息 )进行hmac_sha1签名(注意 消息内容为字符串类型 ------- 但\n实际为换行符即十六进制0x0a,而不应把它分开看做两个字符串 再用在线工具时不能直接加入\n) 建议使用在线加密解密可以换行输入但key只能是字符串类型,而HMAC-在线计算 可以用base64或十六进制的key 但消息内容不能换行输入 如下图为前者的结果:

hmac_sha1截图1.png
3.把上面步骤二的结果再进行base64编码,再再进行url编码即的到最终的sign结果(进行url编码的原因是应为 = 这些符号与URL参数符号相同产生歧义 详情请看下方安全鉴权连接说明)
4.获取token(下载文件必要密匙)
5.校验token(上报状态必要过程不上报可省略)
6.下载文件
7.上报状态(必须经过步骤5否则失败)
import base64
import hmac
import time
from urllib.parse import quote

def token(id,access_key):

    version = '2018-10-31'

    #res = 'mqs/%s' % id  # 通过MQ_ID访问MQ
    res = 'products/%s' % id  # 通过产品ID访问产品API

    # 用户自定义token过期时间
    et = str(int(time.time()) + 3600)

    # 签名方法,支持md5、sha1、sha256
    method = 'sha1'

    # 对access_key进行decode
    key = base64.b64decode(access_key)
    #print(key)#显示解码结果   
    # 计算sign
    org = et + '\n' + method + '\n' + res + '\n' + version
    sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)
    sign = base64.b64encode(sign_b.digest()).decode()

    # value 部分进行url编码,method/res/version值较为简单无需编码
    sign = quote(sign, safe='')
    res = quote(res, safe='')

    # token参数拼接
    token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (version, res, et, method, sign)

    return token


if __name__ == '__main__':
    id = '****'
    access_key = '*****'

    print(token(id,access_key))

二 注意:

  1. 可以用 base64在线工具 验证但不一定能正确显可能网页编码格式不同的原因导致无法正确显示或编码解码,建议还是用程序实现吧 #print(key)#显示解码结果 取消这行注释即可

2.print结果为b'\xe3\xa5G\xb7a....' b''表示以byte显示,\xe3 \xa5表示为十六进制0xE3,0xA5,因其不在ASCII表里无法显示,而G a在ASCII表里所以显示为对应字符实际上等同于\x47(G) \x61(a) (初学py不太会转换显示就将就着看吧)

3.建议看OneNET官方文档-OTA-API使用实例,因文档>>南向API文档四个URL有误缺少south如下图:

错误URL>>南向API-检测任务.png
正确URL>>OTA-API使用示例-检测任务.png

三 流程详细:

以下****中各表示为:dev_id=为设备ID、products%2F为产品ID、sign=为流程总结3的结果、ota_*****为获取的Toke

1. 获取token

使用Fiddler输入以下内容并修改*****里的内容为自己的

GET http://ota.heclouds.com/ota/south/check?dev_id=****&manuf=101&model=10101&type=2&version=1 HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Authorization: version=2018-10-31&res=products%2F******&et=1561476160&method=sha1&sign=***********
Host: ota.heclouds.com

结果如图:


获取token.jpg

如图下方token=后面就是我们所需要的token

2.校验Token

若不上报状态可跳过省略此步,无此步骤却上报状态的话会提示{"errno":21,"error":"invalid operation"}

在此用Fiddler发送请求

GET http://ota.heclouds.com/ota/south/download/ota_i****l/check?dev_id=**** HTTP/1.1
Content-Type: application/json
Authorization: version=2018-10-31&res=products%2F****&et=1564588800&method=sha1&sign=cdDzut8TDdi*****Q%3D
Host: ota.heclouds.com
校验Token.jpg

3. 获取文件

在此用Fiddler发送请求

GET http://ota.heclouds.com/ota/south/download/ota_*******NtL HTTP/1.1
User-Agent: Fiddler
Range: bytes=0-
Host: ota.heclouds.com

Range: bytes=代表获取第几字节到第几字节的数据


获取文件.jpg

注意状态码
分片返回状态码:206
不分片状态码:200

4.上报状态:

必须保证步骤2校验Token已执行才能上报成功

状态码

POST http://ota.heclouds.com/ota/south/report?dev_id=******&token=ota_****** HTTP/1.1
Content-Type: application/json
Authorization: version=2018-10-31&res=products%2F*****&et=1564588800&method=sha1&sign=cdDzut8T******%3D
Host: ota.heclouds.com
Content-Length: 20

{
  "result":201
}
上报状态.png

最后查看状态

路径:(开发者中心-设备管理-OTA升级-SOTA升级)


OTA状态.png

----------------------------------完-----------------------------

----------------------------------完-----------------------------

----------------------------------完-----------------------------


上一篇下一篇

猜你喜欢

热点阅读