From 753a1270aed47451afdcede219237b9e02b6e746 Mon Sep 17 00:00:00 2001 From: dustin007442 Date: Tue, 6 May 2025 16:58:27 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=96=B0=E5=A2=9EAzure=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zh/cloudlib/README.md | 2 + zh/cloudlib/azure.md | 298 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 300 insertions(+) create mode 100644 zh/cloudlib/azure.md diff --git a/zh/cloudlib/README.md b/zh/cloudlib/README.md index 8ba5a29..453d26f 100644 --- a/zh/cloudlib/README.md +++ b/zh/cloudlib/README.md @@ -8,3 +8,5 @@ - [aLiYun - 阿里 IoT 平台](./aLiYun.md) - [TenCentYun- 腾讯 IoT 平台](./TenCentYun.md) - [Aws - 亚马逊 IoT 平台](./aws.md) +- [Azure - Azure IoT 平台](./azure.md) + diff --git a/zh/cloudlib/azure.md b/zh/cloudlib/azure.md new file mode 100644 index 0000000..94a2ccc --- /dev/null +++ b/zh/cloudlib/azure.md @@ -0,0 +1,298 @@ +# Azure - Azure IoT 平台 + +用于连接到 Azure IoT Hub、管理MQTT连接、设备孪生、直接方法以及使用 SAS 令牌和 x.509 证书进行身份验证的客户端。 + +## 初始化客户端 + +### `Azure` +```python +class Azure(client_id, server, port, keep_alive=60, user=None, password=None, ssl=False, ssl_params=None) +``` +**参数:** + +- `client_id` (str) – 设备的唯一标识符。 +- `server` (str) – Azure IoT Hub 服务器域名 (e.g. `your-hub.azure-devices.net`)。 +- `port` (int) – MQTT 端口 (通常 8883 作为 TLS 端口)。 +- `keep_alive` (int) – 保活包心跳周期单位秒。 (默认: 60秒)。 +- `user` (str) – MQTT 用户名 (格式: `hostname/deviceId/?api-version=2020-09-30`)。 +- `password` (str) – SAS 认证的 token 值。 +- `ssl` (bool) – 是否采用 SSL/TLS 连接。(默认: False)。 +- `ssl_params` (dict) – SSL 连接参数。 + +**示例** + +```python +>>> import azure +>>> az = azure.Azure(client_id, server, port, keep_alive=60, user=username, password=sas_token, ssl=True, ssl_params={"cert": cert, "key": key}) +``` + +--- + +## 认证 + +### `azure.generate_sas_token` +```python +generate_sas_token(uri, key, policy_name, expiry=3600) +``` +生成共享访问签名(SAS)令牌。 + +**参数:** + +- `uri` - 统一资源标识符(URI),指定Azure IoT Hub中的目标设备。它应该遵循以下格式: `"{}/devices/{}".format(server, client_id)`, where `server` is the IoT Hub hostname and `client_id` is the unique device identifier. For example: `"your-hub.azure-devices.net/devices/myDeviceId"`。 +- `key` - 共享访问密钥。 +- `policy_name` - 您正在使用的策略的名称。如果不使用任何值,则 policy_name 值为None。 + +**返回值:** + +一个有效的 SAS 令牌字符串。 + + +## MQTT 通信 + +### `azure.connect` +```python +connect() +``` +建立 Azure IoT Hub 的 MQTT 连接。 + +**返回值:** + +None + +### `azure.disconnect` +```python +disconnect() +``` +断开与服务器的 MQTT 连接。 + +**返回值:** + +None + +### `azure.subscribe` +```python +subscribe(topic, qos=0) +``` +订阅主题。 + +**参数:** + +- `topic` (str) - 订阅主题。Azure IoT Hub已为订阅和发布保留了主题。 +- `qos` (str) - QoS 0或1。IoT Hub最多支持QoS 1,并将QoS 2订阅降级为QoS 1。 + +**返回值:** + +None + +### `azure.publish` +```python +publish(topic, payload, qos=0) +``` +指定主题发布消息。 + +**参数:** + +- `topic` (str) - 发布的主题。 +- `qos` (str) - QoS ,0 或 1。 + +**返回值:** + +None + +### `azure.set_callback` +```python +set_callback(topic_name, callback) +``` +为某个主题的传入消息设置回调。 + +**参数:** + +- `topic_name` (str) - 要为其设置回调的主题的名称。 +- `callback` (function) - 收到指定主题的回调函数,原型如下: + + callback_function(msg) + - 回调函数参数: + + - `msg`: 字典类型的消息。已从JSON字符串转换为字典格式。 + +**返回值:** + +None + +### `azure.loop` +```python +loop() +``` +处理传入的MQTT消息(非阻塞循环)。 + +**返回值:** + +None + +### `azure.start` +```python +start() +``` +启动MQTT客户端的主业务循环。 + +**返回值:** + +None + +--- + +## 管理设备孪生 + +### `azure.retrieve_twin` +```python +retrieve_twin(request_id=None, qos=0) +``` +从Azure IoT Hub检索当前孪生设备。它将打印 json 文件。 + +**参数:** + +- `request_id` (str) - 用于跟踪请求的唯一标识符。 +- `qos` (str) - level 0 或 1. + +**返回值:** + +None. + +### `azure.update_twin` +```python +update_twin(payload, request_id=None, qos=0) +``` +发送有关此主题的已报告属性更新:$iothub/twin/PATCH/properties/reported/?$rid={request_id} + +**参数:** + +- `payload`- json格式属性值。 +- `request_id` (str) - 用于跟踪请求的唯一标识符。 +- `qos` (str) - level 0 或 1. + +**返回值:** + +None + +### `azure.subscribe_to_desired_updates` + +```python +subscribe_to_desired_updates(qos=0) +``` +从云端订阅所需的属性更新。当所需属性从云端更改为此主题时,设备应订阅以接收实时更新:$iothub/twin/PATCH/properties/desired/# + +**参数:** + +- `qos` (str) - level 0 or 1. + +**返回值:** + +None + +--- +## Direct Methods + +### `azure.init_direct_method_handler` +```python +init_direct_method_handler(method_handler) +``` +初始化传入方法调用的直接方法处理程序。 + +**参数:** + +- `method_handler` - 回调函数,将在收到直接方法消息后调用。 + +**返回值:** + +None + +### `azure.send_method_response` +```python +send_method_response(status, message, request_id) +``` +向直接方法调用发送响应。当您收到直接方法消息时,您必须在预定义的时间段内做出响应。 + +**参数:** + +- `status` - 如果方法被识别,则为200;如果方法未被识别,则为400。 +- `message` - 响应字符串。 +- `request_id` - 唯一标识。 + +**返回值:** + +None + +--- + +## 示例代码 + +*Using SAS token authentication.* + +```python +import usr.azure as azure +import modem +import ujson +from usr.config import CERT,PRIVATE_KEY,SHARED_ACCESS_KEY, PASSWORD + + +# device name +client_id = 'device_name' +# server address +server = 'hub_name.azure-devices.net' +# port MQTT +port = 8883 + +username = '{}/{}/?api-version=2021-04-12'.format(server, client_id) + +uri = "{}/devices/{}".format(server, client_id) +SharedAccessKey = SHARED_ACCESS_KEY + + +# create azure obj +azure_obj = azure.Azure(client_id, server, port, keep_alive=60, user=username, password=PASSWORD, ssl=True, ssl_params={"cert": +CERT, "key": PRIVATE_KEY}) +print("create azure obj") + +#generate token +token = azure_obj.generate_sas_token(uri, SharedAccessKey, None) +azure_obj.mqtt_client.password = token + +# connect mqtt server +print("azure connect start") +azure_obj.connect() +print("azure connect end") + +''' +direct methods example +''' +#direct method handler +def handle_method(method_name, msg, request_id): + if method_name == "turn_on_the_light": + print("Light on!") + azure_obj.send_method_response(200, "Light on", request_id) + else: + azure_obj.send_method_response(404, "Method not found", request_id) + +#initializing direct method handler +azure_obj.init_direct_method_handler(handle_method) + +''' +device twins example +''' +#getting the twin json payload +azure_obj.retrieve_twin() + +#new payload to be added +payload = { + "status": "active", + "temperature": 24.5 +} + +#updating twin json payload +azure_obj.update_twin(payload) + +#subscribing to recieve updates on desired field in device twin +azure_obj.subscribe_to_desired_updates() + +azure_obj.start() +``` \ No newline at end of file -- Gitee From fcbb16ceabbaeaba8cfd96a08b1f2858ec2cd5cc Mon Sep 17 00:00:00 2001 From: dustin007442 Date: Thu, 8 May 2025 10:06:29 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=9C=A8=20sidebar=20=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20azure=20=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zh/sidebar.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zh/sidebar.yaml b/zh/sidebar.yaml index af2c5ac..52b7c21 100644 --- a/zh/sidebar.yaml +++ b/zh/sidebar.yaml @@ -226,6 +226,8 @@ items: file: cloudlib/TenCentYun.md - label: Aws- 亚马逊 IoT 平台 file: cloudlib/aws.md + - label: Azure - Azure IoT 平台 + file: cloudlib/azure.md - label: 行业应用 file: industry/README.md items: -- Gitee From 413d9e1c568e17eaa86603aa6b8ab3f1f74a816f Mon Sep 17 00:00:00 2001 From: dustin007442 Date: Thu, 8 May 2025 10:41:10 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20aws-s3=20=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zh/cloudlib/README.md | 1 + zh/cloudlib/aws_s3.md | 126 ++++++++++++++++++++++++++++++++++++++++++ zh/sidebar.yaml | 2 + 3 files changed, 129 insertions(+) create mode 100644 zh/cloudlib/aws_s3.md diff --git a/zh/cloudlib/README.md b/zh/cloudlib/README.md index 453d26f..e603226 100644 --- a/zh/cloudlib/README.md +++ b/zh/cloudlib/README.md @@ -9,4 +9,5 @@ - [TenCentYun- 腾讯 IoT 平台](./TenCentYun.md) - [Aws - 亚马逊 IoT 平台](./aws.md) - [Azure - Azure IoT 平台](./azure.md) +- [Aws S3 – AWS S3 客户端](./aws_s3.md) diff --git a/zh/cloudlib/aws_s3.md b/zh/cloudlib/aws_s3.md new file mode 100644 index 0000000..b3042e4 --- /dev/null +++ b/zh/cloudlib/aws_s3.md @@ -0,0 +1,126 @@ +# Aws S3 – AWS S3 客户端 + +`S3Client` 类为与 AWS S3 存储交互提供了一个方便的接口。它支持文件上传、下载和删除等操作,同时通过 HTTP SigV4 身份验证确保安全通信。 + +## 初始化客户端 + +### `S3Client` +```python +class S3Client(region=None, access_key=None, secret_key=None, bucket=None, config_path="config.json", download_path="") +``` + +**参数:** + +- **region** *(str, 可选)*: 指定S3存储桶所在的AWS区域。 +- **access_key** *(str, 可选)*: 用于身份验证的 Access Key。 +- **secret_key** *(str, 可选)*: 用于身份验证的 Secret Key。 +- **bucket** *(str, 可选)*: S3 存储桶的名称。 +- **config_path** *(str, 可选)*: JSON 配置文件的路径。默认为 `config.json`。 +- **download_path** *(str, 可选)*: 用于存储下载文件的本地目录。默认为空字符串。 + +**示例:** + +- 使用显示参数初始化 + +```python +from s3client import S3Client + +client = S3Client( + region="eu-west-3", + access_key="AKIA...", + secret_key="A2HAXbc...", + bucket="my-bucket", + download_path="s3_downloads/" +) +``` + +- 使用配置文件初始化 + +```python +from s3client import S3Client + +client = S3Client(config_path="usr/config.json") +``` + +## S3 通信 + +`S3Client` 使用 HTTP SigV4 签名的请求来执行上传、下载和从 AWS S3 存储中删除文件等操作。 + +### `upload_file` + +```python +upload_file(filepath, object_key, content_type='application/octet-stream') +``` + +将本地文件上载到指定的AWS S3存储桶。 + +**参数:** + +- **filepath** *(str)*: 要上载的文件的本地路径。 +- **object_key** *(str)*: 在S3存储桶中存储文件的密钥(路径)。 +- **content_type** *(str, 可选)*: 文件的 MIME 类型(默认: `application/octet-stream`)。 + +**返回值:** + +- **响应对象**包含服务器返回的所有信息,如响应状态代码、响应头和响应体。 + +- 返回 **None** 如果发生任何异常。 + +### `download_to_file` + +```python +download_to_file(object_key) +``` + +从 S3 存储桶下载一个文件,并将其保存在配置或构造函数中定义的`download_path`中。 + +**参数:** + +- **object_key** *(str)*: 要从S3存储桶下载的文件的密钥(路径)。 + +**返回值:** + +- **响应对象**包含服务器返回的所有信息,如响应状态代码、响应头和响应体。 + +- 返回 **None** 如果发生任何异常。 + +### `delete_object` + +```python +delete_object(object_key) +``` + +从 S3 存储桶中删除一个文件。 + +**参数:** + +- **object_key** *(str)*: 要从S3存储桶中删除的文件的密钥(路径)。 + +**返回值:** + +- **响应对象**包含服务器返回的所有信息,如响应状态代码、响应头和响应体。 + +- 返回 **None** 如果发生任何异常。 + +## 示例代码 + +```python +from s3client import S3Client + +s3_client = S3Client( + region="eu-west-3", + access_key="YOUR_ACCESS_KEY", + secret_key="YOUR_SECRET_KEY", + bucket="your-bucket-name", + download_path="s3_downloads/" +) + +# Upload a file +s3_client.upload_file(filepath='usr/hello.txt', object_key='test-folder/hello.txt',content_type='text/str') + +# Download a file +s3_client.download_to_file(object_key='test-folder/hello.txt') + +# Delete a file +s3_client.delete_file(object_key='test-folder/hello.txt') +``` \ No newline at end of file diff --git a/zh/sidebar.yaml b/zh/sidebar.yaml index 52b7c21..ccd782e 100644 --- a/zh/sidebar.yaml +++ b/zh/sidebar.yaml @@ -228,6 +228,8 @@ items: file: cloudlib/aws.md - label: Azure - Azure IoT 平台 file: cloudlib/azure.md + - label: Aws S3 – AWS S3 客户端 + file: cloudlib/aws_s3.md - label: 行业应用 file: industry/README.md items: -- Gitee