首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有蓝莓Pi和蓝光的IoT Python应用程序:按下按钮不工作

带有蓝莓Pi和蓝光的IoT Python应用程序:按下按钮不工作
EN

Stack Overflow用户
提问于 2016-02-01 16:17:51
回答 2查看 156关注 0票数 2

我做了以下教程,使用IoT基金会将我的覆盆子Pi与Bluemix上的应用程序连接起来:

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

我有以下问题:

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

我没有收到任何短信发送到我的手机,现在有入口在日志中从Twilio。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-01 16:23:38

原来IBM基金会库在解析IoT的方式上发生了变化.此外,我的代码硬编码,以期待美国的电话号码。我还增加了一张美国电话号码的支票。

改变第25行

代码语言:javascript
复制
buttonPushed = cmd.payload["d"]["buttonPushed"]

代码语言:javascript
复制
payload = json.loads(cmd.payload)
buttonPushed = payload["buttonPushed"]
票数 3
EN

Stack Overflow用户

发布于 2016-02-04 12:32:27

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

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

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

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

  • cmd/evt.deviceType
    • 设备的typeId

  • cmd/evt.deviceId
    • 设备的deviceId

  • cmd/evt.device
    • 类型the :组织内设备的唯一标识符

  • 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":true }

普通的json解析器对json的形状不作任何假设,只要有效负载是有效的json就可以工作。

如果您发送格式为“json”的相同内容,那么json-iotf解析器就会启动,只有在使用内置历史学家服务所需的json形状时才能工作。在本例中,它将直接从d元素获取数据,并从ts元素中获取时间戳,因此您可以:

cmd.data == { "buttonPushed":true }

在这两种情况下,在库的最新版本中,cmd.payload将是基本MQTT消息的原始字节数组。

如果您需要您的应用程序/设备来理解不是json的有效负载,这是编写自定义编解码器并将其注册到客户端的一个简单例子。

如何同时使用数据和有效负载的一个很好的例子可以在连接器-云应用程序中找到。

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35135226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档