9.9 KiB
เชื่อมต่ออุปกรณ์ IoT ของคุณกับคลาวด์ - ฮาร์ดแวร์ IoT เสมือนและ Raspberry Pi
ในส่วนนี้ของบทเรียน คุณจะเชื่อมต่ออุปกรณ์ IoT เสมือนหรือ Raspberry Pi ของคุณกับ IoT Hub เพื่อส่งข้อมูลเทเลเมทรีและรับคำสั่ง
เชื่อมต่ออุปกรณ์ของคุณกับ IoT Hub
ขั้นตอนถัดไปคือการเชื่อมต่ออุปกรณ์ของคุณกับ IoT Hub
งาน - เชื่อมต่อกับ IoT Hub
-
เปิดโฟลเดอร์
soil-moisture-sensor
ใน VS Code ตรวจสอบให้แน่ใจว่าสภาพแวดล้อมเสมือนกำลังทำงานในเทอร์มินัล หากคุณใช้อุปกรณ์ IoT เสมือน -
ติดตั้งแพ็กเกจ Pip เพิ่มเติม:
pip3 install azure-iot-device
azure-iot-device
เป็นไลบรารีสำหรับสื่อสารกับ IoT Hub ของคุณ -
เพิ่มการนำเข้าต่อไปนี้ที่ด้านบนของไฟล์
app.py
ใต้การนำเข้าที่มีอยู่:from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse
โค้ดนี้นำเข้า SDK เพื่อสื่อสารกับ IoT Hub ของคุณ
-
ลบบรรทัด
import paho.mqtt.client as mqtt
เนื่องจากไลบรารีนี้ไม่จำเป็นอีกต่อไป ลบโค้ด MQTT ทั้งหมดรวมถึงชื่อหัวข้อ โค้ดทั้งหมดที่ใช้mqtt_client
และhandle_command
เก็บลูปwhile True:
ไว้ เพียงลบบรรทัดmqtt_client.publish
ออกจากลูปนี้ -
เพิ่มโค้ดต่อไปนี้ใต้คำสั่งนำเข้า:
connection_string = "<connection string>"
แทนที่
<connection string>
ด้วยสตริงการเชื่อมต่อที่คุณดึงมาได้สำหรับอุปกรณ์ก่อนหน้านี้ในบทเรียนนี้💁 นี่ไม่ใช่วิธีปฏิบัติที่ดีที่สุด สตริงการเชื่อมต่อไม่ควรถูกเก็บไว้ในซอร์สโค้ด เนื่องจากอาจถูกตรวจสอบในระบบควบคุมซอร์สโค้ดและถูกค้นพบโดยใครก็ตาม เราทำเช่นนี้เพื่อความเรียบง่าย ในทางที่ดีควรใช้สิ่งต่าง ๆ เช่นตัวแปรสภาพแวดล้อมและเครื่องมืออย่าง
python-dotenv
คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ในบทเรียนถัดไป -
ใต้โค้ดนี้ ให้เพิ่มโค้ดต่อไปนี้เพื่อสร้างออบเจ็กต์ client ของอุปกรณ์ที่สามารถสื่อสารกับ IoT Hub และเชื่อมต่อมัน:
device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) print('Connecting') device_client.connect() print('Connected')
-
รันโค้ดนี้ คุณจะเห็นอุปกรณ์ของคุณเชื่อมต่อ
pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py Connecting Connected Soil moisture: 379
ส่งข้อมูลเทเลเมทรี
ตอนนี้อุปกรณ์ของคุณเชื่อมต่อแล้ว คุณสามารถส่งข้อมูลเทเลเมทรีไปยัง IoT Hub แทนที่จะส่งไปยัง MQTT broker
งาน - ส่งข้อมูลเทเลเมทรี
-
เพิ่มโค้ดต่อไปนี้ภายในลูป
while True
ก่อนคำสั่ง sleep:message = Message(json.dumps({ 'soil_moisture': soil_moisture })) device_client.send_message(message)
โค้ดนี้สร้าง
Message
ของ IoT Hub ที่มีการอ่านค่าความชื้นในดินในรูปแบบสตริง JSON จากนั้นส่งไปยัง IoT Hub เป็นข้อความจากอุปกรณ์ไปยังคลาวด์
จัดการคำสั่ง
อุปกรณ์ของคุณจำเป็นต้องจัดการคำสั่งจากโค้ดเซิร์ฟเวอร์เพื่อควบคุมรีเลย์ คำสั่งนี้ถูกส่งมาในรูปแบบคำขอ direct method
งาน - จัดการคำขอ direct method
-
เพิ่มโค้ดต่อไปนี้ก่อนลูป
while True
:def handle_method_request(request): print("Direct method received - ", request.name) if request.name == "relay_on": relay.on() elif request.name == "relay_off": relay.off()
โค้ดนี้กำหนดเมธอด
handle_method_request
ที่จะถูกเรียกเมื่อ direct method ถูกเรียกโดย IoT Hub แต่ละ direct method มีชื่อ และโค้ดนี้คาดหวังเมธอดที่ชื่อrelay_on
เพื่อเปิดรีเลย์ และrelay_off
เพื่อปิดรีเลย์💁 สิ่งนี้สามารถถูกนำไปใช้ใน direct method เดียว โดยส่งสถานะที่ต้องการของรีเลย์ใน payload ที่สามารถส่งไปพร้อมกับคำขอเมธอดและสามารถเข้าถึงได้จากออบเจ็กต์
request
-
Direct method ต้องการการตอบกลับเพื่อแจ้งโค้ดที่เรียกว่าคำขอได้รับการจัดการแล้ว เพิ่มโค้ดต่อไปนี้ที่ท้ายฟังก์ชัน
handle_method_request
เพื่อสร้างการตอบกลับคำขอ:method_response = MethodResponse.create_from_method_request(request, 200) device_client.send_method_response(method_response)
โค้ดนี้ส่งการตอบกลับไปยังคำขอ direct method พร้อมรหัสสถานะ HTTP 200 และส่งกลับไปยัง IoT Hub
-
เพิ่มโค้ดต่อไปนี้ใต้การกำหนดฟังก์ชันนี้:
device_client.on_method_request_received = handle_method_request
โค้ดนี้บอก client ของ IoT Hub ให้เรียกฟังก์ชัน
handle_method_request
เมื่อ direct method ถูกเรียก
💁 คุณสามารถหาโค้ดนี้ได้ในโฟลเดอร์ code/pi หรือ code/virtual-device
😀 โปรแกรมเซ็นเซอร์ความชื้นในดินของคุณเชื่อมต่อกับ IoT Hub แล้ว!
ข้อจำกัดความรับผิดชอบ:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้