使用 Python 做物联网开发

最后更新:2017-03-14 在GitHub编辑

您可以使用Python来构建和开发设备代码,以便在IBM Watson™IoT Platform上与您的项目进行交互。Watson IoT Platform的Python客户端提供了一个API,通过抽象出基础协议(如MQTT和HTTP)来促进与Watson IoT Platform功能的简单交互。

使用提供的文档和示例,通过Python开发您的设备。

下载Python客户端和资源

要访问Watson IoT Platform的Python客户端和其他可用资源,请转到GitHub中的iot-python 并完成安装说明。

构造函数

Python 代码中的 options 字典用于定义与Watson IoT Platform模块的交互方式。构造函数构建客户端实例,并接受包含以下定义的 options 字典:

定义 说明
orgId 您的组织ID。
type 设备的类型。设备类型是执行特定任务的设备的分组,例如“weatherballoon”。
id 标识设备的唯一ID。通常,对于给定的设备类型,设备ID是该设备的唯一标识符,例如序列号或MAC地址。
auth-method 认证方法。唯一支持的方法是apikey
auth-token 一个API密钥令牌,当您将auth-method的值设置为apikey时也是必需的。
clean-session 只有在想要以持久订阅模式连接应用程序时,才需要一个truefalse值。默认情况下,clean-session设置为true

如果没有提供 options 字典,则客户端将作为未注册设备连接到Watson IoT Platform Quickstart服务。

import ibmiotf.device
try:
  options = {
    "org": orgId,
    "type": deviceType,
    "id": deviceId,
    "auth-method": authMethod,
    "auth-token": authToken,
    "clean-session": true
  }
  client = ibmiotf.device.Client(options)
except ibmiotf.ConnectionException  as e:
...

使用配置文件

不仅可以在代码中直接定义options字典,还可以在配置文件中单独定义options字典,如以下代码示例所示:

import ibmiotf.device
try:
  options = ibmiotf.device.ParseConfigFile(configFilePath)
  client = ibmiotf.device.Client(options)
except ibmiotf.ConnectionException  as e:
...

包含options字典的配置文件必须采用以下格式:

[device]
org=orgID
type=deviceType
id=deviceId
auth-method=token
auth-token=token
clean-session=true/false

发布事件

事件是设备向Watson IoT 平台发布数据的机制。由设备控制事件的内容,并为其发送的每个事件分配一个名称。

当Watson IoT Platform实例接收到事件时,接收到的事件的凭据唯一的标识会发送设备,这意味着当前设备不可能模拟其他设备。

可以使用MQTT协议定义的三种服务质量(QoS)级别中的任何一种来发布事件。默认情况下,发布QoS级别为0的事件。

使用默认的服务质量发布事件

client.connect()
myData={'name' : 'foo', 'cpu' : 60, 'mem' : 50}
client.publishEvent("status", "json", myData)

增加事件的QoS级别

您可以提高发布的事件的服务质量(QoS)级别。由于包含了额外的确认收据信息,具有比0更高的QoS级别的事件可能需要较长的时间才能发布。

注意:快速入门流模式仅支持QoS级别0。

client.connect()
myQosLevel=2
myData={'name' : 'foo', 'cpu' : 60, 'mem' : 50}
client.publishEvent("status", "json", myData, myQosLevel)

处理命令

当设备客户端连接时,它会自动订阅为此设备指定的任何命令。要处理特定的命令,您需要注册一个命令回调函数。消息作为Command类的实例返回,其中包含以下属性:

属性 数据类型 说明
command 字符串 标识命令。
format 字符串 格式可以是任何字符串,例如JSON。
data 字典 有效载荷的数据。最大长度为131072字节。
timestamp 日期和时间 事件的日期和时间。
def myCommandCallback(cmd):
  print("Command received: %s" % cmd.data)
  if cmd.command == "setInterval":
    if 'interval' not in cmd.data:
      print("Error - command is missing required information: 'interval'")
    else:
      interval = cmd.data['interval']
  elif cmd.command == "print":
    if 'message' not in cmd.data:
      print("Error - command is missing required information: 'message'")
    else:
      print(cmd.data['message'])

#...
client.connect()
client.commandCallback = myCommandCallback
Custom message format support

默认情况下,消息格式设置为json,这意味着该库支持JSON格式向Python字典对象的编码和解码。当消息格式设置为json-iotf时,消息将按照Watson IoT Platform 的 JSON规范进行编码。要添加对自己的自定义消息格式的支持,请参阅GitHub中的自定义消息格式示例

创建自定义编码器模块时,必须将其注册到设备客户端,如以下示例所述:

import myCustomCodec

client.setMessageEncoderModule("custom", myCustomCodec)
client.publishEvent("status", "custom", myData)

如果以未知格式发送事件,或者设备无法识别格式,则设备库将返回MissingMessageDecoderException


原文地址:Python for device developers