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

【BQ3568HM开发板】智能家居中控屏连接华为云IoTDA物联网平台

目录

引言

安装OpenHarmony的MQTT库

华为云平台的操作

建立设备

建立物模型

连接华为云平台

发布LED灯状态

代码重构

测试结果

接收平台发送的属性修改命令

设备侧API

Topic

下行请求参数说明

上行响应参数说明

程序修改

应用侧API

测试设备属性设置功能

结语


本文首发于电子发烧友论坛:https://bbs.elecfans.com/jishu_2475289_1_1.html

引言

前段时间进行了BQ3568HM开发板的测评,设计了智能家居中控屏并进行了LED灯的控制操作。今天为其加入物联网平台的功能,使其真正成为一个智能家居产品。

安装OpenHarmony的MQTT库

官方有个MQTT软件包:ohpm/mqtt,它的最新版本针对的是API12,而BQ3568HM开发板是基于OpenHarmony 4.1,可以使用老一点的版本,使用如下命令:

ohpm install @ohos/mqtt@2.0.13

上面的操作虽然可以导入老版本的MQTT包,但是当三方包发布新版本后,点击同步工程,会出现默认更新安装的三方包版本情况。为了避免这种情况,手工修改oh-package.json5,将其中@ohos/mqtt一行版本号前面的“^"符号删除掉,这样保证安装固定版本的三方包。

{"name": "myapplication","version": "1.0.0","description": "Please describe the basic information.","main": "","author": "","license": "","dependencies": {"@ohos/mqtt": "2.0.13"},"devDependencies": {"@ohos/hypium": "1.0.6"},"dynamicDependencies": {}
}

华为云平台的操作

建立设备

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

建立物模型

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

操作步骤

  1. 访问设备接入服务,单击“管理控制台”进入“设备接入”控制台。选择您的实例,单击实例卡片进入。
  2. 单击左侧导航栏的“产品”,在产品列表中,找到对应的产品,单击产品进入产品详情页。
  3. 在产品详情基本信息页面,单击“自定义模型”,添加服务。
  4. 输入“服务ID”、“服务类型”和“服务描述”,然后单击“确定”。

    • “服务ID”:采用首字母大写的命名方式。比如:WaterMeter、StreetLight。
    • “服务类型”:建议和服务ID保持一致。
    • “服务描述”:比如路灯上报的环境光强度和路灯开关状态的属性。

    添加服务后,在“添加服务”区域,对属性和命令进行定义。每个服务下,可以包含属性和命令,也可以只包含其中之一,请根据此类设备的实际情况进行配置。

  5. 单击步骤4新增的服务ID,在展开的页面单击“新增属性”,在弹出窗口中配置属性的各项参数,然后单击“确定”。

    参数

    说明

    属性名称

    建议采用驼峰形式,如batteryLevel、internalTemperature。

    数据类型

    • int:当上报的数据为整数时,可配置为此类型。
    • long: 当上报的数据为长整型时,可配置为此类型。
    • decimal:当上报的数据为小数时,可配置为此类型。配置“经纬度”属性时,数据类型建议使用“decimal”。
    • string:当上报的数据为字符串、枚举值时,可以配置为此类型。如果为枚举值,值之间需要用英文逗号(“,”)分隔。
    • dateTime:当上报的数据为日期时,可以配置为此类型。

      此类型属性上报格式推荐样例:2020-09-01T18:50:20Z或者2020-09-01T18:50:20.200Z

    • jsonObject:当上报的数据为JSON结构体时,可以配置为此类型。
    • enum: 当上报的数据为枚举值时,可配置为此类型。

      搭配参数enumList格式填写,比如状态属性的enumList填写为OPEN,CLOSE,那么属性上报格式样例为"OPEN"或者"CLOSE"

    • boolean: 当上报的数据为布尔值时,可配置为此类型。

      此类型属性上报推荐格式样例:true/false 或者 0/1

    • stringList: 当上报的数据为字符串数组时,可配置为此类型。

    此类型属性上报推荐格式样例:["str1","str2","str3"]

    访问权限

    • 可读:通过接口可以查询该属性。
    • 可写:通过接口可以修改该属性值。

    取值范围

    请根据此类设备的实际情况进行配置。

    步长

    单位

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

连接华为云平台

先建立IoTDA.ets,内容如下:

import { MqttAsync, MqttClient, MqttPublishOptions, MqttResponse, MqttSubscribeOptions } from '@ohos/mqtt'export class MQTT{private serverUrl: string = 'tcp://bde4cbe7aa.st1.iotda-device.cn-north-4.myhuaweicloud.com:1883'private clientId: string = 'xxxxx_test_0_0_2025020502'private userName: string = 'xxxxx_test'private password: string = 'xxxxxxxxxxxxxx'public mqttAsyncClient: MqttClient = MqttAsync.createMqtt({url: this.serverUrl,clientId: this.clientId,persistenceType: 1,})private topic: string = "light002"connectMqtt() {this.mqttAsyncClient.connect({userName: this.userName,password: this.password,}).then(() => {this.mqttAsyncClient.isConnected().then((data: boolean) => {console.log("连接状态: " + data)});}).catch(() => {console.warn('连接失败')})}subscribeMqtt(topic: string) {let subscribeOption: MqttSubscribeOptions = {topic: topic,//主题名称qos: 0            //消息的服务质量设置}this.mqttAsyncClient.subscribe(subscribeOption).then((data: MqttResponse) => {console.log("订阅成功 " + JSON.stringify(data));}).catch((err: MqttResponse) => {console.log("订阅失败" + JSON.stringify(err));})}messageArrived() {this.mqttAsyncClient.messageArrived((err, data) => {if (err) {console.error("接收消息时发生错误:", err);} else {console.log("接收到的消息:",JSON.stringify(data));}});}publish(topic:string, message:string) {let publishOption: MqttPublishOptions = {topic: topic,               //主题名称qos: 0,                     //消息的服务质量设置payload: message,//发布的消息};this.mqttAsyncClient.publish(publishOption).then((data: MqttResponse) => {console.log("推送成功" + JSON.stringify(data));}).catch((err: Error) => {console.log("推送失败" + JSON.stringify(err));});}disconnect() {this.mqttAsyncClient.disconnect().then((data: MqttResponse) => {console.log("断开成功:" + JSON.stringify(data));}).catch((err: MqttResponse) => {console.log("断开失败:" + JSON.stringify(err));})}
}
export const mqtt = new MQTT();

在index.ets开头加上下面的语句:

import {mqtt} from './IoTDA'

 在SmartHomeControlPanel部分加上:

  deviceId: string = "XXXX_test";aboutToAppear() {// 创建MQTT客户端mqtt.connectMqtt()}

这样就可以在程序一启动时先连接上华为云的服务器。 

发布LED灯状态

代码重构

我们将原来的LED灯控制逻辑进行一下重构,添加如下函数:

  // 控制LED灯的状态并发布消息private setLedStatusAndPublish() {if (this.lightStatus) {console.info("this toggle is On.");let res: string = testNapi.gpio_on(this.ledPath);console.info(res);} else {console.info("this.toggle is Off.");let res: string = testNapi.gpio_off(this.ledPath);console.info(res);}let ledstatus: string = this.lightStatus ? 'ON' : 'OFF';const topic = `$oc/devices/${this.deviceId}/sys/properties/report`;const message = `{"services": [{"serviceId": "smarthome", "properties": {"LED状态": "${ledstatus}"}}]}`;mqtt.publish(topic, message);}

然后将灯光控制按钮修改为:

      // 灯光控制按钮Button({type: ButtonType.Capsule,stateEffect: true,}) {Row() {Image(this.lightStatus ? $r('app.media.light_off_icon') : $r('app.media.light_on_icon')).width(48).height(48).margin({ right: 10 })Text(this.lightStatus ? '关闭灯光' : '打开灯光').fontSize(20).fontColor('#FFFFFF')}}.width('80%').height(80).margin({ top: 20 }).onClick(() => {this.lightStatus = !this.lightStatus;this.setLedStatusAndPublish();})

 这样我们每按下灯光控制按钮,就会自动向云平台发送一下最新的状态。

测试结果

我们可以测试一下,看到云平台显示的状态信息如下:

接收平台发送的属性修改命令

设备侧API

当平台向设备设置属性信息时,首先设备必须在线。

设备侧会自动收到特定Topic的查询请求(无需订阅),设备收到属性查询请求后,需要将设备的属性数据返回给平台,如果设备没回响应平台会认为属性查询请求执行超时。

有关文档可以参考:平台设置设备属性_设备接入 IoTDA_华为云

Topic

下行: $oc/devices/{device_id}/sys/properties/set/request_id={request_id}

上行: $oc/devices/{device_id}/sys/properties/set/response/request_id={request_id}

下行请求参数说明

字段名

必选/可选

类型

参数描述

object_device_id

可选

String

参数解释:

  • 平台下发时,若为直连设备,不携带该参数。
  • 平台下发时,若为网关子设备,该参数为Topic中设备的子设备ID。

services

必选

List<ServiceProperty>

设备服务数据列表。

ServiceProperty结构定义:

字段名

必选/可选

类型

参数描述

service_id

必选

String

参数解释:

设备的服务ID,由创建的产品模型确定。

properties

必选

Object

参数解释:

设备服务的属性列表,具体字段在产品模型里定义,可以设置多个字段。

上行响应参数说明

字段名

必选/可选

类型

参数描述

result_code

可选

Integer

参数解释:

命令的执行结果,0表示成功,其他表示失败。不带默认认为成功。

result_desc

可选

String

参数解释:

属性设置的响应描述。

程序修改

我们需要在aboutToAppear中加上接收云端消息的函数,同时在其中进行JSON解析。ArkTS的JSON解析有点特殊,参见我写的博文。下面就是修改好的代码:

// 定义设备属性类
class DeviceProperties {温度: number;湿度: number;LED状态: string;constructor(温度: number, 湿度: number, LED状态: string) {this.温度 = 温度;this.湿度 = 湿度;this.LED状态 = LED状态;}
}// 定义服务类
class Service {serviceId: string;properties: DeviceProperties;constructor(serviceId: string, properties: DeviceProperties) {this.serviceId = serviceId;this.properties = properties;}
}// 定义整个数据结构类
class ServiceData {services: Service[];constructor(services: Service[]) {this.services = services;}
}@Entry
@Component
struct SmartHomeControlPanel {
……aboutToAppear() {// 创建MQTT客户端mqtt.connectMqtt()mqtt.mqttAsyncClient.messageArrived((err, data) => {if (err) {console.error("接收消息时发生错误:", err);} else {console.log("接收到的消息:",JSON.stringify(data));// 处理接收到的消息if(data.topic.indexOf('sys/properties/set')) {let upTopic = this.getUpstreamTopic(data.topic)let resultString = '{"result_code": 0, "result_desc": "success" }'mqtt.publish(upTopic, resultString);}// 解析 JSON 字符串const parsedData = JSON.parse(data.payload) as ServiceData;const ledStatus = parsedData.services[0].properties.LED状态;// 打印结果console.log(`Service ID: ${parsedData.services[0].serviceId}`);console.log(`LED状态: ${parsedData.services[0].properties.LED状态}`);if(ledStatus === 'ON'){this.lightStatus = true;}else {this.lightStatus = false;}this.setLedStatusAndPublish();}});}

应用侧API

华为的物联网平台提供了应用侧API,实现设备数据采集、命令下发、设备管理等业务场景。

有关应用侧API参见:应用侧API参考_设备接入 IoTDA_华为云。

为了简化应用侧程序的开发,华为提供了各种语言的SDK:SDK概述_设备接入 IoTDA_华为云。不过,今天不介绍SDK,只介绍如何用API Explorer进行API测试和学习。

华为云API Explorer为开发者提供一站式API 解决方案 统一平台,集成华为 云服务 所有开放API,支持全量快速检索、可视化调试、帮助文档、代码示例等能力,帮助开发者快速查找、学习API和使用API开发代码。API Explorer致力于帮助您更快地查找华为云Open API,您可以使用API Explorer来检索华为云开放的API并查看相应的文档,同时应用于API调试、 故障排查 等场景。

API Explorer的网站:https://console.huaweicloud.com/apiexplorer/#/openapi/overview

测试设备属性设置功能

我在API Explorer中对test设备的“LED状态”属性进行了修改。

程序可以正常收到下发的指令,并根据指令进行开灯和关灯操作。

结语

至此,我们完成了智能中控屏接入物联网的操作。我们的测试仍然将继续。

相关文章:

【BQ3568HM开发板】智能家居中控屏连接华为云IoTDA物联网平台

目录 引言 安装OpenHarmony的MQTT库 华为云平台的操作 建立设备 建立物模型 连接华为云平台 发布LED灯状态 代码重构 测试结果 接收平台发送的属性修改命令 设备侧API Topic 下行请求参数说明 上行响应参数说明 程序修改 应用侧API 测试设备属性设置功能 结语…...

mac 安装 dotnet 环境

目录 一、安装准备 二、安装方法&#xff08;两种任选&#xff09; 方法 1&#xff1a;使用官方安装包&#xff08;推荐新手&#xff09; 方法 2&#xff1a;使用 Homebrew&#xff08;适合开发者&#xff09; 1. 安装 Homebrew&#xff08;如未安装&#xff09; 2. 通过 …...

Python爬虫--requests库

一、安装 requests pip install requests二、基础用法 1. 发送 GET 请求 import requestsresponse requests.get("https://www.example.com") print(response.status_code) # 状态码&#xff08;200表示成功&#xff09; print(response.text) # 响应内…...

java 8 在 idea 无法创建 java spring boot 项目的 变通解决办法

java 8 在 idea 无法创建 java spring boot 项目的 变通解决办法 spring boot 3 官方强制 要用 java 17 &#xff0c;但是 不想安装java 17的 &#xff0c;但是又想 使用 spring boot &#xff0c;可以这样 &#xff1a; 在这个网站 https://start.aliyun.com/ 选择 你相对…...

web-文件上传-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…...

langchain教程-5.DocumentLoader/多种文档加载器

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具 一、SQLAIchemy的介绍二、数据库引擎1、支持的数据库1.1、sqlite数据库1.2、MySQL数据库1.3、数据库引擎的参数 三、定义模型类1、定义模型2、engine负责数据库迁移 四、alembic数据库迁移⼯具1、安装alembic2、初始化alemb…...

C# OpenCV机器视觉:图像风格迁移

在一个充满奇思妙想的创意工作室里&#xff0c;小李正像只热锅上的蚂蚁&#xff0c;为客户的项目挠破了脑袋&#xff0c;急需寻找灵感的火花。他望着眼前那幅平淡无奇的风景图像&#xff0c;心想&#xff1a;“这玩意儿也太普通啦&#xff0c;就像一杯白开水&#xff0c;怎么能…...

6955BA/C/E信号收发仪

6955BA/C/E信号收发仪 6955BA/C/E信号收发仪为符合PXIe总线标准的3U模块化产品&#xff0c;该模块频率范围覆盖40MHz~8GHz/12GHz/26.5GHz、最大信号带宽1GHz、单边带相位噪声为-120dBc/Hz20kHz频偏&#xff08;载波10GHz&#xff0c;典型值&#xff09;&#xff0c;具有矢量信…...

语言月赛 202311【基因】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202311] 基因 题目描述 有一个长度为 n n n 的字符串 S S S。其只包含有大写字母。 小 A 将 S S S 进行翻转后&#xff0c;得到另一个字符串 S ′ S S′。两个字符串 S S S 与 S ′ S S′ 对应配对。例如说&#xff0c;对…...

Spring @PropertySource:让你的应用配置更加模块化和可维护

PropertySource注解在Spring中的作用&#xff0c;就像是给Spring应用配了一个“外部配置箱”。 想象一下&#xff0c;你在开发一个Spring应用时&#xff0c;有很多配置信息需要设置&#xff0c;比如数据库的连接信息、应用的某些功能开关等。如果这些信息都硬编码在代码中&…...

Deep Sleep 96小时:一场没有硝烟的科技保卫战

2025年1月28日凌晨3点&#xff0c;当大多数人还沉浸在梦乡时&#xff0c;一场没有硝烟的战争悄然打响。代号“Deep Sleep”的服务器突遭海量数据洪流冲击&#xff0c;警报声响彻机房&#xff0c;一场针对中国关键信息基础设施的网络攻击来势汹汹&#xff01; 面对美国发起的这场…...

快速搭建GPU环境 | docker、k8s中使用gpu

目录 一、裸机部署安装 GPU Driver安装 CUDA Toolkit测试 二、Docker 环境安装 nvidia-container-toolkit配置使用该 runtime 三、 k8s 环境安装 device-plugin安装 GPU 监控 一、裸机部署 裸机中要使用上 GPU 需要安装以下组件&#xff1a; GPU DriverCUDA Toolkit 二者的关…...

【戒抖音系列】短视频戒除-1-对推荐算法进行干扰

如今推荐算法已经渗透到人们生活的方方面面&#xff0c;尤其是抖音等短视频核心就是推荐算法。 【短视频的危害】 1> 会让人变笨&#xff0c;慢慢让人丧失注意力与专注力 2> 让人丧失阅读长文的能力 3> 让人沉浸在一个又一个快感与嗨点当中。当我们刷短视频时&#x…...

DeepSeek写的lammps反应势断键动态显示程序

最近DeepSeek比较火,跟风试用了一下。 让DeepSeek写了一个lammps反应势模拟的断键动态显示代码。 假如你是一名lammps专家,现在用reaxff反应势模拟一个聚乙烯裂解的分子动力学模拟,模拟的轨迹文件为:dump.lammpstrj,反应产物信息文件为:bonds.reaxff,bonds.reaxff文件包…...

npm中央仓库

1、官网地址 npm | Home 2、搜索依赖包...

2025年软考考试时间及考试科目如何安排?附考试注意事项!

一、考试时间 2025年软考举行两次考试&#xff0c;分别安排在上半年和下半年。根据最新公布的信息&#xff0c;2025年软考考试的具体时间安排如下&#xff1a; 上半年考试时间&#xff1a;5月24日至5月27日 下半年考试时间&#xff1a;11月8日至11月11日 考生需要在规定的时间内…...

4.PPT:日月潭景点介绍【18】

目录 NO1、2、3、4​ NO5、6、7、8 ​ ​NO9、10、11、12 ​ 表居中或者水平/垂直居中单元格内容居中或者水平/垂直居中 NO1、2、3、4 新建一个空白演示文稿&#xff0c;命名为“PPT.pptx”&#xff08;“.pptx”为扩展名&#xff09;新建幻灯片 开始→版式“PPT_素材.doc…...

HTML排版标签、语义化标签、块级和行内元素详解

目录 前言 一、HTML中的排版标签 1. 文本相关标签 1.1 标题标签 ~ 1.2 段落标签 1.3 强调和加粗 1.4 换行标签 1.5 水平线标签 二、HTML中的语义化标签 2.1 语义化标签概述 2.2 常见的语义化标签 示例&#xff08;核心代码部分&#xff09;&#xff1a; 三、HTM…...

机器学习中的关键概念:通过SKlearn的MNIST实验深入理解

欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 sklearn相关介绍 Scikit-learn 是一个广泛使用的开源机器学习库&#xff0c;提供了简单而高效的数据挖掘和数据分析工具。它建立在 NumPy、SciPy 和 matplotlib 等科学计算库之上&#xff0c;支持…...

河洛理数【陈抟】论天地两数

从文中说天数属阳、地数属阴可知如何确定天数和地数的确定,也就是奇数属天数、偶数属地数。当然这只是其中的一个特性,而天地两数都有具体的数字,分别是25和30。利于阳的主要有男性、阳爻、冬至到四月终;利于阴的主要是女性、阴爻、夏至到十月终。 另前文中有说到天数和地数…...

Linux 中为什么进程是休眠的,但是还是处理了数据

在 Linux 中&#xff0c;进程的状态可以是多种多样的&#xff0c;S&#xff08;休眠状态&#xff09;是其中之一。即使进程处于休眠状态&#xff0c;它仍然可以继续处理数据。这是因为 休眠状态 并不意味着进程完全停止工作&#xff0c;它通常指的是进程正在等待某些事件&#…...

弹性盒子的学习

/*弹性盒子内其他的属性和作用*/ 1、flex-grow 定义项目的放大比例&#xff0c;默认值为 0。如果有剩余空间&#xff0c;项目将根据该值进行放大。 2、flex-shrink 定义项目的缩小比例&#xff0c;默认值为 1。如果空间不足&#xff0c;项目将根据该值进行缩小。 3、flex-bas…...

用NeuralProphet预测股价:AI金融新利器(附源码)

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;我用NeuralProphet模型预测了股票价格&#xff0c;发现其通过结合时间序列分析和神经网络算法&#xff0c;确实能提供比传统Last Value方法更精准的预测。经过一系列超参数调优…...

深度学习-103-RAG技术之通过分块技术提升RAG的效果

文章目录 1 RAG中的分块技术1.1 RAG是什么1.2 分块chunking是什么1.3 分块的重要性1.4 分块的技巧2 固定字符大小分块2.1 固定字符大小分块的优缺点2.2 自定义分块代码2.3 LangChain的CharacterTextSplitter3 递归字符文本分割3.1 递归字符文本分割的优缺点3.2 LangChain的Recu…...

【B站保姆级视频教程:Jetson配置YOLOv11环境(六)PyTorchTorchvision安装】

Jetson配置YOLOv11环境&#xff08;6&#xff09;PyTorch&Torchvision安装 文章目录 1. 安装PyTorch1.1安装依赖项1.2 下载torch wheel 安装包1.3 安装 2. 安装torchvisiion2.1 安装依赖2.2 编译安装torchvision2.2.1 Torchvisiion版本选择2.2.2 下载torchvisiion到Downloa…...

【Vitest】单元测试

文章目录 测试&#xff1a;Vitest一、安装二、断言三、回调测试四、对象方法五、模拟第三库 测试&#xff1a;Vitest 一、安装 npm install vitest创建文件&#xff1a;example.test.ts 运行测试&#xff1a; npx vitest example二、断言 import { expect, test } from vi…...

使用conda创建自己的python虚拟环境,与其他python版本独立区分

使用 Conda 创建和使用自己的运行环境非常简单&#xff0c;以下是详细步骤&#xff1a; 1. 安装 Anaconda 或 Miniconda 如果你尚未安装 Anaconda 或 Miniconda&#xff0c;可以访问 Anaconda 官网 或 Miniconda 官网 下载并安装。 2. 创建新的 Conda 虚拟环境 创建虚拟环境…...

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…...

Vue混入(Mixins)与插件开发深度解析

Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析 Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析1. Vue混入&#xff08;Mixins&#xff09;核心概念1.1 什么是混入1.2 基础使用方式1.3 选项合并策略1.4 全局混入及其风险1.5 混入的优缺点分析 2. 混入实战…...