本人是参考 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 但消息内容不能换行输入 如下图为前者的结果:
3.把上面步骤二的结果再进行base64编码,再再进行url编码即的到最终的sign结果(进行url编码的原因是应为 = 这些符号与URL参数符号相同产生歧义 详情请看下方安全鉴权连接说明)
4.获取token(下载文件必要密匙)
5.校验token(上报状态必要过程不上报可省略)
6.下载文件
7.上报状态(必须经过步骤5否则失败)
-
OneNET官方文档-安全鉴权
py生成token代码:
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.复制上述代码到Notepad++中并修改对应的id和access_key 保存为***.py
-
2.用CMD运行上述代码(前提电脑安装python,自行百度安装方法)即可生成sign
CMD 运行py生成token sign.png
二 注意:
- 可以用 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>>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
网友评论