使用Raspberry Pi和Bluemix的IoT Python应用程序:按下按钮不起作用

时间:2016-02-01 16:17:51

标签: python raspberry-pi ibm-cloud iot

我做了以下教程,使用IoT Foundation将我的Raspberry Pi连接到Bluemix上的应用程序:

https://developer.ibm.com/bluemix/2015/04/02/tutorial-using-a-raspberry-pi-python-iot-twilio-bluemix/

我有以下问题:

如果我按下Pi上的按钮,它只会在Pi终端中打印出“按下按钮”。

我手机上没有收到任何短信发送信息,现在可以在Twilio的日志中输入。

2 个答案:

答案 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库仍处于预发布状态,我建议在构建应用程序时将您的需求设置为库的特定版本,因为在此阶段无法保证向后兼容性,并且任何新版本都可能因您的应用程序而中断行为的变化,尽管我尽可能避免这些。

库传递给回调的命令和事件对象具有以下属性:

  • CMD / evt.deviceType
    • 设备的typeId
  • CMD / evt.deviceId
    • 设备的deviceId
  • CMD / evt.device
    • 组织内设备的typeId:deviceId唯一标识符
  • cmd.command / evt.event
    • 命令/事件的ID /名称
  • CMD / evt.format
    • 命令/事件消息的格式
  • CMD / evt.payload
    • 命令的原始有效负载(这似乎仅适用于当前事件.. oops,将在0.1.8中更正)
  • CMD / evt.data
    • 来自命令有效负载的解析数据(作为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已发布,修复了此处提到的一些影响应用程序命令支持的错误。