You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/zh/2-farm/lessons/4-migrate-your-plant-to-the.../single-board-computer-conne...

128 lines
5.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "3ac42e284a7222c0e83d2d43231a364f",
"translation_date": "2025-08-24T22:48:29+00:00",
"source_file": "2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md",
"language_code": "zh"
}
-->
# 将您的 IoT 设备连接到云端 - 虚拟 IoT 硬件和 Raspberry Pi
在本课程的这一部分,您将把虚拟 IoT 设备或 Raspberry Pi 连接到您的 IoT Hub以发送遥测数据并接收命令。
## 将设备连接到 IoT Hub
下一步是将您的设备连接到 IoT Hub。
### 任务 - 连接到 IoT Hub
1. 在 VS Code 中打开 `soil-moisture-sensor` 文件夹。如果您使用的是虚拟 IoT 设备,请确保虚拟环境在终端中运行。
1. 安装一些额外的 Pip 包:
```sh
pip3 install azure-iot-device
```
`azure-iot-device` 是一个用于与 IoT Hub 通信的库。
1.`app.py` 文件顶部的现有导入语句下方添加以下导入:
```python
from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse
```
这段代码导入了与 IoT Hub 通信的 SDK。
1. 删除 `import paho.mqtt.client as mqtt` 这一行,因为这个库不再需要。删除所有 MQTT 相关代码,包括主题名称、所有使用 `mqtt_client` 的代码以及 `handle_command`。保留 `while True:` 循环,只需删除该循环中的 `mqtt_client.publish` 行即可。
1. 在导入语句下方添加以下代码:
```python
connection_string = "<connection string>"
```
`<connection string>` 替换为您在本课程前面为设备检索到的连接字符串。
> 💁 这不是最佳实践。连接字符串不应该存储在源代码中,因为它可能会被提交到源代码控制中并被任何人发现。我们在这里这样做是为了简化操作。理想情况下,您应该使用环境变量和类似 [`python-dotenv`](https://pypi.org/project/python-dotenv/) 的工具。您将在后续课程中了解更多相关内容。
1. 在这段代码下方添加以下内容,以创建一个可以与 IoT Hub 通信的设备客户端对象并连接它:
```python
device_client = IoTHubDeviceClient.create_from_connection_string(connection_string)
print('Connecting')
device_client.connect()
print('Connected')
```
1. 运行这段代码。您将看到您的设备已连接。
```output
pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py
Connecting
Connected
Soil moisture: 379
```
## 发送遥测数据
现在您的设备已连接,您可以将遥测数据发送到 IoT Hub而不是发送到 MQTT broker。
### 任务 - 发送遥测数据
1.`while True` 循环中添加以下代码,就在 `sleep` 之前:
```python
message = Message(json.dumps({ 'soil_moisture': soil_moisture }))
device_client.send_message(message)
```
这段代码创建了一个包含土壤湿度读数的 JSON 字符串的 IoT Hub `Message`,然后将其作为设备到云端消息发送到 IoT Hub。
## 处理命令
您的设备需要处理来自服务器代码的命令以控制继电器。这是通过直接方法请求发送的。
### 任务 - 处理直接方法请求
1.`while True` 循环之前添加以下代码:
```python
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`,当 IoT Hub 调用直接方法时会调用该方法。每个直接方法都有一个名称,这段代码期望一个名为 `relay_on` 的方法来打开继电器,以及一个名为 `relay_off` 的方法来关闭继电器。
> 💁 这也可以通过一个单一的直接方法请求来实现,将继电器的期望状态作为一个有效负载传递,该有效负载可以通过方法请求传递并从 `request` 对象中获取。
1. 直接方法需要一个响应来告诉调用代码请求已被处理。在 `handle_method_request` 函数的末尾添加以下代码,以创建对请求的响应:
```python
method_response = MethodResponse.create_from_method_request(request, 200)
device_client.send_method_response(method_response)
```
这段代码向直接方法请求发送一个 HTTP 状态码为 200 的响应,并将其返回到 IoT Hub。
1. 在该函数定义下方添加以下代码:
```python
device_client.on_method_request_received = handle_method_request
```
这段代码告诉 IoT Hub 客户端在调用直接方法时调用 `handle_method_request` 函数。
> 💁 您可以在 [code/pi](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/pi) 或 [code/virtual-device](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/virtual-device) 文件夹中找到这段代码。
😀 您的土壤湿度传感器程序已连接到您的 IoT Hub
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的原始语言版本为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用本翻译而引起的任何误解或误读不承担责任。