0%

一、做底层驱动 → 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:服务器保留会话信息,离线消息会被存储并在客户端下次连接时发送。

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
一、鸿蒙的“官方推荐”架构

鸿蒙官方在 ArkUI/ArkTS 和 Java HarmonyOS Ability 开发里,推荐用:

1.MVVM(官方最推)

ArkUI/ArkTS 天然支持 数据驱动,也就是 MVVM 核心思想:

Model:数据实体,普通类或 JS 对象

ViewModel:@Observed, @State, @Computed 等管理状态

View:ArkUI Column, Row, Stack 等 UI 组件

数据变化 → UI 自动刷新(无需手动 findView/updateView)

典型标志:

@Observed
class DeviceData {
batteryPercent: number;
online: boolean;
}

@Component
struct DeviceItem {
@ObjectLink data: DeviceData;
build() {
Column() {
Text("电量: " + this.data.batteryPercent + "%")
}
}
}


这个就是 ArkUI 的 MVVM 核心方式。

2.MVP / MVI(非官方也可用)

MVP:

Model: 数据实体

View: ArkUI 页面

Presenter: 普通 TypeScript / Java 类负责业务逻辑

这种方式在鸿蒙 Java 端和 ArkUI 前端都可以实现,但不如 MVVM 官方支持好。

使用场景:你想完全分离逻辑和 UI,类似 Android 老项目迁移。

MVI:

也是数据驱动,但强调 状态不可变 + 单向数据流

对于复杂页面(设备列表、巡检表格、地图轨迹)非常适合

二、鸿蒙开发特点与 Android 不同点
# Android 与 鸿蒙 ArkUI/ArkTS 特性对比

| 特性 | Android | 鸿蒙 ArkUI / ArkTS |
|------|---------|------------------|
| **数据绑定** | LiveData / ViewModel | `@State`, `@Observed` |
| **UI 组件** | XML / Jetpack Compose | Column, Row, Stack, Text, Image |
| **事件绑定** | `setOnClickListener` | `onClick={() => {...}}` |
| **生命周期** | Activity / Fragment | Ability + Component |
| **官方推荐架构** | MVVM + Jetpack | MVVM + ArkUI |

总结:鸿蒙官方就是 ArkUI + MVVM,几乎天然支持,直接用 @Observed/@State 就能做双向绑定。

三、鸿蒙项目常用 MVVM 模式结构
project/

├─ model/ # 数据模型
│ └─ Device.ts

├─ view/ # 页面组件
│ └─ DevicePage.ts

├─ viewmodel/ # 管理状态、提供数据
│ └─ DeviceViewModel.ts

├─ service/ # 网络/设备/数据库服务
│ └─ DeviceService.ts
└─ utils/


使用方法:

ViewModel 中保存状态

View 使用 @Observed 或 @State 绑定 ViewModel 数据

数据变化 → UI 自动刷新,无需手动更新

四、安卓开发经验迁移到鸿蒙

LiveData → @Observed/@State

ViewModel → ArkTS/Java 对应 ViewModel 类

DataBinding / Jetpack Compose → Column/Row/Stack + build()

MVP 的 Presenter → ArkTS 类 + 自己调用更新函数

核心区别:鸿蒙更偏 声明式 + 数据驱动,MVVM 天然支持,MVP 只能自己写。

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
35
36
37
1.在module.json5中
"requestPermissions": [
{"name": "ohos.permission.INTERNET"},
{"name": "ohos.permission.GET_BUNDLE_INFO"},
{"name": "ohos.permission.KEEP_BACKGROUND_RUNNING"}
],

"pages": "$profile:main_pages",
"abilities": [
{
"name": "EntryAbility",
"backgroundModes": [
"dataTransfer" // 对应 BackgroundMode.DATA_TRANSFER
],



2.在EntryAblility中
async onForeground(): Promise<void> {
// Ability has brought to foreground
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
try {
const wantAgentInfo: wantAgent.WantAgentInfo = {
wants: [{ bundleName: 'com.ht.cotton', abilityName: 'EntryAbility' }],
actionType: wantAgent.OperationType.START_ABILITY,
requestCode: 0,
actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
};

const wantAgentObj = await wantAgent.getWantAgent(wantAgentInfo);
const taskTypes = ['dataTransfer']; // 或 ['audioPlayback'], ['audioRecording'] 等
const res = await backgroundTaskManager.startBackgroundRunning(this.context, backgroundTaskManager.BackgroundMode.DATA_TRANSFER, wantAgentObj);
// console.info('后台长时任务已申请, notificationId:', res.notificationId);
} catch (e) {
console.error('申请后台长时任务失败:', JSON.stringify(e));
}
}

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
35
36
37
38
39
40
41
42
{
"app": {
"bundleName": "com.ht.cotton",
"bundleType": "app",
"versionCode": 1000000,
"versionName": "1.0.0",
"label": "Htconnn",
"deployDomain": "codehelps.online",
"icons": {
"normal": "https://codehelps.online/logo.png",
"large": "https://codehelps.online/logo2.png"
},
"minAPIVersion": "5.0.5(17)",
"targetAPIVersion": "5.0.5(17)",
"modules": [
{
"name": "entry",
"type": "entry",
"deviceTypes": [
"tablet",
"2in1",
"phone"
],
"packageUrl": "https://codehelps.online/a.hap",
"packageHash": "56c1438593fc5f3d6e49196b2751a4bb99d3a83da744cbe8deecad27d07bda8e"
}
]
},
"sign": "描述文件签名"
}

1.打出包对应的packageHash
certutil -hashfile "D:\homyspace\htcotton\entry\build\default\outputs\default\entry-default-signed.hap" SHA256

2.描述文件签名
https://gitee.com/arkin-internal-testing/internal-testing
下载后运行manifest-sign.bat

-operation sign -mode localjks -inputFile D:\file\hmmswj\htcotton.json5 -outputFile D:\file\hmmswj\adhocnew.json5 -keystore D:\homyspace\htcotton\csr\htcotton.p12 -keystorepasswd htnova1003 -keyaliaspasswd htnova1003 -privatekey htcotto

3.生成的前json5文件上传到自己的服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
在 ArkTS(ArkUI)里,ForEach 的第三个参数是 key,用来标识每个列表项的唯一性。它有个“复用组件”的机制:

key 不变 → 组件复用,不会重新渲染

key 变化 → 组件重建,UI 才会刷新

ForEach(this.yardList, (item: DataBean, index: number) => {
ListItem() {
this.BuildYardItemPage(item, index)
}
}, (item: DataBean) => item.sn)