1@page sensor sensor 2 3[更正文档](https://gitee.com/alios-things/sensor/edit/master/README.md)      [贡献说明](https://help.aliyun.com/document_detail/302301.html) 4 5# 概述 6uData 框架设计思想是基于传统 sensorhub 概念基础之上的,结合IoT的业务场景和 AliOS Things 物联网操作系统的特点设计而成的一个面对 IoT 的感知设备处理框架。为了能更好的提供每个开发者极简开发,uData 已将驱动相关的 OS 调用,比如中断注册接口,设备硬件配置接口等都抽象到了sensor hal 实现。每一个设备驱动程序,只需一个 .c文件中,通过 BUS 总线如 I2C,对设备进行读写和配置操作,就能实现全部的功能,同时也减少了开发者调试工作时间。可以方便地开发传感器驱动程序。 7 8sensor 组件是 udata 组件的 Sensor Driver 部分,可单独提供 sensor hal 接口给外部模块使用,而无需使用 udata 组件全部功能。 9## 组件支持以下功能: 10- 传感器的硬件抽象层; 11- 统一的I2C和SPI总线驱动程序; 12- 已集成100多个传感器驱动; 13 14## 版权信息 15> Apache license v2.0 16 17## 目录结构 18```tree 19. 20├── drv #已集成的Sensor设备驱动程序 21│ ├── drv_acc_adi_adxl345.c 22│ ├── ... 23│ └── drv_temp_humi_si_si7006.c 24├── example 25│ ├── sensor_cloud_demo.c #示例,获取传感器数据并在本地进行打印; 26│ └── sensor_local_demo.c #示例,获取传感器数据并通过linkkit上传到云端; 27├── hal 28│ ├── gps_parse.c #gps数据处理分析 29│ ├── sensor_drv_api.c #提供给外部模块使用的Sensor Hal接口 30│ ├── sensor_hal.c #传感器驱动调用接口 31│ └── sensor_static_calibrate.c #静态校准配置接口 32├── include #头文件 33│ ├── gps_parse.h 34│ ├── sensor 35│ │ └── sensor.h 36│ ├── sensor_drv_api.h 37│ ├── sensor_hal.h 38│ └── sensor_static_calibrate.h 39├── package.yaml #编译配置文件 40└── README.md 41``` 42 43## 依赖组件 44* ulog 45* vfs 46* i2c 47* spi 48 49# 常用配置 50系统中相关配置已有默认值,如需修改配置,统一在yaml中**def_config**节点修改,具体如下: 51> Sensor 的设备驱动程序默认不编译, 可在yaml中添加驱动对应的宏进行配置,如添加温度传感器驱动 SI7006 52```yaml 53def_config: 54 AOS_SENSOR_TEMP_SI_SI7006: 1 55``` 56 57# API说明 58@ref sensor_hal_init() 59传感器器驱动初始化 60 61@ref sensor_hal_open() 62打开传感器,即让指定的传感器进入工作状态 63 64@ref sensor_hal_read() 65读取传感器数据 66 67@ref sensor_hal_write() 68向传感器发送数据,暂时未使用 69 70@ref sensor_hal_ioctl() 71对传感器的参数进行设置 72 73@ref sensor_hal_close() 74关闭指定的传感器 75 76# 使用示例 -- Sensor hal 本地演示 77 78基于 Sensor Hal 接口获取传感器数据,并在本地进行打印,参考 example/sensor_local_demo.c 79 80> 注意: sensor 组件需配合传感器进行使用,haaseduk1 开发板有自带传感器,本示例基于 haaseduk1 自带的温湿度传感器 SI7006 进行演示。haas100 用户可自行外接传感器参考本示例进行验证。 81 82组件使用示例相关的代码下载、编译和固件烧录均依赖AliOS Things配套的开发工具,所以首先需要参考[《AliOS Things集成开发环境使用说明之搭建开发环境》](https://help.aliyun.com/document_detail/302378.html),下载安装。 83待开发环境搭建完成后,可以按照以下步骤进行示例的测试。 84 85## 1. 创建或打开工程 86 87**打开已有工程** 88 89如果用于测试的案例工程已存在,可参考[《AliOS Things集成开发环境使用说明之打开工程》](https://help.aliyun.com/document_detail/302381.html)打开已有工程。 90 91**创建新的工程** 92 93组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择helloworld_demo案例。helloworld_demo案例相关的源代码下载可参考[《AliOS Things集成开发环境使用说明之创建工程》](https://help.aliyun.com/document_detail/302379.html),硬件类型选择“haas edu k1”, 解决方案选择“ helloworld 简单示例”。 94 95## 2. 添加组件 96 97案例下载完成后,需要在helloworld_demo组件的package.yaml中添加对组件的依赖: 98 99```yaml 100depends: 101 - init: master 102 - cli: master 103 - osal_aos: master 104 - haaseduk1: master 105 - sensor: master 106``` 107在执行编译步骤时,会自动下载 sensor 组件及依赖的相关组件,sensor组件源码被下载到了./components/sensor路径中。 108 109## 3. 添加示例 110> solutions/helloworld_demo/package.yaml 配置信息 def_config 中添加要运行的 example 示例代码和 Sensor 设备驱动的宏。例如温湿度传感器 si7006 数据并在本地进行打印: 111 112```yaml 113def_config: 114 AOS_SENSOR_LOCAL_DEMO_ENABLE: 1 115 AOS_SENSOR_HUMI_SI_SI7006: 1 116 AOS_SENSOR_TEMP_SI_SI7006: 1 117``` 118 119## 4. 编译固件 120 121在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译helloworld_demo案例来生成固件了,具体编译方法可参考[《AliOS Things集成开发环境使用说明之编译固件》](https://help.aliyun.com/document_detail/302384.html)。 122 123## 5. 烧录固件 124 125helloworld_demo案例的固件生成后,可参考[《AliOS Things集成开发环境使用说明之烧录固件》](https://help.aliyun.com/document_detail/302383.html)来烧录固件。 126 127## 6. 打开串口 128 129固件烧录完成后,可以通过串口查看示例的运行结果,打开串口的具体方法可参考[《AliOS Things集成开发环境使用说明之查看日志》](https://help.aliyun.com/document_detail/302382.html)。 130 131当串口终端打开成功后,可在串口中输入help来查看已添加的测试命令。 132 133## 7. 测试示例 134 135> CLI命令行输入: 136```sh 137sensor_local_test 138``` 139 140**关键日志** 141> CLI日志: 142```sh 143Temperature value : 144Humidity value : 145``` 146 147# 使用示例 -- Sensor hal 连云演示 148基于 Sensor Hal 接口获取传感器数据,并通过 linkkit 上传到云端,参考 example/sensor_cloud_demo.c 149 150> 注意: sensor 组件需配合传感器进行使用,haaseduk1 开发板有自带传感器,本示例基于 haaseduk1 自带的温湿度传感器 SI7006 进行演示。haas100 用户可自行外接传感器参考本示例进行验证。 151 152以运行 linksdk_demo 为例,具体步骤如下: 153 154## 1. 创建或打开工程 155 156**打开已有工程** 157如果用于测试的案例工程已存在,可参考[《AliOS Things集成开发环境使用说明之打开工程》](https://help.aliyun.com/document_detail/302381.html)打开已有工程。 158 159**创建新的工程** 160 161组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择 linkkit_demo 案例。 linkkit_demo 案例相关的源代码下载可参考[《AliOS Things集成开发环境使用说明之创建工程》](https://help.aliyun.com/document_detail/302379.html),硬件类型选择“haas edu k1”, 解决方案选择“ WI-FI设备连接阿里云示例”。 162 163## 2. 添加示例代码 164> 2.1 solutions/helloworld_demo/package.yaml 配置信息 def_config 中添加要运行的 example 示例代码和 Sensor 设备驱动的宏。例如温湿度传感器 si7006 数据并通过 linkkit 上传到云端: 165```yaml 166def_config: 167 AOS_SENSOR_CLOUD_DEMO_ENABLE: 1 168 AOS_SENSOR_HUMI_SI_SI7006: 1 169 AOS_SENSOR_TEMP_SI_SI7006: 1 170``` 171> 2.2 solutions/linksdk_demo/main.c 添加 sensor_cloud_test_init() 函数调用 172``` 173extern void sensor_cloud_test_init(void); 174int application_start(int argc, char *argv[]) 175{ 176 aos_set_log_level(AOS_LL_DEBUG); 177 sensor_cloud_test_init(); 178 event_service_init(NULL); 179 ... 180} 181``` 182> 2.3 solutions/linksdk_demo/data_model_basic_demo.c 的 demo_main() 函数中 183- 替换你自己在阿里云物联网平台上创建设备的三元组信息,下面三元组仅本示例测试所用 184``` 185extern void sensor_cloud_test_start(void *dm_handle); 186int demo_main(int argc, char *argv[]) 187{ 188 ... 189 aiot_sysdep_network_cred_t cred; /* 安全凭据结构体, 如果要用TLS, 这个结构体中配置CA证书等参数 */ 190 191 /* TODO: 替换为自己设备的三元组 */ 192 char *product_key = "a1eykua9RBq"; 193 char *device_name = "haas-edu-k1-calon"; 194 char *device_secret = "589bb9ff1d55675096ba6ba2e0d52392"; 195 196 /* 配置SDK的底层依赖 */ 197 aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); 198 ... 199} 200``` 201- 注释掉其它属性上报和事件上报,添加 sensor_cloud_test_start() 函数调用, 202```sh 203extern void sensor_cloud_test_start(void *dm_handle); 204int demo_main(int argc, char *argv[]) 205{ 206 ... 207 208 /* 主循环进入休眠 */ 209 while (1) { 210 /* TODO: 以下代码演示了简单的属性上报和事件上报, 用户可取消注释观察演示效果 */ 211 // demo_send_property_post(dm_handle, "{\"LightSwitch\": 0}"); 212 // demo_send_event_post(dm_handle, "Error", "{\"ErrorCode\": 0}"); 213 214 sensor_cloud_test_start(dm_handle); 215 aos_msleep(1000); 216 } 217 218 ... 219} 220``` 221## 3. 添加 sensor 组件 222> solutions/linksdk_demo/package.yaml 依赖信息 depends 末尾添加 sensor 组件 223```yaml 224depends: 225 - linksdk: master 226 - mbedtls: master 227 - netmgr: master 228 - lwip: master 229 - uservice: master 230 - wifi: master 231 - cli: master 232 - haaseduk1: master 233 - sensor: master 234``` 235 236## 4. 编译固件 237 238在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译 linkkit_demo 案例来生成固件了,具体编译方法可参考[《AliOS Things集成开发环境使用说明之编译固件》](https://help.aliyun.com/document_detail/302384.html)。 239 240## 5. 烧录固件 241 242linkkit_demo 案例的固件生成后,可参考[《AliOS Things集成开发环境使用说明之烧录固件》](https://help.aliyun.com/document_detail/302383.html)来烧录固件。 243 244## 6. 示例测试 245### 设备联网 246> CLI命令行输入:打开连网成功后会自动保存AP信息的功能 247```sh 248netmgr -t wifi -b 1 249``` 250> CLI命令行输入:netmgr -t wifi -c {ssid} {password} 连接名为ssid的路由器AP,其中 {ssid} {password}替换为自己的路由器配网信息 251```sh 252netmgr -t wifi -c my_wifi 12345678 253``` 254> 设备在联网成功后会自动读取 Sensor 数据并上报到云端,同时可以看到设备在阿里云物联网平台处于在线状态,在日志服务中能查看设备上传到云端的日志信息 255 256## 7. 关键日志 257> CLI日志: 258```sh 259AIOT_MQTTEVT_CONNECT 260Humidity value : 15.3 H 261[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post 262Temperature value : 42.0 centidegree 263[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post 264[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post_reply 265[LK-0A08] DM recv generic reply 266demo_dm_recv_handler, type = 0 267msg_id = 1, code = 200, data = {}, message = success 268``` 269 270# 注意事项 271sensor设备驱动 components/sensor/drv/drv_####_####_####.c 中 i2c_dev_t 结构体成员 port 要与 sensor_i2c_init() 初始化中的 port 相同。 272``` 273void i2c_init(void) 274{ 275 i2c_dev_t i2c_dev; 276 i2c_dev.port = 1; 277 i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT; 278 i2c_dev.config.freq = I2C_BUS_BIT_RATES_100K; 279 i2c_dev.config.mode = I2C_MODE_MASTER; 280 281 sensor_i2c_init(&i2c_dev); 282} 283 284i2c_dev_t ####_ctx = { 285 .port = 1, 286 .config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT, 287 .config.freq = I2C_BUS_BIT_RATES_100K, 288 .config.mode = I2C_MODE_MASTER, 289 .config.dev_addr = SI7006_I2C_ADDRESS, 290}; 291``` 292 293# FAQ 294Q1: 怎么自己添加特定型号的传感器驱动程序? 295> 1. 参考 components/sensor/drv/drv_####_####_####.c 已集成的传感器设备驱动编写驱动文件; 296 297> 2. components/sensor/drv/drv_init.c 中添加驱动程序的宏开关, 如 298```sh 299#if AOS_SENSOR_TEMP_SI_SI7006 300 drv_temp_si_si7006_init(); 301#endif 302``` 303> 3. components/sensor/package.yaml 中添加参与编译的源代码文件 304``` 305source_file: 306 - drv/drv_temp_humi_si_si7006.c ? <AOS_SENSOR_TEMP_SI_SI7006> 307``` 308更具体的操作可以参考下面链接: 309- [AliOS Things uData Sensor Driver Porting Guide](https://github.com/alibaba/AliOS-Things/wiki/AliOS-Things-uData-Sensor-Driver-Porting-Guide) 310