摘要: uData框架設計之初的思想是基於傳統sensorhub概念基礎之上的,結合IoT的業務場景和AliOS Things物聯網操做系統的特色設計而成的一個面對IoT的感知設備處理框架。算法
點此查看原文:http://click.aliyun.com/m/40592/架構
uData誕生背景框架
uData框架設計之初的思想是基於傳統sensorhub概念基礎之上的,結合IoT的業務場景和AliOS Things物聯網操做系統的特色設計而成的一個面對IoT的感知設備處理框架。uData的主要目的是爲了解決IoT端側設備傳感器開發的週期長、應用算法缺乏和無雲端數據一體化等痛點問題。異步
uData概要介紹模塊化
uData設計之初是遵循分層解耦的模塊化設計原則,其目的是爲了讓uData根據客戶的不一樣業務和需求組件化作移植適配。下圖是當前架構模塊圖,主要分kernel和framework兩層,kernel層主要是負責傳感器驅動,硬件端口配置和相關的靜態校準,包括軸向校準等;framework層主要是負責應用服務管理、動態校準管理和對外模塊接口等。oop
uData關鍵模塊說明組件化
uData,目前主要有三大模塊支撐整個架構。其餘模塊都可以按照業務需求進行組件化配置或者增長新功能。spa
uData數據表操作系統
當前uData的框架中分別有三張數據表,應用服務表、抽象數據表,物理傳感器表。設計
uData數據類型
uData主要分兩種類型的數據,一種是uData的應用算法數據類型,開發者和外部模塊也只和這類型的數據進行通訊和交互;另一種是物理傳感器數據類別,存在於kernel的sensor驅動層,並和uData framework層進行通訊和交互,暫不對外。通常狀況下,每個應用算法服務數據會訂閱一個物理傳感器數據,也可能一個應用算法數據基於多個物理傳感器數據。
/* uData應用算法數據類型 */ typedef enum { UDATA_SERVICE_ACC = 0, /* Accelerometer */ UDATA_SERVICE_MAG, /* Magnetometer */ UDATA_SERVICE_GYRO, /* Gyroscope */ UDATA_SERVICE_ALS, /* Ambient light sensor */ UDATA_SERVICE_PS, /* Proximity */ UDATA_SERVICE_BARO, /* Barometer */ UDATA_SERVICE_TEMP, /* Temperature */ UDATA_SERVICE_UV, /* Ultraviolet */ UDATA_SERVICE_HUMI, /* Humidity */ UDATA_SERVICE_HALL, /* HALL sensor */ UDATA_SERVICE_HR, /* Heart Rate sensor */ UDATA_SERVICE_PEDOMETER, UDATA_SERVICE_PDR, UDATA_SERVICE_VDR, UDATA_MAX_CNT, }udata_type_e;
/* uData物理傳感器數據類型 */ typedef enum{ TAG_DEV_ACC = 0, /* Accelerometer */ TAG_DEV_MAG, /* Magnetometer */ TAG_DEV_GYRO, /* Gyroscope */ TAG_DEV_ALS, /* Ambient light sensor */ TAG_DEV_PS, /* Proximity */ TAG_DEV_BARO, /* Barometer */ TAG_DEV_TEMP, /* Temperature */ TAG_DEV_UV, /* Ultraviolet */ TAG_DEV_HUMI, /* Humidity */ TAG_DEV_HALL, /* HALL */ TAG_DEV_HR, /* Heart Rate */ TAG_DEV_SENSOR_NUM_MAX, } sensor_tag_e;
物理傳感器介紹
當前uData所支持的都是基於MEMS傳感器(微機電系統,Microelectro Mechanical System)來設計實現的,下表是對現有的傳感器作一個簡單的介紹,能夠增長對整個文檔的理解和uData的認識。
uData開機流程
在本章節中,涉及介紹uData的開機流程。主要是從系統開機,到內核初始化,sensor初始化,framework初始化再到uData的framework初始化。也能夠從下圖中能夠清楚的瞭解到整個初始化過程。
uData模塊間通訊模式
當前的uData模塊間通訊是基於AliOS Things的yloop異步處理機制的。當前uData所支持的異步事件按以下所示,也能夠在includeaosyloop.h中查閱相關信息:
/** uData event */ #define EV_UDATA 0x0004 #define CODE_UDATA_DEV_READ 1 #define CODE_UDATA_DEV_IOCTL 2 #define CODE_UDATA_DEV_OPEN 3 #define CODE_UDATA_DEV_CLOSE 4 #define CODE_UDATA_DEV_ENABLE 5 #define CODE_UDATA_DEV_DISABLE 6 #define CODE_UDATA_SERVICE_SUBSRIBE 7 /* 目前用於外部組件的訂閱,如數據上雲業務 */ #define CODE_UDATA_SERVICE_UNSUBSRIBE 8 /* 目前用於外部組件的退閱,如數據上雲業務 */ #define CODE_UDATA_SERVICE_PROCESS 9 #define CODE_UDATA_SERVICE_IOCTL 10 #define CODE_UDATA_REPORT_PUBLISH 11 /* 當uData數據準備好以後,會廣播事件通知相關的外部模塊 */
在uData框架的framework層,目前設計了一個任務調度器(uData_service_dispatcher)和一個定時器(g_abs_data_timer)來實現整個uData的通信機制。
數據讀取方式
輪詢方式(POLLING) :基於定時器發起的方式。
中斷方式(PUSH/INT):基於傳感器中斷髮起的方式。
通常業務,基本以輪詢方式來讀取數據都能知足業務需求,中斷方式基本用於低功耗管理,系統喚醒等業務居多,好比基於加速度計的系統喚醒機制。
根據上面的各模塊介紹,彙總了下圖來描述了對整個uData框架的總體實現和通信機制的理解和認識。
uData框架小結
本文主要是從uData的軟件設計實現方面來實現。關於uData移植,sensor驅動開發等請參考其餘相關的文檔。