# 2025_OpenHarmony设备使用及开发
**Repository Path**: lsf1106/2025_OpenHarmony
## Basic Information
- **Project Name**: 2025_OpenHarmony设备使用及开发
- **Description**: 这是在2025年学习并实施的OpenHarmony项目仓库
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-13
- **Last Updated**: 2025-12-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 2025_OpenHarmony设备使用及开发
#### 介绍
本次项目
#### 主要技术
软件架构说明

本文档介绍当前项目所采用的核心技术模块,涵盖接口、通信协议、网络连接等关键技术点。
#### 一、GPIO(通用输入输出接口)
GPIO(General Purpose Input/Output)是通用输入输出引脚的缩写,是嵌入式系统中非常重要的基本硬件资源之一。芯片上大部分引脚都是 GPIO引脚,作为这类引脚,它的功能和特点是可以被编程控制它的工作模式,也可以编程控制它的电压高低等 。GPIO 可以用于控制 LED 灯、蜂鸣器,也可以用作按键输入、ADC 采样,从而实现单片机与外部硬件之间的连接与数据交互。STM32F103ZET6芯片为144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。
GPIO 是基础硬件接口技术,核心能力是实现设备的输入 / 输出控制。
工作模式:
浮空输入:引脚悬空时电平不确定,完全由外部信号决定。
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。
上拉输入:通过上拉电阻将引脚默认拉至高电平。
上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。
下拉输入:通过下拉电阻将引脚默认拉至低电平。
下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也还是高电平。
模拟输入:直接传递模拟信号至片上外设(如 ADC 模块),不进行数字化处理。
模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等等。
推挽输出:通过 MOS 管交替导通实现高电平或低电平输出,适合驱动 LED、蜂鸣器等外设。
推挽输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。这里要注意P-MOS管和N-MOS管,当设置输出的值为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的值为低电平的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。
开漏输出:仅能输出低电平或高阻抗状态,高电平需通过外部上拉电阻实现,适用于电平转换或“线与”功能。
开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。
复用推挽输出:引脚功能复用为其他外设(如 UART 的 TX 引脚)
推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。
复用开漏输出:引脚功能复用为其他外设
开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。
推挽结构一般是指两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定。推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
#### 二、ADC(模数转换)
ADC(模数转换器)是将模拟信号转换为数字信号的设备。其主要功能是将连续的模拟信号(如温度、声音等)转换为离散的数字信号,以便数字系统(如微控制器、计算机等)进行处理和分析。ADC 的转换过程通常包括采样、保持、量化和编码四个步骤。通过 ADC,模拟世界的传感器与数字世界的信号处理建立了联系。
采样和保持:
采样是将时间上连续变化的信号,转换为时间上离散的信号,即将时间上连续变化的模拟量转换为一系列等间隔的脉冲,脉冲的幅度取决于输入模拟量。这里采样需遵循采样定理,即当采样频率大于模拟信号中最高频率成分的两倍时,采样值才能不失真的反映原来模拟信号。模拟信号经采样后,得到一系列样值脉冲。采样脉冲宽度一般是很短暂的,在下一个采样脉冲到来之前,应暂时保持所取得的样值脉冲幅度,以便进行转换。因此,在采样电路之后须加保持电路。
量化和编码:
输入的模拟信号电压经过采样保持后,得到的是阶梯波。而该阶梯波仍然是一个可以连续取值的模拟量。但n位数字量只能保持 2^{n} 个数值。因此,用数字量来表示连续变化的模拟量时就有一个类似于四舍五入的近似问题。将采样后的样值脉冲电平归化到与之接近的离散电平之上,这个过程称为量化。指定的离散电平称为量化电平 U_{q} ,两个量化电平之间的差值称为量化单位 \Delta ,即1LSB ,位数越多,量化等级越细,\Delta就越小。采样保持后未量化的 U_{o} 值与量化电平U_{q}值通常是不相等的,其差值称为量化误差 \varepsilon ,即 \varepsilon = U_{o} - U_{q} 。量化的方法一般有两种:只舍不入法和四舍五入法。
#### 什么是半双工?
数据通信中,数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。
单工通信: 是指消息只能单方向传输的工作方式。例如遥控、遥测(一部分),就是单工通信方式。单工通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的。
半双工: 是指数据可以沿两个方向传送,但同一时刻一个信道只允许单方向传送,因此又被称为双向交替通信。(信息在两点之间能够在两个方向上进行发送,但不能同时发送的工作方式。)半双工方式要求收发两端都有发送装置和接收装置。由于这种方式要频繁变换信道方向,故效率低,但可以节约传输线路。
全双工: 是指在通信的任意时刻,线路上可以同时存在A到B和B到A的双向信号传输。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。全双工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。比如,电话机则是一种全双工设备,其通话双方可以同时进行对话。
#### 什么是同步通讯?
同步通信: 发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(例如:在时钟信号的上升沿的时候,将数据发送出去)发送数据,接收端根据发送端提供的时钟信号,以及大家的约定,接收数据。如:I2C、SPI等有时钟信号的协议,都属于这种通信方式。
异步通信: 接收方并不知道数据什么时候会到达,收发双方可以有各自自己的时钟。发送方发送的时间间隔可以不均,接收方是在数据的起始位和停止位的帮助下实现信息同步的。这种传输通常是很小的分组,比如:一个字符为一组,数据组配备起始位和结束位。所以这种传输方式的效率是比较低的,因为额外加入了很多的辅助位作为负载,常用在低速的传输中。
#### 三、I2C(集成电路总线)
I2C(Inter-Integrated Circuit)通信总线,作为嵌入式系统设计中的一个关键组成部分,其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析,包括其基本概念、特点、通信协议,以及在不同场景下的高级应用和最佳实践。I2C接口只有2根信号线,总线上可以连接多个设备,硬件实现简单,可扩展性强。I2C通信协议可以用普通GPIO引脚进行软件模拟。I2C接口主要用于通讯速率要求不高,以及多个器件之间通信的应用场景。
I2C是一个同步半双工硬件层次的串行通信协议、I2C总线总共只有两条信号线,串行时钟线SCL和串行数据线SDA。I2C总线上的各器件的数据线都接到SDA线上,I2C总线上的各器件的时钟线都接到SCL线上。每个连接到I2C总线上的器件都有一个唯一的地址,扩展器件时受到器件数量的限制,当I2C总线空闲时,SDA和SCL均为高电平。由于连接到总线上的器件输出级必须是漏极开路或者集电极开路的,因此只要有一个器件任意时刻输出低电平,都将总线上的信号都将总线上的信号变低,即各器件的SDA和SCL都是“线与“的关系。由于各器件输出端为漏极开路,则SCL和SDA线必须通过上拉电阻接正电源,以保证SDA和SCL在空闲状态被上拉到高电平。
两线制:使用两条线进行通信,分别是串行数据线(SDA)和串行时钟线(SCL)。
多主多从结构:支持多个主设备和多个从设备连接到同一总线上。
通信方式:
同步串行:数据传输同步于时钟信号。
字节格式:每个字节由8位数据构成,加上开始和停止条件以及可选的应答位。
#### 四、SPI(串行外设接口)
SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI主从模式SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。SPI是全双工且SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps。
SPI接口一般使用四条信号线通信:SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)
MISO: 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
MOSI: 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
SCLK:串行时钟信号,由主设备产生。
CS/SS:从设备片选信号,由主设备控制。它的功能是用来作为“片选引脚”,也就是选择指定的从设备,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。
SPI通信有4种不同的操作模式,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来
控制我们主设备的通信模式,具体如下:
时钟极性(CPOL)定义了时钟空闲状态电平:
CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
时钟相位(CPHA)定义数据的采集时间。
CPHA=0,在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。,在第2个边沿发送数据
CPHA=1,在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。,在第1个边沿发送数据
#### 五、UART(通用异步收发传输器)
UART,全称是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是一种双向、串行、异步的通信总线。典型的UART一般使用3根线,分别是发送线(TX)、接收线(RX)和地线(GND),无时钟线,故称为异步串行通信接口。通信时必须将双方的TX和RX交叉连接并且GND相连才可正常通信,UART可以实现全双工通信,常用于控制系统与外设通信,包括控制器与控制器,控制器与终端设备等。UART通信线路简单,成本低,传输距离远,但传输速度慢。
工作原理:
UART是一种采用异步串行通信方式的收发传输器。在串行通信中,数据是按位传送的,因此数据传输速率用每秒钟传送二进制代码的位数表示,称为波特率。UART在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。UART串口通信需要两根信号线来实现:一根用于串口发送(TXD),另一根用于串口接收(RXD)。当不传输数据时,UART数据传输线通常保持高电压电平。若要开始数据传输,发送UART会将传输线从高电平拉到低电平并保持一个波特率周期,这称为起始位。接收UART检测到从高到低电压跃迁时,便开始以波特率对应的频率读取数据帧中的位。
UART数据包包含有一个起始位,5到9个数据位(取决于UART),一个可选择的奇偶检验位以及一个或两个停止位:screen-capture
起始位
UART数据传输线通常在不传输数据时保持在高电平电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压转换时,他开始以波特率的频率读取数据帧中的位。
数据帧
数据帧内包含正在传输的实际数据。使用奇偶校验位是5-8位,不使用最多可以是9位。
校验位
奇偶校验位是接收UART判断传输期间是否有任何数据更改的方式。接收UART读取数据帧后,它将对值为1的数进行技术,并且检查总数是偶数还是奇数,是否与数据相匹配。
停止位
向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少两位的时间。
#### 六、WiFi(无线网络技术)
无线网络是通过无线传输媒介进行数据传输的通信网络。它不需要有线线路,而是利用电磁波在空气中传输数据。无线网络已成为现代通信网络的重要组成部分,广泛应用于移动通信、智能家居、物联网等领域。在无线网络中,各个设备之间通过无线信号进行通信,因此需要遵循一定的通信协议来保证数据的正确传输。协议是网络技术中为数据交换而设置的标准、规则和约定的集合,包括语义、语法和定时三个要素。语义表示协议控制信息的具体含义;语法表示数据和控制信息的格式、编码规则;时序表示数据和控制信息的收发同步和排序。
无线网络协议栈是基于TCP/IP模型的,包括应用层、传输层、网络层、链路层和物理层。每一层都有各自的功能和协议,共同完成无线网络的通信任务。
#### 七、MQTT(消息队列遥测传输协议)
MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为远程连接设备提过实时可靠的消息服务,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(loT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
MQTT的通信流程非常简洁,核心分为4步,我们用“智能家居温湿度监控”的场景来举例说明:
设备连接:温湿度传感器(发布者)和手机APP(订阅者)分别与MQTT Broker建立TCP连接(MQTT协议基于TCP/IP协议工作,保证了传输的可靠性)。
订阅主题:手机APP(订阅者)向Broker发送“订阅主题”的请求,比如订阅“home/livingroom/temperature”(客厅温度)和“home/livingroom/humidity”(客厅湿度)。
发布消息:温湿度传感器(发布者)定时采集数据,然后将数据作为“消息”,发布到对应的主题(如将25℃发布到“home/livingroom/temperature”)。
消息转发:Broker收到发布者的消息后,检查该主题的订阅列表,发现手机APP订阅了该主题,于是将消息转发给手机APP。手机APP接收消息后,在界面上显示温湿度数据。
#### 八、IoT DA(物联网设备接入)
设备接入服务(IoT Device Access)是华为云的物联网平台,提供海量设备连接上云、设备和云端双向消息通信、批量设备管理、远程控制和监控、OTA升级、设备联动规则等能力,并可将设备数据灵活流转到华为云其他服务,帮助物联网行业用户快速完成设备联网及行业应用集成。全新升级后的设备接入服务IoTDA,整合了原设备接入服务和设备管理服务的功能。简言之,IoTDA提供的是基于物的连接平台,设备连接到平台进行数据交互,应用连接到平台进行数据交互,控制台进行界面呈现上的应用管理、设备管理等。
MQTT 协议基于发布/订阅的消息模式工作,核心组件包括:
客户端(Client):任何运行 MQTT 库并通过网络连接到 MQTT 服务器的设备。客户端可以:
发布消息到特定主题
订阅感兴趣的主题以接收消息
取消订阅主题
与服务器断开连接
代理/服务器(Broker):负责接收所有消息,过滤消息,并将消息分发给订阅特定主题的客户端。代理是 MQTT 系统的核心,负责消息路由。
主题(Topic):消息的分类和路由机制。主题使用层次结构组织,类似于文件系统路径(如 home/kitchen/temperature)。
消息(Message):包含有效载荷(payload)的数据包,由发布者发送,通过代理分发给订阅相应主题的客户端。
工作流程如下:
客户端连接到 MQTT 代理
客户端可以发布消息到一个主题
其他客户端可以订阅该主题
代理将消息转发给所有订阅该主题的客户端
当客户端不再需要连接时,它会与代理断开连接