带有 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 上的应用程序连接起来:
除了 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/" ";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:"46.5.2.236"x_forwarded_proto:"http" 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:afdsfsd45641safsda2313
- Bluemix Python 应用程序 ID:afdsfsd45641safsda2313
- Raspberry Pi device.cfg 中的 ID:afdsfsd45641safsda2313
三个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"]
此致
我完成了以下教程,使用 IoT Foundation 将我的 Raspberry Pi 与 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/" ";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:"46.5.2.236"x_forwarded_proto:"http" 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:afdsfsd45641safsda2313
- Bluemix Python 应用程序 ID:afdsfsd45641safsda2313
- Raspberry Pi device.cfg 中的 ID:afdsfsd45641safsda2313
三个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"]
此致