我做了以下教程,使用IoT Foundation将我的Raspberry Pi连接到Bluemix上的应用程序:
我有以下问题:
如果我按下Pi上的按钮,它只会在Pi终端中打印出“按下按钮”。
我手机上没有收到任何短信发送信息,现在可以在Twilio的日志中输入。
答案 0 :(得分:3)
原来IBM IoT Foundation库改变了它解析JSON的方式......而且,我将代码硬编码为期望美国电话号码。我还添加了美国电话号码的支票。
更改line 25
buttonPushed = cmd.payload["d"]["buttonPushed"]
到
payload = json.loads(cmd.payload)
buttonPushed = payload["buttonPushed"]
答案 1 :(得分:1)
请勿使用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已发布,修复了此处提到的一些影响应用程序命令支持的错误。