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

使用 MQTT - C 访问 IoTDA 平台:一个完整的嵌入式示例

引言

在物联网(IoT)开发领域,设备与平台之间的通信至关重要。MQTT 作为一种轻量级的消息传输协议,因其高效、可靠的特性,在物联网场景中得到了广泛应用。华为的 IoTDA(IoT Device Access)平台为开发者提供了便捷的设备接入和管理能力。本文将详细介绍如何使用 MQTT - C 库实现设备与 IoTDA 平台的通信,并结合具体代码示例进行深入剖析。

本次示例程序旨在演示如何使用MQTT - C 库访问 IoTDA 平台。该程序包含了设备连接、消息订阅、消息解析以及 LED 控制等功能,适合对嵌入式系统开发和物联网通信感兴趣的开发者学习参考。MQTT - C库是一个相对小众的C语言库,但是它代码短小,简单易用,非常适合嵌入式领域。

华为IoTDA平台配置

在运行程序前必须在华为IoTDA平台上建立设备,并配置好物模型。

建立设备

我需要先在平台创建产品和设备,有关产品和设备的创建,可以参考我以前的博文:【HZHY-AI300G智能盒试用连载体验】在华为IoTDA平台上建立设备_hzhy-ai300g智盒-CSDN博客

建立物模型

在线开发产品模型前需要创建产品。创建产品需要输入产品名称、协议类型、数据格式、所属行业和设备类型等信息,产品模型会使用这些信息作为设备能力字段取值。物联网平台提供了标准模型和厂商模型,这些模型涉及多个领域,模型中提供了已经编辑好的产品模型文件,您可以根据自己的需要对产品模型中的字段进行修改和增删;如果选择自定义产品模型,则需要完整定义产品模型。

操作步骤

  1. 访问设备接入服务,单击“管理控制台”进入“设备接入”控制台。选择您的实例,单击实例卡片进入。
  2. 单击左侧导航栏的“产品”,在产品列表中,找到对应的产品,单击产品进入产品详情页。
  3. 在产品详情基本信息页面,单击“自定义模型”,添加服务。
  4. 输入“服务ID”、“服务类型”和“服务描述”,然后单击“确定”。
  5. “服务ID”:采用首字母大写的命名方式。比如:WaterMeter、StreetLight。
  6. “服务类型”:建议和服务ID保持一致。
  7. “服务描述”:比如路灯上报的环境光强度和路灯开关状态的属性。
  8. 添加服务后,在“添加服务”区域,对属性和命令进行定义。每个服务下,可以包含属性和命令,也可以只包含其中之一,请根据此类设备的实际情况进行配置。
  9. 单击步骤4新增的服务ID,在展开的页面单击“新增属性”,在弹出窗口中配置属性的各项参数,然后单击“确定”。

我建立了一个smarthome的物模型,包括温度、湿度和LED状态3个属性,其中LED状态属性是平台可以修改的,另外两个都是设备上报的。

项目结构与关键组件

1. 头文件与宏定义

程序对接入地址的定义如下(为了安全,其中的部分登录信息做了修改):

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mqtt.h"
#include "templates/posix_sockets.h"
#include <pthread.h>
#include "cJSON.h"#define ADDRESS     "bde4cbe7aa.st1.iotda-device.cn-north-4.myhuaweicloud.com"
#define PORT        "1883"
#define CLIENT_ID   "67a2xxxxxxxc_test_0_0_2025042802"
#define USERNAME    "67a2xxxxx1872637d83a1c_test"
#define PASSWORD    "c42xxxxxxxc3f6763"
#define TOPIC       "$oc/devices/设备ID/sys/messages/down"
#define QOS         1
#define SEND_BUF_SIZE 1024
#define RECV_BUF_SIZE 1024

代码中引入了多个必要的头文件,包括标准库、MQTT 库、线程库以及 JSON 解析库。同时,通过宏定义指定了连接 IoTDA 平台所需的地址、端口、客户端 ID、用户名、密码等信息。

2. 核心函数

2.1 control_led 函数

该函数用于模拟 LED 的开关操作,根据传入的状态参数打印相应的信息。

// 模拟 LED 操作函数
void control_led(int state) {if (state == 1) {printf("LED 已打开\n");} else {printf("LED 已关闭\n");}
}

2.2 publish_response_callback 函数

此函数是消息回调函数,当 MQTT 客户端接收到消息时会触发该函数。它会将接收到的非空字符结尾的主题名称转换为 C 风格字符串,打印消息信息,并对 JSON 格式的消息进行解析。如果主题包含 

/sys/properties/set

,则构造新主题并创建新线程发布响应消息。

// 消息回调函数
void publish_response_callback(void** unused, struct mqtt_response_publish *published)
{/* 注意:published->topic_name 不是以空字符结尾的(这里我们会将其转换为 C 字符串) */char* topic_name = (char*) malloc(published->topic_name_size + 1);if (topic_name == NULL) {perror("内存分配失败");return;}memcpy(topic_name, published->topic_name, published->topic_name_size);topic_name[published->topic_name_size] = '\0';printf("收到消息:('%s'): %s\n", topic_name, (const char*) published->application_message);// 解析 JSON 消息cJSON *root = cJSON_Parse((const char*) published->application_message);if (root == NULL) {const char *error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {fprintf(stderr, "JSON 解析错误,错误位置: %s\n", error_ptr);}free(topic_name);return;}// 查找 services 数组cJSON *services = cJSON_GetObjectItem(root, "services");if (!cJSON_IsArray(services)) {fprintf(stderr, "未找到 services 数组或不是数组类型\n");cJSON_Delete(root);free(topic_name);return;}// 遍历 services 数组int array_size = cJSON_GetArraySize(services);for (int i = 0; i < array_size; i++) {cJSON *service = cJSON_GetArrayItem(services, i);if (!cJSON_IsObject(service)) {continue;}// 查找 serviceId 为 smarthome 的项cJSON *serviceId = cJSON_GetObjectItem(service, "serviceId");if (cJSON_IsString(serviceId) && strcmp(serviceId->valuestring, "smarthome") == 0) {// 查找 properties 对象cJSON *properties = cJSON_GetObjectItem(service, "properties");if (cJSON_IsObject(properties)) {// 查找 LED状态 字段cJSON *led_status = cJSON_GetObjectItem(properties, "LED状态");if (cJSON_IsString(led_status) && led_status->valuestring != NULL) {printf("解析到 LED 状态字段: %s\n", led_status->valuestring);// 模拟 LED 操作if (strcmp(led_status->valuestring, "ON") == 0) {control_led(1);} else {control_led(0);}}}break;}}// 检查主题是否包含 /sys/properties/setconst char* target_str = "/sys/properties/set";char* pos = strstr(topic_name, target_str);if (pos != NULL) {// 计算新主题长度size_t new_topic_len = strlen(topic_name) + strlen("/response");char* new_topic = (char*) malloc(new_topic_len + 1);if (new_topic == NULL) {perror("新主题内存分配失败");free(topic_name);cJSON_Delete(root);return;}// 构造新主题strncpy(new_topic, topic_name, pos - topic_name + strlen(target_str));new_topic[pos - topic_name + strlen(target_str)] = '\0'; // 确保字符串结束strncat(new_topic, "/response", new_topic_len - strlen(new_topic));strncat(new_topic, pos + strlen(target_str), new_topic_len - strlen(new_topic));new_topic[new_topic_len] = '\0'; // 确保字符串结束// 分配参数结构体内存PublishArgs *args = (PublishArgs *)malloc(sizeof(PublishArgs));if (args == NULL) {perror("参数结构体内存分配失败");free(new_topic);free(topic_name);cJSON_Delete(root);return;}args->client = &client;args->new_topic = new_topic;args->response_message = response_message;args->message_size = strlen(response_message) + 1;// 创建新线程发布消息pthread_t publish_thread;if (pthread_create(&publish_thread, NULL, publish_message_thread, args) != 0) {perror("创建发布消息线程失败");free(new_topic);free(args);}// 分离线程,让系统自动回收资源pthread_detach(publish_thread);}cJSON_Delete(root); // 释放 cJSON 对象内存free(topic_name);
}

2.3 publish_message_thread 函数

该函数是一个线程函数,用于将响应消息发布到新主题。发布完成后,会释放动态分配的内存。

// 新线程函数,用于发布消息
void* publish_message_thread(void* arg) {PublishArgs *args = (PublishArgs *)arg;// 发布消息到新主题printf("发布消息:('%s'): %s\n", args->new_topic, (const char*) args->response_message);int rc = mqtt_publish(args->client, args->new_topic, args->response_message, args->message_size, MQTT_PUBLISH_QOS_0);if (rc != MQTT_OK) {printf("发布消息到新主题失败,错误码: %d\n", rc);} else {printf("已发布消息到新主题: %s\n", args->new_topic);}// 释放内存free(args->new_topic);free(args);return NULL;
}

2.4 connect_to_server 函数

该函数负责初始化 MQTT 客户端并连接到 IoTDA 服务器。如果初始化或连接失败,会打印相应的错误信息。

// 连接服务器
int connect_to_server(struct mqtt_client *client, mqtt_pal_socket_handle sockfd) {int rc;// 初始化 MQTT 客户端rc = mqtt_init(client, sockfd, sendbuf, SEND_BUF_SIZE, recvbuf, RECV_BUF_SIZE, publish_response_callback);if (rc != MQTT_OK) {printf("MQTT 初始化失败,错误码: %d\n", rc);return -1;}// 连接到服务器rc = mqtt_connect(client, CLIENT_ID, NULL, NULL, 0, USERNAME, PASSWORD, MQTT_CONNECT_CLEAN_SESSION, 400);if (rc != MQTT_OK) {printf("连接失败,错误码: %d\n", rc);return -1;}return 0;
}

3. main 函数

main函数是程序的入口,它会创建套接字,调用 connect_to_server 函数连接到服务器,启动一个线程来刷新客户端,监听 IoTDA 消息,直到用户按下 CTRL - D 退出程序。

 

 

 

int main(int argc, char *argv[]) {mqtt_pal_socket_handle sockfd;int rc;// 创建套接字sockfd = open_nb_socket(ADDRESS, PORT);if (sockfd == -1) {perror("创建套接字失败");}// 连接 MQTT 服务器if (connect_to_server(&client, sockfd) != 0) {close(sockfd); // 使用 close 函数关闭套接字return -1;}/* 启动一个线程来刷新客户端(处理客户端的入站和出站流量) */pthread_t client_daemon;if(pthread_create(&client_daemon, NULL, client_refresher, &client)) {fprintf(stderr, "启动客户端守护线程失败。\n");return -1;}/* start publishing the time */printf("listening for IoTDA messages.\n");printf("Press CTRL-D to exit.\n\n");/* block */while(fgetc(stdin) != EOF);// 断开连接mqtt_disconnect(&client);close(sockfd); // 使用 close 函数关闭套接字return 0;
}

JSON 消息解析与处理

程序使用 cJSON 库对接收到的 JSON 格式消息进行解析。在 publish_response_callback 函数中,会查找 services 数组,遍历数组找到 serviceId 为 smarthome 的项,然后在其 properties 对象中查找 LED状态 字段,根据字段值调用 control_led 函数模拟 LED 操作。

多线程处理

为了提高程序的并发性能,程序使用了多线程技术。在 publish_response_callback 函数中,如果需要发布响应消息,会创建一个新线程 publish_message_thread 来处理消息发布,避免阻塞主线程。同时,使用 pthread_detach 函数分离线程,让系统自动回收线程资源。

测试

程序启动后,在API Explorer中对程序进行控制。

程序正确执行。

 

总结

通过本文的介绍,我们了解了如何使用 MQTT - C 库实现设备与 IoTDA 平台的通信。从项目的结构和关键组件入手,详细分析了核心函数的功能和实现原理,以及 JSON 消息解析和多线程处理的方法。这个示例程序为开发者提供了一个完整的嵌入式物联网通信解决方案,开发者可以根据实际需求进行扩展和优化。

相关文章:

使用 MQTT - C 访问 IoTDA 平台:一个完整的嵌入式示例

引言 在物联网&#xff08;IoT&#xff09;开发领域&#xff0c;设备与平台之间的通信至关重要。MQTT 作为一种轻量级的消息传输协议&#xff0c;因其高效、可靠的特性&#xff0c;在物联网场景中得到了广泛应用。华为的 IoTDA&#xff08;IoT Device Access&#xff09;平台为…...

Leetcode594.最长和谐子序列

目录 题目算法标签: 滑动窗口, 哈希表思路滑动窗口代码哈希表代码 题目 594. 最长和谐子序列 算法标签: 滑动窗口, 哈希表 思路 先将数组进行排序, 检查两个相邻的但是不相等的数字的差值是否是 1 1 1, 如果是 1 1 1更新答案 滑动窗口代码 #include <algorithm> #i…...

如何在idea中编写spark程序

在 IntelliJ IDEA 中编写 Spark 程序的详细指南 在大数据处理领域&#xff0c;Apache Spark 凭借其强大的分布式计算能力&#xff0c;成为了众多开发者的首选工具。而 IntelliJ IDEA 作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为编写 Spark 程序…...

人工智能数学基础(一):人工智能与数学

在人工智能领域&#xff0c;数学是不可或缺的基石。无论是算法的设计、模型的训练还是结果的评估&#xff0c;都离不开数学的支持。接下来&#xff0c;我将带大家深入了解人工智能数学基础&#xff0c;包括微积分、线性代数、概率论、数理统计和最优化理论&#xff0c;并通过 P…...

Android Studio 安装 Continue插件

1、Android 插件Studio中安装Continue 2、从本地盘符安装 3、安装后发现Continue为空 Android studio中 Help -> Find Action->Choose Boot Java 设置 4、配置DeepSeek 参考https://juejin.cn/post/7464122534546407461...

【C++】类和对象(4)

目录 1. 类型转换 非explicit的单参数构造函数 示例 explicit的单参数构造函数 示例 不同版本的行为 示例 &#xff08;单参数&#xff09; 示例&#xff08;多参数且其余参数有默认值 &#xff09; 示例&#xff08;多参数且无默认值&#xff09; 2. static成员变量…...

微信jdk 前端vue获取流程1、

参考链接&#xff1a; 企业微信的JSSDK,调用及使用方法_企业微信jssdk-CSDN博客 1、引用 <script src"//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script src"https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolic…...

Linux进程7-signal信号处理方式验证、可重入函数举例、信号集函数验证、信号集阻塞验证

目录 1. signal函数 1.1进程接收到信号后的处理方式 1.2 signal 函数 1.2.1 signal 函数默认处理 1.2.2 signal 函数忽略处理 1.2.3 signal 函数自定义处理 1.2.4 signal 函数返回值 2.可重入函数 2.1如何判断函数是否可重入 2.2自定义信号处理函数举例 2.2.1 sle…...

使用Python在excel里创建柱状图

一、前言 通过使用Python的openpyxl库&#xff0c;在excel里创建柱状图。openpyxl库提供了创建Excel图表的功能&#xff0c;包括柱状图(Bar Chart)。 二、程序展示 1、导入相关模块&#xff0c;新建excel 新建excel后&#xff0c;在excel的第一列创建一些数据。 import op…...

计算机视觉进化论:YOLOv12、YOLOv11与Darknet系YOLOv7的微调实战对比

摘要 YOLO系列作为实时目标检测领域的重要里程碑&#xff0c;持续引领速度与精度的平衡发展。本文围绕YOLOv7&#xff08;基于Darknet框架&#xff09;、YOLOv11及YOLOv12&#xff0c;系统、深入地对比了三款模型的架构创新、微调策略、核心技术及应用场景。我们详细解析了三者…...

湖北理元理律师事务所:债务管理领域的平台化创新探索

随着中国居民负债率攀升至62%&#xff08;央行2023年数据&#xff09;&#xff0c;债务管理从个体需求演变为社会性课题。湖北理元理律师事务所通过“法律科技金融”的融合模式&#xff0c;构建了国内首个全链条债务管理平台&#xff0c;其服务逻辑与行业价值值得深度剖析。 平…...

沐曦玩转 LMDeploy、XTuner 和 InternLM3

学习链接&#xff1a; https://aicarrier.feishu.cn/wiki/O84LwkiBriUU0NkDwurcSufhnVb 一 LMDeploy推理及验证 1.1 下载LMDeploy # 安装addict软件包 pip install addict mmengine mmengine-lite fire accelerate0.32.1 nvidia-ml-py# 解决LMDeploy对tranformers版本要求的…...

【Java面试笔记:进阶】26.如何监控和诊断JVM堆内和堆外内存使用?

监控和诊断JVM内存使用是优化性能和解决内存问题的关键。 1.JVM内存监控与诊断方法 1.图形化工具 JConsole:提供图形化界面,可直接连接到Java进程,查看内存使用情况。VisualVM:功能强大的图形化工具,但注意从Oracle JDK 9开始不再包含在JDK安装包中。Java Mission Contr…...

阿里云服务器云盘扩容

在阿里云服务器上在线扩容了云盘后&#xff0c;如果服务器内部查看容量没有变化&#xff0c;可能是由于分区和文件系统未正确扩展。以下是详细的解决步骤&#xff1a; 1. 确认扩容是否成功 在阿里云控制台检查磁盘容量是否已显示扩容后的新大小。如果控制台显示已扩容&#x…...

【ESP32】st7735s + LVGL移植

LVGL的移植 使用版本1、创建工程2、开始移植2.1、文件准备2.2、修改代码2.3、SDK配置编辑器 3、测试 使用版本 LVGL版本&#xff1a;8.3 链接点这里ESPIDF版本&#xff1a;4.4.8lvgl_esp32_drivers&#xff1a; 链接点这里ESP32型号&#xff1a;ESP32S3 1、创建工程 默认都会…...

Jackson 使用方法详解

Jackson 是 Java 生态中最流行的 JSON 处理库&#xff0c;也是 Spring Boot 的默认 JSON 解析器。它提供了高性能的 JSON 序列化&#xff08;对象 → JSON&#xff09;和反序列化&#xff08;JSON → 对象&#xff09;功能。以下是 Jackson 的全面使用指南。 1. 基础依赖 Mave…...

TensorFlow深度学习框架:从入门到精通的完整指南

&#x1f31f; TensorFlow核心优势 TensorFlow作为Google开发的顶级深度学习框架&#xff0c;具有三大独特优势&#xff1a; 工业级部署能力&#xff1a;支持从移动端到服务器的全平台部署完善的工具链&#xff1a;包含TensorBoard、TF Lite、TF.js等完整生态强大的社区支持&…...

Java 入门宝典--注释、关键字、数据类型、变量常量、类型转换

作者&#xff1a;IvanCodes 发布时间&#xff1a;2025年4月28日&#x1f423; 专栏&#xff1a;Java教程 哈喽&#xff0c;各位 CSDN 的小伙伴们&#xff01;&#x1f44b; 这部分内容虽然基础&#xff0c;但 极其重要&#xff0c;是后续学习所有高级特性的基石。准备好了吗&…...

【含文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的旅游论坛系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 …...

Android开发,实现一个简约又好看的登录页

文章目录 1. 编写布局文件2.设计要点说明3. 效果图4. 关于作者其它项目视频教程介绍 1. 编写布局文件 编写activity.login.xml 布局文件 <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android…...

一种改进的YOLOv11网络,用于无人机视角下的小目标检测

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 随着无人机&#xff08;UAV&#xff09;和计算机视觉技术的快速发展&#xff0c;从无人机视角进行目标检测已成为一个重要的研究领域。然而&#xff0c;无人机图像中目标像素占比极小、物体尺度变…...

linux离线安装zsh

下载zsh 下载仓库后解压 下载地址&#xff1a;https://github.com/zsh-users/zsh 离线安装 安装方法见INSTALL文件 ./configure --prefix[/usr/local] make make install...

Golang|使用函数作为参数和使用接口的联系

函数作为数据类型的一种&#xff0c;可以成为其他函数的参数。在 Go&#xff08;Golang&#xff09; 中&#xff0c;函数作为参数 和 接口&#xff08;interface&#xff09;&#xff0c;本质上都和抽象、灵活调用有关 —— 都是让代码更灵活、更可扩展的手段。不过它们各有侧重…...

Python爬虫实战:获取软科网最新特定专业大学排名数据并做分析,为高考填报志愿做参考

一、引言 在高考升学的重要阶段,志愿填报成为考生和家长关注的核心问题。准确、全面且具有权威性的大学专业排名数据,是考生做出科学志愿决策的关键依据。软科网作为专业的大学排名信息发布平台,其发布的计算机科学与技术专业排名数据,因具有较高的公信力和参考价值,备受…...

【ACL系列论文写作指北12-Deadline管理与科研项目规划】-用节奏赢得高质量科研

科研不是一场冲刺&#xff0c;而是有序推进的系统工程。 引言&#xff1a;掌控时间&#xff0c;才能掌控科研主动权 再好的想法和技术&#xff0c;如果没有良好的时间管理&#xff0c;最终只会沦为“赶DDL”的牺牲品。科研项目规划&#xff0c;是确保质量、效率与心态平衡的关…...

elasticsearch底层模块解析与实践系列

#作者&#xff1a;猎人 文章目录 底层模块深入解析之threadpool1、线程池2、线程池类型3、cpu core数量设置 底层模块深入解析之plugin底层模块深入解析之es node节点角色1、node类型2、master eligible node3、data node4、ingest node5、cooridnating only node6、node data…...

Git-基本操作

前言 安装 git --version sudo apt-get remove git -y #卸载 sudo apt-get install git -y基本操作 创建本地仓库 mkdir gitcodegit init 这个就可以创建本地仓库了 然后当前目录下就有一个.git的文件夹 配置本地仓库 就是配置用户的名称&#xff0c;和用户的email地址 在…...

iVX 图形化编程如何改写后端开发新范式

在数字化转型加速推进的当下&#xff0c;企业对后端系统的需求呈现爆发式增长。Gartner 最新报告指出&#xff0c;2025 年全球企业平均需完成 300 定制化应用开发&#xff0c;而传统编码模式下&#xff0c;单个项目平均交付周期长达 6 - 8 个月。与此同时&#xff0c;Redis、K…...

【数据可视化-42】杂货库存数据集可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

使用 Electron 打包 Windows 可执行程序

使用 Electron 打包 Windows 可执行程序 在使用 Electron 构建桌面应用程序时&#xff0c;通常需要将项目打包为可执行文件&#xff08;例如 .exe 文件&#xff09;&#xff0c;以便用户可以方便地安装和运行。本文将介绍如何使用 electron-builder 将 Electron 项目打包成 Wi…...

爬虫学习笔记(三)--Http协议

思维导图 上面思维导图提取的原文是2026王道计网P286~290 URL最前面&#xff08;URL传输过程中遵循HTTP协议&#xff09; 协议 计算机传输的数据实际上就是二进制0和1&#xff0c;协议就是规定这一串二进制数字的前几位代表什么、中间几位代表什么、后几位代表什么 HTTP&a…...

ai环境cuda cudnn conda torch整体迁移 wsl docker

运行没问题的环境&#xff0c;wsl先关停wsl --shutdown 然后导出复制到迁移机器上wsl --export U24 E:\wsl\u24.tar 使用wsl版挂成虚拟机wsl --import U24 E:\wsl\ubuntu E:\wsl\u24.tar 使用docker版挂成镜像docker import E:\wsl\u24.tar my-ubuntu:custom 启动docker容器&am…...

数据库小技巧-使用开窗函数矫正数据库指定列部分列值重复的数据

需求描述 目前有某表的某列部分值重复&#xff0c;需要批量矫正该列数据&#xff0c;确保该列分组内不会出现重复值。 解决思路 -- 创建个临时表 create table t_tmp_20250428( c_bh varchar(32), -- 主键 c_bh_aj varchar(32), -- 主表外键&#xff0c;分组条件&#xff0c…...

【优选算法 | 二分查找】二分查找算法解析:如何通过二段性优化搜索效率

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;双指针滑动窗口 在本篇文章中&#xff0c;我们将深入解析二分查找算法的核心原理。从基本概念到实际应用&#xff0c;带你了解如何利用二分查找高效定位元素&#xff0c;提升搜索效率。无论你是刚接触算法的新手…...

AI与IT协同的典型案例

简介 本篇代码示例展示了IT从业者如何与AI协同工作&#xff0c;发挥各自优势。这些案例均来自2025年的最新企业实践&#xff0c;涵盖了不同IT岗位的应用场景。 一、GitHub Copilot生成代码框架 开发工程师AI协作示例&#xff1a;利用GitHub Copilot生成代码框架&#xff0c;…...

5.软考高项(信息系统项目管理师)-成本管理

成本管理非常重要&#xff0c;选择、计算考得非常多&#xff0c;必须要好好学。 过程、输入、工具及输出 过程名&#xff08;附作用&#xff09; 通俗解释 输入 工具和技术 输出 规划成本管理 为如何管理项目成本提供指南和方向 编制成本管理计划&#xff0c;这个计划主…...

前端:纯HTML、CSS和JS菜单样式

实现了一个多级折叠菜单系统,使用纯HTML、CSS和JavaScript(无任何框架) 一、二级菜单展开 1、实现效果 初始状态-展示全部一级菜单 选中共状态,一级标题选中共为蓝色背景色,二级标题选中共为蓝色文字,展开右侧图标为-,后缩状态右侧图标为+ 2、实现 ​​HTML结构​​ …...

案例篇:如何用tcpdump和Wireshark识别潜在威胁

无论是日常浏览网页、观看视频&#xff0c;还是企业开展线上业务、进行数据传输&#xff0c;都离不开网络的支持。然而&#xff0c;网络问题也时有发生&#xff0c;比如网络卡顿&#xff0c;相信大家都遇到过&#xff0c;那种等待页面加载的焦急心情&#xff0c;真的让人抓狂。…...

微信小程序开发中关于首屏加载、本地数据持久化的思考

本文将围绕小程序开发中首屏性能优化与本地存储持久化两大重要主题展开&#xff0c;结合实际项目经验&#xff0c;系统分析常见问题、优化方法与最佳实践&#xff0c;构建流畅且高效的小程序体验。 文章目录 前言一、什么是首屏加载&#xff1f;为什么重要&#xff1f;二、小程…...

媒资管理之视频管理

一&#xff1a;业务概述&#xff1a; 媒资管理这个模块是我负责开发的&#xff0c;主要的管理对象是视频&#xff0c;图片&#xff0c;文档等 包括文件的上传&#xff0c;视频的处理&#xff0c;文件的删除 &#xff08;在媒资管理界面&#xff0c;有个上传视频的按钮&#…...

windows程序转鲲鹏服务器踩坑记【持续更新中】

1.鲲鹏处理器和Intel处理器的区别 处理器/对比项IntelKunpeng厂家因特尔(美国)华为(中国)指令集X86架构ARM-V8架构与指令集- x86 CISC复杂指令集 - 单核性能强&#xff08;如至强8380主频3.8GHz&#xff09; - 三级缓存优化&#xff0c;支持DDR4-3200和Optane内存- ARMv8-A RI…...

【阿里云大模型高级工程师ACP习题集】2.6.用插件扩展答疑机器人的能力边界

习题集: 【单选题】在构建Agent系统时,使用Assistant API创建Agent时,若想让Agent具备查询员工信息和发送请假申请的功能,以下对instructions参数设置最合理的是( ) A. “你可以做任何事情” B. “你能查询员工信息和发送请假申请” C. “你是公司助手,功能有:1.查询员…...

程序进程多任务线程

1.程序 程序(program)是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。 2.进程 进程(process)是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。进程是操作系统资源分配和处理器调度的基本单位,拥有独立的代码、内部数…...

Finish技术生态计划: FinishRpc

finishRpc 简介 ​ 纯个人兴趣设计的项目: 因为失业在家摆烂 所以没事就想写点代码 本身也比较喜欢自己写一些好玩的demo 这个项目的设计完全是取悦自己又菜又有一个创造框架的梦想 可以用于提升框架设计思路以及实践一些常用技术的练习 可以用于校园中的练习 , 如果能对你有所…...

《商业世界的开源法则:协议选择与商业模式创新》

引言 在当今数字化时代&#xff0c;开源软件已成为技术生态系统中不可或缺的一部分。从Linux操作系统到Apache Web服务器&#xff0c;从MySQL数据库到React前端框架&#xff0c;开源项目支撑着全球大部分互联网基础设施和企业IT系统。然而&#xff0c;关于开源协议与商业使用之…...

Kubernetes》》k8s》》explain查 yaml 参数

在创建json 和yaml 时&#xff0c;我们可能不知道具体的参数该怎么写。同样 我们可以通过explain这个 命令来查看 每个参数具体的作用与写法 # 查看 pod类性有哪些参数 kubectl explain pod# 查看pod中 spec下面有哪些参数 kubectl explain pod.spec...

Kubernetes(k8s)学习笔记(三)--部署 Kubernetes Master

前文已经使用docker安装了kubeadm&#xff0c;因此本文使用kubeadm部署master节点。 一.先拉取必要的镜像库到本地。 在拉取之前&#xff0c;先配下镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&qu…...

《数据结构之美--二叉树》

一&#xff1a;引言&#xff1a; 上次我们学习了栈和队列这两个数据结构&#xff0c;今天我们来学习一个新的数据结构–二叉树中的堆。 堆其实就是一种特殊的二叉树&#xff0c;具有二叉树的性质的同时&#xff0c;还具有其他的性质。 那么在学习堆之前还是先来了解一下树。 …...

Prompt Engineering 提示工程:释放大语言模型潜力的关键技术与实践指南

提示工程:释放大语言模型潜力的关键技术与实践指南 提示工程(Prompt Engineering)作为与大型语言模型(LLM)交互的核心技术,已成为AI应用开发的关键技能。本文将系统介绍提示工程的定义与发展历程,深入剖析其核心知识点,提供实用的设计框架与技巧,并通过丰富的实战案例展示…...

std::print 和 std::println

一、基本概念 std::print 和 std::println 是 C23 新增的格式化输出函数&#xff0c;旨在替代传统的 std::cout 链式调用。它们基于 std::format 实现&#xff0c;支持类型安全的格式化字符串&#xff0c;语法更简洁&#xff0c;性能更优15。 功能特点&#xff1a; 直接输出到…...