1. import datetime
    2. import paho.mqtt.client as paho
    3. import json
    4. import time
    5. import random
    6. # 设备的访问令牌
    7. accessToken = "T8Uqq3g7sVZoBKfDE8uc"
    8. # thingsboard的服务器IP地址
    9. host = 'thingsboard-local'
    10. # `mqtt`的端口号
    11. port = 1883
    12. def on_publish(client, userdata, result):
    13. print("时间: {}, client: {}, userdata: {}, result: {}".format(datetime.datetime.now(), client, userdata, result))
    14. print("publish ...")
    15. def on_connect(client, userdata, flag, rc):
    16. print(str(rc))
    17. print("connect ...")
    18. client.subscribe("v1/devices/me/rpc/request/+", qos=0);
    19. def on_subscribe(client, userdata, mid, granted_qos):
    20. print("subscribe ...")
    21. def on_message(client, obj, msg):
    22. print('receive message ...')
    23. print("msg.payload: {}".format(msg.payload))
    24. print("json.loads(msg.payload): {}".format(json.loads(msg.payload)))
    25. # print("平台发布的需要修改的寄存器值是:", json.loads(msg.payload)['params'])
    26. # 当收到平台发布的数据之后修改PLC的寄存器的值。modbus_tcp 的写操作。
    27. mqtt = paho.Client("device_id_dev_001")
    28. mqtt.on_publish = on_publish
    29. mqtt.on_connect = on_connect
    30. mqtt.on_subscribe = on_subscribe
    31. mqtt.on_message = on_message
    32. mqtt.username_pw_set(accessToken)
    33. mqtt.connect(host, port, keepalive=60)
    34. mqtt.loop_start()
    35. while True:
    36. # 来自PLC,实际状况中读 modbus TCP的读寄存器值。eg:40001
    37. data = {
    38. "ts": int(time.time() * 1000),
    39. "temperature": random.randint(0, 40),
    40. "humidity": random.randint(5, 50)
    41. }
    42. # 模拟`硬件设备` 上报数据到 `thingsboard`服务端
    43. mqtt.publish('v1/devices/me/telemetry', payload=json.dumps(data), qos=0)
    44. time.sleep(1 * 60) # 5秒发布一次数据