OneNet_communicate.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. # -*- coding: utf-8 -*-
  2. # pip install paho-mqtt
  3. import paho.mqtt.client as mqtt
  4. import base64
  5. import hmac
  6. import time
  7. from urllib.parse import quote
  8. DEV_ID="950698937" #设备ID
  9. PRO_ID = "522417" #产品ID
  10. DEV_NAME='Air_Conditioning_IR'
  11. accesskey="dgEP7iOL2/1kVNc1ykDvIhXSVqhb0tLnKinjU2RYpDs="
  12. def token(id,access_key): #官方文档给出的核心秘钥计算算法
  13. version = '2018-10-31'
  14. res = 'products/%s' % id # 通过产品ID访问产品API
  15. # 用户自定义token过期时间
  16. et = str(int(time.time()) + 3600)
  17. # 签名方法,支持md5、sha1、sha256
  18. method = 'sha1'
  19. # 对access_key进行decode
  20. key = base64.b64decode(access_key)
  21. # 计算sign
  22. org = et + '\n' + method + '\n' + res + '\n' + version
  23. sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)
  24. sign = base64.b64encode(sign_b.digest()).decode()
  25. # value 部分进行url编码,method/res/version值较为简单无需编码
  26. sign = quote(sign, safe='')
  27. res = quote(res, safe='')
  28. # token参数拼接
  29. token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (version, res, et, method, sign)
  30. return token
  31. # 当客户端收到来自服务器的CONNACK响应时的回调。也就是申请连接,服务器返回结果是否成功等
  32. def on_connect(client, userdata, flags, rc):
  33. print("连接结果:" + mqtt.connack_string(rc))
  34. # 从服务器接收发布消息时的回调。
  35. def on_message(client, userdata, msg):
  36. print(str(msg.payload,'utf-8'))
  37. #当消息已经被发送给中间人,on_publish()回调将会被触发
  38. def on_publish(client, userdata, mid):
  39. print(str(mid))
  40. import random
  41. import json
  42. # 从树莓派发布到服务器的数据内容
  43. def data(ds_id,value):
  44. message = {
  45. "id": int(ds_id),
  46. "dp": {
  47. "count": [{ # 距离传感器采集的数据
  48. "v": value
  49. }],
  50. "random": [{ # Python产生的随机数
  51. "v": random.randint(20,80)
  52. }],
  53. "talk": [{ # Python产生的随机数
  54. "v": "fuck you bitch!%d"%(value*random.randint(20,80))
  55. }]
  56. }
  57. }
  58. # print(message)
  59. message = json.dumps(message).encode('ascii')
  60. return message
  61. def main():
  62. passw=token(PRO_ID,accesskey)
  63. print(passw)
  64. username = PRO_ID
  65. client = mqtt.Client(DEV_NAME,protocol=mqtt.MQTTv311)
  66. #client.tls_set(certfile='/Users/mryu/PycharmProjects/MyProject/onenet/MQTTS-certificate.pem') #鉴权证书
  67. client.on_connect = on_connect
  68. client.on_publish = on_publish
  69. client.on_message = on_message
  70. client.username_pw_set(PRO_ID, passw)
  71. client.connect('183.230.40.96', port=1883, keepalive=1200)
  72. # 按照OneENT要求的格式,配置数据发布和订阅的主题
  73. topic_dp = '$sys/%s/%s/dp/post/json/+' % (username, DEV_NAME) # 设备上报数据主题
  74. topic_cmd = '$sys/%s/%s/cmd/#' % (username, DEV_NAME) # 设备接受命令主题
  75. topic_cmds = '$sys/%s/%s/cmd/request/' % (username, DEV_NAME) # 设备接受命令主题
  76. topic_publish = '$sys/%s/%s/dp/post/json' %(username,DEV_NAME)
  77. client.loop_start()
  78. count = 0
  79. while True:
  80. count += 1
  81. # 树莓派循环发布数据到OneNET
  82. client.publish(topic=topic_publish, payload=data(count, random.randint(0,100)), qos=1)
  83. print("-------------------------------------------------------------------------------")
  84. time.sleep(3)
  85. if __name__ == '__main__':
  86. main()