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

IoT Python app with a Raspberry Pi and Bluemix: Pushing the button doesn't work

我按照以下教程使用 IoT Foundation 将我的 Raspberry Pi 与 Bluemix 上的应用程序连接起来:

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

我有以下问题:

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

我的 phone 上没有收到任何短信,现在日志中有来自 Twilio 的条目。

原来 IBM IoT Foundation 库在解析 JSON 的方式上发生了变化...此外,我将代码硬编码为期望美国 phone 数字。我还添加了美国 phone 号码的支票。

改变line 25

buttonPushed = cmd.payload["d"]["buttonPushed"]

payload = json.loads(cmd.payload)
buttonPushed = payload["buttonPushed"]

不要使用 cmd.payload ... 使用 cmd.data

这个例子是旧的,是使用旧版本的库构建的,不幸的是它没有引用它使用的 python 库的哪个版本,因为简单的 "fix"安装应用程序开发的库版本。

python 库仍处于预发布状态,我建议在构建应用程序时将您的要求设置为特定版本的库,因为在此阶段不能保证向后兼容性和任何新版本可能会因为行为的改变而破坏你的应用程序,尽管我尽可能地避免这些。

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

  • cmd/evt.deviceType
    • 设备的typeId
  • cmd/evt.deviceId
    • 设备的deviceId
  • cmd/evt.device
    • 您组织内设备的 typeId:deviceId 唯一标识符
  • cmd.command/evt.event
    • ID/namecommand/event
  • cmd/evt.格式
    • command/event 消息的格式
  • cmd/evt.payload
    • 命令的原始负载(这似乎只适用于目前的事件..哎呀,将在 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 消息的原始字节数组

如果您需要 application/device 来理解不是 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 已发布,修复了此处提到的几个影响应用程序命令支持的错误。