TuyaOS Sensor Hub组件介绍
文章目录
- Sensor Hub 设计思想
- 分层设计
- Sensor Hub 层(tdl)
- Sensor Driver 层(tdd)
- 传感数据元素类型抽象
- 传感器采集策略
- Sensor Hub 对上数据与接口
- 数据结构
- 1. 数据读取的触发模式
- 2. 元素型数据订阅规则
- 3. 数据就绪通知回调
- 4. 传感设备信息
- 应用接口
- 1. 创建传感器实例
- 2. 启动传感器
- 3. 停止传感器
- 4. 配置传感器参数
- 5. 读取传感器实时数据
- Sensor Hub 对下数据与接口
- 数据结构
- 驱动接口抽象
- 驱动注册接口
- 驱动开发流程
- Sensor Hub使用流程
Sensor Hub 是 TuyaOS 传感器管理组件,可以实现对传感器设备的硬件抽象,设备管理和数据处理。基于 sensor_hub 开发传感器应用时,开发者无需关注传感器的传输协议,只需要对传感器挂载硬件接口、工作方式、采集间隔等进行配置,然后在事件回调中读取传感器处理即可。
通过 Sensor Hub 管理传感器,可快速新增、切换新的传感器,而无需修改上层应用程序。
开发者可使用 tuyaos_sensor_hub_demo_quickstart 体验 Sensor Hub 组件,将多种传感器设备加入到智能设备中,实现更多设备智能化。
Sensor Hub 设计思想
分层设计
Sensor Hub 组件采用软硬件分层设计,分为 sensor hub 逻辑实现层、sensor driver 驱动层,可在驱动层添加新驱动实现新传感器快速接入。
Sensor Hub 层(tdl)
主要功能:
- 对应用提供统一的传感交互接口
- 对传感驱动提供统一的适配接口
- 给应用提供多种比较通用的采集策略
Sensor Driver 层(tdd)
主要功能:
- 传感器实例化
- 对应用提供挂载到 Sensor Hub 上的注册接口
传感数据元素类型抽象
传感上报的数据类型由 Sensor Driver 层配置,即由传感器实例决定。
- 元素型
传感器采集的某一类数据可以根据其物理含义抽象为一种元素 (element),复合型传感则包含多种元素,如温湿度传感器就包含了 2 种元素:温度、湿度。一组数据中包含了 几种元素、各元素名称 (ID)、各元素值的数据类型 均由 Sensor Driver 层配置。
元素值的数据类型可分为整型、浮点型。
- 透传型
传感数据存储的具体格式由 Sensor Driver 层配置,以二进制形式存储。
传感器采集策略
目前 Sensor Hub 支持以下采集策略配置:
- 数据读取的触发模式
- 软定时轮询
- 硬件定时轮询
- IO中断
-
传感数据组缓存 fifo 深度
-
数据订阅模式
- 元素组(每次返回都是所有元素数据)
- 单元素(每次返回仅一种元素数据)
- 数据订阅规则设定
- 数据组数
- 过滤规则(最大值/最小值/步进值)
Sensor Hub 对上数据与接口
数据结构
1. 数据读取的触发模式
/*** @brief 采集触发模式*/
typedef BYTE_T SR_TRIG_MODE_E;
#define SR_MODE_POLL_SOFT_TM 0 // 轮询(软件定时)
#define SR_MODE_POLL_HARD_TM 1 // 轮询(硬件定时)
#define SR_MODE_EXTI 2 // 外部中断(GPIO)/*** @brief 工作模式配置*/
typedef struct {SR_TRIG_MODE_E trig_mode; // 采集触发方式UINT_T poll_intv_ms; // 轮询方式:采集间隔(ms)TUYA_GPIO_NUM_E irq_pin; // 中断方式:中断引脚TUYA_GPIO_IRQ_E irq_mode; // 中断方式:中断模式
} SR_WORK_MODE_T;
2. 元素型数据订阅规则
/*** @brief 元素型数据订阅类型*/
typedef BYTE_T SR_ELE_SUB_TP_E;
#define SR_ELE_SUB_TP_GROUP 0 // 以组的形式上报应用订阅的所有元素的数据
#define SR_ELE_SUB_TP_SINGLE 1 // 一一上报应用订阅的每个元素的数据/*** @brief 过滤规则*/
typedef union {struct {INT_T max; // 最大值INT_T min; // 最小值UINT_T step; // 步进值(非0:前后变化低于该值的会被过滤)} i; // 整型struct {FLOAT_T max; // 最大值FLOAT_T min; // 最小值FLOAT_T step; // 步进值(非0:前后变化低于该值的会被过滤)} f; // 浮点型
} SR_FILTETR_U;/*** @brief 元素型数据订阅规则* @note val_num仅在订阅类型为SR_ELE_SUB_TP_SINGLE时有效,且其值不能超过fifo_size*/
typedef struct {UCHAR_T id; // 元素IDUCHAR_T val_num; // 每次订阅的元素值个数SR_FILTETR_U filter; // 过滤规则
} SR_ELE_SUB_RULE_T;/*** @brief 元素型数据订阅配置* 拓展功能 (可选)*/
typedef struct {SR_ELE_SUB_TP_E tp; // 元素型数据订阅方式UCHAR_T num; // 元素订阅数量,也是元素型数据订阅规则数量SR_ELE_SUB_RULE_T *rule; // 元素型数据订阅规则
} SR_ELE_SUB_CFG_T;
3. 数据就绪通知回调
/*** @brief 元素型数据缓存结构*/
typedef struct {UCHAR_T id; // 元素IDSR_VAL_TP_E val_tp; // 元素值类型UCHAR_T val_num; // 元素值个数SR_VAL_U *val; // 元素值(存储地址)
} SR_ELE_BUFF_T;/*** @brief 数据就绪通知回调*/
typedef VOID_T (*SR_ELE_INFORM_CB)(CHAR_T* name, UCHAR_T buf_num, SR_ELE_BUFF_T *ele_data);
typedef VOID_T (*SR_RAW_INFORM_CB)(CHAR_T* name, UINT_T raw_num, SR_RAW_DATA_T *raw_data);
typedef union {SR_ELE_INFORM_CB ele; // 用于元素型数据SR_RAW_INFORM_CB raw; // 用于透传型数据
} SR_INFORM_CB_T;
4. 传感设备信息
/*** @brief 传感设备注册信息*/
typedef struct {SR_WORK_MODE_T mode; // 数据采集模式SR_INFORM_CB_T inform_cb; // 数据就绪通知回调UCHAR_T fifo_size; // 存放返回给app数据的缓存大小SR_ELE_SUB_CFG_T *ele_sub; // 元素型数据订阅模型配置(不使用则写NULL)
} SR_DEV_CFG_T;/*** @brief 传感设备句柄*/
typedef VOID_T* SENSOR_HANDLE_T;
应用接口
1. 创建传感器实例
/*** @brief 查找传感设备* @param[in] dev_name: 传感设备名称* @param[out] handle: 传感设备句柄* @return 操作结果*/
OPERATE_RET tdl_sensor_dev_find(CHAR_T *dev_name, SENSOR_HANDLE_T* handle);
2. 启动传感器
/*** @brief 启动传感设备* @param[in] handle: 传感设备句柄* @param[in] config: 设备配置参数* @return 操作结果*/
OPERATE_RET tdl_sensor_dev_open(SENSOR_HANDLE_T handle, SR_DEV_CFG_T* config);
3. 停止传感器
/*** @brief 启动传感设备* @param[in] handle: 传感设备句柄* @return 操作结果*/
OPERATE_RET tdl_sensor_dev_close(SENSOR_HANDLE_T handle);
4. 配置传感器参数
/*** @brief 配置传感设备* @param[in] handle: 传感设备句柄* @param[in] cmd: 配置命令* @param[in] param: 配置命令参数* @return 操作结果*/
OPERATE_RET tdl_sensor_dev_config(SENSOR_HANDLE_T handle, UCHAR_T cmd, VOID_T *param);
5. 读取传感器实时数据
/*** @brief 读取传感实时数据* @param[in] handle: 设备句柄* @param[in] ele_num: 元素个数,0表示透传型* @param[inout] ele_data: 元素型数据,不使用时写NULL* @param[out] raw_data: 透传型数据,不使用时写NULL* @return 操作结果*/
OPERATE_RET tdl_sensor_dev_read(IN SENSOR_HANDLE_T handle, IN UCHAR_T ele_num,INOUT SR_ELE_DATA_T *ele_data, OUT SR_RAW_DATA_T *raw_data);
Sensor Hub 对下数据与接口
数据结构
- 元素数据类型配置
/*** @brief 元素数据类型配置*/
typedef struct {UCHAR_T id; // 元素IDSR_VAL_TP_E val_tp; // 元素值类型
} SR_ELE_CFG_T;
- 驱动依赖资源信息
/*** @brief 资源信息*/
typedef struct {UCHAR_T type; // 资源类型(I2C/SPI/...)UCHAR_T port; // 资源端口VOID_T* handle; // 资源句柄(暂时没有用到)UCHAR_T info[SR_RSRC_INFO_LEN]; // 其他资源信息
} SR_RSRC_T;
驱动接口抽象
/*** @brief 驱动接口抽象*/
typedef struct {OPERATE_RET (*open)(SR_RSRC_T* dev);OPERATE_RET (*close)(SR_RSRC_T* dev);OPERATE_RET (*control)(SR_RSRC_T* dev, UCHAR_T cmd, VOID_T *param);OPERATE_RET (*read_ele)(SR_RSRC_T* dev, SR_ELE_DATA_T *ele_data, UCHAR_T ele_num); OPERATE_RET (*read_raw)(SR_RSRC_T* dev, SR_RAW_DATA_T *raw_data);
} SR_INTFS_T;
驱动注册接口
/*** @brief 注册传感设备* @param[in] dev_name: 传感设备名称* @param[in] intfs: 传感设备操作接口(内存由具体的传感器分配)* @param[in] ele_num: 传感数据元素个数,0表示采用透传型(内存由具体的传感器分配)* @param[in] ele_cfg: 每个元素的数据类型配置* @param[in] resource: 传感设备依赖的资源信息* @return 操作结果*/
OPERATE_RET tdl_sensor_register(CHAR_T *dev_name, SR_INTFS_T *intfs, UCHAR_T ele_num, \SR_ELE_CFG_T *ele_cfg, SR_RSRC_T *resource);
驱动开发流程
- 确定传感数据存储方式,如果选择元素型,则需确定有哪些
元素
及每个元素值的数据类型
; - 确定传感驱动的
外设
类型和需要配置的内容,比如 I2C、SPI …; - 确定注册设备时需要做哪些处理,有哪些 资源信息 需要暂存至 SensorHub,实现
tdd_sensor_xxx_register
接口;(传感的通用初始化可以在注册时进行,或者使用控制命令进行,即由用户决定何时初始化) - 确定传感是否有启动测量和停止测量命令,实现
open
和close
接口; - 确定传感读数据的过程,实现
read_ele
或read_raw
接口; - 确定除读数据外是否需要增加其他的配置命令,实现
control
接口。
Sensor Hub使用流程
- 调用
tdd_sensor_xxx_register
注册 xxx 设备。 - 调用
tdl_sensor_dev_find
查找 xxx 设备,获得设备句柄(确认 xxx 设备是否注册成功)。 - 调用
tdl_sensor_dev_config
配置 xxx 设备(启动前的一些必要配置;启动后也可通过调用该接口控制设备)。 - 调用
tdl_sensor_dev_open
启动 xxx 设备(在需要启动时调用),同时需要编写数据通知回调函数。 - 调用
tdl_sensor_dev_read
读取 xxx 设备的实时数据(有需要时)。 - 调用
tdl_sensor_dev_close
停止 xxx 设备(在需要停止时调用)。
相关文章:
TuyaOS Sensor Hub组件介绍
文章目录 Sensor Hub 设计思想分层设计Sensor Hub 层(tdl)Sensor Driver 层(tdd) 传感数据元素类型抽象传感器采集策略 Sensor Hub 对上数据与接口数据结构1. 数据读取的触发模式2. 元素型数据订阅规则3. 数据就绪通知回调4. 传感设备信息 应用接口1. 创建传感器实例2. 启动传感…...
【实战】React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(总结展望篇)
文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...
Leetcode.321 拼接最大数
题目链接 Leetcode.321 拼接最大数 hard 题目描述 给定长度分别为 m m m 和 n n n 的两个数组,其元素由 0 ∼ 9 0 \sim 9 0∼9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k k k ( k ≤ m n ) (k \leq m n) (k≤mn) 个数字拼接成…...
数学建模竞赛常用代码总结-PythonMatlab
数学建模过程中有许多可复用的基础代码,在此对 python 以及 MATLAB 中常用代码进行简单总结,该总结会进行实时更新。 一、文件读取 python (pandas) 文件后缀名(扩展名)并不是必须的,其作用主要一方面是提示系统是用…...
在Ubuntu上安装CUDA和cuDNN以及验证安装步骤
在Ubuntu上安装CUDA和cuDNN以及验证安装步骤 本教程详细介绍了如何在Ubuntu操作系统上安装CUDA(NVIDIA的并行计算平台)和cuDNN(深度神经网络库),以及如何验证安装是否成功。通过按照这些步骤操作,您将能够…...
SecureCRT ssh链接服务器
SecureCRT通过密钥进行SSH登录 说明: 一般的密码方式登录容易被密码暴力破解。所以一般我们会将 SSH 的端口设置为默认22以外的端口,或者禁用root账户登录。其实可以通过密钥登录这种方式来更好地保证安全。 密钥形式登录的原理是:利用密钥…...
linux之perf(3)top实时性能
Linux之perf(3)top实时性能 Author:Onceday Date:2023年9月3日 漫漫长路,才刚刚开始… 注:该文档内容采用了GPT4.0生成的回答,部分文本准确率可能存在问题。 参考文档: Tutorial - Perf Wiki (kernel.org)perf-to…...
【linux命令讲解大全】076.pgrep命令:查找和列出符合条件的进程ID
文章目录 pgrep补充说明语法选项参数实例 从零学 python pgrep 根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID(PID) 补充说明 pgrep 命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程ID。每一个进程ID以一个…...
微信小程序开发---条件渲染和列表渲染
目录 一、条件渲染 (1)基本使用 (2)block (3)hidden 二、列表渲染 (1)基本使用 (2)手动指定索引和当前项的变量名 (3)wx:key的…...
【ES6】require、export和import的用法
在JavaScript中,require、export和import是Node.js的模块系统中的关键字,用于处理模块间的依赖关系。 1、require:这是Node.js中引入模块的方法。当你需要使用其他模块提供的功能时,可以使用require关键字来引入该模块。例如&…...
Vue + Element UI 前端篇(九):接口格式定义
接口请求格式定义 前台显示需要后台数据,我们这里先把前后端交互接口定义好,没有后台的时候,也方便用mock模拟。 接口定义遵循几个规范: 1. 接口按功能模块划分。 系统登录:登录相关接口 用户管理:用户…...
部署Django报错-requires SQLite 3.8.3 or higher
记一次CentOS7部署Django项目时的报错 问题出现 在部署测试环境时,有需要用到一个python的后端服务,要部署到测试环境中去 心想这不是so easy吗,把本地调试时使用的python版本及Django版本在服务器上对应下载好,然后直接执行命…...
什么是网络存储服务器
网络存储器就像一台只有存储功能的终端,独立地工作,里面带有固定的系统,但可以自己设置部分参数功能,可以接入服务器或者电脑进行设置,网络存储服务器实际上就是精简的、小型化的服务器,同样由主板、CPU&am…...
lv3 嵌入式开发-10 NFS服务器搭建及使用
目录 1 NFS服务器介绍 1.1 NFS服务器的介绍 1.2 NFS服务器的特点 1.3 NFS服务器的适用场景 2 NFS服务器搭建 2.1 配置介绍 2.2 常见错误 3 WINDOWS下NFS服务器搭建(扩展) 1 NFS服务器介绍 1.1 NFS服务器的介绍 nfs(Network File Sys…...
后流量时代的跨境风口:Facebook广告
Facebook拥有超过25亿各个年龄段和人群的每月活跃用户,可以帮助您接触世界各地的相关消费者。无论您是需要吸引新的潜在客户还是吸引回头客访问您的在线商店,Facebook广告都可以为电子商务提供丰厚的投资回报;无论您是在沃尔玛、eBay、亚马逊…...
Java基础学习笔记-2
前言 在计算机编程领域,条件语句和控制流结构是构建程序逻辑的基本组成部分。它们允许程序员根据不同的条件执行不同的操作,从而使程序更加灵活和智能。本文将深入探讨Java编程语言中的条件语句和控制流,提供了一系列实用的示例和技巧&#…...
Mongodb 安装脚本(附服务器自启动)
shell脚本 #!/bin/bash #mail:xuelanchnet.com #function:auto install mongodb [ $(id -u) ! "0" ] && echo "Error: You must be root to run this script" && exit 1 logfile"/var/log/mongod_install.log" softdir"/s…...
yolov5的pytorch配置
1. conda create -n rdd38 python3.82、pip install torch1.8.0 torchvision0.9.0 torchaudio0.8.0 -f https://download.pytorch.org/whl/cu113/torch_stable.html -i https://pypi.tuna.tsinghua.edu.cn/simple 3、conda install cudatoolkit10.2...
ISO 19712-1-2008装饰用实体面材检测
实体面材是指由聚合物材料、填料和颜料组成,经浇筑或压制等工艺成型的板型产品或非板型产品,主要用于厨房台面,家具等领域。 ISO 19712-1-2008装饰用实体面材测试 测试项目 测试标准 耐干热 ISO 19712-3 ISO 19712-2 耐湿热 ISO 19712-…...
华为OD机试 - 最多颜色的车辆 - 数据结构map(Java 2022Q4 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路1、核心思想2、题做多了,你就会发现,这道题属于送分题,为什么这样说?3、具体解题思路: 五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B…...
Mybatis 插入、修改、删除
前面几篇我们介绍了使用Mybatis查询数据,并且也了解了如何在Mybatis中使用JDK的日志系统打印日志;本篇我们继续介绍如何使用Mybatis完成数据的插入、修改和删除。 如果您对查询数据和Mybatis集成JDK日志系统不太了解,建议您先进行了解后再阅…...
2023年9月DAMA-CDGA/CDGP数据治理认证火热招生中
DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…...
【SpringCloudAlibaba】Seata分布式事务使用
文章目录 分布式事务问题示例Seata概述、官网一个典型的分布式事务过程处理过程全局GlobalTransactional分布式交易解决方案流程图 Seata安装下载修改conf目录下的application.yml配置文件dashboard demo 分布式事务问题示例 单体应用被拆分成微服务应用,原来的三个…...
Java-day13(IO流)
IO流 凡是与输入,输出相关的类,接口等都定义在java.io包下 1.File类的使用 File类可以有构造器创建其对象,此对象对应着一个文件(.txt,.avi,.doc,.mp3等)或文件目录 File类对象是与平台无关的 File中的方法仅涉及到如何创建,…...
Vue2项目练手——通用后台管理项目第四节
Vue2项目练手——通用后台管理项目 数据的请求mock数据模拟实战文件目录src/api/mock.jssrc/api/mockServeData/home.jsmain.js 首页组件布局可视化图表可视化图表布局Home.vue echarts表Home.vue 数据的请求 mock数据模拟实战 mock官方文档 前端用来模拟后端接口的工具&…...
linux运维(二)内存占用分析
一、centos内存高,查看占用内存, top命令详解 1.1: free 命令是 free 单位K free -m 单位M free -h 单位Gfree最常规的查看内存占用情况的命令 1.2: 参数说明 total 总物理内存 used 已经使用的内存 free 没有使用的内存 shared 多进程共享内存 buff/cache 读写…...
go logger 不侵入业务代码 用slog 替换 zap 并实现 callerSkip
快速体验 以下是 项目中 已经用slog替换 zap 后的 logger 使用方法,无任何感知,与之前一模一样 package mainimport "github.com/webws/go-moda/logger"func main() {// 格式化打印 {"time":"2023-09-08T01:25:21.31346308:00","level&qu…...
vuez 与 Vue3 响应式比较
Vue2 的响应式 对象:通过 defineProperty 对对象的已有属性值的读取和修改进行劫持(监视/拦被)。 数组:通过重写数组、更新数组等一系列更新元素的方法来实现元素修改的劫持。 存在的问题如下: &#…...
【Apollo学习笔记】——规划模块TASK之PIECEWISE_JERK_SPEED_OPTIMIZER
文章目录 TASK系列解析文章前言PIECEWISE_JERK_SPEED_OPTIMIZER功能简介PIECEWISE_JERK_SPEED_OPTIMIZER相关配置PIECEWISE_JERK_SPEED_OPTIMIZER流程QP问题的标准类型定义:优化变量设计目标函数约束条件相关矩阵二次项系数矩阵 H H H一次项系数向量 q q q设定OSQP求…...
CNI、CSI 和 CRI在 Docker 中的角色和作用
摘要 CNI(Container Network Interface): CNI 是用于容器网络的接口标准,它定义了容器和网络插件之间的通信协议。CNI 的主要作用是为容器创建和管理网络接口。当创建一个容器时,CNI 插件会被调用来为容器创建一个网络…...
杭州建设网杭州建设工程招标平台/seo软件服务
foreach只是简单的遍历读取,不能在循环中进行remove等操作。 for可以转载于:https://www.cnblogs.com/lb12081116/p/4384587.html...
做企业网站推广多少钱/百度竞价排名事件分析
目录 第二章 掌控SpringBoot基础篇 2.1 Spring Boot ? 2.1.1 与Spring关系 2.1.2 与SpringCloud关系 2.1.3 最新的Spring Boot3 新特性 2.1.4 如何学好框架 2.2 脚手架 2.2.1 使用脚手架创建项目 2.2.2 IDEA创建SpringBoot项目 2.3 代码结构 2.3.1.1 单一模块…...
网站建设背景图/seo和网络推广有什么区别
一、ls命令 -l :列出长数据串,包含文件的属性与权限数据等 -a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用) -d :仅列出目录本身,而…...
湛江的网站建设公司/如何在各种网站投放广告
大家或多或少都用过 MySQL,起码 select 还是会用的吧,但是 select 执行后,MySQL 内部到底发生了什么,你知道吗?比如,我们有个简单的表 T,它有个 ID 字段,那么我们可以执行下面的语句…...
敦化网站建设/seo怎么做优化
题意:中文。。 思路: 这里的等级限制是,与他本身交易的以及间接交易的都不能超过m。所以我们在树形DP时,维护可行区间即可。 关键是在维护可行区间时卡住了。 View Code #include <iostream> #include <cstdio> #in…...
z-blog与wordpress/一句简短走心文案
依据《专利法》的规定,专利被别人恶意抢注的,不能直接要回来,但可以向专利管理部门申请宣告专利无效。专利管理部门宣告专利无效后,当事人可以申请该专利注册。关于专利被抢注了该怎么才能拿回来的问题,泸州律师在线已…...