我已经在我的覆盆子pi上安装了最新版本的raspbian,我在亚马逊上开设了一个账户AWS IoT,然后在IoT网页界面中创建了一个东西,用“RaspberryPi_2”命名并创建证书并连接事情证明,我已按照本指南:
http://blog.getflint.io/blog/get-started-with-aws-iot-and-raspberry-pi
然后我在指南中创建了脚本,连接并订阅了raspberry pi,这是我的代码:
#!/usr/bin/python3
#required libraries
import sys
import ssl
import paho.mqtt.client as mqtt
#called while client tries to establish connection with the server
def on_connect(mqttc, obj, flags, rc):
if rc==0:
print ("Subscriber Connection status code: "+str(rc)+" | Connection status: successful")
elif rc==1:
print ("Subscriber Connection status code: "+str(rc)+" | Connection status: Connection refused")
#called when a topic is successfully subscribed to
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos)+"data"+str(obj))
#called when a message is received by a topic
def on_message(mqttc, obj, msg):
print("Received message from topic: "+msg.topic+" | QoS: "+str(msg.qos)+" | Data Received: "+str(msg.payload))
#creating a client with client-id=mqtt-test
mqttc = mqtt.Client(client_id="mqtt-test")
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_message = on_message
#Configure network encryption and authentication options. Enables SSL/TLS support.
#adding client-side certificates and enabling tlsv1.2 support as required by aws-iot service
mqttc.tls_set("/home/pi/aws_iot/things/raspberryPi_2/certs/aws-iot-rootCA.crt",
certfile="/home/pi/aws_iot/things/raspberryPi_2/certs/0ea2cd7eb6-certificate.pem.crt",
keyfile="/home/pi/aws_iot/things/raspberryPi_2/certs/0ea2cd7eb6-private.pem.key",
tls_version=ssl.PROTOCOL_TLSv1_2,
ciphers=None)
#connecting to aws-account-specific-iot-endpoint
mqttc.connect("A2GF7W5U5A46J1.iot.us-west-2.amazonaws.com", port=8883) #AWS IoT service hostname and portno
#the topic to publish to
mqttc.subscribe("$aws/things/RaspberryPi_2/shadow/update/#", qos=1) #The names of these topics start with $aws/things/thingName/shadow."
#automatically handles reconnecting
mqttc.loop_forever()
但是当我执行此命令时:
python3 mqtt_test.py
或此命令:
python mqtt_test.py
然后按回车键,光标闪烁,不打印任何内容并且卡在那里,有人可以帮我吗?
我还不明白client-id名称是否应该与名称相同,以及订阅路径的含义,例如在我发现的教程中:
mqttc.publish("temperature", tempreading, qos=1)
为什么没有完整的路径?
或者这个:
$aws/things/RaspberryPi_2/shadow/update/delta
所以我可以把我想要的东西放在路径上?
感谢
答案 0 :(得分:1)
代码订阅了一个主题,但没有人发布它。因此,代码还具有on_connect
函数,该函数将在成功连接后触发。是否正在打印消息"Subscriber Connection status code: ..."
?如果是,则还应显示来自on_subscribe
的消息。是吗?
如果不是您在连接到AWS服务器之前遇到问题。使用netstat
命令查看Raspberry Pi的连接位置,并在此情况下发布更多调试信息。
如果显示连接和订阅消息后没有任何反应,这是正常的,因为您只订阅主题但不发布任何内容。
关于主题,请将它们视为目录结构。主题层次结构没有严格的规则。 “温度”主题在服务器上为temperature
主题,“温度/客厅”为temperature/livingroom
,您可以在同一服务器上订阅一个,另一个或两者。您为事物选择的路径对您的应用程序有意义。例如,房屋可能表示为:
房子/厨房/ ENV /温度 房子/厨房/ ENV /湿度 房子/厨房/灯/ sinklamp 房子/厨房/灯/ mainlap 房子/ masterbed / env的/温度 房子/ masterbed / env的/湿度 房子/ masterbed /灯/ readinglampleft 房子/ masterbed /灯/ readinglampright 房子/ masterbed /灯/ mainlamp 房子/ masterbed /灯/ mirrorlamp
等等。
假设你在主卧室有一个恒温器。它仅对temperature
感兴趣,但不对humidity
感兴趣。它也只对主卧温度感兴趣。该恒温器应订阅house/masterbed/env/temperature
。与此相反,一个房间宽的面板显示房间中每个的东西的状态,将订阅house/masterbed/#
,意思是“房子后面的所有东西”。阅读有关通配符here
您订阅的主题:$aws/things/RaspberryPi_2/shadow/update/#
表示“$ aws / things / RaspberryPi_2 / shadow / update /之后的所有内容”。请注意,他是一个特殊主题,它以$aws
开头,特别是以$
字符开头。在AWS context中,这意味着:
任何以$开头的主题都被视为保留,而不是 支持发布和订阅,除非在使用时 Thing Shadows服务。有关更多信息,请参阅Thing Shadows。
所以你需要了解thing shadow
是什么。这是AWS特定(非常实用)的概念。请阅读docs关于此主题的内容。
最后,我建议你安装一个本地代理(mosquitto可以在respbian上使用)并在进入AWS之前尝试使用它。这样您就可以在没有连接问题的情况下掌握mqtt概念。之后,您将AWS置于混合状态。