【发布时间】:2016-02-01 16:17:51
【问题描述】:
我按照以下教程使用 IoT Foundation 将我的 Raspberry Pi 与 Bluemix 上的应用程序连接起来:
我有以下问题:
如果我按下 Pi 上的按钮,它只会在 Pi 终端中打印出“Button push”。
我的手机没有收到任何短信,现在 Twilio 的日志中有条目。
【问题讨论】:
标签: python raspberry-pi ibm-cloud iot
我按照以下教程使用 IoT Foundation 将我的 Raspberry Pi 与 Bluemix 上的应用程序连接起来:
我有以下问题:
如果我按下 Pi 上的按钮,它只会在 Pi 终端中打印出“Button push”。
我的手机没有收到任何短信,现在 Twilio 的日志中有条目。
【问题讨论】:
标签: python raspberry-pi ibm-cloud iot
原来,IBM IoT Foundation 库在解析 JSON 的方式上发生了变化……此外,我将代码硬编码为预期美国电话号码。我还添加了美国电话号码检查。
更改line 25
buttonPushed = cmd.payload["d"]["buttonPushed"]
到
payload = json.loads(cmd.payload)
buttonPushed = payload["buttonPushed"]
【讨论】:
不要使用 cmd.payload ...使用 cmd.data
这个例子很旧,是使用旧版本的库构建的,不幸的是它没有引用它使用的 python 库的版本,因为简单的“修复”是安装库的版本应用程序是为开发的。
python 库仍处于预发布状态,我建议在构建应用程序时将您的要求设置为库的特定版本,因为在此阶段不保证向后兼容性,任何新版本都可能会破坏您的应用程序,因为行为的变化,尽管我尽可能避免这些变化。
库传递给回调的命令和事件对象具有以下属性:
如果您发送格式为“json”且内容如下的命令:{"d": {"buttonPushed": true}} 那么 cmd.data 将如下所示:
cmd.data == { “d”:{ “buttonPushed”:真 } }
普通的json parser 不对您的 json 的形状做任何假设,只要您的有效负载是有效的 json,它就可以工作。
如果您使用“json-iotf”格式发送相同的内容,则json-iotf 解析器将启动,这仅在您使用内置历史服务所需的 json 形状时才有效。在这种情况下,它将直接从 d 元素中获取数据并从 ts 元素中获取时间戳,因此您将拥有:
cmd.data == { “buttonPushed”:真 }
在这两种情况下,在最新版本的库中,cmd.payload 都是底层 MQTT 消息的原始字节数组
如果您需要您的应用程序/设备来理解不是 json 的有效负载,这是writing a custom codec and registering it with the clients 的简单案例。
可以在connector-cloudant application 中找到如何使用数据和有效负载的一个很好的示例:
def myEventCallback(self, evt):
#self.logger.info("%-33s%-30s%s" % (evt.timestamp.isoformat(), evt.device, evt.event + ": " + json.dumps(evt.data)))
#self.logger.info(evt.data)
# Create with a generated ID
future = self._cloudantDb.post(params={
'typeId': evt.deviceType,
'deviceId': evt.deviceId,
'eventId': evt.event,
'timestamp': evt.timestamp.isoformat(),
'data': evt.data,
'format': evt.format,
'payload': base64.encodestring(evt.payload).decode('ascii')
})
future.add_done_callback(self._eventRecordedCallback)
所有这些都适用于当前版本 (0.1.7)
编辑:0.1.8 已发布,修复了此处提到的几个影响应用程序命令支持的错误。
【讨论】: