LV01-01-AliOSThings-16-事件驱动-01-事件驱动的基本概念

本文主要是事件驱动——事件驱动的基本概念的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu22.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
点击查看本文参考资料
分类 网址 说明
官方网站 阿里云 阿里云官网主页
阿里生活物联平台 生活物联网平台(飞燕平台)主页
AliGenie 天猫精灵开放平台AliGenie主页
阿里物联网平台 阿里物联网平台主页
Bluetooth 技术网站 蓝牙协议规范什么的可以来这里找
Telink Telink | Chips for a Smarter IoT (telink-semi.com)
Telink中文官网
开发手册 AliOS Things开发指南 AliOS Things开发指南,这里是最新版本,可以直接从官网找到
AliOS Things开发指南 AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档
AliOS Things开发指南(3.0) AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档
生活物联网平台开发文档 生活物联网平台(飞燕平台)开发文档
《设备端开发指南》
Wi-Fi IoT品类定义与功能开发 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发
硬件平台 mk3080 WiFi开发板 WiFi开发板使用指南-阿里云开发者社区
esp8266开发板 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com)
TLSR8258 Datasheet Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258
参考资料 AliOS Things 3.0 应用开发指南 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考
IP知识百科 - 华为 (huawei.com) IP的一些相关知识点
点击查看相关文件下载
分类 网址 说明
蓝牙规范相关文档 Core Specification 5.2 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。
《Core_v5.2.pdf》
Mesh Model(v1.1) 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。
本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。
《MshMDL_v1.1.pdf》
Mesh Profile(v1.0.1) 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。
《MshPRFv1.0.1.pdf》
Mesh Device Properties 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。
但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》
GATT Specification Supplement GATT Specification Supplement | Bluetooth® Technology Website。
好像可以在线看:《GATT Specification Supplement》
Assigned Numbers GATT的一些类型定义可以在这里找。
AliOS Things alios-things/AliOS-Things Gitee上的AliOSThings SDK源码仓库
alibaba/AliOS-Things GitHub上的AliOSThings SDK源码仓库
天猫精灵蓝牙Mesh协议栈 alibaba-archive/genie-bt-mesh-stack GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。
之前是在alibaba/genie-bt-mesh-stack这个仓库。
写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a
蓝牙Mesh设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

一、事件驱动的基本概念

1. 事件驱动解决什么问题?

主要是解决高并发问题,其实下面的两个图并没有让我很好的理解为什么是解决高并发问题的,这里只是做个笔记,后面理解了再补充。

  • node.js
timg

node.js是一个服务器后端开发的框架,它的内部就存在大量的事件库,如上图的uv、libeio核libev,这些暂时不做详细了解。

  • linux下的一个事件驱动库基本逻辑
image-20200723181834974

为什么可以处理高并发?因为在这个过程中没有阻塞。

2. 是什么是事件驱动?

还是来看一下百度百科:事件驱动是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。在计算机编程、公共关系、经济活动等领域均有应用。

所谓事件驱动,简单地说就是点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数)。当然事件不仅限于用户的操作。事件驱动的核心自然是事件。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制(函数名往往取为类似于HandleMsg的一个名字)。对于框架的使用者来说,他们能够看到的是事件处理器。这也是他们所关心的内容。

说实话,其实没怎么看懂,大概理解一下吧。其实大概来说事件驱动编程是一种软件开发方法,其中系统的行为由外部事件触发而不是通过程序的顺序流控制。在事件驱动编程中,主要有以下几个概念:

(1)事件(Event):外部触发的信号或输入,可以是硬件事件(如按键、传感器触发)、软件事件(如定时器、网络数据到达)等。

(2)事件处理器(Event Handler):对特定事件进行响应和处理的函数或模块。

(3)事件循环(Event Loop):负责监听事件并调用相应的事件处理器的主循环。

(4)回调函数(Callback):在事件处理器中注册的函数,当特定事件发生时自动被调用。

事件驱动编程的核心思想是通过注册事件处理器和回调函数来实现对事件的响应,以及在事件循环中等待事件发生并处理。就比如说前面学习linux的时候接触到的信号、定时器、I/O多路复用和设备驱动等。几种常见的事件驱动编程技术:

(1)信号(Signal):Linux通过信号机制来处理各种异步事件,包括外部硬件中断、进程间通信等。通过使用signal()函数注册信号处理器,可以在信号发生时执行相应的处理函数。

(2)定时器(Timer):利用Linux提供的定时器接口,可以创建定时器事件,并在特定时间间隔触发回调函数。定时器可以用于实现周期性任务或者超时检测等功能。

(3)I/O多路复用(I/O Multiplexing):通过select()、poll()或epoll()等系统调用,可以同时监听多个文件描述符上的事件,并在有事件发生时进行通知。这种方法适用于处理大量文件描述符的场景,比如网络服务器。

(4)设备驱动(Device Driver):在嵌入式系统中,可以通过编写设备驱动程序来实现对硬件事件的响应。设备驱动程序负责与硬件交互,并将硬件事件转换为Linux可处理的事件,然后调用相应的事件处理器进行处理。

3. 一个事件驱动的例子

下面以一个简单的智能家居系统为例,说明如何利用Linux事件驱动编程进行嵌入式系统的开发。以此来理解这个事件驱动的概念。

假设我们的智能家居系统中有多个传感器(如温度传感器、湿度传感器)和执行器(如LED灯、电风扇)。我们希望通过事件驱动的方式实现以下功能:

(1)当温度超过某个阈值时,触发温度报警事件。

(2)当湿度过高时,触发除湿事件。

(3)当用户通过手机App发送控制命令时,执行相应的操作。

实现该系统的关键步骤如下:

(1)注册事件处理器:根据不同的传感器或执行器,编写相应的事件处理器函数,并将其注册到事件循环中。例如,当温度传感器检测到温度超过阈值时,触发温度报警事件并调用相应的事件处理器函数。

(2)监听事件:在事件循环中使用合适的事件监听机制(如定时器、I/O多路复用)来监听传感器和外部输入事件。当事件发生时,事件循环将自动调用对应的事件处理器函数。

(3)执行操作:根据事件处理器函数的实现,执行相应的操作。例如,当温度报警事件发生时,可以发送警报通知用户;当抽湿事件发生时,控制电风扇的开启和关闭。

二、AliOSThings中的事件驱动

1. Yloop概要

Yloop是AliOS Things的异步事件框架。Yloop借鉴了,libuv及嵌入式业界常见的event loop,综合考虑使用复杂性,性能,及footprint,实现了一个适合于MCU的事件调度机制。

2. Yloop调度

Yloop实现了对IO,timer,callback,event的统一调度管理(AliOSThings已将帮我们实现了的):

  • IO:最常见的是Socket,也可以是AliOS Things的vfs(虚拟文件系统)管理的设备,可以通过read/write来操作。
  • timer:即常见的定时器。
  • callback:特定的执行函数。
  • event:包括系统事件和用户自定义事件。

当调用aos_loop_run后,当前任务将会等待上述的各类事件发生。可以理解为一个事件处理任务,里面会遍历着我们注册的事件。

3. 事件驱动基本原理

Yloop利用协议栈的select接口实现了对IO及timer的调度。AliOS Things自带的协议栈又暴露一个特殊的eventfd接口,Yloop利用此接口把VFS的设备文件,和eventfd关联起来,实现了对整个系统的事件的统一调度。

image-20201016133322932