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

智能硬件开发革命:低代码平台+物联网

物联网和低代码开发

初识物联网

物联网的概念

20 世纪末,随着计算机网络和通信技术的兴起,互联网开始走进并融入人们的生活。传统互联网通常以人作为主体,数据的产生和传输都在人的控制下进行,数据的应用结果也在具体的人身上得到反映。以网络短视频为例,拍摄、上传和观看等环节都离不开用户的主动参与,而短视频平台对用户产生的数据进行分析和处理后,再根据偏好情况推送相关内容,最终受影响的依旧是用户本身。可以看出,传统互联网的大部分流程都是围绕人在运行和发展的。
以人为主体的传统互联网

随着技术的不断演进,物与物之间信息传输和交换的需求日趋增加,物联网(Internet of Things, IoT)的概念应运而生。

物联网是一个将所有物体连接起来组成的物-物相连的互联网络。它利用各种信息传感器、射频识别技术、全球定位系统、红外线感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。

现代物联网在本质上属于互联网的延伸。它将传统互联网的基础设施作为信息传递的载体,打破了时间和空间的限制,让“物”成为了数据产生和消费的主体,极大地拉近了“人与物”“物与物”的距离。以智慧农业灌溉为例,土壤中预埋的湿度传感器将土壤水分信息定时地上传到云端平台,当平台的程序监测到土壤缺水时,按照预设的规则,远程启动田间的灌溉设备,从而控制土壤含水量在合适水平。在这个场景中,无需人的参与,所有的流程都是靠物与物之间的交互完成,涉及的数据也是与“物”本身直接相关的。

在这里插入图片描述

当前,物联网的涵义和外延仍在不断的变化和发展中,因此还没有一个清晰准确的定义。不过,从上面的介绍中,可以大致看出物联网的特点:物联网是以“物”为主体的互联网,在形式和内容上处处体现着“物”的特征。因此,物联网应用的整体架构和开发方式也与传统的互联网应用有着显著的区别。

如今,物联网已经成为一种新型信息基础设施和社会经济发展模式。它在工业、农业、环境、交通、物流、安保等基础设施领域,在家居、医疗健康、教育、金融与服务业、旅游业等与生活息息相关的领域,都有着广泛的应用和创新,有效地推动了这些方面的智能化发展,使得有限的资源更加合理地使用分配,从而提高了行业效率,也大大地提高了人们的生活质量。

随着经济和科技的快速发展,20 多年前关于“万物互联”的幻想开始走入现实。从身边的各类智能设备、智能家居,到智慧地球和“元宇宙”的最新概念,物联网为这些技术变革提供了坚实有力的支撑。

物联网的体系结构

“下班前,打开手机中的开关,控制空调启动,到家后,即可享受舒适的室内温度。”这是日常生活中司空见惯的物联网应用场景。大部分物联网应用都和远程开空调一样,在用户层面的感知十分简单纯粹。但实际上,要实现这样一个简单的物联网应用,并不是一件容易的事。

一个完整的物联网应用,需要涉及到较多的技术、环节和角色。从数据流向和功能角度,物联网生态系统的体系结构可被大致分成四个层级。各层级执行属于自身的特定的功能,同时也通过各种渠道与其他层级之间进行互动,进而实现完整的物联网功能。

终端层

终端层(Terminal Layer),又称感知层(Perception Layer)或感知控制层,是物联网体系中最基础的一层。终端层的核心功能是与物理世界的交互,进而实现对现实对象(环境参数、设备状态等)的感知和对具体设备的控制。

在这里插入图片描述

终端层是绝大部分物联网实体设备(如传感器、RFID 等)的所在地。传感器通过将现实世界的物理量转换为电信号,实现信息采集和识别的重要作用。实际的物联网设备中,除了传感器,通常还具备用于协调和控制所有功能和部件运行的主控和用于网络接入的通信模块等部件。

网络层

网络层(Network Layer)是负责将终端层的设备收集的数据传输到平台层,以及将平台层的控制指令发送回终端层的双向通信的桥梁。从功能维度,网络层又可分为接入层(Access Layer)和传输层(Transport Layer)。

接入层主要涉及传统 OSI 模型中的物理层和数据链路层的功能,简单来说,就是设备接入网络、实现互联的各种方式。从介质上,可分为有线网络接入和无线网络接入两类。有线网络接入方式包括以太网、串行通信(如 RS-232、RS-485)和 USB 等。无线网络接入方式包括 Wi-Fi、蓝牙、蜂窝网络(如 2G/3G/4G/5G,将在 下一节 进行详细介绍)、低功耗广域网(如 LoRaWAN、NB-IoT)等。

在这里插入图片描述

传输层建立在接入层之上,包括了数据上报和下发的通信协议。与互联网终端相比,目前大部分物联网终端设备在处理性能、存储容量、网络速率等方面的可用资源较少,因而在通信时倾向于选择占用资源更少的通信协议,如 MQTT(Message Queuing Telemetry Transport)和 CoAP(Constrained Application Protocol)等。这些协议都是基于发布/订阅(Publish/Subscribe)模式的,可以实现设备和平台之间的双向通信,同时也支持数据加密和压缩等功能。

平台层

平台层(Platform Layer)是物联网架构的中间层,是数据被处理、存储和分析的地方。在过去,这一层一般由独立的服务器构成。随着微服务和云计算等技术的发展,现代的物联网平台层通常包括了基于云的系统性平台、数据分析引擎和中间件,使开发者能够在物联网基础设施之上构建和部署应用程序。

在这里插入图片描述

平台层在功能上作为承接设备和行业应用的中间服务,在整个物联网体系架构中起着承上启下的作用,承载了抽象化的业务逻辑和标准化的核心数据模型。一个典型的平台层不但可以实现设备的快速接入,还可以提供强大的模块化能力,满足行业应用场景下的各类需求。

除了提供基本的设备接入和管理功能外,成熟的物联网平台层通常还包括安全管理、监控运维、规则引擎、边缘计算等功能,为实际应用提供更多的方便。

应用层

应用层(Application Layer)是物联网架构的顶层,是物联网数据真正产生价值的地方,也是物联网与人产生直接关联的层次。应用层包括网络和移动应用程序、仪表板和其他用户界面,使用户能够监测和控制设备,访问数据,并执行其他任务。在大部分场景中,应用层承接平台层的数据并进行分析和处理,再将结果应用于各类自动化流程,或是在与用户的交互中予以呈现。应用层还可以包括机器学习和人工智能算法,使系统能够从数据中不断学习,并随着时间的推移而对结果进行优化。

典型的物联网工程

为了更好地让读者理解物联网的体系结构和相关技术,我们再次以前文中提到的远程开启空调为例,介绍一个典型的物联网工程的内容和开发流程。

需求分析

对于大部分工程项目,了解和细化需求是开发的第一步。在没有充分理解需求的基础上盲目启动开发工作往往会影响开发效率和最终效果,甚至造成不可挽回的损失。

在空调这个项目里,最初了解到的需求也许只有“远程开空调”这一项。面对这种需求,大部分人会设想的场景和流程是:

在手机或平板电脑上按下某个 App 中的按键,App 发送指令给服务器,服务器再发送命令给用户家中的某个本地设备,本地设备控制空调启动。

在这里插入图片描述

显然,其中包含的信息过于模糊,并含有大量先入为主的猜测,并不足以支持一个完整项目的开发。因此,需要通过与需求者(客户)的深入沟通,对内容和整体流程进行细化。对于这种类型的项目而言,要了解的内容包括但不限于:

  • 远程控制所用的设备:Android 智能手机 / iPhone / 普通 PC / ……
  • 用户交互所用的软件:专门的 App / 微信小程序 / 网页控制 / ……
  • 空调的型号及控制方式:红外 / 蓝牙 / ……
  • 云平台的类型:公版服务 / 私有化部署 / 独立服务 / ……
  • “本地设备”的类型:智能插座 / 家庭网关 / ……
  • “本地设备”的通信方式:Wi-Fi / 蓝牙 / Matter / 4G / ……
  • 用户的其他功能需求:定时开关 / 自动开关机 / 自动省电 / ……
  • ……

经过细化,最终的业务流程可能会变成:

用户通过操作 Android 智能手机上安装的独立 App,远程向部署在阿里云平台上的云端程序发送包括直接启动、定时开关等指令。云端程序根据不同的用户指令,直接或定时发送信息给部署于用户房间内的智能插座。智能插座通过 Wi-Fi 网络接收信息,然后通过红外遥控的形式,控制 xx 型号空调开启对应的工作模式。

乍一看,开发难度好像增加了不少。但需求细节的增加,为实际的开发指明了更加清晰完整的路径。

框架建立

结合上文介绍的物联网四层架构和刚刚梳理的需求细节,开发者可以开始构建起大概的工程框架。可以看出,这个工程的主要开发工作量集中在以下三个板块。

  1. 终端层(智能硬件):开发一个智能插座,负责实现与云平台的交互和对空调的控制。
  2. 平台层(核心逻辑):部署相应的平台,并在其上实现相应的判断和控制算法。
  3. 应用层(手机 App):通过智能手机 App 完成对空调的远程控制,并能通过 App 轻松查询空调运行的实时状态。

事实上,大部分物联网工程的开发内容也都包括这三个方面。通俗地说,物联网工程开发,很多时候就是数据的“两头”(数据的产生侧和消费侧)和“中间”(整体逻辑)的开发。

在这里插入图片描述

开发内容梳理

在工程的整体框架清晰之后,就可以针对每一个部分的功能进行进一步的分析,整理出具体的开发路径和开发内容。

对于设备端的开发,从总体上看是实现一个基于 Wi-Fi 的智能插座。所以,在开发过程中,开发者需要通过控制 Wi-Fi 芯片或模块实现智能插座应有的网络配置、连接以及与云平台双向通信的功能。此外,这个智能插座还需要实现对空调的红外遥控,因此开发者需要在其中集成红外发射管,并对其发射功率、安装角度等进行考量,同时对空调的红外编码进行研究。

应用端的开发相对来说更为简单。基于 Android 系统开发智能手机 App,给用户提供图形化的操作界面,接收用户指令并发送到云端,同时从云端获取状态信息并在界面上进行显示。这个流程与普通的 App 开发相比没有显著差异。

云端的开发是整个项目的核心。具体来说,需要设计完备的机制,实现设备的接入以及各类数据和指令的上传、下发和存储,同时还需要提供智能手机 App 可访问的设备操作 API。此外,应用的核心控制逻辑,如定时启停等操作,一般也都在云端实现。好在目前大部分现有的商业云平台都已经搭建了成熟的基础架构,让用户可以方便地实现物联网数据上云操作。

需要注意的是,本节为了便于读者理解,只介绍了构成完整物联网业务逻辑的最核心的开发内容。一个真正成熟可商用的物联网项目,在开发过程中还会涉及到更多的功能,如设备监控、固件更新等等,开发工作量通常也远大于业余项目。

实际开发流程

实际开发通常从硬件设计开始。在明确功能需求的基础上,对元件和其他物料进行选型,然后进行 PCB 设计和制造。对于一个智能插座而言,除了满足基本的功能需要,整体的体积、抗干扰能力等也是需要考虑的范畴。因此,硬件设计本身是一项门槛较高、专业性较强的工作。

之后,需要对物联网云平台进行配置。正如前文所言,大部分现有的商业云平台都已经搭建了成熟的基础架构,开发者需要根据不同平台的说明,创建相应的产品和(虚拟)设备,并完成属性和接口的配置,便于后期将设备与平台进行对接。

完成云平台配置后,就进入了真正的代码开发阶段。包括设备端的嵌入式软件开发和手机端的 App 开发。对于一般的嵌入式软件而言,除了实现设备所需的各类功能外,通常还需要根据实际需求,对功耗、稳定性等方面进行不断的迭代和优化。

最后,在所有软硬件开发结束,并完成最终产品的装配后,进入测试阶段。在这一阶段,一般会根据产品的功能和相关规范进行相关的量产测试,如设备功能测试、老化测试、射频测试等。对于业余项目而言,测试通常是非必须的,但对于商业项目,只有经过充分的测试,才能尽可能地规避内在风险,减少产品上市后出现问题的可能性。

低代码开发

从前文的介绍可以看出,对于物联网项目开发而言,涉及的专业知识较多,开发工作量也较大。如何降低开发难度,让更多人参与到物联网开发中来,低代码开发无疑是最好的选择。

低代码开发的由来

低代码(Low-Code)开发是近年来流行的一种全新的软件开发方式。在低代码开发过程中,开发者可以使用预先生成的模板、组件和其他工具来创建软件应用程序,显著降低人工编写的代码总量和代码的复杂度。与传统的开发模式相比,这类方法使开发者能够更快、更省力地完成项目开发。

低代码开发的概念源于对传统软件开发面临的挑战的解决需求。传统的软件开发往往需要专业的编程知识和大量的资源来完成,而且开发周期较长,维护成本较高。低代码开发的出现是为了简化和加速应用程序开发过程,使其更容易被不同层次和背景的开发者所掌握和使用,包括那些没有太多编程经验的非专业用户。

低代码开发的核心思想是让开发者只关注业务逻辑,而不需要把精力浪费在非业务层面。这一思想可以追溯到第四代编程语言和上世纪 90 年代至 21 世纪初流行的快速应用程序开发(Rapid Application Development,RAD)工具。有过 Microsoft Visual Basic / Microsoft Visual C++ 或工业组态软件使用经验的用户通常很容易理解这一点。在 Microsoft Visual Basic 中,通过简单的拖拽就可以绘制完备的用户界面。开发者只需开发事件处理相关的业务代码,而无需关注界面相关代码。在组态软件中,除了界面可以通过拖拽绘制外,很多的业务逻辑也被包装为功能块的形式,开发者通过拖拽和简单配置即可实现完整的系统功能。这些“积木式开发”的方式其实就反映了低代码开发的核心思想。

在这里插入图片描述

低代码开发有许多优势,其中最显著的是对项目开发效率的提升作用。由于低代码开发提供了可重用组件等功能,传统的、需要消耗大量时间完成的冗长的编程工作将大幅减少,开发者因而可以更快、更省力地创建应用程序。这一优势使得低代码在快速迭代和原型设计中得到广泛应用,开发者可以便捷地修改和测试新的想法,而无需花费大量时间和精力。

低代码开发的另一重要优势在于保证了程序的质量。“积木式开发”中,开发者实际做的是对于各类预先开发的功能模块的串联和排布,通常不会涉及到具体的技术细节的修改,因而可以从源头上规避开发者主观因素导致的程序质量问题。对于一般的开发者来说,只要低代码运行环境和各功能模块的质量有所保证,利用低代码开发方式开发的应用在可靠性上会远高于传统开发方式开发的应用。

当前,低代码开发在包括网络和移动应用开发、流程自动化和数据集成等在内的多个领域中已经得到广泛应用。在网络和移动应用开发中,低代码开发可用于创建自定义用户界面、工作流程和数据模型。在流程自动化中,低代码开发可用于自动化重复性任务和简化业务流程。在数据集成方面,低代码开发可用于创建不同系统和应用程序之间的自定义集成。

在这里插入图片描述

此外,低代码开发在实体企业中也受到了越来越广泛的欢迎。低代码开发可以帮助企业以较低的成本实现传统生产系统的现代化,并加速数字化转型工作。通过赋予非专业用户创建应用程序和自动化流程的能力,低代码开发技术可以帮助组织变得更加灵活,对不断变化的业务需求做出反应。

总之,低代码开发是一种革命性的软件开发方式,它可以让更多的人参与到应用程序的开发过程中,提高开发效率和质量,降低开发成本和难度,满足各种业务场景的需求。

物联网和低代码

低代码开发技术已经在物联网生态系统的平台层和应用层发挥了重要作用。借助低代码开发技术,平台开发者和用户可以通过可视化的界面和拖拽式的操作,轻松地对物联网数据在云端的流向进行控制(即“云组态”),并快速构建包括手机 App 在内的各种终端应用方式。这样,无论是对于物联网平台的搭建,还是对于物联网数据的利用,都可以大大提高效率和灵活性,降低复杂度和风险。随着各类编程框架的发展,低代码开发也开始在终端层,即具体的物联网设备开发中得到使用。

在实际的物联网项目落地和推广应用过程中,普遍存在着开发量和成本之间的矛盾。对于一个具体的物联网应用场景,如智能养殖,需要接入云端的传感器和智能仪表数量和种类繁多,物理链路多样,通信协议各有不同,显著增加了开发周期和开发成本,同时大量的设备对于长期维护来说也带来了挑战。而大部分物联网场景对于系统的整体成本较为敏感。这一矛盾为物联网项目的快速落地实施带来了巨大的阻碍。低代码开发凭借其低成本、短周期、高稳定性的优势,成为了解决这一问题的钥匙。

物联网设备开发是一个典型的嵌入式系统(Embedded System)开发场景,在传统理念中,通常需要掌握多个领域的知识才能胜任。例如,开发者需要了解硬件设计、电路原理、嵌入式软件、本地和远程通信、中间件、应用程序、分析、机器学习等等。这些知识不仅涉及不同的技术栈,而且需要不断更新和学习。这就导致了物联网设备开发的门槛很高,人才很稀缺,成本很高昂。而低代码开发技术的引入极大地降低了这一门槛,使得非专业用户也可以参与到开发中来。同时,模块化的开发方式也降低了开发者犯错的可能性,并为后续的维护提供了便利。随着物联网应用数量的不断增加,碎片化程度不断加深,人们对于能实现从端到云的物联网全链条开发的全栈工程师的需求也愈发迫切。低代码开发将进一步在这一领域展现其不可替代的价值。

物联网设备的低代码开发

物联网设备的低代码开发是一种利用简单易用的编程语言(如脚本语言)和框架,在物联网设备上快速构建和部署应用程序的方法。正如前文所述,低代码开发可以降低物联网设备开发的门槛,提高开发效率,适应多变的业务需求。

常见的低代码硬件开发框架

目前,市面上有许多不同类型的低代码开发框架,它们各有优势和特点,可以根据不同的场景和设备进行选择。

Arduino

Arduino 是一个基于 C++ 语言的开源开发框架,它为开发者提供了丰富的库和模块,让他们可以方便地控制各种传感器和执行器,实现各种创意项目和原型设计。

作为近年来物联网嵌入式开发领域的重要技术之一,Arduino 具有良好的互操作性和可移植性,能够与多种硬件平台和网络协议兼容。同时,Arduino 也是运算能力和内存资源较为有限的物联网硬件的首选编程框架,因为它可以优化性能和节省空间,提高开发效率和质量。此外,Arduino 还具有价格便宜、开源特性、易用性和社区支持等优点,这些优点使得 Arduino 更加受到开发者的青睐和信赖。

Johnny-Five

Johnny-Five 是一个基于 JavaScript 的机器人和物联网编程框架,它可以让开发者用熟悉的语言和工具来控制各种硬件设备,同时享受 Node.js 生态系统的优势。它使用 Firmata 协议与硬件平台进行通信,支持 Tessel 2、Raspberry Pi、Intel Edison、Particle Photon 等多种主流的开发板。

Johnny-Five 提供了丰富的组件库,可以轻松控制各种传感器、执行器、显示器等常用的硬件模块。它具有强大的事件驱动模型,可以响应硬件的状态变化,实现交互式和智能化的功能。它具有灵活的插件机制,可以扩展新的硬件支持或功能,满足不同的需求和场景。它还有友好的文档和示例,可以帮助开发者快速入门和学习,提高开发效率和质量。

NodeMCU

如果你想在低成本的 Wi-Fi 芯片上开发物联网应用程序,NodeMCU 是一个不错的选择。NodeMCU 是一个开源的物联网开发框架,它基于 Lua 语言,可以让你使用简洁清晰的语法编写和运行网络应用程序。Lua 是一种高级的脚本语言,它主要面向数据的物联网解决方案,可以快速地处理和分析大量复杂数据,提高物联网系统的性能和效率。

NodeMCU 支持多种网络服务和云平台,如 HTTP、MQTT、CoAP 等,可以方便地连接和控制各种物联网设备。你可以使用 NodeMCU 实现智能家居、远程监控、数据采集等功能。NodeMCU 还提供了丰富的库函数和示例代码,可以帮助你快速入门和学习。

NodeMCU 可以在 ESP8266 和 ESP32 等低成本的 Wi-Fi 芯片上运行,这些芯片集成了 Wi-Fi 功能和低功耗微控制器,适合物联网应用开发。除此之外,NodeMCU 还有以下优点:它可读性强,易于维护和修改,也便于与其他开发者交流和协作;它与面向对象、结构化和函数式编程高度兼容,可以灵活地适应不同的编程风格和需求;它可以通过与 C/C++ 混合编程或使用 JIT 编译器等方式来提升运行速度。

MicroPython

MicroPython 是 Python 的“精简版”,它适应了资源有限的设备,同时保留了 Python 的语法和交互式编程体验,使得 Python 语言能够在微控制器和小型嵌入式系统上运行。这意味着开发者可以使用熟悉的 Python 语法和工具来编写和调试代码,而不需要学习新的语言或环境。MicroPython 还继承了 Python 的 REPL(Read-Eval-Print Loop)模式,即开发者可以在设备上直接输入代码并立即看到执行结果,这有助于快速测试和验证想法。

为了方便 Python 开发者和教育者使用,MicroPython 支持多种硬件接口和库。例如,MicroPython 可以通过 SPI、I2C、UART 等接口与传感器、显示器、马达等外部设备通信,也可以通过网络模块实现无线连接和远程控制。此外,MicroPython 还提供了一些专门针对微控制器和嵌入式系统的库,如 machinenetworkuasyncio 等。

在这里插入图片描述

关于 MicroPython 的更多信息,我们将在本章的 第 3 节 进行介绍。

低代码硬件开发的特性

尽管低代码硬件开发框架的种类繁多、适用场景多样,但作为低代码技术,它们都具备着一些相似的特性。

面向对象

面向对象是一种编程范式,它将数据和操作数据的方法封装在一起,形成一个对象。对象之间可以通过消息传递进行交互,实现复杂的功能。面向对象的编程语言和框架可以让开发者更容易地理解和操作硬件设备,因为它们都被抽象为具有属性和行为的对象。例如,Arduino 中的 LED 灯可以被看作是一个对象,它有一个引脚属性和一个亮度属性,它有一个设置引脚和设置亮度的方法。使用 Arduino 语言,我们可以很容易地创建一个 LED 灯对象,并且调用它的方法来控制它的状态。

屏蔽细节

屏蔽细节是一种编程技巧,它隐藏了不必要或不相关的信息,只暴露出必要或相关的信息,从而简化了编程过程。屏蔽细节的编程语言和框架可以让开发者无需关心硬件设备的底层实现细节,只需要关注其功能和接口,从而降低了开发难度和出错率。例如,NodeMCU 中的网络服务模块可以让开发者无需了解 Wi-Fi 芯片的底层驱动和协议栈,只需要调用简单的函数就可以实现网络连接和数据传输。

以 GPIO(General Purpose Input/Output,通用输入输出)开发为例,开发者通常无需查看原理图,理解电路层面的连接关系;不需要了解各类引脚的类型和速度模式,也不需要搞清楚电平上下拉等知识;更不需要手动编写传统嵌入式开发必不可少的时钟配置和系统初始化等代码。开发者只需按照实际的业务需求直接编写 GPIO 状态控制逻辑即可,开发门槛和代码量都得到了显著降低。

模块化

模块化是一种编程原则,它将一个大型的程序分解为多个相互独立的小型模块,每个模块都有自己的功能和接口,可以被重复使用和组合。模块化的编程语言和框架可以让开发者灵活地调用现有的功能模块,根据不同的需求组合不同的模块,实现复杂的功能。例如,MicroPython 中的硬件接口模块可以让开发者轻松地使用各种硬件设备,如 I2C、SPI、UART 等,只需要导入相应的模块并创建相应的对象就可以进行通信和控制。

通过以上分析,我们可以看出低代码开发框架具有以下优势:简化了编程过程,提高了开发效率;抽象了硬件设备,增强了可移植性;利用了现有资源,扩展了功能性。总而言之,低代码开发框架是一种适应时代变化和技术进步的编程范式,它可以让更多人参与到创新和制作中来,实现自己的想法和梦想。

相关文章:

智能硬件开发革命:低代码平台+物联网

物联网和低代码开发 初识物联网 物联网的概念 20 世纪末,随着计算机网络和通信技术的兴起,互联网开始走进并融入人们的生活。传统互联网通常以人作为主体,数据的产生和传输都在人的控制下进行,数据的应用结果也在具体的人身上得…...

「合诚」携手企企通共建新材料和健康产业采购数智化新生态

在科技革命与产业变革深度融合的时代背景下,新材料与健康产业正迎来数字化、智能化的快速发展。 技术突破与消费升级的双重驱动,推动着行业不断创新,同时也对企业的供应链管理提出了更高要求。 1、合诚:聚焦新材料与健康产业&am…...

ansible角色

一、角色 role 本质上就是目录 /etc/ansible/roles 1、创建角色 tree查看目录结构 在同一个角色中,相互引用文件、操作时,不需要添加任何路径 删除角色,将角色目录中的角色文件删除 案例:部署zabbix agent 执行角色...

WHAT - React 元素接收的 ref 详解

目录 1. ref 的基本概念2. 如何使用 ref2.1 基本用法2.2 类组件使用 createRef 3. forwardRef 转发 ref4. ref 的应用场景5. ref 和函数组件总结 在 React 中,ref(引用)用于访问 DOM 元素或类组件实例。它允许我们直接与元素进行交互&#xf…...

数字游戏(继Day 10)

主体: #include<stdio.h> #include<time.h> #include<stdlib.h>#include"mygetch.h"#define MAX 51 //定义测试字母的最大长度void help() {printf("\n****************************************");printf("\n*输入过程中无法退出…...

react 中将生成二维码保存到相册

需求&#xff1a;生成二维码&#xff0c;能保存到相册 框架用的 react 所以直接 qrcode.react 插件&#xff0c;然后直接用插件生成二维码&#xff0c;这里一定要写 renderAs{‘svg’} 属性&#xff0c;否则会报错&#xff0c;这里为什么会报错&#xff1f;&#xff1f;&#…...

React-05React中props属性(传递数据),propTypes校验,类式与函数式组件props的使用

1.类式组件props基本数据读取与解构运算符传递 <script type"text/babel">// 创建组件class PersonalInfo extends React.Component {render() {// 读取props属性 并读取值console.log(props,this.props);return(<ul><li>姓名&#xff1a;{this.p…...

export default function?在react中在前面还是后面呢?

好的&#xff01;我将通过几个具体场景的代码示例&#xff0c;展示不同 export default 使用方式的适用情况&#xff0c;并给出推荐实践。 场景 1&#xff1a;基础组件&#xff08;推荐直接导出&#xff09; 适用情况&#xff1a;简单组件&#xff0c;无需额外处理 // 方式A:…...

红米手机输入正确密码也无法解锁的问题的可尝试解决方法

文章目录 问题现象官方途径没看到有能给解决的可尝试解决方法&#xff08;汇总小红书成功解决方法&#xff0c;但从回复来看&#xff0c;多为成功的个例&#xff0c;整体而言希望不大&#xff09;重启/强制重启尝试之前的密码等待一晚上后再次尝试输入密码&#xff0c;包括重启…...

优选算法系列(6.模拟)

一.替换所有的问号&#xff08;easy&#xff09; 题目链接&#xff1a;1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 纯模拟。从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就用 a ~ z 的每⼀个字符去尝试替换即可。 代码…...

罗技K860键盘

罗技蓝牙键盘的顶部功能键F1-F12的原本功能 单击罗技键盘的功能键时&#xff0c;默认响应的是键盘上面显示的快进、调节音量等功能。改变回F1~F12原本功能&#xff0c;同时按下 fn和esc组合键...

⭐算法OJ⭐数据流的中位数【最小堆】Find Median from Data Stream

最小堆 最小堆是一种特殊的完全二叉树数据结构。 基本定义 堆性质&#xff1a;每个节点的值都小于或等于其子节点的值&#xff08;根节点是最小值&#xff09;完全二叉树性质&#xff1a;除了最底层外&#xff0c;其他层的节点都是满的&#xff0c;且最底层的节点都靠左排列…...

node-modules-inspector 使用以及 node_modules可视化 依赖关联关系快速分析

node-modules-inspector 使用以及 node_modules可视化 依赖关联关系快速分析 node-modules-inspector 简介 node-modules-inspector 是一个用于分析和可视化 node_modules 依赖关系的工具&#xff0c;主要功能包括&#xff1a; 依赖可视化&#xff1a;以交互式图表展示项目的依…...

python自动登录远程设备的几种方式(华为设备)

其实登录远程设备&#xff08;交换机路由器&#xff09;的方式无非就是通过SSH或者是Telnet这两个协议&#xff0c;当然最主要的还是SSH&#xff0c;这里主要讲的是通过这两个协议登录远程设备的几个方式 拓扑 本文都是用的这个拓扑&#xff0c;主要通过编写python脚本来登录其…...

【android bluetooth 框架分析 01】【关键线程 1】【关键线程介绍】

1. 为什么学习蓝牙协议栈之前&#xff0c;必须先梳理清楚这几大线程&#xff1f; 为什么 学习协议栈之前 最好是要先梳理清楚 关键线程 bt_stack_manager_threadbt_jni_threadbt_main_threadbt_a2dp_sink_worker_thread 1.1 蓝牙协议栈是典型的“多线程异步系统” 蓝牙协议…...

LDAP高效数据同步:Syncrepl复制模式实战指南

#作者&#xff1a;朱雷 文章目录 一、Syncrepl 复制简介1.1. 什么是复制模式1.2. 什么是 syncrepl同步复制 二、Ldap环境部署三、配置复制类型3.1. 提供者端配置3.2. 消费者端配置3.3.启动服务3.4.测试同步是否生效 四、总结 一、Syncrepl 复制简介 1.1. 什么是复制模式 Ope…...

SeeGround: See and Ground for Zero-Shot Open-Vocabulary 3D Visual Grounding

CVPR 2025 核心问题与动机 问题背景&#xff1a;3D视觉定位&#xff08;3DVG&#xff09;要求根据文本描述在3D场景中定位目标物体&#xff0c;是增强现实、机器人导航等应用的关键技术。传统方法依赖标注的3D数据集和预定义类别&#xff0c;限制了其在开放场景中的扩展性。现…...

深入理解Spring IoCDI

1. 引言&#xff1a;为什么需要IoC和DI&#xff1f; 传统开发方式的耦合性问题 在传统开发中&#xff0c;对象通常通过 new 关键字直接创建&#xff0c;例如&#xff1a; // 直接依赖具体实现类 UserService userService new UserServiceImpl(); OrderService orderService…...

NO.78十六届蓝桥杯备战|数据结构-并查集|双亲表示法|初始化|查询|合并|判断|亲戚|Lake Counting|程序自动分析(C++)

双亲表⽰法 接下来要学习到的并查集&#xff0c;本质上就是⽤双亲表⽰法实现的森林。因此&#xff0c;我们先认识⼀下双亲表⽰法。 在学习树这个数据结构的时&#xff0c;讲到树的存储⽅式有很多种&#xff1a;孩⼦表⽰法&#xff0c;双亲表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表…...

20250407-组件v-model

基本用法 v-model 可以在组件上使用以实现双向绑定。 首先看下 v-model 在原生元素上的用法&#xff1a; <input v-model"searchText" /> 在代码背后&#xff0c;模板编译器会对 v-model 进行更冗长的等价展开。因此上面的代码其实等价于下面这段&#xff…...

oracle 存储体系结构

oracle 存储体系结构 参考&#xff1a; Logical Storage Structures (oracle.com)...

晋城市电子健康证上传照片尺寸要求及手机拍照制作方法

晋城市餐饮从业人员健康证电子照片上传有着明确的技术规范。根据"晋城市从业人员电子健康证明服务平台"要求&#xff0c;照片尺寸应为358像素&#xff08;宽&#xff09;441像素&#xff08;高&#xff09;&#xff0c;这一比例符合标准证件照的规格。照片底色可选择…...

STL c++ list——模拟实现

结点类的模拟实现 list是一个带头双向循环链表 因需要实现一个节点类&#xff0c;其中包含哨兵位&#xff08;用来标识位置&#xff09;&#xff0c;节点信息&#xff08;val数据&#xff0c;prev后指针&#xff0c;next后指针&#xff09; template<class T> struct …...

【ES系列】Elasticsearch从入门到精通保姆级教程 | 启篇

🔥 本系列将带你从零开始学习Elasticsearch,通过保姆级教程,手把手教你掌握这个强大的搜索与分析引擎。无论你是完全的新手,还是想系统学习ES的开发者,这个系列都能满足你的需求。 📚博主匠心之作,强推专栏: JAVA集合专栏 【夜话集】JVM知识专栏数据库sql理论与实战【…...

图解Java运行机制-JVM、JRE、JDK区别

以下是Java运行机制及JVM、JRE、JDK区别的图解与说明&#xff1a; --- ### 一、Java程序运行机制 1. **编写与编译** Java源文件&#xff08;.java&#xff09;通过**JDK中的编译器&#xff08;javac&#xff09;**编译为字节码文件&#xff08;.class&#xff09;&#xff…...

UML类图综合实验三补档

1.使用简单工厂模式模拟女娲(Nvwa)造人(Person)&#xff0c;如果传入参数“M”&#xff0c;则返回一个Man对象&#xff0c;如果传入参数“W”&#xff0c;则返回一个Woman对象&#xff0c;用Java语言实现该场景。现需要增加一个新的Robot类&#xff0c;如果传入参数“R”&#…...

OpenHarmony子系统开发 - DFX(八)

OpenHarmony子系统开发 - DFX&#xff08;八&#xff09; 八、Faultlogger开发指导 概述 功能简介 Faultlogger是OpenHarmony为开发者提供的一个维测日志框架&#xff0c;能够为应用、元能力、系统服务进程崩溃故障提供统一检测、日志采集、日志存储、日志上报功能&#xf…...

C# virtual 和 abstract 详解

简介 在 C# 中&#xff0c;virtual 和 abstract 关键字都用于面向对象编程中的继承和多态&#xff0c;它们主要用于方法、属性和事件的定义&#xff0c;但在用法上存在一些重要的区别。 virtual 关键字 virtual 表示可重写的方法&#xff0c;但可以提供默认实现&#xff0c;…...

红宝书第三十二讲:零基础学会模块打包器:Webpack、Parcel、Rollup

红宝书第三十二讲&#xff1a;零基础学会模块打包器&#xff1a;Webpack、Parcel、Rollup 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、模块打包器是什么&#xff1f; 把分散的HTML/CSS/JS文件 组合成浏览…...

DeepSeek 在金融领域的应用解决方案

DeepSeek 在金融领域的应用解决方案 一、背景 随着人工智能技术的快速发展&#xff0c;DeepSeek 作为一款国产大模型&#xff0c;凭借其强大的语义理解、逻辑推理和多模态处理能力&#xff0c;在金融行业迅速崭露头角。金融行业作为经济的核心&#xff0c;面临着激烈的市场竞…...

linux 处理2个文件的差集

命令 grep -Fvxf 文件1 文件2 -F 将模式视为固定字符串&#xff0c;而非正则表达式。 -v 反向匹配&#xff0c;输出不匹配的行。 -x 精确匹配整行&#xff0c;避免部分匹配。 -f 文件1 从文件1中读取模式。 示例 执行命令 grep -Fvxf a1.txt a2.txt...

vue3中pinia基本使用

一、安装以及引入 安装&#xff1a;npm install piniamain.js文件&#xff1a; import { createApp } from "vue"; import { createPinia } from "pinia"; import App from "./App.vue";const pinia createPinia() const app createApp(App)…...

“乐企“平台如何重构业财税票全流程生态?

2025年&#xff0c;国家税务总局持续推进的"便民办税春风行动"再次推进数字化服务升级&#xff0c;其中"乐企"平台作为税务信息化的重要载体&#xff0c;持续优化数电票服务能力&#xff0c;为企业提供更高效、更规范的税务管理支持。在这一背景下&#xf…...

JVM内存模型

JVM内存模型 JVM&#xff08;Java Virtual Machine&#xff09;内存模型是 Java 程序在运行时&#xff0c;JVM 为其分配的内存结构&#xff0c;它定义了 Java 程序如何在内存中存储数据和如何进行线程之间的通信。JVM 内存模型是为了支持高效的多线程执行和垃圾回收机制。 一…...

LeetCode热题100记录-【二分查找】

二分查找 35.搜索插入位置 思考&#xff1a;二分查找先判定边界条件 记录&#xff1a;不需要二刷 class Solution {public int searchInsert(int[] nums, int target) {int left 0,right nums.length-1;if(nums[right] < target){return right1;}if(nums[left] > tar…...

科普:原始数据是特征向量么?

一、输入向量 x \mathbf{x} x是特征向量 机器学习算法公式中的输入向量 x \mathbf{x} x通常要求是特征向量。原因如下&#xff1a; 从算法原理角度&#xff1a;机器学习算法旨在通过对输入数据的学习来建立模型&#xff0c;以实现对未知数据的预测或分类等任务。特征向量是对…...

echarts地图添加涟漪波纹点位

1.完整代码 chartsOption: {tooltip: {trigger: "item",formatter: this.initTooltip,triggerOn: "mousemove",borderColor: "#fff",backgroundColor: "rgba(216, 227, 244, 1)",extraCssText: "border-radius: 14px;", //…...

Linux(十三)fork + exec进程创建

一、进程创建 在了解进程创建的步骤前&#xff0c;让我们先通过实例观察一下。大家可以跟小编一起&#xff0c;在终端中执行3次ps -f命令&#xff0c;观察一下。 通过上图&#xff0c;我们可以发现&#xff0c;3次ps -f的父进程&#xff08;PPID&#xff09;都是一样的&#xf…...

集合计算高级函数

说明 过滤 遍历一个集合并从中获取满足指定条件的元素组成一个新的集合转化/映射&#xff08;map&#xff09;将集合中的每一个元素映射到某一个函数扁平化 扁平化映射 注&#xff1a;flatMap 相当于先进行 map 操作&#xff0c;在进行 flatten 操作集合中的每个元素的子元素映…...

鼎讯信通 便携式雷达信号干扰模拟器:打造实战化电磁环境的新利器

在现代战争中&#xff0c;电磁环境的复杂性直接影响着雷达装备的性能和作战效果。面对敌方日益精进的电子战手段&#xff0c;如何提升雷达设备的抗干扰能力&#xff0c;确保其在实战环境中的稳定性和可靠性&#xff0c;已成为各国军队和科研机构的重要课题。 为此&#xff0c;…...

避开养生误区,拥抱健康生活

在追求健康的道路上&#xff0c;我们常常会陷入一些养生误区&#xff0c;不仅无法达到预期效果&#xff0c;还可能损害身体健康。只有拨云见日&#xff0c;认清这些误区&#xff0c;采取正确的养生方式&#xff0c;才能真正拥抱健康生活。​ 很多人认为&#xff0c;保健品吃得…...

解码ChatBI技术形态:独立对话框、插件式与IM集成模式的技术优劣

ChatBI的形态之争 随着大语言模型&#xff08;LLM&#xff09;技术的成熟&#xff0c;**对话式商业智能&#xff08;ChatBI&#xff09;**正成为企业数据分析的新范式。然而&#xff0c;不同的技术形态直接影响ChatBI的落地效果——独立对话框、插件式助手、IM集成机器人&…...

rockylinux 8 9 升级到指定版本

rockylinux 8 update 指定版本 rockylinux 历史版 所有版本rockylinux 最新版 所有版本vault历史版 pub最新版(https://dl.rockylinux.org)地址后面增加不同名称 echo "delete repos" rm -rf /etc/yum.repos.d/*echo "new rockylinux repo" cat <<EO…...

一文详解OpenCV环境搭建:Ubuntu20.4使用CLion配置OpenCV开发环境

在计算机视觉和图像处理领域&#xff0c;OpenCV 是一个不可或缺的工具。其为开发者提供了一系列广泛的算法和实用工具&#xff0c;支持多种编程语言&#xff0c;并且可以在多个平台上运行。对于希望在其项目中集成先进视觉功能的开发者来说&#xff0c;掌握如何配置和使用OpenC…...

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四)

Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;四&#xff09; 对 Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;三&#xff09;-CSDN博客 进行完善&#xff0c;注意完善 …...

01-JVM 内存模型与 GC 原理

JVM 内存模型与 GC 原理解析 本文将从 JVM 内存模型入手&#xff0c;深入剖析各个区域的作用、GC 的运行机制与常见算法&#xff0c;并结合源码与面试思维&#xff0c;带你掌握 JVM 的底层世界。 一、JVM 内存模型&#xff08;Java Memory Model&#xff09; JVM 将内存划分为…...

Docker--Docker镜像制作的注意事项

Docker 镜像制作 dockerfiles的指令讲解 链接 CMD和ENTRYPOINT CMD 和 ENTRYPOINT 是 Dockerfile 中用于指定容器启动时运行命令的两个指令。它们在功能上有一些相似之处&#xff0c;但也存在重要区别。 在编辑Dockerfile时&#xff0c;ENTRYPOINT或者CMD命令会自动覆盖之前…...

AI:支持向量机(SVM)

支持向量机(SVM)理论基础详解:从零开始的完全指南 一、SVM的核心思想:直观理解 1.1 什么是分类问题? 想象你在玩一个游戏:桌上有红色和蓝色的球,你需要画一条线把它们分开。这条线就是分类边界。SVM的目标是找到一条最优分界线,使得这条线到最近的红色球和蓝色球的距…...

Vue.js 中 v-if 的使用及其原理

在 Vue.js 的开发过程中&#xff0c;条件渲染是一项极为常见的需求。v-if指令作为 Vue.js 实现条件渲染的关键手段&#xff0c;能够根据表达式的真假来决定是否渲染某一块 DOM 元素。它在优化页面展示逻辑、提升用户体验等方面发挥着重要作用。接下来&#xff0c;我们就深入探讨…...

Vue.js 中 v-show 的使用及其原理

在 Vue.js 的开发过程中&#xff0c;我们常常需要根据不同的条件来控制页面元素的显示与隐藏。v-show指令作为 Vue.js 提供的重要工具之一&#xff0c;为我们实现这一功能提供了便捷的途径。它与v-if指令有些相似&#xff0c;但在使用方法和原理上存在着明显的区别。接下来&…...