0%

一、先更新系统
yum update -y
二、安装 Docker

Alibaba Cloud Linux 3 推荐安装 **Docker Engine 官方版本。

先安装依赖:

yum install -y yum-utils device-mapper-persistent-data lvm2

添加 Docker 官方仓库:

yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo
三、安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io

安装完成后查看版本:

docker -v

如果看到类似:

Docker version 24.x

说明安装成功。

四、启动 Docker

启动服务:

systemctl start docker

设置开机自启动:

systemctl enable docker

查看状态:

systemctl status docker

看到:

active (running)

说明正常。

五、测试 Docker

运行测试容器:

docker run hello-world

如果看到:

Hello from Docker!

说明 Docker 已经正常运行。

六、查看 Docker 信息

查看容器:

docker ps

查看镜像:

docker images
七、测试运行一个 Web 服务

运行 **Nginx 容器:

docker run -d -p 80:80 nginx

解释:

-d 后台运行
-p 端口映射
80:80 服务器80 → 容器80

浏览器访问:

http://你的服务器IP

如果看到 Nginx 欢迎页,说明 Docker 完全正常。

八(强烈推荐):安装 Docker 可视化

安装 Portainer

docker run -d
-p 9000:9000
–name portainer
-v /var/run/docker.sock:/var/run/docker.sock
portainer/portainer-ce

浏览器访问:

http://服务器IP:9000

就能用 图形界面管理 Docker。

九、阿里云服务器注意

如果访问不到 nginx 页面,需要:

打开安全组端口:

80
9000

在 **Alibaba Cloud 控制台 → 安全组 → 放行端口。

十、总结

你的服务器现在下一步只需要执行:

yum update
yum install docker-ce
systemctl start docker
docker run hello-world

就能跑 Docker。

一、Portainer 界面概览

登录后,你会看到几个核心区域:

1️⃣ Dashboard(仪表盘)

显示当前 Docker 状态

正在运行的容器数量、镜像数量、网络、卷等

2️⃣ Containers(容器)

管理所有容器

启动 / 停止 / 删除 / 查看日志

3️⃣ Images(镜像)

管理 Docker 镜像

拉取镜像、删除镜像、查看标签

4️⃣ Volumes(卷)

管理数据卷

备份、挂载到容器

5️⃣ Networks(网络)

管理容器网络

自定义桥接网络或 overlay 网络

6️⃣ Stacks(堆栈)

支持 Docker Compose 文件

一键部署多容器应用

7️⃣ Settings(设置)

管理 Portainer 本身、用户账号、访问权限

二、常用操作示例
1️⃣ 查看和管理容器

在左侧菜单 Containers:

Start:启动容器

Stop:停止容器

Restart:重启容器

Logs:查看容器输出日志

Console / Exec:进入容器终端

例如,你可以直接进入 nginx 容器执行命令:

docker exec -it 容器ID bash

Portainer 提供图形界面执行同样操作。

2️⃣ 拉取镜像

在左侧菜单 Images → Pull Image:

输入镜像名称,例如 nginx:latest

点击 Pull the image

镜像下载完成后,可以直接在 Containers 新建并启动容器。

3️⃣ 创建新容器

左侧菜单 Containers → Add container:

Container name:自定义名字

Image:填你想用的镜像,比如 nginx:latest

Port mapping:服务器端口 → 容器端口,例如 8080:80

Volumes:挂载宿主机目录到容器,例如 /data:/var/www/html

Environment variables:设置环境变量

点击 Deploy the container

容器就会启动,你可以在 Dashboard 或 Containers 页面看到状态。

4️⃣ 使用 Stacks 部署多容器应用

左侧菜单 Stacks → Add stack

粘贴你的 docker-compose.yml 文件

点击 Deploy the stack

Portainer 会自动创建所有容器、网络、卷,非常适合 前后端应用 + 数据库 一键部署。

5️⃣ 管理卷和数据

Volumes → Add volume:创建数据卷

挂载到容器保证数据不丢失

例如,MySQL 数据库卷:

/var/lib/mysql:/var/lib/mysql

保证容器重启数据依然存在。

三、建议的学习顺序

1️⃣ 先在 Containers 里新建几个简单容器(nginx、redis、mysql)
2️⃣ 学会 查看日志 / 进入容器终端 / 停止/删除容器
3️⃣ 再学习 拉取镜像 / 自定义端口 / 挂载卷
4️⃣ 最后学 Stacks,实现 前后端 + 数据库一键部署

四、日常运维小技巧

监控容器资源:Dashboard 可以看 CPU / 内存占用

定期清理无用镜像:

docker image prune -a

备份数据卷:

docker run –rm -v 卷名:/volume -v /backup:/backup busybox tar czf /backup/卷名.tar.gz -C /volume .

💡 总结:

Portainer 就是 Docker 的图形管理面板:

新手:用它管理容器、镜像、卷

进阶:用 Stacks 部署多容器应用,几乎可以替代命令行

ARM 架构 是家族
├── Cortex-A → 应用处理器(Application) 用来跑操作系统 🍓 Raspberry Pi 手机 平板 车机
├── Cortex-M → 微控制器(Microcontroller) Microcontroller 用来做实时控制 STM32F411 🔹 ESP32(不是 ARM 但同类定位)
└── Cortex-R → 实时高可靠(Real-time)

cpu Central Processing Unit(中央处理器) 就是电脑、手机或嵌入式设备的大脑 典型例子:Intel x86 系列、AMD Ryzen、ARM Cortex-A 系列
mcu Microcontroller Unit(微控制器) “大脑 + 手脚 + 内存 + 小工具箱”的微型智能芯片
soc System on Chip,把 CPU + GPU + NPU + 外设等全部集成在一颗芯片上(手机芯片常用)

树莓派 arduino ESP32 STM32 系列 BeagleBone Jetson Nano / Xavier Micro:bit Teensy
通用计算型开发板(能跑 Linux / Android)
树莓派、BeagleBone、Jetson Nano
MCU 控制型开发板(低功耗、专用任务)
Arduino、ESP32、STM32、Micro:bit、Teensy
AI / GPU 加速型开发板
Jetson 系列、Coral Dev Board

Arm
ARM(授权) → Qualcomm、Apple、Samsung ,手机、平板、嵌入式设备、IoT,Linux/Android/iOS/鸿蒙,低功耗,适合电池供电

x86

Intel、AMD,PC、笔记本、服务器,Windows/Linux/macOS,功耗较高,适合电源充足

linux内核 硬件抽象层 binder ipc android runtime(ART) fragment activity/fragment app

你列的这一串:

Linux内核 → 硬件抽象层 → Binder IPC → ART → Fragment → Activity → App

本质是在问:

👉 Android 整个系统从硬件到 UI 的分层关系到底是怎样的?

我给你按“真实架构顺序”捋清楚一遍,而且结合你现在做的安卓 + 嵌入式项目讲。

一、正确的 Android 分层结构(从下往上)

真正标准结构是:

硬件

Linux Kernel

HAL(硬件抽象层)

Native Framework / System Services

Binder IPC

Android Runtime (ART)

Application Framework

Activity / Fragment

App

我们一层一层讲。

1️⃣ Linux Kernel(内核层)

Android 底层就是 Linux。

负责:

进程管理

内存管理

调度

驱动

Binder 驱动

比如:

摄像头驱动

I2C / SPI

显示驱动

PWM 驱动

Linux 内核是整个系统的“权限中心”。

2️⃣ HAL(Hardware Abstraction Layer)

HAL 作用是:

把“驱动接口”包装成统一接口给 Android Framework 用。

例如:

Camera HAL

Audio HAL

Sensor HAL

比如摄像头:

驱动接口是内核 C 代码
HAL 把它封装成标准接口

Framework 调用 HAL
HAL 再调驱动

HAL 是 C/C++ 写的。

3️⃣ Binder IPC(进程间通信核心)

Android 有大量进程:

system_server

media_server

surfaceflinger

你的 App 进程

它们之间靠什么通信?

👉 Binder

Binder 是:

Linux 内核驱动 + 用户态库

当你调用:

CameraManager.openCamera()

其实通过 Binder 访问的是:

CameraService(在 system_server 里)

Binder 是 Android 架构的“血管系统”。

4️⃣ Android Runtime (ART)

这里是关键。

ART 是:

Java/Kotlin 代码的运行环境

比如:

垃圾回收

类加载

字节码执行

JIT / AOT

以前是 Dalvik
现在是 ART

代表系统:

Android Runtime

ART 运行在:

Linux 用户空间

5️⃣ Application Framework

这里是:

ActivityManager

WindowManager

PackageManager

LocationManager

CameraManager

都是 Java 层服务。

你写的代码大部分用的就是这一层。

6️⃣ Activity / Fragment

这属于:

应用框架层的 UI 组件

例如:

Activity

Fragment

它们本质只是:

Framework 提供的 UI 管理类

7️⃣ App(你写的代码)

你写的:

MVVM

ViewModel

RxJava

MQTT

地图

视频解码

都运行在:

ART 之上
用户空间
独立进程

二、现在我们串起来

比如你点击按钮:

button.setOnClickListener { openCamera() }

完整路径是:

App

Activity

Framework(CameraManager)

Binder IPC

system_server

CameraService

HAL

Linux 驱动

摄像头硬件

三、关键理解
1️⃣ Binder 在哪里?

Binder 位于:

Linux Kernel + 用户空间之间

它是跨进程桥梁。

2️⃣ ART 在哪里?

ART 在:

Linux 用户空间

它不接触硬件。

3️⃣ HAL 在哪里?

HAL 在:

用户空间(native 层)

但它调用:

内核驱动

四、用你无人机项目类比一下

你现在:

Android 做 UI

MQTT

地图

视频解码

这些都在:

App → ART → Framework

真正飞控板:

MCU

RTOS

PWM

IMU

在完全不同系统。

五、你这串的正确顺序应该是:

从下到上:

硬件
Linux Kernel
Binder 驱动
HAL
System Services
Android Runtime (ART)
Application Framework
Activity / Fragment
App
六、一句话理解每层
层 作用
Linux Kernel 控制硬件
HAL 统一驱动接口
Binder 进程间通信
ART 运行 Java 代码
Framework 提供系统服务
Activity UI 管理
App 业务逻辑
七、最重要的一句话

Android App 从来没有碰到过硬件
它只是通过一层一层代理访问

这也是为什么:

👉 你做无人机控制时
Android 只是“上位机”

真正控制硬件的是:

MCU

RTOS

Linux 驱动

一、做底层驱动 → STM32 很典型

👉 关键词:纯控制、稳定、实时性强

🌡 例子1:工业温控器

MCU:STM32F4

功能:

采集温度传感器

控制继电器

PWM 控制加热器

RS485 通讯

它不需要 WiFi,也不跑 Linux。
只需要:

精准 + 稳定 + 实时

所以用 STM32。

🚁 例子2:无人机飞控板

MCU:STM32F7 / H7

功能:

读取 IMU

读取气压计

电机 PWM 输出

实时姿态解算

要求:

1ms级实时控制

不能卡顿

所以用 STM32。

二、做联网传感器 → ESP32 很常见

👉 关键词:自带 WiFi + 成本低

🌡 例子1:WiFi 温湿度传感器

芯片:ESP32

功能:

读取 DHT22

通过 MQTT 上传数据

手机 App 查看

它本质是:

传感器 + WiFi 模块

ESP32 一颗芯片搞定。

🏠 例子2:智能插座

ESP32

功能:

继电器控制

手机远程开关

OTA升级

如果用 STM32:
还得外挂 WiFi 模块。

ESP32 更简单。

三、做边缘 AI → Cortex-A + NPU

👉 关键词:跑 Linux + 神经网络推理

这已经不是 MCU 级别了。

📷 例子1:人脸识别门禁

芯片可能是:

瑞芯微 RK3568

全志 V853

海思

带 NPU 的 ARM SoC

功能:

摄像头采集

跑人脸识别模型

本地推理

显示屏UI

以太网通讯

它运行的是 Linux。

不能用 STM32,因为:

STM32 内存只有几百 KB 到几 MB。
AI 模型动不动几十 MB。

🚗 例子2:车载视觉系统

Cortex-A53 + NPU

跑 YOLO 模型

实时目标检测

这种已经属于:

边缘计算设备

四、给你一个非常直观的对比
类型 类比
STM32 计算器
ESP32 计算器 + WiFi
Cortex-A 小电脑
Cortex-A + NPU 带显卡的小电脑
五、从资源角度看
芯片 RAM 系统
STM32F411 128KB 裸机 / RTOS
ESP32 520KB FreeRTOS
Cortex-A53 512MB~2GB Linux
六、结合你现在的方向

你现在:

写 W25Q 驱动

玩 RTOS

做抽象架构

👉 明显是“控制型嵌入式”

如果以后你做:

本地 AI 推理

视频分析

无人机视觉

那就是 Cortex-A + NPU。

七、用一句话帮你彻底理解

STM32 = 控制世界

ESP32 = 物联网世界

Cortex-A = 计算世界

NPU = AI世界

1️⃣ STM32

STM32 属于 超低功耗 MCU(微控制器),CPU 主频一般在几十 MHz 到几百 MHz,内存(RAM/Flash)也非常有限。

特点:

CPU:ARM Cortex-M 系列(M0/M3/M4/M7/M33)

内存:几十 KB 到几 MB 不等

优点:功耗低,适合传感器数据处理

缺点:算力有限,存储小,不能跑大型神经网络

跑 AI 模型的方法:

TinyML / Edge AI:专门为 MCU 优化的轻量级模型

框架:

TensorFlow Lite Micro

CMSIS-NN(ARM 官方的神经网络库)

模型:通常是 小于 100KB 的全连接、卷积神经网络

应用:传感器异常检测、简单语音识别、手势识别

限制:

模型必须极小(通常几 KB 到几十 KB)

只能做推理(Inference),训练几乎不可能

CPU 不支持浮点硬件的话,需要用量化模型(int8)

总结:STM32 可以跑 TinyML,适合超轻量模型,但跑大型 CNN/RNN 基本不现实。

2️⃣ ESP32

ESP32 属于 Wi-Fi/蓝牙 MCU,CPU 双核 240MHz,SRAM 一般 520KB 左右,Flash 4~16MB。

CPU:Xtensa LX6

内存:约 520KB SRAM + 4MB Flash

优点:比 STM32 强大,集成 Wi-Fi/BT,可跑更复杂任务

缺点:算力和内存仍然有限,不能直接跑大型 AI 模型

跑 AI 模型的方法:

TensorFlow Lite for Microcontrollers

支持 ESP32,适合小型 CNN 或简单全连接网络

可以做手势识别、语音唤醒、传感器异常检测

ESP-DL / ESP-NN

Espressif 官方提供轻量神经网络库

支持量化模型、卷积加速

限制:

模型仍然要小(几十 KB~几百 KB)

大模型(比如 YOLO、GPT)几乎跑不动

复杂模型一般需要 外接 AI 加速芯片或 MCU+NPU

3️⃣ 总结对比
MCU/SoC CPU频率 RAM 可跑模型类型 框架/库
STM32 10400MHz 几 KB几 MB TinyML, 简单CNN/MLP TFLite Micro, CMSIS-NN
ESP32 240MHz 双核 520KB + Flash TinyML, 小型CNN/MLP TFLite Micro, ESP-DL

关键点:

不能跑大型模型(比如 GPT、YOLOv8/YOLOv9、ResNet50)

可以跑轻量化、量化、微型模型,适合物联网、边缘智能

💡 实际方案

如果是语音唤醒/手势识别/环境检测 → STM32/ESP32 可以直接用

如果是图像识别或复杂 NLP → 需要用 ESP32 + AI 加速芯片(如 Coral Edge TPU、K210)

或者用 ESP32 采集数据,再发送到 云端/PC 端 推理

UART(异步串口)用于简单点对点通信;I2C(两线接口)适合低速多设备互联;SPI(高速串行)用于高速板级数据传输;ADC(模数转换器)将模拟信号转为数字信号;CAN(控制器局域网络)专注于汽车或工业环境的高可靠性通信

UART (Universal Asynchronous Receiver/Transmitter, 通用异步接收/发送器):
啥意思:一种点对点的串行通信协议。
特点:异步(不需要时钟线,但双方要约定波特率),只需TX(发送)和RX(接收)两根线。
用途:常用于调试、连接GPS模块、蓝牙模块等。
I2C (Inter-Integrated Circuit, 内部集成电路总线):
啥意思:由NXP(飞利浦)开发的两线制、同步串行总线。
特点:只需要两根线(SDA数据线、SCL时钟线),支持主从模式,可以连接多个设备。
用途:传感器、EEPROM存储器、显示屏等低速外设。
SPI (Serial Peripheral Interface, 串行外设接口):
啥意思:一种高速、同步、全双工的串行通信总线。
特点:通信速度快,通常需要4根线(SDI, SDO, SCK, CS/SS),适用于数据量大、对速度有要求的场合。
用途:高速ADC、SD卡、液晶显示屏(LCD)。
ADC (Analog-to-Digital Converter, 模数转换器):
啥意思:将模拟信号(如电压、温度、声音)转换为单片机可处理的数字信号的硬件电路。
特点:关键参数有分辨率(位数,如10位、12位)和采样率。
用途:测量传感器电压、电池电量监测。
CAN (Controller Area Network, 控制器局域网络):
啥意思:一种高可靠性的串行通信协议,专注于网络通信。
特点:差分信号传输,抗干扰能力极强,常用于复杂环境。
用途:汽车电子(车身控制、引擎)、工业自动化。
Reddit
Reddit
+6
总结对比:
速度:SPI > CAN > I2C > UART
接线数量:SPI > UART > I2C
复杂场景:CAN
简单调试:UART
传感器多:I2C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1.安装 MySQL 5.7 官方源
sudo rpm -Uvh https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
2.安装 MySQL 5.7
sudo yum install -y mysql-community-server
兜底:
sudo yum install -y mysql-community-server --nogpgcheck 跳过签名验证
3.启动
sudo systemctl start mysqld
sudo systemctl enable mysqld
4.查初始密码(5.7 也有)
grep 'temporary password' /var/log/mysqld.log
5.登录
mysql -uroot -p
mysql -uroot -p --connect-expired-password

输入密码
5.修改密码(5.7)
SET PASSWORD = PASSWORD('NewPass123!');
6.创建或修改业务用户,允许远程访问
CREATE USER 'app_user'@'%' IDENTIFIED BY 'App@123456';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;

在服务器安全规则里 放行3306端口

1
2
3
4
5
6
1.先在本地创建仓库  vcs/creat git
2.在添加进仓库 git add
3.提交 commond and push
4.在远程端创建仓库,获得url
5.把url填写到提交过程中的弹框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# AI 工程师常用名词速查表


| 序号 | 名词 | 一句话解释 | 工程视角关键点 |
|----|----|----|----|
| 1 | **LLM**(Large Language Model) | 能理解和生成自然语言的超大模型 | 本质:token → 预测下一个 token;无记忆、不主动执行 |
| 2 | **Prompt** | 给 LLM 的“指令 / 程序” | System 定规则,User 提需求,Output 控格式 |
| 3 | **Token** | 模型处理文本的最小单位 | 决定上下文长度、推理成本;中文 ≠ 一字一 token |
| 4 | **Context Length** | 模型一次能记住的 token 上限 | 影响 RAG 文档量、Agent 长流程能力 |
| 5 | **Fine-tuning** | 用数据改变模型行为 | 常用 LoRA / QLoRA,低成本、不动底座 |
| 6 | **SFT**(Supervised Fine-Tuning) | 用标准问答教模型 | 数据格式:指令 → 输入 → 正确输出 |
| 7 | **RAG**(Retrieval-Augmented Generation) | 先查资料再回答 | LLM + 外部知识库,减少幻觉 |
| 8 | **Agent(智能体)** | 能自主完成任务的 LLM 系统 | = LLM + 规划 + 工具 + 记忆 |
| 9 | **Tool / Function Calling** | 让模型调用代码 / API | 模型负责“想”,程序负责“干” |
|10 | **Planner** | 把复杂任务拆成步骤 | 常用于 Agent 流程拆解 |
|11 | **Multi-Agent** | 多 Agent 协同工作 | 查资料 / 分析 / 审核 分工 |
|12 | **MCP** |通过引入合适的 MCP Server,智能体可以更深度地参与到日常开发流程中,协助完成项目文件读取、官方文档获取、浏览器自动化、代码仓库管理,以及跨会话的上下文维护等任务。 |
---

## 📌 速记理解版

- **LLM**:会说话、会推理的引擎 ,但它本身没有记忆、不会主动干活
- **Prompt**:提示词,给模型写程序 例子 你是一个金融分析师,请用表格输出风险点
- **Token / Context**:模型的记忆与成本边界
- **Fine-tuning / SFT**:改变模型行为和规则 LoRA / QLoRA 一种低成本微调技术 给大模型加“外挂”,不动原模型
- **RAG**:给模型接外部知识 先查资料,再让模型回答。 给 LLM 接“外部知识库”
- **Agent**:让模型能自己干活 Agent = LLM + 规划 + 工具 + 记忆
- **Tool**:模型指挥,代码执行 让模型调用代码 / API
- **Planner(规划器)**: 把复杂任务拆成步骤。
- **Multi-Agent(多智能体)**:多个模型协作,比如 一个查资料,一个分析,一个审核




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
一.
每次连接时候 clientID需要不一样,不然会被服务端认为没有离线,会发送之前的消息。
可以在消费端通过设置QoS和cleanSession两个参数来决定客户端是否需要获取离线消息。
表 1. QoS和cleanSession的组合关系

| QoS 级别 | cleanSession = true | cleanSession = false |
|----------|-------------------|--------------------|
| QoS 0 | 无离线消息,在线消息只尝试推一次 | 有离线消息,在线消息只尝试推一次 |
| QoS 1 | 无离线消息,在线消息保证可达 | 有离线消息,所有消息保证可达 |
| QoS 2 | 无离线消息,在线消息保证可达且只接收一次 | 暂不支持 |

## 说明

1. **QoS 0**
- 最低的服务质量。消息最多发送一次,不会重试。
- 不保证消息到达,不适合重要消息。

2. **QoS 1**
- 消息至少到达一次。在线时保证投递成功。
- cleanSession=false 时,客户端离线期间的消息也会被服务器保留并投递。

3. **QoS 2**
- 消息确保只到达一次。适合需要严格唯一性的消息。
- cleanSession=false 时,部分平台暂不支持 QoS2 离线消息。

4. **CleanSession**
- true:每次连接会创建新的会话,断开连接时不会保留订阅和未发送的消息。
- false:服务器保留会话信息,离线消息会被存储并在客户端下次连接时发送。