使用 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 |
只有在想要以持久订阅模式连接应用程序时,才需要一个true或false值。默认情况下,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。