【问题标题】:IoT Python app with a Raspberry Pi and Bluemix: Pushing the button doesn't work带有 Raspberry Pi 和 Bluemix 的 IoT Python 应用程序:按下按钮不起作用
【发布时间】:2016-02-01 16:17:51
【问题描述】:

我按照以下教程使用 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 push”。

我的手机没有收到任何短信,现在 Twilio 的日志中有条目。

【问题讨论】:

    标签: python raspberry-pi ibm-cloud iot


    【解决方案1】:

    原来,IBM IoT Foundation 库在解析 JSON 的方式上发生了变化……此外,我将代码硬编码为预期美国电话号码。我还添加了美国电话号码检查。

    更改line 25

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

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

    【讨论】:

      【解决方案2】:

      不要使用 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
        • 命令的原始负载(这似乎仅适用于目前的事件..哎呀,将在 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 已发布,修复了此处提到的几个影响应用程序命令支持的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多