当前位置: 首页 > news >正文

使用Python从阿里云物联网平台获取STM32温度数据

在物联网(IoT)应用中,设备数据的采集与监控至关重要。本文将详细介绍如何使用Python从阿里云物联网平台获取STM32设备的温度数据。我们将从已有的Java代码出发,逐步将其转换为Python,并处理在过程中遇到的问题,最终实现一个稳定且高效的Python脚本。
在这里插入图片描述

前言

在物联网应用中,设备数据的实时监控是不可或缺的一部分。阿里云物联网平台提供了丰富的API接口,方便开发者获取和管理设备数据。本文将通过将Java程序转写为Python,实现从阿里云物联网平台获取STM32设备的温度数据,并确保代码的稳定性和可维护性。

环境准备

在开始编码之前,需要确保以下环境和依赖已准备好:

  1. Python 3.x:确保已安装Python 3.x版本。可以通过以下命令检查版本:

    python --version
    
  2. 安装阿里云Python SDK

    使用pip安装阿里云的Python SDK:

    pip install aliyun-python-sdk-core
    
  3. 获取阿里云认证信息

    您需要拥有阿里云的Access Key IDAccess Key Secret,用于认证API请求。

  4. 设备信息

    • ProductKey
    • DeviceName
    • IotInstanceId

    请确保这些信息已正确配置,并且设备已成功连接到阿里云物联网平台。

原始Java代码解析

本文最初的Java程序用于从阿里云物联网平台获取设备属性状态。主要步骤包括:

  1. 初始化阿里云客户端:使用DefaultAcsClient,通过accessKeyIdsecret进行认证。
  2. 发送设备属性查询请求:使用QueryDevicePropertyStatusRequest构造请求,并发送给阿里云。
  3. 处理响应:解析JSON响应,提取传感器数据并打印。

以下是关键的Java代码片段:

// 初始化客户端
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, secret);
client = new DefaultAcsClient(profile);// 构造查询设备属性请求
QueryDevicePropertyStatusRequest request = new QueryDevicePropertyStatusRequest();
request.setRegionId(regionId);
request.setIotInstanceId(iotid);
request.setDeviceName(deviceName);
request.setProductKey(deviceProductkey);// 发送请求并获取响应
QueryDevicePropertyStatusResponse response = client.getAcsResponse(request);// 解析JSON响应并提取数据
String string = JSON.toJSONString(response);
JsonObject jsonObject = (JsonObject) parser.parse(string);
JsonObject data = (JsonObject) jsonObject.get("data");
JsonArray list = (JsonArray) data.get("list");
System.out.println("传感器数据:" + list.get(0).getAsJsonObject().get("value"));

Python代码转换与优化

将上述Java代码转换为Python之后,初步实现了设备数据的获取。然而,在实际运行中遇到了IndexError,这是因为响应中的数据列表为空。本文将逐步优化代码,确保其稳定性和准确性。

初始Python代码

初步的Python代码如下:

import time
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException# ====================== 配置信息 ======================
ACCESS_KEY_ID = "YOUR_ACCESS_KEY_ID"  # 请替换为您的Access Key ID
SECRET = "YOUR_ACCESS_KEY_SECRET"     # 请替换为您的Access Key Secret
REGION_ID = "cn-shanghai"DEVICE_PRODUCTKEY = "hfuyHEEc31U"
DEVICE_NAME = "STM32_tem_hum_1215"IOT_INSTANCE_ID = "iot-06z00f0h5dpyp1f"
# =======================================================def get_device_property(client):"""查询设备属性状态并打印第一个传感器的数据值"""# 创建请求对象request = CommonRequest()request.set_accept_format('json')request.set_domain('iot.cn-shanghai.aliyuncs.com')  # 根据您的地域可能需要调整request.set_method('POST')request.set_version('2018-01-20')request.set_action_name('QueryDevicePropertyStatus')# 设置请求参数request.add_query_param('IotInstanceId', IOT_INSTANCE_ID)request.add_query_param('DeviceName', DEVICE_NAME)request.add_query_param('ProductKey', DEVICE_PRODUCTKEY)try:# 发送请求并获取响应response = client.do_action_with_exception(request)# 响应内容是字节,需要解码成字符串response_str = response.decode('utf-8')# 解析JSON响应response_json = json.loads(response_str)# 打印整个响应(用于调试,实际使用时可以移除)print("完整响应:", json.dumps(response_json, indent=4, ensure_ascii=False))# 提取传感器数据data = response_json.get('data', {})properties = data.get('list', [])if properties:# 假设您要获取列表中的第一个属性值first_property = properties[0]value = first_property.get('Value')print(f"传感器数据:{value}")else:print("未获取到传感器数据。")print(f"Data 内容: {data}")except ClientException as e:print(f"请求失败:{e}")def main():# 初始化AcsClientclient = AcsClient(ACCESS_KEY_ID, SECRET, REGION_ID)# 无限循环,每秒查询一次while True:get_device_property(client)time.sleep(1)  # 暂停1秒if __name__ == "__main__":main()

处理空列表错误

运行上述代码时,可能会遇到以下错误:

Traceback (most recent call last):File "c:\aliyuniot\main.py", line 71, in <module>main()File "c:\aliyuniot\main.py", line 67, in mainget_device_property(client)File "c:\aliyuniot\main.py", line 52, in get_device_propertyfirst_property = properties[0]
IndexError: list index out of range

这个错误表明在尝试访问properties[0]时,列表为空,导致IndexError。分析可能的原因:

  1. JSON键名大小写不匹配:确保JSON响应中的键名与代码中一致。
  2. API响应中确实没有数据:可能是请求参数配置错误,或设备未上报数据。
  3. 认证或请求参数错误:验证AccessKeyIdSecretIotInstanceIdDeviceNameProductKey是否正确。

为解决上述问题,我们对代码进行了如下修改:

  • 将JSON键名改为小写,确保与响应一致。
  • 添加调试信息,打印完整的API响应。
  • 添加对空列表的检查。

修改后的代码如下:

import time
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException# ====================== 配置信息 ======================
ACCESS_KEY_ID = "YOUR_ACCESS_KEY_ID"  # 请替换为您的Access Key ID
SECRET = "YOUR_ACCESS_KEY_SECRET"     # 请替换为您的Access Key Secret
REGION_ID = "cn-shanghai"DEVICE_PRODUCTKEY = "hfuyHEEc31U"
DEVICE_NAME = "STM32_tem_hum_1215"IOT_INSTANCE_ID = "iot-06z00f0h5dpyp1f"
# =======================================================def get_device_property(client):"""查询设备属性状态并打印第一个传感器的数据值"""# 创建请求对象request = CommonRequest()request.set_accept_format('json')request.set_domain('iot.cn-shanghai.aliyuncs.com')  # 根据您的地域可能需要调整request.set_method('POST')request.set_version('2018-01-20')request.set_action_name('QueryDevicePropertyStatus')# 设置请求参数request.add_query_param('IotInstanceId', IOT_INSTANCE_ID)request.add_query_param('DeviceName', DEVICE_NAME)request.add_query_param('ProductKey', DEVICE_PRODUCTKEY)try:# 发送请求并获取响应response = client.do_action_with_exception(request)# 响应内容是字节,需要解码成字符串response_str = response.decode('utf-8')# 解析JSON响应response_json = json.loads(response_str)# 打印整个响应(用于调试,实际使用时可以移除)print("完整响应:", json.dumps(response_json, indent=4, ensure_ascii=False))# 提取传感器数据data = response_json.get('data', {})properties = data.get('list', [])if properties:# 假设您要获取列表中的第一个属性值first_property = properties[0]value = first_property.get('Value')print(f"传感器数据:{value}")else:print("未获取到传感器数据。")print(f"Data 内容: {data}")except ClientException as e:print(f"请求失败:{e}")except json.JSONDecodeError as e:print(f"JSON 解析失败:{e}")except Exception as e:print(f"发生未预期的错误:{e}")def main():# 初始化AcsClientclient = AcsClient(ACCESS_KEY_ID, SECRET, REGION_ID)# 无限循环,每秒查询一次while True:get_device_property(client)time.sleep(1)  # 暂停1秒if __name__ == "__main__":main()

提取STM32温度数据

根据用户提供的完整JSON响应结构,PropertyStatusInfo是一个包含多个属性的列表。我们需要遍历该列表,找到Name为“STM32温度”的条目,并提取其Value

修改后的代码如下:

import time
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException# ====================== 配置信息 ======================
ACCESS_KEY_ID = "YOUR_ACCESS_KEY_ID"  # 请替换为您的Access Key ID
SECRET = "YOUR_ACCESS_KEY_SECRET"     # 请替换为您的Access Key Secret
REGION_ID = "cn-shanghai"DEVICE_PRODUCTKEY = "hfuyHEEc31U"
DEVICE_NAME = "STM32_tem_hum_1215"IOT_INSTANCE_ID = "iot-06z00f0h5dpyp1f"
# =======================================================def get_stm32_temperature(client):"""查询设备属性状态并打印STM32温度的值"""# 创建请求对象request = CommonRequest()request.set_accept_format('json')request.set_domain('iot.cn-shanghai.aliyuncs.com')  # 根据您的地域可能需要调整request.set_method('POST')request.set_version('2018-01-20')request.set_action_name('QueryDevicePropertyStatus')# 设置请求参数request.add_query_param('IotInstanceId', IOT_INSTANCE_ID)request.add_query_param('DeviceName', DEVICE_NAME)request.add_query_param('ProductKey', DEVICE_PRODUCTKEY)try:# 发送请求并获取响应response = client.do_action_with_exception(request)# 响应内容是字节,需要解码成字符串response_str = response.decode('utf-8')# 解析JSON响应response_json = json.loads(response_str)# 打印整个响应(用于调试,实际使用时可以移除)print("完整响应:", json.dumps(response_json, indent=4, ensure_ascii=False))# 提取传感器数据data = response_json.get('Data', {})list_data = data.get('List', {})property_status_info = list_data.get('PropertyStatusInfo', [])if not property_status_info:print("未获取到 PropertyStatusInfo 数据。")print(f"Data 内容: {data}")return# 寻找名称为 "STM32温度" 的属性stm32_temp_value = Nonefor prop in property_status_info:if prop.get('Name') == "STM32温度":stm32_temp_value = prop.get('Value')breakif stm32_temp_value is not None:print(f"STM32温度:{stm32_temp_value}")else:print("未找到名称为 'STM32温度' 的属性。")except ClientException as e:print(f"请求失败:{e}")except json.JSONDecodeError as e:print(f"JSON 解析失败:{e}")except Exception as e:print(f"发生未预期的错误:{e}")def main():# 初始化AcsClientclient = AcsClient(ACCESS_KEY_ID, SECRET, REGION_ID)# 无限循环,每秒查询一次while True:get_stm32_temperature(client)time.sleep(1)  # 暂停1秒if __name__ == "__main__":main()

进一步优化

为了提高代码的健壮性和可维护性,我们进行了以下优化:

  1. 使用logging模块替代print:方便管理日志级别和格式。
  2. 环境变量管理敏感信息:避免将Access Key IDSecret硬编码在脚本中。
  3. 优雅地终止脚本:捕获键盘中断信号,使脚本可以通过Ctrl+C优雅地退出。

优化后的代码如下:

import time
import json
import os
import logging
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException# ====================== 配置信息 ======================
ACCESS_KEY_ID = os.getenv('ALIYUN_ACCESS_KEY_ID')  # 从环境变量获取
SECRET = os.getenv('ALIYUN_SECRET')               # 从环境变量获取
REGION_ID = "cn-shanghai"DEVICE_PRODUCTKEY = "hfuyHEEc31U"
DEVICE_NAME = "STM32_tem_hum_1215"IOT_INSTANCE_ID = "iot-06z00f0h5dpyp1f"
# =======================================================# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def get_stm32_temperature(client):"""查询设备属性状态并打印STM32温度的值"""# 创建请求对象request = CommonRequest()request.set_accept_format('json')request.set_domain('iot.cn-shanghai.aliyuncs.com')  # 根据您的地域可能需要调整request.set_method('POST')request.set_version('2018-01-20')request.set_action_name('QueryDevicePropertyStatus')# 设置请求参数request.add_query_param('IotInstanceId', IOT_INSTANCE_ID)request.add_query_param('DeviceName', DEVICE_NAME)request.add_query_param('ProductKey', DEVICE_PRODUCTKEY)try:# 发送请求并获取响应response = client.do_action_with_exception(request)# 响应内容是字节,需要解码成字符串response_str = response.decode('utf-8')# 解析JSON响应response_json = json.loads(response_str)# 打印整个响应(用于调试,实际使用时可以移除)logging.debug("完整响应: %s", json.dumps(response_json, indent=4, ensure_ascii=False))# 提取传感器数据data = response_json.get('Data', {})list_data = data.get('List', {})property_status_info = list_data.get('PropertyStatusInfo', [])if not property_status_info:logging.warning("未获取到 PropertyStatusInfo 数据。")logging.debug("Data 内容: %s", data)return# 寻找名称为 "STM32温度" 的属性stm32_temp_value = Nonefor prop in property_status_info:if prop.get('Name') == "STM32温度":stm32_temp_value = prop.get('Value')breakif stm32_temp_value is not None:logging.info(f"STM32温度:{stm32_temp_value}")else:logging.warning("未找到名称为 'STM32温度' 的属性。")except ClientException as e:logging.error(f"请求失败:{e}")except json.JSONDecodeError as e:logging.error(f"JSON 解析失败:{e}")except Exception as e:logging.error(f"发生未预期的错误:{e}")def main():# 检查环境变量是否设置if not ACCESS_KEY_ID or not SECRET:logging.error("未设置环境变量 ALIYUN_ACCESS_KEY_ID 和/或 ALIYUN_SECRET。请设置后重试。")return# 初始化AcsClientclient = AcsClient(ACCESS_KEY_ID, SECRET, REGION_ID)try:# 无限循环,每秒查询一次while True:get_stm32_temperature(client)time.sleep(1)  # 暂停1秒except KeyboardInterrupt:logging.info("脚本已手动终止。")if __name__ == "__main__":main()

完整优化后的Python代码

结合上述所有优化,以下是最终的Python脚本,用于从阿里云物联网平台获取STM32温度数据。

import time
import json
import os
import logging
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException# ====================== 配置信息 ======================
ACCESS_KEY_ID = os.getenv('ALIYUN_ACCESS_KEY_ID')  # 从环境变量获取
SECRET = os.getenv('ALIYUN_SECRET')               # 从环境变量获取
REGION_ID = "cn-shanghai"DEVICE_PRODUCTKEY = "hfuyHEEc31U"
DEVICE_NAME = "STM32_tem_hum_1215"IOT_INSTANCE_ID = "iot-06z00f0h5dpyp1f"
# =======================================================# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def get_stm32_temperature(client):"""查询设备属性状态并打印STM32温度的值"""# 创建请求对象request = CommonRequest()request.set_accept_format('json')request.set_domain('iot.cn-shanghai.aliyuncs.com')  # 根据您的地域可能需要调整request.set_method('POST')request.set_version('2018-01-20')request.set_action_name('QueryDevicePropertyStatus')# 设置请求参数request.add_query_param('IotInstanceId', IOT_INSTANCE_ID)request.add_query_param('DeviceName', DEVICE_NAME)request.add_query_param('ProductKey', DEVICE_PRODUCTKEY)try:# 发送请求并获取响应response = client.do_action_with_exception(request)# 响应内容是字节,需要解码成字符串response_str = response.decode('utf-8')# 解析JSON响应response_json = json.loads(response_str)# 打印整个响应(用于调试,实际使用时可以移除)logging.debug("完整响应: %s", json.dumps(response_json, indent=4, ensure_ascii=False))# 提取传感器数据data = response_json.get('Data', {})list_data = data.get('List', {})property_status_info = list_data.get('PropertyStatusInfo', [])if not property_status_info:logging.warning("未获取到 PropertyStatusInfo 数据。")logging.debug("Data 内容: %s", data)return# 寻找名称为 "STM32温度" 的属性stm32_temp_value = Nonefor prop in property_status_info:if prop.get('Name') == "STM32温度":stm32_temp_value = prop.get('Value')breakif stm32_temp_value is not None:logging.info(f"STM32温度:{stm32_temp_value}")else:logging.warning("未找到名称为 'STM32温度' 的属性。")except ClientException as e:logging.error(f"请求失败:{e}")except json.JSONDecodeError as e:logging.error(f"JSON 解析失败:{e}")except Exception as e:logging.error(f"发生未预期的错误:{e}")def main():# 检查环境变量是否设置if not ACCESS_KEY_ID or not SECRET:logging.error("未设置环境变量 ALIYUN_ACCESS_KEY_ID 和/或 ALIYUN_SECRET。请设置后重试。")return# 初始化AcsClientclient = AcsClient(ACCESS_KEY_ID, SECRET, REGION_ID)try:# 无限循环,每秒查询一次while True:get_stm32_temperature(client)time.sleep(1)  # 暂停1秒except KeyboardInterrupt:logging.info("脚本已手动终止。")if __name__ == "__main__":main()

运行与测试

在运行脚本之前,请确保完成以下步骤:

  1. 设置环境变量

    为了增强安全性,不将Access Key IDSecret硬编码在脚本中。请通过环境变量设置这些信息。

    • 在Linux或macOS上

      export ALIYUN_ACCESS_KEY_ID="您的Access Key ID"
      export ALIYUN_SECRET="您的Access Key Secret"
      
    • 在Windows上

      set ALIYUN_ACCESS_KEY_ID=您的Access Key ID
      set ALIYUN_SECRET=您的Access Key Secret
      
  2. 安装必要的Python库

    确保已安装aliyun-python-sdk-core

    pip install aliyun-python-sdk-core
    
  3. 运行脚本

    通过命令行运行Python脚本:

    python main.py
    
  4. 检查输出

    如果设备正确上报数据,您将看到类似以下的输出:

    2023-10-01 12:00:00,000 - INFO - STM32温度:36
    

    若发生错误或未找到相关属性,您将看到相应的警告或错误信息。

总结与注意事项

本文详细介绍了如何使用Python从阿里云物联网平台获取STM32设备的温度数据,包括从Java代码的转换、错误处理、日志记录、安全管理等多个方面。以下是一些关键的注意事项:

  1. 安全性

    • 保护认证信息:避免将Access Key IDSecret硬编码在代码中,建议使用环境变量或安全的配置管理工具。
    • 权限管理:确保阿里云账号具备必要的权限,避免过度授权。
  2. 错误处理

    • 捕获异常:通过try-except块捕获并处理可能的异常,如请求失败、JSON解析错误等。
    • 日志记录:使用logging模块记录信息、警告和错误,方便后续调试和维护。
  3. 代码优化

    • 模块化:将功能模块化,便于维护和扩展。
    • 配置管理:将配置信息集中管理,便于修改和统一管理。
  4. 性能与稳定性

    • 合理的查询间隔:当前设置为每秒查询一次,根据实际需求调整查询频率,避免过度请求导致API限制或费用增加。
    • 优雅终止:通过捕获KeyboardInterrupt信号,实现脚本的优雅终止,确保资源的正确释放。
  5. 调试与测试

    • 打印完整响应:在调试阶段,打印完整的API响应,了解数据结构,便于提取所需信息。
    • 测试设备连接:确保设备已正确连接至阿里云物联网平台,并能正常上报数据。

通过本文的指导,您可以轻松地使用Python从阿里云物联网平台获取STM32设备的温度数据,并在此基础上扩展更多功能,如数据存储、实时监控、报警系统等。如有任何疑问或需要进一步的帮助,欢迎在评论区留言讨论!


免责声明:本文中的Access Key IDSecret已经被替换为占位符YOUR_ACCESS_KEY_IDYOUR_ACCESS_KEY_SECRET。请勿在实际代码中使用本文示例中的敏感信息。务必确保您的认证信息安全,避免泄露。

相关文章:

使用Python从阿里云物联网平台获取STM32温度数据

在物联网&#xff08;IoT&#xff09;应用中&#xff0c;设备数据的采集与监控至关重要。本文将详细介绍如何使用Python从阿里云物联网平台获取STM32设备的温度数据。我们将从已有的Java代码出发&#xff0c;逐步将其转换为Python&#xff0c;并处理在过程中遇到的问题&#xf…...

Spring Boot 声明式事务

Spring Boot中的声明式事务管理主要通过Transactional注解来实现。以下是Transactional注解的一些关键用法和特性&#xff1a; 1. 启用事务管理 在Spring Boot应用中使用Transactional注解之前&#xff0c;需要在启动类或者配置类上添加EnableTransactionManagement注解来启用事…...

websocket 局域网 webrtc 一对一 多对多 视频通话 的示例

基本介绍 WebRTC&#xff08;Web Real-Time Communications&#xff09;是一项实时通讯技术&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和&am…...

uniapp-微信小程序调用摄像头

1.uniapp中的index.vue代码 <template><view class"content"><view class"container"><!-- 摄像头组件 --><camera id"camera" device-position"front" flash"off" binderror"onCameraErr…...

鸿蒙学习笔记:用户登录界面

文章目录 1. 提出任务2. 完成任务2.1 创建鸿蒙项目2.2 准备图片资源2.3 编写首页代码2.4 启动应用 3. 实战小结 1. 提出任务 本次任务聚焦于运用 ArkUI 打造用户登录界面。需呈现特定元素&#xff1a;一张图片增添视觉感&#xff0c;两个分别用于账号与密码的文本输入框&#…...

无人机航测系统技术特点!

一、无人机航测系统的设计逻辑 无人机航测系统的设计逻辑主要围绕实现高效、准确、安全的航空摄影测量展开。其设计目标是通过无人机搭载相机和传感器&#xff0c;利用先进的飞行控制系统和数据处理技术&#xff0c;实现对地表信息的全方位、高精度获取。 需求分析&#xff1…...

《算法ZUC》题目

判断题 ZUC算法LFSR部分产生的二元序列具有很低的线性复杂度。 A.正确 B.错误 正确答案A 单项选择题 ZUC算法驱动部分LFSR的抽头位置不包括&#xff08; &#xff09;。 A.s15 B.s10 C.s7 D.s0 正确答案C 单项选择题 ZUC算法比特重组BR层主要使用了软件实现友好的…...

配置flutter 解决andriod studio报错 no device selected

flutter配置好后 明明下载好了模拟器 但是在andriod studio 找不到设备 显示no devices 这个时候需要我们配置一下flutter关联的android sdk的路径和文件夹 就可以解决了 flutter config --android-sdk 自己android studio的路径 这样配置就可以解决了~...

docker搭建Redis集群及哨兵(windows10环境,OSS Cluster)

一、基本概念 Redis:即 "Remote DIctionary Server" &#xff0c;翻译为“远程字典服务器”。从字面意义上讲&#xff0c;它指的是一个远程的字典服务&#xff0c;意味着它是一个可以远程访问的服务&#xff0c;主要用于存储键值对&#xff08;key-value pairs&…...

信息化基础知识——数字政府(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 数字政府 大数…...

信息安全实训室网络攻防靶场实战核心平台解决方案

一、引言 网络安全靶场&#xff0c;作为一种融合了虚拟与现实环境的综合性平台&#xff0c;专为基础设施、应用程序及物理系统等目标设计&#xff0c;旨在向系统用户提供全方位的安全服务&#xff0c;涵盖教学、研究、训练及测试等多个维度。随着网络空间对抗态势的日益复杂化…...

Nginx主要知识点总结

1下载nginx 到nginx官网nginx: download下载nginx&#xff0c;然后解压压缩包 然后双击nginx.exe就可以启动nginx 2启动nginx 然后在浏览器的网址处输入localhost&#xff0c;进入如下页面说明nginx启动成功 3了解nginx的配置文件 4熟悉nginx的基本配置和常用操作 Nginx 常…...

PySide6程序框架设计

pyside6有一个优点自动适配高分辨ui pyqt5需要自己写这部分逻辑 1、主程序代码 DINGSHI01Main.py # -*- coding: utf-8 -*- import sys,time,copy from PySide6.QtWidgets import QWidget,QApplication from PySide6.QtCore import Qt from PySide6 import QtCore, QtGui, Q…...

「九」HarmonyOS 5 端云一体化实战项目——「M.U.」应用云侧开发云数据库

1 立意背景 M. 代表 “我”&#xff0c;U. 代表 “你”&#xff0c;这是一款用于记录情侣从相识、相知、相恋、见家长、订婚直至结婚等各个阶段美好记忆留存的应用程序。它旨在为情侣们提供一个专属的空间&#xff0c;让他们能够将一路走来的点点滴滴&#xff0c;如初次相遇时…...

记录:virt-manager配置Ubuntu arm虚拟机

virt-manager&#xff08;Virtual Machine Manager&#xff09;是一个图形用户界面应用程序&#xff0c;通过libvirt管理虚拟机&#xff08;即作为libvirt的图形前端&#xff09; 因为要在Linux arm环境做测试&#xff0c;记录下virt-manager配置arm虚拟机的过程 先在VMWare中…...

clickhouse-介绍、安装、数据类型、sql

1、介绍 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。 OLAP&#xff08;On-Line A…...

【shell】常用100个shell命令使用讲解

【shell】常用100个shell命令使用讲解 【一】文件操作命令【二】搜索命令【三】目录操作命令【四】权限操作命令【五】网络操作命令【六】进程和系统控制命令【七】文本操作命令【八】压缩与解压命令【九】磁盘使用管理命令【十】包管理命令【十一】进程管理命令【十二】环境变…...

Git-分支(branch)常用命令

分支 我们在做项目开发的时候&#xff0c;无论是软件项目还是其他机械工程项目&#xff0c;我们为了提高效率以及合理的节省时间等等原因&#xff0c;现在都不再是线性进行&#xff0c;而是将一个项目抽离出诸进行线&#xff0c;每一条线在git中我们就叫做分支&#xff0c;bran…...

谈谈es6 Map 函数

发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 Map 是 ES6 中引入的一种新的数据结构&#xff0c;它类似于对象&#xff08;Object&#xff09;&#xff0c;但与对象相比&#…...

微信小程序:实现节点进度条的效果;正在完成的节点有动态循环效果;横向,纵向排列

参考说明 微信小程序实现流程进度功能 - 知乎 上面的为一个节点进度条的例子&#xff0c;但并不完整&#xff0c;根据上述代码&#xff0c;进行修改完善&#xff0c;实现其效果 横向效果 代码 wxml <view classorder_process><view classprocess_wrap wx:for&quo…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...