我做了以下教程,使用IoT基金会将我的覆盆子Pi与Bluemix上的应用程序连接起来:
我有以下问题:
如果我按下Pi上的按钮,它只会在Pi终端上打印出“按钮按下”。
我没有收到任何短信发送到我的手机,现在有入口在日志中从Twilio。
发布于 2016-02-01 16:23:38
原来IBM基金会库在解析IoT的方式上发生了变化.此外,我的代码硬编码,以期待美国的电话号码。我还增加了一张美国电话号码的支票。
改变第25行
buttonPushed = cmd.payload["d"]["buttonPushed"]至
payload = json.loads(cmd.payload)
buttonPushed = payload["buttonPushed"]发布于 2016-02-04 12:32:27
不要用cmd.payload ..。使用cmd.data
这个例子是旧的,是使用旧版本的库构建的,不幸的是它没有引用它使用的python库的哪个版本,因为简单的“修复”是安装应用程序开发的库的版本。
python库仍然处于预发布状态,我建议您在构建应用程序时,将您的需求设置为库的特定版本,因为在此阶段不能保证向后兼容性,而且任何新的版本都可能会因为行为的改变而破坏应用程序,尽管我尽量避免这种情况。
库传递给回调的命令和事件对象具有以下属性:
如果您发送的命令格式为"json“,其内容如下:{"d":{"buttonPushed":true},则cmd.data将如下所示:
cmd.data == { "d":{ "buttonPushed":true }
普通的json解析器对json的形状不作任何假设,只要有效负载是有效的json就可以工作。
如果您发送格式为“json”的相同内容,那么json-iotf解析器就会启动,只有在使用内置历史学家服务所需的json形状时才能工作。在本例中,它将直接从d元素获取数据,并从ts元素中获取时间戳,因此您可以:
cmd.data == { "buttonPushed":true }
在这两种情况下,在库的最新版本中,cmd.payload将是基本MQTT消息的原始字节数组。
如果您需要您的应用程序/设备来理解不是json的有效负载,这是编写自定义编解码器并将其注册到客户端的一个简单例子。
如何同时使用数据和有效负载的一个很好的例子可以在连接器-云应用程序中找到。
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发布,它修复了这里提到的影响应用程序命令支持的几个bug。
https://stackoverflow.com/questions/35135226
复制相似问题