带有 Raspberry Pi 和 Bluemix 的 IoT Python 应用程序:无法打开 on/off 灯并使用按钮发送消息

IoT Python app with a Raspberry Pi and Bluemix: Cannot turn on/off lights and send message using the button

我完成了以下教程,使用 IoT Foundation 将我的 Raspberry Pi 与 Bluemix 上的应用程序连接起来:

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

除了 client.py(教程中的第 36 步),我已经准备好了所有东西 运行。我收到以下错误消息:

client.py:9: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(17, GPIO.OUT)
Traceback (most recent call last):
  File "client.py", line 23, in <module>
    options = ibmiotf.application.ParseConfigFile("/home/pi/device.cfg")
  File "/usr/local/lib/python2.7/dist-packages/ibmiotf/application.py", line 501, in ParseConfigFile
    appType = parms.get(sectionHeader, "type", "standalone")
  File "/usr/lib/python2.7/ConfigParser.py", line 618, in get
    raise NoOptionError(option, section)
ConfigParser.NoOptionError: No option 'type' in section: 'application'

我发现错误来自配置文件 (device.cfg) 中缺少的 "type" 部分。

本教程第 35 步中列出的文件结构并未说明您需要 "type"。我用的是之前在物联网基金会创建的设备类型(raspberrypi)

现在我确实成功连接到 IoT Foundation。

我现在遇到的问题是,当我按下我的 Raspberry Pi 按钮或网络应用程序的 "Turn light on/off" 按钮时,没有任何反应。

如果我使用“./cf logs myappname -recent”检查 python 应用程序的日志,我会得到以下输出:

2016-01-29T08:38:49.10+0100 [App/0]      OUT on
2016-01-29T08:38:49.10+0100 [App/0]      ERR 75.126.37.74 - - [29/Jan/2016 07:38:49] "POST /light/on HTTP/1.1"; 302 -
2016-01-29T08:38:49.34+0100 [App/0]      ERR 75.126.52.20 - - [29/Jan/2016 07:38:49] "GET / HTTP/1.1"; 200 -
2016-01-29T08:38:49.56+0100 [RTR/1]      OUT myappname.mybluemix.net - [29/01/2016:07:38:49 +0000] "GET / HTTP/1.1" 200 0 751 "http://myappname.mybluemix.net/&quot; ";Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36" 108.168.250.151:39460 x_forwarded_for:&quot;46.5.2.236"x_forwarded_proto:"http&quot; vcap_request_id:myrequestid response_time:0.31228492 app_id:myapp_id x_global_transaction_id:mytransactionid;
2016-01-29T08:40:08.32+0100 [App/0]      OUT off
2016-01-29T08:40:08.33+0100 [App/0]      ERR 75.126.37.74 - - [29/Jan/2016 07:40:08] "POST /light/off HTTP/1.1" 302 -
2016-01-29T08:40:08.51+0100 [App/0]      ERR 75.126.23.243 - - [29/Jan/2016 07:40:08] "GET / HTTP/1.1" 200 -`

本教程的作者 Jeff 说我应该仔细检查 Pi 和 Bluemix 中的应用程序是否都在收听同一主题。在 IoT 服务中,我应该能够看到通过的消息。

我不知道这意味着什么,也不知道我该怎么做。

我们已经在博客 post (https://www.youtube.com/watch?v=YHDhn5hGnn8) 的 youtube 视频的评论部分讨论了我的问题,Jeff 告诉我我们应该将它转移到 Whosebug(有道理).

感谢您的帮助。

// 编辑以获取更多信息 // 这是我在 Pi 上获得的输出,当我启动应用程序时: 须藤 python client.py

2016-02-01 14:36:23,221   ibmiotf.application.Client  WARNING Unable to encrypt messages because TLSv1.2 is unavailable (MQTT over SSL requires at least Python v2.7.9 or 3.4 and openssl v1.0.1)
2016-02-01 14:36:23,716   ibmiotf.application.Client  INFO    Connected successfully: A:69wm3f:aaaafdsfsd45641safsda2313

如果我在客户端启动后第一次按下 on/off 按钮,我会在 Pi 上得到以下输出:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2287, in _thread_main
    self.loop_forever()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1261, in loop_forever
    rc = self.loop(timeout, max_packets)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 811, in loop
    rc = self.loop_read(max_packets)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1073, in loop_read
    rc = self._packet_read()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1475, in _packet_read
    rc = self._packet_handle()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1943, in _packet_handle
    return self._handle_publish()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2118, in _handle_publish
    self._handle_on_message(message)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2268, in _handle_on_message
    t[1](self, self._userdata, message)
  File "/usr/local/lib/python2.7/dist-packages/ibmiotf/application.py", line 423, in __onDeviceEvent
    if self.deviceEventCallback: self.deviceEventCallback(event)
  File "client.py", line 17, in myCommandCallback
    command = cmd.payload["d"]["command"]
TypeError: string indices must be integers, not str

看起来来自 IoT Foundation 的消息正在到达客户端。

我在 IoT Foundation、Bluemix Python 应用程序的环境变量和 Raspberry Pi 上设置了以下 ID:

三个ID都一样

// 编辑 2 // 添加评论部分的 print cmd 语句后的日志输出:

<ibmiotf.application.Event instance at 0x76526738>
light
{"command": "on"}

更改后的堆栈跟踪

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

command = cmd.payload["command"]

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2287, in _thread_main
    self.loop_forever()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1261, in loop_forever
    rc = self.loop(timeout, max_packets)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 811, in loop
    rc = self.loop_read(max_packets)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1073, in loop_read
    rc = self._packet_read()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1475, in _packet_read
    rc = self._packet_handle()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1943, in _packet_handle
    return self._handle_publish()
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2118, in _handle_publish
    self._handle_on_message(message)
  File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2268, in _handle_on_message
    t[1](self, self._userdata, message)
  File "/usr/local/lib/python2.7/dist-packages/ibmiotf/application.py", line 423, in __onDeviceEvent
    if self.deviceEventCallback: self.deviceEventCallback(event)
  File "client.py", line 18, in myCommandCallback
    command = cmd.payload["command"]
TypeError: string indices must be integers, not str

原来 IBM IoT Foundation 库的解析方式发生了变化 JSON...

改变line 15

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

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

我再添加一行 "json.dumps",它对我有用。

dataraw   = json.dumps(cmd.data)
payload = json.loads(dataraw)
command = payload["command"]

此致