智能门锁开发系列:从设计到实现的全面解析

01-面试大保健-智能门锁-概述

1. 项目背景

智能门锁作为物联网领域的应用之一,核心功能是开锁,但除了开锁之外,它还支持多种方式进行操作,提升了用户体验。在这篇博客中,我们将详细回顾智能门锁项目的背景、开发环境以及硬件和软件架构。

1.1 核心功能与开锁方式

智能门锁的核心功能无非是开锁,而本项目支持多种开锁方式:

  • 密码开锁(或称按键开锁)
  • 指纹开锁
  • 蓝牙开锁

这些开锁方式为用户提供了不同的选择,增强了门锁的安全性和便捷性。对于每种方式,我们都采用了不同的硬件和算法来实现,确保在各种环境下都能稳定运行。

此外,门锁还支持OTA升级功能。通过OTA(Over-The-Air)升级,用户可以在不接触设备的情况下,通过无线网络进行固件更新。这是一个非常实用的小亮点,能够保证设备长期的可维护性。


图示:

流程图:智能门锁核心功能
+------------------------+
| 密码开锁               |
+------------------------+|v
+------------------------+
| 指纹开锁               |
+------------------------+|v
+------------------------+
| 蓝牙开锁               |
+------------------------+|v
+------------------------+
| OTA升级               |
+------------------------+

2. 开发环境

2.1 开发工具与框架
  • IDE:我们使用了Visual Studio Code与ESP32的开发插件。这个组合能够提供高效的开发环境,方便我们进行代码编写和调试。
  • 开发框架:开发过程中使用了官方提供的ESP-IDF(Espressif IoT Development Framework),它是为ESP32芯片定制的开发框架。ESP-IDF提供了多种API,包括FreeRTOS内核、外设驱动、网络协议支持等。

ESP-IDF作为物联网开发的标准框架,内置了多种底层支持:

  • FreeRTOS内核:支持多任务的并发执行。
  • 外设驱动:如GPIO、UART、SPI、I2C等。
  • 网络协议:包括WiFi、蓝牙等,使得门锁能够进行无线通信。

图示:

流程图:开发环境架构
+------------------------+
| Visual Studio Code     |
+------------------------+|v
+------------------------+
| ESP-IDF                |
+------------------------+|v
+------------------------+
| FreeRTOS + 外设驱动    |
+------------------------+

3. 硬件架构

3.1 主控芯片与外设

智能门锁的硬件架构由以下几个关键部分组成:

  • 主控芯片:我们使用了ESP32-C3作为主控芯片。它具有较高的性能和低功耗的特点,适合嵌入式物联网应用。其CPU最高频率为160 MHz,具有4MB的闪存和400KB的RAM。
  • 触摸感应器:用于读取用户输入的密码,使用的是SC16B芯片。通过I2C协议与主控芯片通信,并具有中断功能,能够响应用户的按键操作。
  • 指纹识别模块:采用一体式的指纹识别模块,内部集成了传感器和识别芯片,能够独立完成指纹比对和存储功能。
  • 蓝牙模块:ESP32自带蓝牙功能,用于实现蓝牙开锁功能。
  • Wi-Fi模块:用于支持OTA升级功能。

图示:

流程图:硬件架构
+-----------------------+
| ESP32-C3主控芯片      |
+-----------------------+|v
+-----------------------+
| 触摸感应器 (SC16B)    |
+-----------------------+|v
+-----------------------+
| 指纹识别模块          |
+-----------------------+|v
+-----------------------+
| 蓝牙 + Wi-Fi模块      |
+-----------------------+

4. 软件架构

4.1 软件层次

智能门锁的软件架构可以分为几个主要模块:

  • 硬件驱动模块:负责与外设的通信,包括GPIO、I2C、UART等,确保各个硬件模块的正常工作。
  • 应用层:处理门锁的核心功能,如密码输入、指纹识别、蓝牙连接等。该层与硬件驱动模块进行交互,完成具体任务。
  • 网络层:处理Wi-Fi和蓝牙的连接,支持OTA升级功能。
  • 系统层:基于FreeRTOS的多任务调度,确保不同功能模块的并发执行。

图示:

流程图:软件架构
+-----------------------+
| 硬件驱动模块          |
+-----------------------+|v
+-----------------------+
| 应用层                |
+-----------------------+|v
+-----------------------+
| 网络层 (Wi-Fi/蓝牙)  |
+-----------------------+|v
+-----------------------+
| 系统层 (FreeRTOS)     |
+-----------------------+

5. 总结

在这篇博客中,我们详细回顾了智能门锁项目的核心功能和开发环境。智能门锁支持多种开锁方式(密码、指纹、蓝牙),并且具有OTA升级功能,使得门锁在未来可以方便地进行更新和维护。我们使用了ESP32-C3主控芯片,并基于ESP-IDF开发框架进行开发,利用FreeRTOS进行任务管理。

  • 核心功能:包括多种开锁方式(密码、指纹、蓝牙)和OTA升级。
  • 硬件架构:ESP32-C3主控芯片,配合触摸感应器、指纹模块、蓝牙模块等外设。
  • 软件架构:包括硬件驱动层、应用层、网络层和系统层,确保系统稳定高效运行。

希望这篇博客帮助你更好地理解智能门锁项目的设计与实现,并为将来的开发和面试提供有用的参考。

02-面试大保健-智能门锁-架构

1. 项目背景与需求

在这篇博客中,我们将回顾智能门锁项目的整体架构,特别是软件的设计和各个任务之间的协作。项目的核心功能是多种开锁方式的支持,包括密码开锁、指纹开锁和蓝牙开锁,同时还具备OTA(Over-the-Air)升级功能。

1.1 任务定义

在智能门锁项目中,我们定义了几个关键任务,每个任务处理不同的功能:

  1. 扫描按键任务:负责读取按键输入并处理密码。
  2. 扫描指纹任务:负责指纹的识别与验证。
  3. OTA升级任务:处理远程升级功能。

每个任务采用阻塞方式等待通知,这样可以在没有事件触发时节省资源,进入低功耗模式。


图示:

流程图:任务定义
+--------------------+
| 扫描按键任务       |
+--------------------+|v
+--------------------+
| 扫描指纹任务       |
+--------------------+|v
+--------------------+
| OTA升级任务        |
+--------------------+

2. 按键任务流程

按键任务的主要目的是验证密码并开锁。让我们来看一下这个任务是如何工作的。

2.1 按键任务的实现
  • 等待通知:在没有按键按下时,任务处于阻塞状态,等待中断通知。
  • 中断通知:当按键被按下时,GPIO引脚会发送一个中断通知给主控芯片。
  • 读取按键编号:按键被触摸后,按键任务会读取按键编号。
  • 密码验证:如果输入完成并且按下井号键(#),系统就开始验证密码。

密码验证通过应用程序接口(API)进行,验证成功后通过GPIO引脚控制电机解锁。


图示:

流程图:按键任务处理
+-------------------+
| 等待中断通知      |
+-------------------+|v
+-------------------+
| 读取按键编号      |
+-------------------+|v
+-------------------+
| 验证密码并开锁    |
+-------------------+

3. 指纹识别任务

指纹识别任务相对复杂,它涉及多个步骤来确保指纹的验证和开锁。

3.1 指纹任务的实现

指纹识别任务也采用阻塞方式,等待来自不同来源的通知。一旦收到指纹识别的通知,就开始执行相应操作。

  • 等待通知:任务处于阻塞状态,等待蓝牙或按键任务的通知。
  • 指纹识别:接收到指纹识别任务后,系统会调用指纹识别模块进行指纹验证。
  • 匹配与开锁:通过指纹匹配后,如果成功,系统会触发开锁动作。

图示:

流程图:指纹任务处理
+---------------------+
| 等待通知            |
+---------------------+|v
+---------------------+
| 执行指纹识别        |
+---------------------+|v
+---------------------+
| 验证匹配并开锁      |
+---------------------+

4. 蓝牙与OTA任务

4.1 蓝牙任务

蓝牙任务负责接收来自手机APP的指令,包括开锁、录入指纹和删除密码等。

  • 事件驱动:蓝牙模块采用事件驱动模式,等待不同的事件触发,比如连接、读取数据等。
  • 接收数据:当手机APP发送指令时,蓝牙模块会通过回调函数接收数据。
  • 执行指令:根据接收到的指令执行相应操作,比如录入指纹或验证密码。
4.2 OTA升级任务

OTA任务主要负责门锁固件的远程升级。它通过手机APP发送OTA升级指令,门锁收到指令后会下载固件并进行更新。

  • 等待通知:OTA任务也处于阻塞状态,等待蓝牙模块或手机APP发送升级指令。
  • 固件下载:固件下载完成后,任务会进行完整性校验。
  • 升级与重启:如果校验通过,门锁固件会进行更新并重启。

图示:

流程图:蓝牙与OTA任务
+-------------------+
| 蓝牙模块          |
+-------------------+|v
+-------------------+
| 接收指令并执行    |
+-------------------+|v
+-------------------+
| OTA升级           |
+-------------------+

5. 总结

通过这篇博客,我们详细介绍了智能门锁项目中的关键任务与流程:

  • 按键任务:实现了密码验证和开锁功能。
  • 指纹识别任务:处理了指纹验证和开锁功能。
  • 蓝牙与OTA任务:通过蓝牙接收指令并执行相应操作,支持远程OTA升级。

每个任务都是以阻塞模式等待通知,这种设计有效提高了系统的低功耗运行。在开发时,合理利用中断、任务通知和事件驱动模型,能够使得嵌入式系统更加高效和稳定。

希望这篇博客能帮助你更好地理解智能门锁项目的架构,并为面试和实际开发提供有用的参考。

03-面试大保健-智能门锁-细节

1. 按键扫描任务与中断处理

在智能门锁的设计中,按键扫描任务是核心之一,负责监听按键的输入操作。按键的工作原理较为简单,通过中断来触发任务的执行。

1.1 中断处理机制
  • 按键扫描:当用户按下某个按键时,按键任务会监听到这个动作,触发相应的中断信号。
  • 中断触发:中断触发后,系统通过中断通知任务进行处理。
  • 任务唤醒:一旦收到中断通知,按键任务会被唤醒并开始读取按键状态。系统通过中断机制来避免轮询方式的低效,从而实现低功耗设计。

这个思路不仅应用于按键任务,指纹任务的实现也是类似的,使用中断处理来高效地监听和处理硬件输入。


图示:

流程图:按键任务与中断
+-------------------------+
| 按键任务                |
+-------------------------+|v
+-------------------------+
| 中断触发                |
+-------------------------+|v
+-------------------------+
| 唤醒任务并处理按键输入  |
+-------------------------+

2. OTA升级原理

OTA(Over-The-Air)升级是智能门锁项目中的一个重要功能。尽管在代码实现中调用相应的API即可,但在面试中,面试官可能会要求你解释OTA的底层原理。我们需要从两个方面理解OTA升级的工作原理:

2.1 启动流程与Bootloader
  • Bootloader:当ESP32芯片上电时,首先执行的是Bootloader程序。它的作用是加载存储在Flash中的应用程序镜像,将它加载到RAM中并开始执行。
  • 程序镜像:应用程序的二进制文件存储在Flash的特定分区中,通过Bootloader加载执行。

在这过程中,程序的镜像通过特定的分区管理,确保不同版本的固件能够正常更新和执行。


图示:

流程图:Bootloader与程序加载
+-------------------------+
| Bootloader启动          |
+-------------------------+|v
+-------------------------+
| 加载应用程序镜像到RAM   |
+-------------------------+|v
+-------------------------+
| 执行应用程序            |
+-------------------------+
2.2 Flash分区管理

在ESP32芯片中,Flash的管理是通过分区来进行的。每个分区存储不同的内容,比如引导程序和应用程序。OTA升级的关键就在于分区的管理,具体如下:

  • OTA零与OTA一分区:这些分区分别用于存储当前版本的应用程序和新版本的应用程序。当前版本程序存储在OTA零分区,新版本程序则存储在OTA一分区。
  • 数据分区(OTAdata):这个分区存储每次升级后应从哪个分区加载程序。

当进行OTA升级时,新版本的固件会被下载到OTA一分区,而系统会根据OTAdata分区的信息判断下次启动时从哪个分区加载程序。这样,整个升级过程就得以顺利完成。


图示:

流程图:OTA升级流程
+------------------------+
| 初始程序存储在OTA零分区|
+------------------------+|v
+------------------------+
| 新版本下载到OTA一分区  |
+------------------------+|v
+------------------------+
| 重启并加载OTA一分区    |
+------------------------+|v
+------------------------+
| 程序从OTA一分区启动    |
+------------------------+
2.3 升级流程总结

OTA升级的核心是通过Flash分区管理来支持版本的切换。在第一次升级时,程序会下载到OTA一分区,执行升级操作后,系统会指向新分区并从新版本中启动。下一次升级时,过程会重复,但下载内容会存储到OTA零分区,再次更新后切换到新的版本。

通过这样的管理,门锁可以高效地进行远程升级,并且在出现问题时通过回滚机制恢复到上一个版本。


图示:

流程图:升级与回滚
+------------------------+
| 升级后下载新固件到OTA一 |
+------------------------+|v
+------------------------+
| 回滚机制:OTA零与OTA一  |
+------------------------+

3. 总结

这篇博客详细讲解了智能门锁项目中的一些技术细节,特别是按键任务、中断处理机制以及OTA升级的原理。了解这些底层原理有助于你在面试中更好地回答相关问题,展示你对系统架构和硬件管理的深入理解。

  • 按键任务与中断:通过中断触发任务,减少了轮询开销,提高了系统的响应性。
  • OTA升级原理:基于Flash分区管理,通过Bootloader加载程序,支持版本切换和升级。

这些细节是嵌入式系统开发中的关键要素,能够帮助你更好地设计和调试智能硬件项目。希望这篇博客为你的学习和面试准备提供帮助。

04-面试大保健-智能门锁-面试真题

1. OTA代码实现与协议

在面试中,关于OTA升级的常见问题之一是:“你使用什么协议来下载OTA代码?”在这方面,很多面试官可能对ESP32ESP-IDF的OTA功能不够了解,可能会以为你需要从头实现。其实,ESP32本身支持OTA升级功能,且通过ESP-IDF框架提供了非常简单的API,可以很方便地实现这个功能。

1.1 协议选择
  • 下载协议:我们使用了HTTP协议来下载OTA固件。ESP32的固件下载是通过HTTP请求获取的,下载完成后,固件会被保存到指定的Flash分区。
  • 升级流程:下载成功后,我们会重启设备,设备会从新的分区启动新版本的固件。

这段实现的代码其实非常简洁,因为ESP-IDF已经封装了相关的API。


图示:

流程图:OTA升级流程
+--------------------------+
| 使用HTTP协议下载固件    |
+--------------------------+|v
+--------------------------+
| 下载到指定的分区        |
+--------------------------+|v
+--------------------------+
| 重启设备,从新分区启动  |
+--------------------------+

2. OTA切换到新版本

当谈到如何切换到新版本时,面试官会关注OTA是如何切换到下载的固件版本的。为了清晰地回答这个问题,我们可以按照以下流程解释:

2.1 启动流程与Bootloader
  • Bootloader的作用:ESP32的启动流程是首先执行Bootloader,Bootloader会读取Flash中的应用程序,并加载到RAM中,然后执行。
  • OTA分区:在OTA升级中,ESP32会将固件存储在OTA零OTA一两个分区。OTA零存储当前正在运行的固件,而OTA一存储新下载的固件。
2.2 如何切换到新版本
  1. 下载到OTA一分区:升级时,新固件会下载到OTA一分区。
  2. 更新OTAdata:下载成功后,OTAdata分区会保存下载固件所在的分区编号。
  3. 重启:重启设备时,Bootloader会根据OTAdata分区的指示,从新的分区加载固件。

这样,新固件便会被加载并执行,完成升级过程。


图示:

流程图:OTA升级切换
+--------------------------+
| 当前固件在OTA零分区      |
+--------------------------+|v
+--------------------------+
| 新固件下载到OTA一分区    |
+--------------------------+|v
+--------------------------+
| 更新OTAdata分区          |
+--------------------------+|v
+--------------------------+
| 重启,启动新固件          |
+--------------------------+

3. 蓝牙连接与安全性问题

面试官通常会对智能门锁的蓝牙连接进行深入提问,涉及连接方式、加密等问题。常见的问题包括:

  • 门锁的蓝牙和手机连接使用的是广播吗?
  • 一个设备连接后,其他人能否再次连接?
  • 蓝牙连接时是否有加密措施?

这些问题涉及到蓝牙协议,尤其是**低功耗蓝牙(BLE)**协议。在BLE协议中,有一些关键的点需要了解。

3.1 蓝牙协议栈

BLE协议栈包括多个层次,下面是BLE协议的基本层次:

  • 物理层和链路层:负责无线信号的传输和接收。
  • 主机层:由操作系统管理,提供蓝牙的通信接口。
  • 应用层:由开发者编写,处理蓝牙设备的具体应用。

在智能门锁中,我们关注的是应用层,它与手机等客户端设备进行交互。你不需要关注物理层和链路层,因为这些由蓝牙芯片厂商和操作系统处理。


图示:

流程图:蓝牙协议栈
+---------------------------+
| 应用层(开发者编写)       |
+---------------------------+|v
+---------------------------+
| 主机层(操作系统管理)    |
+---------------------------+|v
+---------------------------+
| 物理层与链路层(硬件处理) |
+---------------------------+
3.2 蓝牙连接与加密
  • 广播与扫描:蓝牙设备需要进入广播模式才能被其他设备发现。在设备连接后,它会退出广播模式。
  • 配对与加密:配对是蓝牙连接中的安全步骤,目的是为了身份认证和生成加密密钥。配对后,设备之间可以安全地交换数据。根据蓝牙版本不同,可能使用对称加密或非对称加密。
3.3 服务端与客户端

在蓝牙通信中,服务端是提供数据的设备,而客户端则是请求数据的设备。例如,智能门锁作为服务端,提供电量信息等数据;手机作为客户端,发起请求并获取数据。


图示:

流程图:蓝牙服务端与客户端
+---------------------------+
| 服务端(门锁)            |
+---------------------------+|v
+---------------------------+
| 客户端(手机)            |
+---------------------------+|v
+---------------------------+
| 数据传输(电量等信息)     |
+---------------------------+

4. 安全管理协议(SMP)

**SMP(安全管理协议)**主要负责设备之间的安全连接和加密。它在蓝牙配对时用于生成密钥,以确保通信过程中的数据不被泄露。

4.1 安全连接流程

安全连接流程包括四个步骤:

  1. 广播与扫描:设备进行广播,等待客户端扫描。
  2. 连接:客户端请求连接服务端。
  3. 配对:进行身份认证并生成加密密钥。
  4. 绑定:配对后,密钥会被保存,之后再连接时无需重新配对。

图示:

流程图:安全连接与配对
+-----------------------+
| 广播与扫描            |
+-----------------------+|v
+-----------------------+
| 建立连接              |
+-----------------------+|v
+-----------------------+
| 配对并生成密钥        |
+-----------------------+|v
+-----------------------+
| 保存密钥并进行绑定    |
+-----------------------+

5. 总结

这篇博客回顾了智能门锁的几个常见面试问题,主要包括:

  • OTA代码实现与切换:使用ESP-IDF框架提供的API进行固件下载和版本切换。
  • 蓝牙连接与协议:详细解释了BLE协议的层次、设备角色和数据传输方式。
  • 安全管理协议(SMP):介绍了蓝牙连接的安全性管理,包括配对、加密和绑定。

这些内容不仅帮助你理解智能门锁的工作原理,还能为你在面试中回答相关问题提供帮助。希望这篇博客对你的学习和面试准备有所帮助。

05-面试大保健-智能门锁-串讲

1. 项目概述与功能

在这篇博客中,我们将回顾一个智能门锁的项目,包括它的核心功能、硬件架构、软件设计和常见的开锁方式。我们使用的是ESP32-C3主控芯片,结合其强大的Wi-Fi和蓝牙功能,支持多种开锁方式,并且支持OTA升级功能。

1.1 智能门锁的功能

该智能门锁支持多种开锁方式:

  1. 密码开锁(按键输入)
  2. 指纹开锁
  3. 蓝牙开锁

此外,它还具有OTA(Over-the-Air)在线升级的功能,确保设备可以远程升级,保持最新的功能和安全性。

智能门锁的用户交互方面还包括:

  • 语音播报:每当有操作时,系统会提供语音提示。
  • 背光灯:按键上配有背光灯,方便用户在暗处使用。

图示:

流程图:智能门锁功能
+------------------------+
| 密码开锁               |
+------------------------+|v
+------------------------+
| 指纹开锁               |
+------------------------+|v
+------------------------+
| 蓝牙开锁               |
+------------------------+|v
+------------------------+
| OTA在线升级           |
+------------------------+

2. 开锁方式

2.1 密码开锁

密码开锁使用的是12键电容触摸键盘,通过I2C协议与主控芯片通信,并支持中断通知。

  • 按键扫描:当用户触摸某个按键时,触摸键盘会发送中断通知到主控芯片,主控芯片通过I2C接口读取按键编号。
  • 密码输入:用户输入的密码会缓存在内存中,直到输入完成并按下井号键(#)为止。
  • 密码验证:系统会将输入的密码与存储在Flash中的密码进行对比。如果匹配成功,系统通过GPIO控制电机开锁。

这整个过程通过FreeRTOS的任务机制来实现,每个任务通过消息通知机制进行同步。任务在没有触发事件时是处于阻塞状态的,等待中断通知。


图示:

流程图:密码开锁流程
+--------------------------+
| 按键触摸事件(I2C中断)  |
+--------------------------+|v
+--------------------------+
| 读取按键编号并缓存输入    |
+--------------------------+|v
+--------------------------+
| 比对密码与存储的密码    |
+--------------------------+|v
+--------------------------+
| 电机开锁(GPIO控制)    |
+--------------------------+
2.2 指纹开锁

指纹开锁使用的是一体化指纹模块,该模块集成了传感器和识别芯片,支持指纹的录入和验证。

  • 指纹识别:指纹模块通过UART接口与主控芯片通信。当检测到指纹时,模块会通过中断通知主控芯片。
  • 指纹验证:主控芯片收到中断通知后,发送指令给指纹模块进行指纹验证。验证成功后,电机通过GPIO开锁。

这个过程同样使用了FreeRTOS中的任务通知机制,确保指纹识别和任务之间的高效协作。


图示:

流程图:指纹开锁流程
+----------------------------+
| 检测到指纹(UART中断)    |
+----------------------------+|v
+----------------------------+
| 指纹验证                   |
+----------------------------+|v
+----------------------------+
| 电机开锁(GPIO控制)       |
+----------------------------+
2.3 蓝牙开锁

蓝牙开锁功能依赖于ESP32的蓝牙驱动。通过蓝牙,手机APP与门锁设备进行配对和连接。

  • 配对与连接:初次使用时,用户需要配对手机与门锁设备。配对后,设备可以自动连接。
  • 指令接收:一旦蓝牙连接建立,手机APP可以发送开锁指令到门锁,门锁通过GPIO控制电机开锁。

通过使用ESP32提供的蓝牙API,蓝牙模块能够简洁地处理蓝牙通信,包括配对、数据传输等功能。


图示:

流程图:蓝牙开锁流程
+--------------------------+
| 配对与连接蓝牙设备       |
+--------------------------+|v
+--------------------------+
| 手机发送开锁指令         |
+--------------------------+|v
+--------------------------+
| 电机开锁(GPIO控制)     |
+--------------------------+

3. OTA在线升级

智能门锁支持OTA升级,让用户能够通过无线网络进行固件更新。这是通过ESP32的ESP-IDF框架实现的,框架中内置了支持OTA功能的API。

3.1 OTA升级过程
  • 任务启动:OTA升级任务会处于阻塞状态,等待手机APP的升级通知。
  • Wi-Fi连接:当APP通知门锁进行OTA时,门锁会首先连接到Wi-Fi。
  • 下载固件:使用ESP-IDF的ESPHTTPSOTA函数从服务器下载固件。
  • 重启与更新:下载完成后,门锁会通过ESPvstar重启并加载新固件。

通过OTA升级,门锁能够确保在未来的使用中持续获得新功能和安全补丁。


图示:

流程图:OTA升级流程
+----------------------------+
| 手机APP发送OTA升级指令    |
+----------------------------+|v
+----------------------------+
| 连接Wi-Fi并下载固件        |
+----------------------------+|v
+----------------------------+
| 重启并加载新固件          |
+----------------------------+

4. 总结

这篇博客回顾了智能门锁的几个核心功能,包括:

  • 多种开锁方式:密码开锁、指纹开锁和蓝牙开锁,确保了用户在不同场景下都能方便安全地使用门锁。
  • OTA升级功能:使门锁能够通过Wi-Fi无线升级,保持设备的长期更新与安全性。
  • FreeRTOS任务与中断机制:确保了设备操作的高效与实时性。

掌握这些核心功能和技术细节,不仅能够帮助你理解智能门锁项目的设计理念,也能在面试时清晰地回答相关问题。希望这篇博客能为你的面试准备提供帮助,助你更好地展示项目经验与技术能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6921.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DX12 快速教程(4) —— 画钻石原矿

快速导航 新建项目 "004-DrawTexture"纹理贴图纹理采样纹理过滤邻近点采样双线性过滤Mipmap 多级渐远纹理三线性过滤各向异性过滤 纹理环绕LOD 细节层次 开始画钻石原矿吧加载纹理到内存中:LoadTexture什么是 WIC如何用 WIC 读取一帧图片获取图片格式并转…

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转,旋转效果示意图如下: 为了实时对比旋转效果,采用分屏显示进行处理,左边代表旋转前的视频在屏幕中的位置,右边代表旋转后的视频在屏幕中的位置。 分屏显示的…

Blazor-选择循环语句

今天我们来说说Blazor选择语句和循环语句。 下面我们以一个简单的例子来讲解相关的语法,我已经创建好了一个Student类,以此类来进行语法的运用 因为我们需要交互性所以我们将类创建在*.client目录下 if 我们做一个学生信息的显示,Gender为…

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟 Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐&…

在 Ubuntu22.04 上安装 Splunk

ELK感觉太麻烦了,换个日志收集工具 Splunk 是一种 IT 工具,可帮助在任何设备上收集日志、分析、可视化、审计和创建报告。简单来说,它将“机器生成的数据转换为人类可读的数据”。它支持从虚拟机、网络设备、防火墙、基于 Unix 和基于 Windo…

【C++高并发服务器WebServer】-2:exec函数簇、进程控制

本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…

[ACTF2020 新生赛]Upload1

题目 以为是前端验证&#xff0c;试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…

第24篇 基于ARM A9处理器用汇编语言实现中断<六>

Q&#xff1a;怎样设计ARM处理器汇编语言程序使用定时器中断实现实时时钟&#xff1f; A&#xff1a;此前我们曾使用轮询定时器I/O的方式实现实时时钟&#xff0c;而在本实验中将采用定时器中断的方式。新增第三个中断源A9 Private Timer&#xff0c;对该定时器进行配置&#…

SpringMVC新版本踩坑[已解决]

问题&#xff1a; 在使用最新版本springMVC做项目部署时&#xff0c;浏览器反复500&#xff0c;如下图&#xff1a; 异常描述&#xff1a; 类型异常报告 消息Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [int] not specifie…

系统思考—复杂问题的根源分析

在企业中&#xff0c;许多问题看似简单&#xff0c;背后却潜藏着复杂的因果关系。传统的思维方式往往只能看到表面&#xff0c;而无法深入挖掘问题的真正根源。我们常常通过“表面解决”来应对眼前的症状&#xff0c;但这往往只是治标不治本。 比如&#xff0c;销量下降时&…

安装VMware17

一、VMware Workstation 简介 VMware Workstation是一款由VMware公司开发的功能强大的桌面虚拟化软件。它允许用户在单一的物理电脑上同时运行多个操作系统作为虚拟机&#xff08;VMs&#xff09;&#xff0c;每个虚拟机都可配置有自己的独立硬件资源&#xff0c;如CPU核心、内…

三、双链表

链表的种类有很多&#xff0c;单链表是不带头不循环单向链表&#xff0c;但双链表是带头循环双向链表&#xff0c;并且双链表还有一个哨兵位&#xff0c;哨兵位不是头节点 typedef int LTDataType;typedef struct ListNode{struct ListNode* next; //指针保存下⼀个结点的地址s…

【知识】可视化理解git中的cherry-pick、merge、rebase

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这三个确实非常像&#xff0c;以至于对于初学者来说比较难理解。 总结对比 先给出对比&#xff1a; 特性git mergegit rebasegit cherry-pick功能合并…

SpringBoot开发(三)SpringBoot介绍、项目创建、运行

1. SpringBoot 1.1. SpringBoot介绍 Spring Boot给世界程序员带来了春天&#xff0c;越来越多的企业选择使用spring boot来开发他们的软件&#xff0c;因此学习spring boot是科技发展的必然趋势。本门课程将从web最基础的知识点开始讲起&#xff0c;逐步带你攻破spring boot的…

438. 找到字符串中所有字母异位词

【题目】&#xff1a;438. 找到字符串中所有字母异位词 class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> res;vector<int> curVec(26, 0); // 统计p中字母出现的次数for(char c : p) {curVec[c - a];}for(int l 0, r …

Leetcode-两数之和

1.暴力枚举 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int lennums.size();int i,j;for(i0;i<len;i){for(ji1;j<len;j){if(nums[i]nums[j]target){return{i,j};}}}return {i,j};} }; 新知识&#xff1a; return {…

边缘网关具备哪些功能?

边缘网关&#xff0c;又称边缘计算网关&#xff0c;部署在网络边缘&#xff0c;它位于物联网设备与云计算平台之间&#xff0c;充当着数据流动的“守门员”和“处理器”。通过其强大的数据处理能力和多样化的通信协议支持&#xff0c;边缘网关能够实时分析、过滤和存储来自终端…

高等数学学习笔记 ☞ 微分方程

1. 微分方程的基本概念 1. 微分方程的基本概念&#xff1a; &#xff08;1&#xff09;微分方程&#xff1a;含有未知函数及其导数或微分的方程。 举例说明微分方程&#xff1a;&#xff1b;。 &#xff08;2&#xff09;微分方程的阶&#xff1a;指微分方程中未知函数的导数…

【优选算法】9----长度最小的子数组

----------------------------------------begin-------------------------------------- 铁子们&#xff0c;前面的双指针算法篇就算告一段落啦~ 接下来是我们的滑动窗口篇&#xff0c;不过有一说一&#xff0c;算法题就跟数学题一样&#xff0c;只要掌握方法&#xff0c;多做…

计算机网络之链路层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 02 数据链路层 在网上看到其他人做了详细的笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 1 详解数据链路层-数据链路层的功能【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51C…