在 Raspberry Pi 上使用 Python 中的 WebSockets 进行发布
此示例展示如何使用端口 80 上的 WebSockets 使用运行 Python 的 Raspberry Pi 板发布到 ThingSpeak 通道。如果您有多个传感器值想要发送到 ThingSpeak,则可以将多个值发布到通道源。在此示例中,每 20 秒收集一次 Raspberry Pi 板的 CPU 和 RAM 使用情况数据,并将这些值发布到通道源。或者,如果您只有一个值需要更新,则可以将单个值发布到通道字段。
设置
1) 创建一个新通道,如在新通道中收集数据所示。
2) 通过点击 ThingSpeak 页面顶部的 Devices > MQTT,然后点击 Add Device 来创建 MQTT 设备。设置设备并将新通道添加到其授权列表时,点击 Download Credentials > Plain Text。详情请参阅创建 ThingSpeak MQTT 设备。使用下面代码部分中保存的凭据。
3) 下载适用于 Python 的 Paho MQTT 客户端库。您可以使用命令行来安装库。如果您使用的是 Python 2,请使用以下代码:
sudo pip install paho-mqtt sudo pip install psutil
如果您使用 Python 3,请使用以下代码:
sudo pip3 install paho-mqtt sudo pip3 install psutil
代码
1) 在您的 Python 代码中包含库 paho.mqtt.publish as publish
、psutil
和 string
。
import paho.mqtt.publish as publish import psutil import string
2) 定义与 ThingSpeak 通信的变量。编辑通道 ID 和 MQTT 设备凭证。
# The ThingSpeak Channel ID. # Replace <YOUR-CHANNEL-ID> with your channel ID. channel_ID = "<YOUR-CHANNEL-ID>" # The hostname of the ThingSpeak MQTT broker. mqtt_host = "mqtt3.thingspeak.com" # Your MQTT credentials for the device mqtt_client_ID = "<YOUR-CLIENT-ID>" mqtt_username = "<YOUR-USERNAME>" mqtt_password = "<YOUR-MQTT-PASSWORD>"
3) 定义连接类型为 websockets
,并将端口设置为 80
。
t_transport = "websockets" t_port = 80
4) 创建一个如发布到通道 Feed 所示形式的主题字符串,同时更新指定通道的字段 1 和字段 2。
# Create the topic string. topic = "channels/" + channel_ID + "/publish"
5) 运行一个循环,每 20 秒计算一次系统 RAM 和 CPU 性能并发布计算值。使用 WebSockets 同时发布到指定通道的字段 1 和 2。
while (True): # get the system performance data over 20 seconds. cpu_percent = psutil.cpu_percent(interval=20) ram_percent = psutil.virtual_memory().percent # build the payload string. payload = "field1=" + str(cpu_percent) + "&field2=" + str(ram_percent) # attempt to publish this data to the topic. try: print ("Writing Payload = ", payload," to host: ", mqtt_host, " clientID= ", mqtt_client_ID, " User ", mqtt_username, " PWD ", mqtt_password) publish.single(topic, payload, hostname=mqtt_host, transport=t_transport, port=t_port, client_id=mqtt_client_ID, auth={'username':mqtt_username,'password':mqtt_password}) except (keyboardInterrupt) break except Exception as e: print (e)
运行该程序并观看该通道从您的设备获取的定期更新。
另请参阅
Publish to a Channel Feed | Publish to a Channel Field Feed