阿里云IOT设备管理
本文主要介绍了阿里云IOT设备管理的基本概念、功能特点以及应用场景。阐述了如何利用阿里云IOT平台实现设备的连接、监控和控制,以及如何借助其丰富的数据分析功能提升设备管理效率。
一、IOT工作原理
二、创建模拟设备
1.创建产品
2.物模型
3.设备
4.设备数据上报
因为是模拟设备,这里通过node进行模拟数据的上报,下面代码为bracelet_001.js案列代码
const mqtt = require('aliyun-iot-mqtt');
// 1. 设备身份信息
var options = {productKey: "j0rk1AN61hM",deviceName: "watch001",deviceSecret: "ea94110e5495bb04b0a7b35b9535a50c",host: "iot-06z00frq8umvkx2.mqtt.iothub.aliyuncs.com"
};// 2. 建立MQTT连接
const client = mqtt.getAliyunIotMqttClient(options);
//订阅云端指令Topic
client.subscribe(`/${options.productKey}/${options.deviceName}/user/get`)
client.subscribe(`/sys/${options.productKey}/${options.deviceName}/thing/event/property/post_reply`)
client.on('message', function (topic, message) {console.log("topic " + topic)console.log("message " + message)
})setInterval(function () {// 3.定时上报温湿度数据client.publish(`/sys/${options.productKey}/${options.deviceName}/thing/event/property/post`, getPostData(), { qos: 0 });
}, 5 * 1000);var power = 1000;function getPostData () {const payloadJson = {id: Date.now(),version: "1.0",params: {PowerConsumption: power--},method: "thing.event.property.post"}console.log("payloadJson " + JSON.stringify(payloadJson))return JSON.stringify(payloadJson);
}
在bracelet_001.js目录下cmd打开运行窗口,运行下面命令
npm install aliyun-iot-mqtt
node bracelet_001.js
三、IOT接口对接
1.依赖引入
<!-- https://mvnrepository.com/artifact/com.aliyun/iot20180120 --><dependency><groupId>com.aliyun</groupId><artifactId>iot20180120</artifactId><version>3.0.8</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>tea-openapi</artifactId><version>0.2.2</version></dependency>
2.环境配置
zzyl:aliyun:accessKeyId: LTAI5tDQKg9F61aJhbmhqVRKaccessKeySecret: LYUKZH7HQGBoD025pmSq0fQsREaOYDconsumerGroupId: DEFAULT_GROUPregionId: cn-shanghaiiotInstanceId: iot-06z00frq8umvkx2host: iot-06z00frq8umvkx2.amqp.iothub.aliyuncs.com
3.读取配置类
@Data
@Configuration
@ConfigurationProperties(prefix = "zzyl.aliyun")
public class AliIoTConfigProperties {/*** 访问Key*/private String accessKeyId;/*** 访问秘钥*/private String accessKeySecret;/*** 区域id*/private String regionId;/*** 实例id*/private String iotInstanceId;/*** 域名*/private String host;/*** 消费组*/private String consumerGroupId;}
4.连接配置类
import com.aliyun.iot20180120.Client;
import com.aliyun.teaopenapi.models.Config;
import com.zzyl.properties.AliIoTConfigProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class IotClientConfig {@Autowiredprivate AliIoTConfigProperties aliIoTConfigProperties;@Beanpublic Client instance() throws Exception {Config config = new Config();config.accessKeyId = aliIoTConfigProperties.getAccessKeyId();config.accessKeySecret = aliIoTConfigProperties.getAccessKeySecret();// 您的可用区ID 默认上海config.regionId = aliIoTConfigProperties.getRegionId();return new Client(config);}
}
5.测试类
@SpringBootTest
public class IoTDeviceTest {@Autowiredprivate Client client;@Autowiredprivate AliIoTConfigProperties aliIoTConfigProperties;/*** 查询公共实例下的所有产品* @throws Exception*/@Testpublic void selectProduceList() throws Exception {QueryProductListRequest queryProductListRequest = new QueryProductListRequest();queryProductListRequest.setCurrentPage(1);queryProductListRequest.setPageSize(10);queryProductListRequest.setIotInstanceId(aliIoTConfigProperties.getIotInstanceId());QueryProductListResponse queryProductListResponse = client.queryProductList(queryProductListRequest);System.out.println(queryProductListResponse.getBody().getData());}
}
四、业务对接
IOT官方文档:调用QueryProductList接口查看所有产品列表_物联网平台(IoT)-阿里云帮助中心
1.查询所有的产品
@PostMapping("/QueryProductList")@ApiOperation(value = "查看所有的产品列表")public ResponseResult queryProductList(@RequestBody QueryProductListRequest queryProductListRequest) throws Exception{queryProductListRequest.setIotInstanceId(iotInstanceId);QueryProductListResponse queryProductListResponse = client.queryProductList(queryProductListRequest);if (Objects.isNull(queryProductListResponse.getBody())) {return ResponseResult.error();}return ResponseResult.success(queryProductListResponse.getBody().getData());}
2.注册设备
@Overridepublic void registerDevice(DeviceDto deviceDto) throws Exception {//请求IOT中新增设备
// RegisterDeviceRequest registerDeviceRequest = new RegisterDeviceRequest();RegisterDeviceRequest registerDeviceRequest = deviceDto.getRegisterDeviceRequest();registerDeviceRequest.setProductKey(deviceDto.getProductKey());registerDeviceRequest.setIotInstanceId(iotInstanceId);RegisterDeviceResponse registerDeviceResponse = client.registerDevice(registerDeviceRequest);//是否新增成功if (!registerDeviceResponse.getBody().getSuccess()) {throw new Exception("新增设备失败");}//查询产品名称QueryProductRequest queryProductRequest = new QueryProductRequest();queryProductRequest.setProductKey(deviceDto.getProductKey());queryProductRequest.setIotInstanceId(iotInstanceId);QueryProductResponse queryProductResponse = client.queryProduct(queryProductRequest);String productName = queryProductResponse.getBody().getData().getProductName();//新增设备Device device = new Device();BeanUtils.copyProperties(deviceDto, device);//设备iddevice.setDeviceId(registerDeviceResponse.getBody().getData().getIotId());//备注名称device.setNoteName(deviceDto.getNickname());//产品keydevice.setProductId(deviceDto.getProductKey());//产品名称device.setProductName(productName);//绑定位置device.setBindingLocation(deviceDto.getBindingLocation().toString());//判断设备接入类别if(Objects.equal(device.getLocationType(), 0)) {device.setPhysicalLocationType(-1);}//添加设备信息到数据库try {deviceMapper.insert(device);log.info("添加设备成功");} catch (Exception e) {//删除IOT中的设备DeleteDeviceRequest deleteDeviceRequest = new DeleteDeviceRequest();deleteDeviceRequest.setIotInstanceId(iotInstanceId);deleteDeviceRequest.setProductKey(device.getProductKey());deleteDeviceRequest.setDeviceName(device.getDeviceName());deleteDeviceRequest.setIotId(device.getDeviceId());client.deleteDevice(deleteDeviceRequest);throw new RuntimeException("该老人/位置已绑定该产品,请重新选择");}}
3.查询所有设备
/*** 查询设备*/@Overridepublic PageResponse<DeviceVo> queryDevice(QueryDeviceRequest request) throws Exception {//根据产品查询设备列表request.setIotInstanceId(iotInstanceId);QueryDeviceResponse queryDeviceResponse = client.queryDevice(request);if (!queryDeviceResponse.getBody().getSuccess()) {throw new Exception("查询设备失败");}//取出所有的设备idList<QueryDeviceResponseBody.QueryDeviceResponseBodyDataDeviceInfo> deviceInfoList = queryDeviceResponse.getBody().getData().getDeviceInfo();List<String> deviceIdList = deviceInfoList.stream().map(QueryDeviceResponseBody.QueryDeviceResponseBodyDataDeviceInfo::getIotId).collect(Collectors.toList());//根据id集合到DB中查询所有设备List<DeviceVo> deviceVos = deviceMapper.selectByDeviceIds(deviceIdList);//整合数据List<DeviceVo> deviceResult = new ArrayList<>();Map<String, DeviceVo> deviceVoMap = deviceVos.stream().collect(Collectors.toMap(DeviceVo::getDeviceId, deviceVo -> deviceVo));deviceInfoList.forEach(deviceInfo -> {DeviceVo deviceVo = deviceVoMap.get(deviceInfo.getIotId());if (deviceVo != null) {BeanUtils.copyProperties(deviceInfo, deviceVo);deviceResult.add(deviceVo);}});return PageResponse.of(deviceResult, request.getCurrentPage(), request.getPageSize(), (long) queryDeviceResponse.getBody().getPageCount(), (long)queryDeviceResponse.getBody().getTotal());}
4.查询设备的详细信息
/*** 查询指定设备的详细信息* @param request* @return* @throws Exception*/@Overridepublic DeviceVo queryDeviceDetail(QueryDeviceDetailRequest request) throws Exception {request.setIotInstanceId(iotInstanceId);QueryDeviceDetailResponse queryDeviceDetailResponse = client.queryDeviceDetail(request);if (Boolean.FALSE.equals(queryDeviceDetailResponse.getBody().getSuccess())) {throw new Exception(queryDeviceDetailResponse.getBody().getErrorMessage());}QueryDeviceDetailResponseBody.QueryDeviceDetailResponseBodyData deviceData = queryDeviceDetailResponse.getBody().getData();DeviceVo deviceVo = new DeviceVo();BeanUtils.copyProperties(deviceData, deviceVo);List<DeviceVo> devices = deviceMapper.selectByDeviceIds(Lists.newArrayList(deviceData.getIotId()));if (CollUtil.isNotEmpty(devices)) {BeanUtil.copyProperties(devices.get(0), deviceVo, CopyOptions.create().ignoreNullValue());deviceVo.setIotId(deviceVo.getDeviceId());return deviceVo;}return new DeviceVo();}
5.查询设备的状态
@PostMapping("/QueryDevicePropertyStatus")@ApiOperation(value = "查询指定设备的状态", notes = "查询指定设备的状态")public ResponseResult QueryDevicePropertyStatus(@RequestBody QueryDevicePropertyStatusRequest request) throws Exception {request.setIotInstanceId(iotInstanceId);QueryDevicePropertyStatusResponse queryDevicePropertyStatusResponse = client.queryDevicePropertyStatus(request);return ResponseResult.success(queryDevicePropertyStatusResponse.getBody().getData());}
6.查看物模型功能列表
@PostMapping("/QueryThingModelPublished")@ApiOperation(value = "查看指定产品的已发布物模型中的功能定义详情", notes = "查看指定产品的已发布物模型中的功能定义详情")public ResponseResult queryThingModelPublished(@RequestBody QueryThingModelPublishedRequest request) throws Exception {request.setIotInstanceId(iotInstanceId);QueryThingModelPublishedResponse response = client.queryThingModelPublished(request);return ResponseResult.success(response.getBody().getData());}
7.修改设备名称
@Overridepublic void updateDevice(DeviceDto deviceDto) throws Exception {BatchUpdateDeviceNicknameRequest request = new BatchUpdateDeviceNicknameRequest();request.setIotInstanceId(iotInstanceId);BatchUpdateDeviceNicknameRequest.BatchUpdateDeviceNicknameRequestDeviceNicknameInfo nicknameInfo = BeanUtil.toBean(deviceDto, BatchUpdateDeviceNicknameRequest.BatchUpdateDeviceNicknameRequestDeviceNicknameInfo.class);request.setDeviceNicknameInfo(Lists.newArrayList(nicknameInfo));BatchUpdateDeviceNicknameResponse response = client.batchUpdateDeviceNickname(request);// 保存位置if (Boolean.TRUE.equals(response.getBody().getSuccess())) {// 保存位置Device device = BeanUtil.toBean(deviceDto, Device.class);device.setProductId(deviceDto.getProductKey());device.setNoteName(deviceDto.getNickname());Device device1 = deviceMapper.selectByPrimaryKey(device.getId());if (ObjectUtil.isEmpty(device1)) {device.setDeviceId(deviceDto.getIotId());device.setNoteName(deviceDto.getNickname());device.setProductId(deviceDto.getProductKey());device.setDeviceId(deviceDto.getIotId());deviceMapper.insert(device);return;}try {deviceMapper.updateByPrimaryKeySelective(device);}catch (Exception e) {throw new BaseException("该老人/位置已绑定该产品,请重新选择");}return;}throw new BaseException(response.getBody().getErrorMessage());}
8.删除设备
@Overridepublic void deleteDevice(DeleteDeviceRequest request) throws Exception {request.setIotInstanceId(iotInstanceId);DeleteDeviceResponse response = client.deleteDevice(request);if (Boolean.TRUE.equals(response.getBody().getSuccess())) {deviceMapper.deleteByDeviceId(request.getIotId());return;}throw new BaseException(response.getBody().getErrorMessage());}
相关文章:
阿里云IOT设备管理
本文主要介绍了阿里云IOT设备管理的基本概念、功能特点以及应用场景。阐述了如何利用阿里云IOT平台实现设备的连接、监控和控制,以及如何借助其丰富的数据分析功能提升设备管理效率。 一、IOT工作原理 二、创建模拟设备 1.创建产品 2.物模型 3.设备 4.设备数据上报…...
图像处理技术和应用
图像处理技术是一种依托计算机和相关算法,对图像进行深度处理、分析及改变的技术。主要包括图像数字化、图像增强和复原、图像数据编码、图像分割和图像识别等。它不仅能够从静态图像中提取关键信息,还能改变图像的外观或特征,并进一步检测、…...
格式化字符串漏洞详解
一、漏洞原理 格式化字符串漏洞(Format String Vulnerability)是由于程序使用用户可控的输入作为格式化字符串参数(如 printf、sprintf 等函数)时未正确过滤导致的漏洞。攻击者可通过构造特殊格式字符串实现以下操作:…...
java项目之基于web的中国古诗词的设计与实现源码(ssm+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于web的中国古诗词的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于web的中国…...
网络初识-
网络的相关概念 一、局域网和广域网 将各种计算机、外部设备等相互连接起来,实现在这个范围内数据通信和资源共享的计算机网络。它的覆盖范围通常在几百米到几公里之内。例如,一个小型企业的办公室,通过交换机将多台电脑连接在一起…...
AOS安装及操作演示
文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…...
vue学习8
1.pinia(更优) 是vue最新的状态管理工具,是vuex的替代品 pinia: state actions(支持异步,可以直接修改state) getters 优点: 提供更加简单的API(去掉了mutation)提供符合,组合式的API语法(和v…...
【竞技宝】电竞世界杯:无畏契约首次入选正式项目!
北京时间2月12日,电竞世界杯基金会(EWCF)与知名游戏开发商拳头游戏(Riot Games)在近日共同宣布达成三年合作伙伴关系。同时,三大顶级电竞项目——《英雄联盟》《英雄联盟:云顶之弈》(…...
Bigemap Pro地图配置文件包
配置文件获取 配置文件下载后,直接拖入软件中自动识别导入图源,一键完成加载。...
有哪些免费的SEO软件优化工具
随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...
第二天:工具的使用
每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。 键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的…...
分享在职同时准备系统分析师和教资考试的时间安排
(在职、时间有限、同时备考系统分析师考试和小学信息技术教资面试),以下是详细的备考计划,确保计划的可行性和通过性。 一、总体安排 时间分配: 每周周末(2天)用于系统分析师考试备考。工作日晚…...
从Word里面用VBA调用NVIDIA的免费DeepSeekR1
看上去能用而已。 选中的文字作为输入,运行对应的宏即可;会先MSGBOX提示一下,然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…...
3.2 > Bash
概览 在上一节中我们了解了关于 Shell 的执行流程,知道了在 Linux 环境中一般有哪些常用的 Shell。而在本节中,将会学习到 Linux 中最常见的一个 Shell —— Bash,了解到 bash 的相关知识和用法。 本节目录 概览相关知识bash 命令提示符bas…...
游戏引擎学习第100天
仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天,我们开始了反射和环境贴图的工作,成功地根据法线显示了反射效果。然而,我们还没有实现反射向量的计算,导致反射交点的代…...
新一代SCADA: 宏集Panorama Suite 2025 正式发布,提供更灵活、符合人体工学且安全的应用体验
宏集科技宣布正式推出全新Panorama Suite 2025 SCADA软件!全新版本标志着 Panorama Suite的一个重要里程碑,代表了从 Panorama Suite 2022 开始并跨越三个版本(2022、2023、2025)的开发过程的顶峰。 此次重大发布集中在六个核心主…...
Visual Studio 进行单元测试【入门】
摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试,包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...
Notepad++ 中删除所有以 “pdf“ 结尾的行
Notepad 中删除所有以 “pdf” 结尾的行 操作步骤 1.打开文件: 在 Notepad 中打开你需要处理的文本文件。 2.打开查找和替换对话框: 按快捷键 Ctrl F,打开“查找和替换”对话框。 3.启用正则表达式模式: 在对话框的底部…...
Java 使用腾讯翻译 API 实现含 HTML 标签文本,json值,精准翻译工具
注意:需搭配标题二的腾讯翻译工具使用 一-1、翻译标签文本工具 package org.springblade.common.utils;import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TencentTranslationFor…...
DeepSeek R1+Open WebUI +SearXNG 本地化部署与联网功能
GitHub - searxng/searxng-docker: The docker-compose files for setting up a SearXNG instance with docker....
数据科学之数据管理|NumPy数据管
一、Numpy介绍 (一) 什么是numpy NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运…...
零基础玩转 DeepSeek API实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...
【GPIO】5.理解保护二极管在GPIO过电压保护中的作用
在电子电路设计中,保护二极管是常见的保护元件,用于防止过电压对敏感电路的损害。本文将探讨当GPIO输入电压大于3.3V时,保护二极管如何工作,并解释为什么大部分过电压引起的电流会通过二极管流向VDD而不是流入内部电路。 1.背景 …...
2.5 模块化迁移策略:从传统项目到模块化系统
模块化迁移策略:从传统项目到模块化系统 将传统 Java 项目迁移至 JDK 9 模块化系统是一项系统性工程,需分阶段实施以降低风险。以下是详细的迁移策略、工具使用和实战示例。 1. 迁移阶段划分 阶段目标关键操作阶段1:兼容性验证确保项目能在…...
Tortoise Git
TortoiseGit 是一个 Windows Shell 与 Git 的接口,它提供了文件状态的覆盖图标,强大的 Git 上下文菜单等。你可以在官方网站 (tortoisegit.org) 轻松使用安装程序进行下载。TortoiseGit 的当前稳定版本是 2.14.0 ,根据你的机器配置࿰…...
Maven Spring框架依赖包
Maven中添加Spring框架依赖包 Spring核心工具包SpringJDBCSpring配置文件头信息 Spring核心工具包 在pom.xml文件中添加 <!-- Spring的核心工具包--><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spr…...
【Cocos TypeScript 零基础 15.1】
目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…...
Linux库制作与原理:【静态库】【动态库】【目标文件】【ELF文件】【ELF从形成到假造轮廓】【理解链接和加载】
目录 一.什么是库 二.静态库 2.1创建静态库 我们在之前的路径下新建lib使用我们自己的库 2.2 使用makefile生成静态库 三.动态库 3.1动态库生成 3.2动态库使用 3.3库运行搜索路径 四.目标文件 五.ELF文件 六.ELF从形成到加载轮廓 6.1ELF形成可执行 6.2 ELF可执行文…...
中间件-redis-(ubantu)
1、安装依赖包 sudo apt-get update sudo apt-get install redis 一旦安装完成,Redis 服务将会自动启动。想要检查服务的状态,输入下面的命令: rootvims:/etc/redis# sudo systemctl status redis-server ● redis-server.service - Adva…...
ubuntu20.04+ROS+Gazebo+px4+QGC+MAVROS
目录 前言 一、安装ROS 二、安装PX4 编译 三、QGC安装 四、安装MAVROS 命令记得加sudo! 前言 在安装ubuntu20.04ROSGazebopx4QGCMAVROS时,参考了很多网上的资料,总结一个较为顺利的流程。 官方指南PX4 自动驾驶仪用户指南 | PX4 Gui…...
基于 openEuler 构建 LVS-DR 群集(同网段)。
一、LVS相关原理 1.LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项 目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在 Linux2.4内核以前&…...
计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【设计模式】【行为型模式】观察者模式(Observer)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 📫 欢迎V: flzjcsg2,我们共同讨论Java深渊的奥秘 …...
机器学习: 逻辑回归
概念与定义 逻辑回归是一种用于分类问题的统计方法。它通过计算目标变量的概率来预测类别归属,并假设数据服从伯努利分布(二分类)或多项式分布(多分类)。逻辑回归模型输出的是概率值,通常使用sigmoid函数将线性组合映射到0和1之间。 1. 概念 逻辑回归用于解决分类问题…...
域名解析—互联网世界的导航系统
在互联网的世界里,每个网站都像一座“城市”,而用户要找到这些“城市”,必须依赖一套精准的导航系统——这就是域名解析。无论是浏览网页、发送邮件,还是使用移动应用,域名解析都在背后默默支撑着用户的每一次访问。本…...
PAT乙级真题 — 1080 MOOC期终成绩(java)【测试点3超时】
对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评获得不少于60分(满分100)。总评成绩的计…...
【Prometheus】如何通过prometheus监控redis实时运行状态,并实现告警通知
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
ARM Cortex-M3/M4 权威指南 笔记【一】技术综述
一、Cortex-M3/M4 处理器的一般信息 1.1 处理器类型 ARM Cortex-M 为 32 位 RISC(精简指令集)处理器,其具有: 32位寄存器32位内部数据通路32位总线接口 除了 32 位数据,Cortex-M 处理器(以及其他任何 A…...
【Qt】定期清理程序
在现有Qt程序中实现可配置日志保存天数的代码示例,分为界面修改、配置存储和核心逻辑三部分: // 1. 在配置文件(如settings.h)中添加保存天数的配置项 class Settings { public:int logRetentionDays() const {return m_settings…...
基于51单片机的门禁刷卡器proteus仿真
地址:https://pan.baidu.com/s/1j0KAmH5pVGWZWRpT6p5hBg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectron…...
二、数据持久化篇(深度增强版)
二、数据持久化篇(深度增强版) 2.1 JDBC Template深度解析 架构设计思想 #mermaid-svg-y2IrKiVu2gzenoCB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-y2IrKiVu2gzenoCB .error-icon{fil…...
时间敏感和非时间敏感流量的性能保证配置
论文标题 中文标题: 时间敏感和非时间敏感流量的性能保证配置 英文标题: Provisioning of Time-Sensitive and non-Time-Sensitive Flows with Assured Performance 作者信息 Luis Velasco, Gianluca Graziadei, Sima Barzegar, Marc Ruiz Optical Co…...
k8s管理工具之lens
什么是lens Lens 是当前市场上最强大的K8S IDE。它是一个独立的单机应用,可以同时运行在macOS、Windows和Linux上。 作为K8S IDE,该有的它基本都有了! 集群管理 导入已有集群 首先,你需要在 Lens 中添加你的 Kubernetes 集群。点…...
kafka介绍,kafka集群环境搭建,kafka命令测试,C++实现kafka客户端
目录 kafka介绍kafka集群环境搭建zookeeper安装与配置kafka安装与配置 kafka命令测试C实现kafka客户端librdkafka库编译新版本cmake编译cppkafka库编译C实现kafka生产者和消费者客户端 kafka介绍 定义与概述 Apache Kafka 是一个开源的分布式流处理平台,最初由 Lin…...
DeepSeek的蒸馏技术:让模型推理更快
DeepSeek系列模型,如DeepSeek-R1-Distill-Qwen-7B,采用了知识蒸馏(Knowledge Distillation)技术,这是一种强大的模型压缩和优化方法。通过蒸馏,DeepSeek模型在保持甚至提升性能的同时,实现了更快…...
SAP-ABAP:dialog界面中的数据块Event Block详解举例
在SAP的Dialog程序开发中,Event Block(事件块)是屏幕流逻辑(Flow Logic)中的关键部分,用于定义屏幕在特定事件触发时执行的逻辑。Event Block通常与ABAP模块(Module)结合使用&#x…...
微信小程序 - 模版语法
声明和绑定数据 小程序页面中使用的数据均需要在 Page() 方法的 data 对象中进行声明定义 在将数据声明好以后,需要在 WXML 中绑定数据,数据绑定最简单的方式是使用 Mustache 语法(双大括号)将变量包起来。 在 {{ }} 内部可以做…...
mapbox进阶,添加绘图扩展插件,裁剪线
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...
Dav_笔记14:优化程序提示 HINTs -2
优化方法和目标的提示 ALL_ROWS和FIRST_ROWS(n)提示允许您在优化方法和目标之间进行选择。如果SQL语句具有指定优化方法和目标的提示,则优化程序将使用指定的方法,无论是否存在统计信息,OPTIMIZER_MODE初始化参数的值…...
Oracle ORA-00054
ORA-00054: resource busy and acquire with NOWAlT specified or timeout expire 错误 ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired 是 Oracle 数据库中常见的一个错误,通常发生在尝试获取一个已经被其他会话占用的资源时。这…...