Browse Source

本地电脑实现publish数据

mrh 3 years ago
parent
commit
e8b41fedcc
1 changed files with 9 additions and 35 deletions
  1. 9 35
      python38/OneNet_communicate.py

+ 9 - 35
python38/OneNet_communicate.py

@@ -1,43 +1,18 @@
 # -*- coding: utf-8 -*-
 # pip install paho-mqtt
-import paho.mqtt.client as mqtt
 import base64
 import hmac
+import paho.mqtt.client as mqtt
 import time
 from urllib.parse import quote
+from OneNet_token import cal_token
 
 DEV_ID="950698937" #设备ID
 PRO_ID = "522417" #产品ID
 DEV_NAME='Air_Conditioning_IR'
 accesskey="dgEP7iOL2/1kVNc1ykDvIhXSVqhb0tLnKinjU2RYpDs="
+SERVER = 'mqtts.heclouds.com'
 
-def token(id,access_key):  #官方文档给出的核心秘钥计算算法
-
-    version = '2018-10-31'
-
-    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)
-
-    # 计算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
 
 # 当客户端收到来自服务器的CONNACK响应时的回调。也就是申请连接,服务器返回结果是否成功等
 def on_connect(client, userdata, flags, rc):
@@ -50,8 +25,6 @@ def on_publish(client, userdata, mid):
     print(str(mid))
 
 import random
-import json
-# 从树莓派发布到服务器的数据内容
 def data(ds_id,value):
     message = {
         "id": int(ds_id),
@@ -67,21 +40,22 @@ def data(ds_id,value):
             }]
         }
     }
-    # print(message)
-    message = json.dumps(message).encode('ascii')
+    # message = json.dumps(message).encode('ascii')
+    print("publish json:", bytes("{}".format(message), 'ascii'))
+    message = bytes("{}".format(message), 'ascii')
     return message
 
 def main():
-    passw=token(PRO_ID,accesskey)
+    passw = cal_token(PRO_ID, accesskey)
     print(passw)
     username = PRO_ID
-    client = mqtt.Client(DEV_NAME,protocol=mqtt.MQTTv311)
+    client = mqtt.Client(DEV_NAME, protocol=mqtt.MQTTv311)
     #client.tls_set(certfile='/Users/mryu/PycharmProjects/MyProject/onenet/MQTTS-certificate.pem') #鉴权证书
     client.on_connect = on_connect
     client.on_publish = on_publish
     client.on_message = on_message
+    client.connect(SERVER, port=1883, keepalive=300)
     client.username_pw_set(PRO_ID, passw)
-    client.connect('183.230.40.96', port=1883, keepalive=1200)
 
     # 按照OneENT要求的格式,配置数据发布和订阅的主题
     topic_dp = '$sys/%s/%s/dp/post/json/+' % (username, DEV_NAME)   # 设备上报数据主题