mylib.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import random
  2. import base64
  3. import hmac
  4. import time
  5. from urllib.parse import quote
  6. # base64 无法导入microPython,因为文件过大(5M),esp8266只有8Mflash空间
  7. # 因此要计算好之后再加入到嵌入式设备
  8. def cal_token(id, access_key): # 官方文档给出的核心秘钥计算算法
  9. version = '2018-10-31'
  10. res = 'products/%s' % id # 通过产品ID访问产品API
  11. # 用户自定义token过期时间:一年后过期
  12. et = str(int(time.time()) + 31536000)
  13. # 签名方法,支持md5、sha1、sha256
  14. method = 'sha1'
  15. # 对access_key进行decode
  16. key = base64.b64decode(access_key)
  17. # 计算sign
  18. org = et + '\n' + method + '\n' + res + '\n' + version
  19. sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)
  20. sign = base64.b64encode(sign_b.digest()).decode()
  21. # value 部分进行url编码,method/res/version值较为简单无需编码
  22. sign = quote(sign, safe='')
  23. res = quote(res, safe='')
  24. # token参数拼接
  25. token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (
  26. version, res, et, method, sign)
  27. return token
  28. '''
  29. publish 时,OneNet 对 payload 数据的格式要求:
  30. dictionaries 必须为字典
  31. 字典的 key 可以是 object
  32. 字典 value 必须是数组,数组元素必须是字典,哪怕数组只有一个元素。
  33. 参考文件: readme.md -> publish 消息
  34. 参考官网文档: https://open.iot.10086.cn/doc/v5/develop/detail/251
  35. '''
  36. def payload_data(ds_id, dictionaries: dict):
  37. message = {
  38. "id": int(ds_id),
  39. "dp": dictionaries
  40. }
  41. message = bytes("{}".format(message), 'ascii')
  42. print(message)
  43. return message
  44. if __name__ == '__main__':
  45. PRO_ID = "522417" #产品ID
  46. accesskey = "dgEP7iOL2/1kVNc1ykDvIhXSVqhb0tLnKinjU2RYpDs=" # 设备秘钥
  47. password = cal_token(PRO_ID, accesskey)
  48. print(password)