一、引言

在嵌入式开发领域,随着项目规模的不断扩大和代码复杂度的日益增加,如何高效地管理代码、快速发现并修复问题,以及确保软件的稳定交付,成为了开发团队面临的重要挑战。持续集成 / 持续交付(CI/CD)流水线应运而生,它通过自动化的流程,将代码的集成、测试、部署等环节紧密连接,大大提高了开发效率,降低了人为错误,为嵌入式项目的成功实施提供了有力保障。

Jenkins 作为一款广泛使用的开源自动化服务器,具有强大的插件生态系统,能够方便地实现各种自动化任务。而 GitLab 则是一个集代码托管、版本控制、团队协作于一体的平台,其丰富的功能和友好的界面深受开发者喜爱。本文将详细介绍如何利用 Jenkins 和 GitLab 搭建嵌入式 CI/CD 流水线,实现代码的自动构建,帮助开发团队提升开发效率和软件质量。

二、认识嵌入式 CI/CD

嵌入式 CI/CD 是持续集成(Continuous Integration)和持续交付 / 持续部署(Continuous Delivery/Continuous Deployment)在嵌入式开发领域的应用 。它通过一系列自动化流程,实现代码从开发到部署的高效流转,确保软件的质量和稳定性。

(一)持续集成(CI)

在嵌入式开发中,持续集成意味着开发人员频繁地将自己的代码更改合并到共享的代码仓库(如 GitLab)中。每次代码合并后,CI 系统(如 Jenkins)会自动触发构建和测试过程。通过自动化构建,能够及时发现代码中的语法错误、依赖问题等;而自动化测试则可以验证代码的功能正确性,包括单元测试、集成测试等。例如,在一个基于 ARM 架构的嵌入式项目中,开发人员每次提交代码后,Jenkins 会自动调用交叉编译工具,将代码编译成适合目标硬件的可执行文件,并运行预先编写好的单元测试用例,检查各个函数和模块的功能是否正常。这样可以快速发现代码中的问题,避免问题在后续的开发过程中积累,降低修复成本。

(二)持续交付(CD)

持续交付是在持续集成的基础上,将经过测试的代码进一步部署到类生产环境(如测试服务器、预发布环境等),进行更全面的测试,包括系统测试、性能测试、兼容性测试等。在嵌入式领域,这可能涉及到将构建好的固件或软件镜像部署到模拟的目标硬件环境中,进行实际运行测试。如果所有测试都通过,代码就可以随时手动部署到生产环境。例如,对于一款智能家电的嵌入式软件,在持续交付阶段,会将软件部署到与实际产品硬件配置相同的测试设备上,进行长时间的稳定性测试、功能验证以及与其他设备的兼容性测试,确保软件在各种实际场景下都能稳定运行,然后再由人工决定是否将其部署到正式的生产设备中。

(三)持续部署

持续部署则是持续交付的更进一步,它实现了代码从测试到生产环境的全自动部署。一旦代码通过了所有的测试阶段,就会自动被部署到生产环境中,无需人工干预。这在一些对软件更新及时性要求较高的嵌入式场景中非常有用,比如智能穿戴设备的软件更新。当新的软件版本通过测试后,会自动推送到用户的设备上,实现快速的功能迭代和问题修复。

(四)嵌入式 CI/CD 的作用和价值

  1. 提高开发效率:自动化的构建和测试过程大大减少了人工干预,节省了开发人员手动编译、测试的时间,使他们能够更专注于代码的编写和功能的实现。同时,频繁的集成和快速的反馈机制有助于及时发现和解决问题,避免了长时间的调试和返工,加快了项目的开发进度。
  1. 提升软件质量:通过自动化测试,包括单元测试、集成测试、系统测试等,可以全面覆盖软件的各个功能点和接口,及时发现潜在的缺陷和漏洞。持续集成和持续交付 / 部署的流程确保了软件在每次代码变更后都能得到充分的验证,保证了软件的稳定性和可靠性。
  1. 增强团队协作:CI/CD 流程要求开发人员频繁地将代码合并到共享仓库,促进了代码的共享和交流。团队成员可以及时了解彼此的工作进展,发现并解决代码冲突,提高了团队的协作效率。同时,自动化的流程也使得不同角色(开发、测试、运维)之间的沟通更加顺畅,减少了因沟通不畅导致的问题。
  1. 便于版本管理和追溯:GitLab 等代码管理平台与 CI/CD 系统的结合,使得代码的版本管理更加规范和便捷。开发人员可以清晰地查看每次代码变更的历史记录、作者、时间等信息,方便对问题进行追溯和定位。在出现问题时,可以快速回滚到之前的稳定版本,降低风险。

三、准备工作

(一)环境要求

  1. 硬件环境:建议使用至少具有 2 核 CPU、4GB 内存和 50GB 可用磁盘空间的服务器,以确保 Jenkins 和 GitLab 在运行过程中能够有足够的资源支持,避免因资源不足导致构建和代码管理任务出现卡顿或失败的情况。
  1. 软件环境:操作系统可选择 Linux(如 CentOS 7+、Ubuntu 18.04 + 等),这些操作系统具有良好的稳定性和开源生态,便于安装和配置各种开发工具。同时,需要安装 Java 环境,因为 Jenkins 是基于 Java 开发的,建议安装 Java Development Kit (JDK) 11 及以上版本,以保证 Jenkins 的正常运行和获取最新的功能支持 。此外,还需要安装 Git,用于代码的版本控制和管理,确保能够与 GitLab 进行交互,获取和提交代码。

(二)工具安装

  1. Jenkins 安装
    • 下载安装包:访问 Jenkins 官方网站(https://www.jenkins.io/zh/download/ ),根据服务器的操作系统选择合适的安装包。例如,在 Linux 系统中,可以下载.war包或者使用包管理器进行安装。如果是使用.war包安装,下载完成后,将其放置在合适的目录下,如/opt/jenkins。
    • 启动 Jenkins:通过命令java -jar jenkins.war --httpPort=8080来启动 Jenkins 服务(假设使用 8080 端口,可根据实际情况修改)。如果使用包管理器安装,如在 Ubuntu 系统中使用sudo apt - get install jenkins安装后,可以使用sudo systemctl start jenkins命令启动服务。
    • 初始化配置:启动成功后,打开浏览器,访问http://服务器IP:8080(如果修改了端口,替换为实际端口)。首次访问时,需要输入初始管理员密码,密码路径一般为/var/lib/jenkins/secrets/initialAdminPassword(根据安装方式和系统不同可能有所差异)。然后按照向导提示进行插件安装和用户设置,可以选择安装推荐的插件,也可以根据实际需求自定义选择安装,如 Git 插件用于与 GitLab 集成,Maven 插件用于项目构建等。
  1. GitLab 安装
    • 安装依赖:在安装 GitLab 之前,需要确保服务器已经安装了必要的依赖包。以 CentOS 系统为例,可以使用以下命令安装依赖:sudo yum install -y curl policycoreutils-python openssh-server cronie。这些依赖包分别用于支持网络请求(curl)、安全策略(policycoreutils - python)、SSH 服务(openssh - server)和定时任务(cronie),是 GitLab 正常运行的基础。
    • 下载安装包:前往 GitLab 官方网站(https://about.gitlab.com/installation/ ),根据服务器的操作系统和版本选择对应的安装包下载。例如,对于 CentOS 7 系统,可以下载gitlab - ce - 最新版本.el7.x86_64.rpm包。
    • 安装 GitLab:下载完成后,使用命令sudo rpm - ivh gitlab - ce - 最新版本.el7.x86_64.rpm进行安装。安装过程中,系统会自动配置相关服务和文件。
    • 配置 GitLab:安装完成后,需要对 GitLab 进行一些基本配置。编辑 GitLab 的配置文件/etc/gitlab/gitlab.rb,可以设置外部 URL(external_url 'http://服务器IP'),如果需要使用邮件服务进行通知,还需要配置邮件相关参数,如 SMTP 服务器地址、端口、用户名和密码等。配置完成后,执行命令sudo gitlab - ctl reconfigure使配置生效。
    • 启动 GitLab:使用命令sudo gitlab - ctl start启动 GitLab 服务,启动成功后,可以通过浏览器访问http://服务器IP,首次访问需要设置 root 用户的密码,设置完成后即可登录使用 GitLab。

四、Jenkins 与 GitLab 基础配置

(一)Jenkins 配置

  1. 系统设置:登录 Jenkins 后,点击左侧菜单栏的 “系统管理”,再选择 “系统设置”。在 “Jenkins Location” 部分,设置 “Jenkins URL” 为服务器的实际访问地址,如http://你的服务器IP:8080,这将用于在构建结果通知、邮件等场景中正确引用 Jenkins 的链接。同时,设置 “系统管理员邮件地址”,以便在构建出现问题时能够及时接收通知邮件,确保管理员可以第一时间了解构建状态 。
  1. 插件安装:在 “系统管理” 中选择 “插件管理”,进入插件管理页面后,切换到 “可选插件” 标签页。在搜索框中输入 “GitLab Plugin”,找到该插件后勾选并点击 “直接安装” 按钮,等待插件安装完成。安装完成后,在 “已安装” 标签页中可以看到 GitLab 插件,表示安装成功。该插件用于实现 Jenkins 与 GitLab 的集成,使得 GitLab 的代码变更能够触发 Jenkins 的构建任务,并将构建状态反馈回 GitLab。
  1. 全局工具配置:在 “系统管理” 中选择 “全局工具配置”,配置与项目构建相关的工具。例如,如果项目使用 Maven 进行构建,需要在 “Maven” 部分点击 “新增 Maven”,设置 Maven 的名称(如 “Maven 3.8.6”),并指定 Maven 的安装目录(如果是自动安装,可选择自动下载并安装指定版本)。对于 Git,同样在 “Git” 部分配置 Git 的路径(如果已经安装在系统默认路径,一般无需额外配置),确保 Jenkins 能够调用 Git 命令进行代码的拉取和管理 。

(二)GitLab 配置

  1. 项目创建:登录 GitLab 后,点击页面左上角的 “+” 按钮,选择 “新建项目”。在新建项目页面,输入项目名称(如 “embedded_project”)、项目描述(简要介绍项目的功能、用途等),并选择项目的可见性级别。“Private” 表示项目私有,只有被邀请的成员可以访问;“Internal” 表示内部可见,登录 GitLab 的用户都可以访问;“Public” 表示公开可见,任何人都可以访问项目。一般在嵌入式开发项目中,为了保证代码安全,会选择 “Private” 或 “Internal”。如果需要,可以勾选 “使用 README 文件初始化项目”,这将在项目仓库中生成一个 README 文件,方便记录项目的基本信息和使用说明 。
  1. 仓库设置:项目创建完成后,进入项目页面。点击左侧菜单栏的 “设置”,再选择 “仓库”,可以对仓库进行一些基本设置。例如,在 “仓库” 设置中,可以添加项目的标签,方便对项目进行分类和搜索;还可以设置仓库的默认分支,一般选择 “master” 或 “main” 作为默认分支。此外,如果项目有多个开发人员协作,可以在 “成员” 设置中添加成员,并为他们分配不同的权限,如 “开发者” 可以进行代码提交、合并请求等操作,“访客” 则只能查看项目代码和基本信息 。

五、构建流水线

(一)连接 Jenkins 与 GitLab

在 Jenkins 中,点击左侧菜单栏的 “凭据”,进入凭据管理页面。点击 “全局凭据” 下的 “添加凭据”,在弹出的对话框中,“种类” 选择 “GitLab API Token”,“范围” 选择 “全局”。在 “API Token” 字段中输入在 GitLab 中生成的访问令牌(在 GitLab 用户设置的 “Access Tokens” 中生成),“ID” 和 “描述” 可以自定义填写,方便识别,例如 “gitlab - token” 和 “用于连接 GitLab 的令牌” ,点击 “确定” 完成凭据添加。

完成凭据添加后,在 Jenkins 的 “系统管理” 中选择 “系统设置”,找到 “GitLab” 部分。在 “GitLab host URL” 中填写 GitLab 的访问地址,如http://你的服务器IP,在 “Credentials” 中选择刚刚添加的 GitLab 凭据,点击 “Test Connection” 按钮进行连接测试。如果显示 “Success”,则表示 Jenkins 与 GitLab 连接成功,这样 Jenkins 就可以通过该凭据访问 GitLab 上的项目代码,为后续的构建任务做好准备 。

(二)配置构建任务

1. 新建任务

登录 Jenkins 后,点击左侧菜单栏的 “新建 Item”。在弹出的 “输入项目名称” 对话框中,输入任务名称,如 “embedded_project_build”,然后选择 “Freestyle project”(适用于简单的构建场景,通过配置不同的构建步骤来完成任务)或 “Pipeline”(适用于复杂的流水线场景,通过编写代码化的流水线脚本来定义构建流程,具有更好的灵活性和可扩展性)。这里以 Freestyle project 为例,点击 “确定” 进入项目配置页面 。

2. 配置源码管理

在项目配置页面的 “源码管理” 部分,选择 “Git”。在 “Repository URL” 中填写 GitLab 上项目的仓库地址,例如git@你的服务器IP:用户名/embedded_project.git(如果使用 SSH 连接)或http://你的服务器IP/用户名/embedded_project.git(如果使用 HTTP 连接) 。如果项目仓库需要认证,在 “Credentials” 中选择之前配置好的 Git 凭据。在 “Branches to build” 中指定要构建的分支,例如*/master表示构建 master 分支,*/development表示构建 development 分支,如果需要构建多个分支,可以使用逗号分隔,如*/master, */development 。

3. 配置构建触发器

在项目配置页面找到 “构建触发器” 部分,勾选 “触发远程构建”,这里会生成一个 URL,如http://你的Jenkins服务器IP:8080/job/embedded_project_build/build?token=自定义令牌,其中自定义令牌是用于验证触发请求的安全标识,需要记录下来,后续在 GitLab 中配置 Webhook 时会用到 。

接下来,在 GitLab 中配置 Webhook 以实现代码推送时自动触发构建。进入 GitLab 上的项目页面,点击左侧菜单栏的 “设置”,再选择 “Webhook”。在 “Webhook URL” 中填写刚刚在 Jenkins 中生成的触发远程构建的 URL,在 “Secret Token” 中填写 Jenkins 中设置的自定义令牌,然后勾选 “Push events”(当有代码推送事件时触发)等需要的触发事件,点击 “Add webhook” 添加 Webhook 。添加完成后,可以点击 “Test” 按钮测试 Webhook 是否配置成功,如果能够成功触发 Jenkins 的构建任务,说明配置正确,这样每次在 GitLab 上有代码推送时,就会自动触发 Jenkins 的构建任务 。

4. 编写构建脚本

构建脚本是构建任务的核心部分,用于将源代码编译成可执行文件或固件。对于嵌入式项目,构建脚本通常需要调用交叉编译工具链,将代码编译成适合目标硬件的格式。以下是一个基于 Makefile 的构建脚本示例,假设项目使用 GCC 交叉编译器:


# 定义交叉编译工具前缀

CROSS_COMPILE = arm-none-eabi-

# 定义编译器

CC = $(CROSS_COMPILE)gcc

# 定义链接器

LD = $(CROSS_COMPILE)ld

# 定义目标文件

TARGET = main.elf

# 定义源文件目录

SRC_DIR = src

# 定义源文件

SRCS = $(wildcard $(SRC_DIR)/*.c)

# 定义目标文件列表

OBJS = $(SRCS:.c=.o)

# 编译规则

%.o: %.c

$(CC) -c $< -o $@

# 链接规则

$(TARGET): $(OBJS)

$(LD) -T linker_script.ld -o $(TARGET) $(OBJS)

# 清理规则

clean:

rm -f $(OBJS) $(TARGET)

在这个示例中,首先定义了交叉编译工具前缀、编译器、链接器等变量。然后通过wildcard函数获取源文件目录下的所有.c文件,并将其转换为对应的目标文件列表。编译规则中,使用$(CC) -c $< -o $@命令将每个源文件编译成目标文件。链接规则中,使用$(LD) -T linker_script.ld -o $(TARGET) $(OBJS)命令将所有目标文件链接成最终的可执行文件main.elf 。清理规则用于删除编译生成的目标文件和可执行文件 。

在 Jenkins 的构建任务配置中,将构建脚本添加到 “构建步骤” 中。如果使用 Shell 脚本执行构建,可以选择 “Execute shell”(在 Linux 系统中)或 “Execute Windows batch command”(在 Windows 系统中),然后在文本框中输入执行构建脚本的命令,例如make(假设 Makefile 在项目根目录下) 。这样,当 Jenkins 触发构建任务时,就会执行构建脚本,完成代码的编译和构建过程 。

六、部署与测试

(一)部署流程

  1. 选择部署方式:根据嵌入式项目的特点和需求,可以选择多种部署方式。对于一些资源受限的嵌入式设备,可能采用串口、USB 等物理连接方式进行部署,将构建好的固件通过特定的烧录工具写入设备的存储介质中。例如,在开发基于 STM32 微控制器的嵌入式系统时,常常使用 ST - Link 工具通过 SWD 接口将编译生成的二进制文件烧录到芯片中 。而对于一些具备网络功能的嵌入式设备,可以通过网络进行部署,如使用 TFTP(Trivial File Transfer Protocol)、FTP(File Transfer Protocol)等协议将构建产物传输到设备指定的目录。比如,在开发智能路由器的嵌入式软件时,可以通过 TFTP 服务器将新的固件版本下载到路由器中进行更新。
  1. 配置部署环境:在部署之前,需要对目标设备或测试环境进行相应的配置。这可能包括设置设备的网络参数(如 IP 地址、子网掩码、网关等),确保设备能够与部署服务器进行通信。如果是通过网络部署,还需要在部署服务器上配置好相应的服务,如 TFTP 服务器的根目录设置、FTP 服务器的用户权限等。同时,对于一些需要特定运行环境的嵌入式软件,还需要在目标设备上安装和配置相关的依赖库和运行时环境 。例如,在部署一个基于 Linux 的嵌入式应用时,可能需要确保目标设备上已经安装了所需的动态链接库,如libc、libstdc++等,并且环境变量配置正确,以保证应用能够正常运行。
  1. 执行部署操作:在 Jenkins 的构建任务配置中,添加部署步骤。如果是通过串口烧录,可以使用相关的烧录工具命令,如stm32flash -w 固件文件.bin /dev/ttyUSB0(假设使用stm32flash工具,设备连接在/dev/ttyUSB0串口上)。如果是通过网络部署,以 TFTP 为例,可以使用命令tftp -p 目标设备IP -c put 固件文件.bin将固件文件传输到目标设备。在执行部署操作后,需要对部署结果进行检查,确保构建产物已经成功部署到目标设备或测试环境中。可以通过查看设备的日志文件、运行一些简单的测试命令或者观察设备的运行状态来验证部署是否成功 。例如,在部署完成后,可以在目标设备上运行ls -l命令查看文件是否存在,或者通过设备的 LED 指示灯状态、网络连接状态等判断设备是否正常启动并加载了新的软件版本。

(二)测试环节

  1. 单元测试配置与执行:单元测试是对软件中的最小可测试单元(如函数、类的方法等)进行测试,以验证其功能的正确性。在嵌入式项目中,常用的单元测试框架有 Google Test、Unity 等。以 Google Test 为例,首先需要在项目中引入 Google Test 库,将其添加到项目的依赖中。然后编写单元测试用例,例如,对于一个计算两个整数之和的函数int add(int a, int b),可以编写如下测试用例:

#include <gtest/gtest.h>

int add(int a, int b) {

return a + b;

}

TEST(AdditionTest, AddTwoNumbers) {

EXPECT_EQ(add(2, 3), 5);

}

int main(int argc, char **argv) {

::testing::InitGoogleTest(&argc, argv);

return RUN_ALL_TESTS();

}

在 Jenkins 的构建任务中,添加执行单元测试的步骤。如果项目使用 Makefile 管理,可以在 Makefile 中添加测试目标,如test:,并在其中调用测试执行命令,例如$(CXX) -o test test.cpp $(GTEST_LIBS)(假设使用 C++ 编译器$(CXX),测试源文件为test.cpp,链接 Google Test 库$(GTEST_LIBS)) 。然后在 Jenkins 的构建步骤中执行make test命令,Jenkins 会自动运行单元测试,并将测试结果输出到控制台。通过查看测试结果,可以了解各个单元的功能是否正常,及时发现代码中的逻辑错误。

2. 集成测试配置与执行:集成测试是将多个单元组合在一起,测试它们之间的协作和接口是否正常。在嵌入式开发中,集成测试可以验证不同模块之间的数据交互、通信协议的正确性等。例如,在一个包含传感器模块和数据处理模块的嵌入式系统中,集成测试可以验证传感器模块采集的数据是否能够正确地传输到数据处理模块,并得到正确的处理结果。可以使用一些模拟工具来模拟传感器的数据输出,以便在测试环境中进行集成测试。例如,使用Mockito等模拟框架来创建模拟对象,模拟传感器的行为 。在 Jenkins 的构建任务中,添加集成测试的执行步骤。这可能涉及到启动多个相关的模块或服务,然后运行集成测试脚本。例如,先启动模拟传感器服务,再启动数据处理模块,然后执行集成测试脚本,脚本中使用相关的测试工具和断言来验证两个模块之间的交互是否正确。通过集成测试,可以发现模块之间的集成问题,确保整个系统的功能完整性 。

七、常见问题及解决

(一)连接失败问题

  1. Jenkins 与 GitLab 连接失败:可能是由于访问令牌错误、网络问题或 GitLab 服务器配置问题导致。首先,检查在 Jenkins 中配置的 GitLab 凭据,确保访问令牌正确无误,可以尝试重新生成令牌并在 Jenkins 中更新。其次,检查网络连接,确保 Jenkins 服务器能够正常访问 GitLab 服务器,可以使用ping命令测试网络连通性,如ping 你的GitLab服务器IP 。如果网络正常,检查 GitLab 服务器的配置,如防火墙设置是否允许 Jenkins 服务器的访问,查看 GitLab 的日志文件(一般位于/var/log/gitlab目录下),看是否有相关的错误信息提示 。
  1. 部署时设备连接失败:在部署过程中,如果使用串口连接设备,可能会出现串口设备找不到或连接不稳定的情况。首先,检查设备是否正确连接到服务器的串口,并且串口线是否正常工作,可以尝试更换串口线进行测试。其次,确认串口设备的驱动是否正确安装,在 Linux 系统中,可以查看/dev目录下是否有对应的串口设备文件,如/dev/ttyUSB0 。如果设备文件不存在,可能需要安装相应的驱动程序。如果使用网络部署,检查设备的网络配置是否正确,如 IP 地址是否冲突、网关是否设置正确等,可以在设备上使用ping命令测试与部署服务器的网络连通性,如ping 部署服务器IP 。

(二)构建错误问题

  1. 编译错误:构建过程中出现编译错误是常见问题,可能是由于代码语法错误、依赖库缺失或构建脚本配置错误等原因导致。首先,查看 Jenkins 构建日志,找到具体的编译错误信息,根据错误提示定位代码中的问题。例如,如果是语法错误,根据错误行号修改代码中的语法错误。如果是依赖库缺失,检查项目的依赖配置,确保所有依赖库都已正确安装。对于使用 Maven 管理依赖的项目,可以在项目的pom.xml文件中检查依赖配置,并使用mvn dependency:tree命令查看依赖树,确认依赖是否正确引入 。如果是构建脚本配置错误,仔细检查构建脚本中的命令和参数是否正确,如 Makefile 中的变量定义、命令执行顺序等 。
  1. 测试失败:单元测试或集成测试失败可能是由于测试用例编写错误、测试环境配置问题或代码逻辑错误等原因导致。对于单元测试失败,检查测试用例的断言是否正确,是否覆盖了所有可能的情况。可以使用调试工具逐步执行测试用例,查看变量的值和程序执行流程,找出问题所在。如果是集成测试失败,检查测试环境的配置是否与实际运行环境一致,如数据库连接配置、网络服务地址等。可以使用模拟工具来隔离外部依赖,简化测试环境,便于定位问题。同时,也要检查代码逻辑是否正确,确保各个模块之间的协作符合预期 。

八、总结与展望

通过以上步骤,我们成功地利用 Jenkins 和 GitLab 搭建了嵌入式 CI/CD 流水线,实现了代码的自动构建、部署与测试。这一过程不仅提高了开发效率,减少了人为错误,还增强了软件质量和团队协作能力 。在实际应用中,团队成员能够更加专注于代码的开发和优化,而不必花费大量时间在繁琐的构建、测试和部署任务上,大大加快了项目的迭代速度 。

展望未来,我们可以进一步优化流水线。例如,引入更高级的测试策略,如静态代码分析、动态代码扫描等,以更全面地检测代码中的潜在问题,提升软件的安全性和稳定性。同时,可以探索将流水线与容器技术(如 Docker、Kubernetes)相结合,实现更高效的部署和资源管理,进一步提升嵌入式项目的开发和交付效率,以适应不断变化的市场需求和技术发展趋势 。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐