开发者中心

Hello MQTT Python

概述

在本教程中,您将学习如何用具有预定义消息(称为"静态模板")来使用Python MQTT客户端。

前提条件

为了更好的使用本教程,请检查以下必备条件:

  • 有一个有效的租户,一个用户和一个密码,可以用来访问Quarkioe。
  • 确认已经安装了Python:
  • 
    python --version
    Python 2.7.12
                            
  • 下载Python的路径www.python.org
  • 安装Paho客户端
  • 
    pip install paho-mqtt
                            

开发"Hello, MQTT world!" 的客户端

开发一个非常简单的“Hello,MQTT world!”客户端,需要:

  • 创建python脚本
  • 运行脚本
创建python脚本

创建一个脚本文件,例如"hello_mqtt.py",内容如下:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import time, threading, ssl

receivedMessages = []

def on_message(client, userdata, message):
  print("Received operation " + str(message.payload))
  if (message.payload.startswith("510")):
     print("Simulating device restart...")
     publish("s/us", "501,c8y_Restart");
     print("...restarting...")
     time.sleep(1)
     publish("s/us", "503,c8y_Restart");
     print("...done...")

def sendMeasurements():
  try:
    print("Sending temperature measurement")
    publish("s/us", "211,25");
    thread = threading.Timer(3, sendMeasurements)
    thread.daemon=True
    thread.start()
    while True: time.sleep(100)
  except (KeyboardInterrupt, SystemExit):
    print 'Received keyboard interrupt, quitting ...'


def publish(topic, message, waitForAck = False):
  mid = client.publish(topic, message, 2)[1]
  if (waitForAck):
    while mid not in receivedMessages:
      time.sleep(0.25)

def on_publish(client, userdata, mid):
  receivedMessages.append(mid)

client = mqtt.Client(client_id="<<clientId>>")
client.username_pw_set("<<tenant>>/<<username>>", "<<password>>")
client.on_message = on_message
client.on_publish = on_publish

client.connect("<<serverHost>>", 1883)
client.loop_start()
publish("s/us", "100,Python MQTT,c8y_MQTTDevice", True)
publish("s/us", "110,S123456789,MQTT test model,Rev0.1")
client.subscribe("s/ds")
sendMeasurements()
                        

用你的数据替换"<<clientId>>", "<<serverHost >>", "<<tenant>>", "<<username>>", "<<password>>"。

Quarkioe MQTT协议同时支持不安全的TCP和安全的SSL连接,因此配置端口时请记得使用正确的端口。无论您选择哪个连接类型,您的“<< serverHost >>”都应该保持不变。(如mqtt.quarkioe.com)。

上面的例子是使用TCP连接,如果你想使用SSL,请记住Paho MQTT客户端的正确配置,更多信息可以参考https://www.eclipse.org/paho/clients/python/docs/#option-functions。

脚本用来做什么?

  • 配置MQTT连接。
  • 注册一个on_message回调函数,它将列印出传入的消息,并在c8y_Restart操作的情况下,它将模拟设备重新启动。
  • 注册一个on_publish回调函数,将在发布消息被发布之后被调用。
  • 通过MQTT协议与Cumulocity连接。
  • 使用Python MQTT名称和c8y_MQTT设备类型创建新设备。
  • 通过添加一个S123456789串行,一个MQTT测试模型的模型和一个Rev0.1的修订版来更新设备硬件信息。
  • 订阅设备的静态操作模板 - 每次创建新操作时,都会导致on_message方法调用。
  • 调用每3秒发送一次温度测量值的sendMeasurements方法。

发布消息用来做什么?

  • 通过MQTT发布关于给定主题的给定消息。Publish a given message about the given topic via MQTT.
  • 发布消息时使用QoS 2,所以为了确保消息已经传递,它将等待服务器ACK(直到使用匹配的消息ID调用on_publish方法)。

注意:订阅是在设备创建后被建立,否则,如果给定的clientId没有设备,服务器将不会接受订阅。

运行脚本,只需调用:

编译:


  python hello_mqtt.py 
                    

启动应用程序后,在QuarkIoE应用程序的设备列表中可以看到一个新设备。 此外,如果在该设备上创建一个新的操作(例如c8y_Restart),则会在控制台列印出此信息。

在控制台中会看到下面的输出:


Sending temperature measurement
...
                    

启动应用程序后,您会在立子云平台应用程序的设备管理中的设备清单里面看到一个新的设备。

另外,如果新创建一个设备操作(例如 c8y_Restart),该设备操作信息将会显示在控制列表。

改进agent

现在你已经完成了第一步,请查看Hello MQTT部分以了解更多关于Quarkioe MQTT的信息,并改进您的应用程序。