使用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():
    # 初始化AcsClient
    client = 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 main
    get_device_property(client)
  File "c:\aliyuniot\main.py", line 52, in get_device_property
    first_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():
    # 初始化AcsClient
    client = 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 = None
        for prop in property_status_info:
            if prop.get('Name') == "STM32温度":
                stm32_temp_value = prop.get('Value')
                break

        if 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():
    # 初始化AcsClient
    client = 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 = None
        for prop in property_status_info:
            if prop.get('Name') == "STM32温度":
                stm32_temp_value = prop.get('Value')
                break

        if 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

    # 初始化AcsClient
    client = 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 = None
        for prop in property_status_info:
            if prop.get('Name') == "STM32温度":
                stm32_temp_value = prop.get('Value')
                break

        if 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

    # 初始化AcsClient
    client = 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。请勿在实际代码中使用本文示例中的敏感信息。务必确保您的认证信息安全,避免泄露。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/939563.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

职场上,如何做好自我保护?

今天我们讨论一个话题&#xff1a;在职场上&#xff0c;如何保护好自己&#xff1f;废话不多说&#xff0c;我们直接上干货。 &#xff08;一&#xff09; 1.时刻准备一点零食或代餐&#xff0c;如果遇到长时间的会议&#xff0c;就补充点能量。代餐最好选流体&#xff0c;这…

网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取

一、概述 记录时间 [2024-12-18] 前置文章&#xff1a;网络编程 01&#xff1a;计算机网络概述&#xff0c;网络的作用&#xff0c;网络通信的要素&#xff0c;以及网络通信协议与分层模型 本文讲述网络编程相关知识——IP 地址&#xff0c;包括 IP 地址的作用、分类&#xff…

tryhackme-Pre Security-HTTP in Detail(HTTP的详细内容)

任务一&#xff1a;What is HTTP(S)?&#xff08;什么是http&#xff08;s&#xff09;&#xff09; 1.What is HTTP? (HyperText Transfer Protocol)&#xff08;什么是 HTTP&#xff1f;&#xff08;超文本传输协议&#xff09;&#xff09; http是你查看网站的时候遵循的…

UDP网络编程套接

目录 本文核心 预备知识 1.端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 sockaddr结构 UDP套接字编程 服务端 客户端 TCP与UDP传输的区别 可靠性&#xff1a; 传输方式&#xff1a; 用途&#xff1a; 头部开销&#xff1a; 速度&#xff1a; li…

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录 前言1. 探讨2. 基本知识3. 总结 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#x…

EGO Swarm翻译

目录 摘要 Ⅰ 介绍 Ⅱ 相关工作 A . 单四旋翼局部规划 B . 拓扑规划 C. 分布式无人机集群 Ⅲ 基于梯度的局部规划隐式拓扑轨迹生成 A.无需ESDF梯度的局部路径规划 B.隐式拓扑轨迹生成 Ⅳ 无人机集群导航 A 机间避碰 B. 定位漂移补偿 C. 从深度图像中去除agent Ⅴ …

电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据

电商数据采集可以通过多种方式完成&#xff0c;其中包括人工采集、使用电商平台提供的API接口、以及利用爬虫技术等自动化工具。以下是一些常用的电商数据采集方法&#xff1a; 人工采集&#xff1a;人工采集主要是通过基本的“复制粘贴”的方式在电商平台上进行数据的收集&am…

PostgreSQL和Postgis安装

Windows下PostgreSQL和对应的版本的Postgis安装 PostgreSQL安装 1、官网下载地址 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 2、根据自己的系统下载完成&#xff0c;Windows下可以直接傻瓜式安装就OK 建议不要通过自带的这个程序安装postgis,…

代码开发相关操作

使用Vue项目管理器创建项目&#xff1a;&#xff08;vue脚手架安装一次就可以全局使用&#xff09; windowR打开命令窗口&#xff0c;输入vue ui&#xff0c;进入GUI页面&#xff0c;点击创建-> 设置项目名称&#xff0c;在初始化git下面输入&#xff1a;init project&…

Vulnhub DC-6靶机攻击实战(一)

导语   之前的分享中我们介绍了关于Vulnhub虚拟机前五个机器的攻防演练测试,接下来我们继续分享Vulnhub DC-6靶机攻击实战。 文章目录 搭建测试环境第一步、信息采集第二步、wpscan爆破第三步、开始查找其他的用户第四步、提权总结搭建测试环境 首先需要从Vulnhub官网中下载…

深度学习之超分辨率算法——FRCNN

– 对之前SRCNN算法的改进 输出层采用转置卷积层放大尺寸&#xff0c;这样可以直接将低分辨率图片输入模型中&#xff0c;解决了输入尺度问题。改变特征维数&#xff0c;使用更小的卷积核和使用更多的映射层。卷积核更小&#xff0c;加入了更多的激活层。共享其中的映射层&…

深度学习从入门到精通——图像分割实战DeeplabV3

DeeplabV3算法 参数配置关于数据集的配置训练集参数 数据预处理模块DataSet构建模块测试一下数据集去正则化模型加载模块DeepLABV3 参数配置 关于数据集的配置 parser argparse.ArgumentParser()# Datset Optionsparser.add_argument("--data_root", typestr, defa…

大数据操作实验一

1.Postgresql 1.1 数据库的对象创建 1.1.1 创建数据库(Database) 鼠标右键database进行创建 1.1.2 创建图(Schema) 鼠标右键schema&#xff0c;然后创建schema图纸 1.1.3 创建表(Table) 鼠标右键Table&#xff0c;创建表 1.2数据库实列化 1.2.1 实列化静态数据 提…

IDEA2024如何创建一个普通的Java Web项目工程(JSP)

本章教程,主要介绍如何在IDEA2024 专业版本中,创建一个普通的Java Web项目。 一、新建项目 二、配置项目 依次点击File——Project Structure——Modules 修改路径中的web为webapp,然后点击Create Artifact默认保存。 至此,一个基础的Java web就创建完成了。

Linux下mysql 8.0安装教程

本文介绍了如何在Linux下安装MySQL8.0,供大家参考,具体内容如下 准备工作: mysql8.0 rpm文件 测试工具(比如 idea的database工具) 安装步骤: 1. 下载mysql的repo源,下载地址: 进入Linux系统,输入指令: 1 wgethttps://dev.mysql.com/get/mysql80-community-rele…

libaom 源码分析:熵编码模块介绍

AV1 熵编码原理介绍 关于AV1 熵编码原理介绍可以参考:AV1 编码标准熵编码技术概述libaom 熵编码相关源码介绍 函数流程图 核心函数介绍 av1_pack_bitstream 函数:该函数负责将编码后的数据打包成符合 AV1 标准的比特流格式;包括写入序列头 OBU 的函数 av1_write_obu_header…

[数据结构#1] 并查集 | FindRoot | Union | 优化 | 应用

目录 1. 并查集原理 问题背景 名称与编号映射 数据结构设计 2. 并查集基本操作 (1) 初始化 (2) 查询根节点 (FindRoot) (3) 合并集合 (Union) (4) 集合操作总结 并查集优化 (1) 路径压缩 (2) 按秩合并 3. 并查集的应用 (1) 统计省份数量 (2) 判断等式方程是否成…

Centos创建共享文件夹拉取文件

1.打开VMware程序&#xff0c;鼠标右检你的虚拟机&#xff0c;打开设置 2.点击选项——共享文件夹——总是启用 点击添加&#xff0c;设置你想要共享的文件夹在pc上的路径&#xff08;我这里已经添加过了就不加了&#xff09; 注意不要中文&#xff0c;建议用share&#xff0c…

Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能

背景&#xff1a;现在有一个新需求&#xff0c;需要借助树结构来实现词库的分类管理&#xff0c;树的节点是不同的分类&#xff0c;不同的分类可以有自己的词库&#xff0c;所以父子节点是互不影响的&#xff1b;同样为了选择的方便性&#xff0c;提出了新需求&#xff0c;选择…

java版电子招投标采购|投标|评标|竞标|邀标|评审招投标系统源码

招投标管理系统是一款适用于招标代理、政府采购、企业采购和工程交易等领域的企业级应用平台。该平台以项目为主线&#xff0c;从项目立项到项目归档&#xff0c;实现了全流程的高效沟通和协作。通过该平台&#xff0c;用户可以实时共享项目数据信息&#xff0c;实现规范化管理…