一、前言
近幾年隨著科技的進(jìn)步和智能化浪潮的到來,智能穿戴設(shè)備也在飛速火爆發(fā)展,各種健康智能手環(huán),智能手表、智能跑鞋、智能眼鏡紛紛上市,并出現(xiàn)了很多針對(duì)個(gè)人家庭的健康管理設(shè)備。比如: 智能血壓計(jì)、智能心率檢測(cè)、脂肪秤、智能體重秤等等,都帶上了智能、健康各種標(biāo)簽。
可穿戴設(shè)備,即直接穿在身上,或是整合到用戶的衣服或配件的一種便攜式設(shè)備。可穿戴設(shè)備不僅僅是一種硬件設(shè)備,更是通過軟件支持以及數(shù)據(jù)交互、云端交互來實(shí)現(xiàn)強(qiáng)大的功能,可穿戴設(shè)備將會(huì)對(duì)生活、感知帶來很大的轉(zhuǎn)變。
這篇文章就利用STM32加上各種外設(shè)傳感器配合華為云IOT物聯(lián)網(wǎng)平臺(tái)設(shè)計(jì)一個(gè)健康管理設(shè)備,通過ESP8266+MQTT協(xié)議將數(shù)據(jù)傳輸導(dǎo)致華為云物聯(lián)網(wǎng)平臺(tái),并通過華為云的應(yīng)用側(cè)完成應(yīng)用層軟件開發(fā);設(shè)計(jì)本項(xiàng)目的目的就是,上手體驗(yàn)華為云物聯(lián)網(wǎng)平臺(tái),并探究一下智能設(shè)備的實(shí)現(xiàn)原理。
當(dāng)前設(shè)計(jì)的監(jiān)控管理設(shè)備支持的功能有: (1)人體溫度測(cè)量 (2)運(yùn)動(dòng)監(jiān)測(cè)、計(jì)步功能 (3)睡眠監(jiān)測(cè) (4)心率測(cè)量
STM32采集這些傳感器數(shù)據(jù)之后,進(jìn)行處理,在本地OLED顯示屏上完成顯示;再通過ESP8266將數(shù)據(jù)傳遞到華為云物聯(lián)網(wǎng)平臺(tái),關(guān)聯(lián)數(shù)據(jù)可視化大屏完成數(shù)據(jù)展示。
下面是示波器測(cè)量的心率顯示 :
設(shè)備運(yùn)行效果:
二、硬件介紹
2.1 主控芯片
主控芯片采用STM32F103C8T6,它一款基于ARM Cortex-M 內(nèi)核STM32系列的32位的微控制器,程序存儲(chǔ)器容量是64KB,RAM空間是20K,工作電壓2V~3.6V,運(yùn)行速度72MHZ。
2.2 體溫測(cè)量
人體溫度測(cè)量,采用非接觸式紅外測(cè)溫芯片GY-MCU90615,工作電壓 3-5v 功耗小,體積小。其工作原理, 是通過單片機(jī)讀取紅外溫度度數(shù)據(jù),串口(TTL 電平)通信方式輸出。串口的波特率有 9600bps 與 115200bps有連續(xù)輸出與詢問輸出兩種方式,可適應(yīng)不同的工作環(huán)境,與所有的單片機(jī)及電腦連接。
2.3 心率測(cè)量
心率測(cè)量,采用PulseSensor傳感器,這是一款用于脈搏心率測(cè)量的光電反射式模擬傳感器,通過模擬輸出口可將采集到的模擬信號(hào)傳輸給 STM32單片機(jī)用來轉(zhuǎn)換為數(shù)字信號(hào),再通過單片機(jī)簡單計(jì)算后就可以得到心率數(shù)值。
2.4 計(jì)步、睡眠監(jiān)測(cè)功能
計(jì)步模塊,睡眠監(jiān)測(cè),運(yùn)動(dòng)監(jiān)測(cè)功能采用MUP6050陀螺儀實(shí)現(xiàn),這是一款高性能三軸加速度+三軸陀螺儀的六軸傳感器,該模塊采用InvenSense 公司的 MPU6050 芯片作為核心, 該芯片內(nèi)部整合了3軸陀螺儀和3軸加速度傳感器,并可利用自帶的數(shù)字運(yùn)動(dòng)處理器硬件加速引擎,通過主 IIC 接口,向應(yīng)用端輸出姿態(tài)解算后的數(shù)據(jù)。有了DMP,可以使用 InvenSense 公司提供的運(yùn)動(dòng)處理資料庫,非常方便的實(shí)現(xiàn)姿態(tài)解算,降低了運(yùn)動(dòng)處理運(yùn)算對(duì)操作系統(tǒng)的負(fù)荷,同時(shí)大大降低了開發(fā)難度。 MPU6050 模塊具有:體積小、自帶 DMP、 自帶溫度傳感器、 支持 IIC 從機(jī)地址設(shè)置和中斷、兼容 3.3V/5V 系統(tǒng)、使用方便等特點(diǎn)。
(5)本地?cái)?shù)據(jù)顯示用的OLED顯示屏采用0.96寸的SPI接口顯示屏,分辨率為 128*64,主要是在本地顯示采集的數(shù)據(jù),時(shí)間等信息。
(6)上網(wǎng)的模塊采用ESP8266,ESP8266是物聯(lián)網(wǎng)領(lǐng)域常見無線網(wǎng)卡芯片,支持AT指令,支持串口協(xié)議控制,只需要幾個(gè)簡單的AT指令就可以完成網(wǎng)絡(luò)連接,數(shù)據(jù)傳輸。當(dāng)前項(xiàng)目里,就是通過ESP8266將采集的數(shù)據(jù)傳遞到華為云IOT平臺(tái),實(shí)現(xiàn)數(shù)據(jù)展示。
三、創(chuàng)建IOT產(chǎn)品、上云測(cè)試
3.1 創(chuàng)建產(chǎn)品
官網(wǎng)地址: https://www.huaweicloud.com/s/JeeJqeiBlOe9kSU
選擇IOTDA進(jìn)入,選擇免費(fèi)試用。
在產(chǎn)品頁面,選擇右上角創(chuàng)建產(chǎn)品。
根據(jù)提示,填入對(duì)應(yīng)參數(shù)。
創(chuàng)建好之后,查看產(chǎn)品詳情,進(jìn)入屬性配置頁面。
選擇自定義模型。
添加服務(wù)。
接下來就添加屬性,屬性就是傳感器上傳的數(shù)據(jù)類型,需要展示的數(shù)據(jù);根據(jù)自己傳感器的數(shù)量、類型自己設(shè)置即可。
添加心率傳感器數(shù)據(jù)屬性。
添加體溫傳感器數(shù)據(jù)屬性。
添加計(jì)步功能的數(shù)據(jù)屬性。
創(chuàng)建成功:
3.2 注冊(cè)設(shè)備
打開設(shè)備頁面,點(diǎn)擊右上角注冊(cè)設(shè)備按鈕,根據(jù)提示和產(chǎn)品的信息填入;創(chuàng)建完保存得到的信息。
點(diǎn)擊確定之后,創(chuàng)建成功效果如下;目前設(shè)備還未激活,需要設(shè)備登錄一次服務(wù)器即可激活;接下來就是如何登錄了。
3.3 設(shè)備上云測(cè)試
完成產(chǎn)品、設(shè)備創(chuàng)建之后,接下來采用MQTT客戶端模擬設(shè)備,測(cè)試是否可以正常上華為云。
連接協(xié)議使用MQTT協(xié)議,MQTT協(xié)議登錄服務(wù)器,就像QQ登錄一樣,需要輸入賬號(hào)、密碼等一些信息;下面先利用華為云的小工具完成這些數(shù)據(jù)的創(chuàng)建。
華為云提供的MQTT賬戶信息生成在線小工具: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
前面兩行填入的數(shù)據(jù),在創(chuàng)建設(shè)備成功時(shí)提示下載的文件里有,照著填寫即可。
我的設(shè)備生成的數(shù)據(jù)如下:
ClientId 61df9a6bc7fb24029b0c160d_1126626497_0_0_2022011303
Username 61df9a6bc7fb24029b0c160d_1126626497
Password 20618c172eb24418e0910804889c7d2074a5847e9e7205a41a8bf5adeec399f9
華為云IOT平臺(tái)的MQTT服務(wù)器地址信息如下:
端口: 1883
域名: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
IP地址: 121.36.42.100
華為云IOT平臺(tái)MQTT協(xié)議訂閱主題的格式:
格式: $oc/devices/{device_id}/sys/messages/down
//訂閱主題: 平臺(tái)下發(fā)消息給設(shè)備
$oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/messages/down
華為云IOT平臺(tái)MQTT協(xié)議上報(bào)主題的格式:
格式: $oc/devices/{device_id}/sys/properties/report
//設(shè)備上報(bào)主題請(qǐng)求
$oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/properties/report
?
?
//上報(bào)的數(shù)據(jù)格式如下
{"services": [{"service_id": "healthy","properties":{"HeartRate":127}},{"service_id": "healthy","properties":{"motion":2000}},{"service_id": "healthy","properties":{"temperature":36.2}}]}
打開MQTT客戶端,填入對(duì)應(yīng)數(shù)據(jù),連接華為云物聯(lián)網(wǎng)平臺(tái):
如需使用和我一樣的同款軟件,打開百度搜索MQTT客戶端_v2.4(協(xié)議3.1.1).exe
即可找到下載地址。
登錄成功后,查看華為云頁面,可以看到設(shè)備已經(jīng)在線,并且上傳的數(shù)據(jù)已經(jīng)展示出來。
四、應(yīng)用側(cè)軟件開發(fā)
4.1 功能介紹
為了更方便的展示設(shè)備數(shù)據(jù),與設(shè)備完成交互,還需要開發(fā)一個(gè)配套的上位機(jī),官方提供了應(yīng)用側(cè)開發(fā)的API接口、SDK接口,為了方便通用一點(diǎn),我這里采用了API接口完成數(shù)據(jù)交互,上位機(jī)軟件采用QT開發(fā)。
幫助文檔地址: https://support.huaweicloud.com/usermanual-iothub/iot_01_0045.html
4.2 查詢?cè)O(shè)備屬性接口
設(shè)備屬性就是設(shè)備上傳的傳感器狀態(tài)數(shù)據(jù)信息,應(yīng)用側(cè)提供了API接口,可以主動(dòng)向設(shè)備端下發(fā)請(qǐng)求指令;設(shè)備端收到指令之后需要按照約定的數(shù)據(jù)格式上報(bào)數(shù)據(jù);所以,要實(shí)現(xiàn)應(yīng)用層與設(shè)備端的數(shù)據(jù)交互,需要應(yīng)用層與設(shè)備端配合才能完成。
下面分別介紹應(yīng)用測(cè)和設(shè)備測(cè)的實(shí)現(xiàn)流程。
(1)應(yīng)用層下發(fā)的指令
幫助文檔地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html
接口的在線調(diào)試地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ListProperties
如果請(qǐng)求參數(shù)和返回值不清楚,寫代碼前,先使用在線調(diào)試接口體驗(yàn)一下,驗(yàn)證數(shù)據(jù)交互是否OK。
請(qǐng)求參數(shù)里比較總要的兩個(gè)必填參數(shù),是設(shè)備ID和服務(wù)ID,這兩個(gè)參數(shù)在第3章節(jié)就介紹過如何獲取了,在產(chǎn)品頁面創(chuàng)建自定義屬性時(shí)可以看到服務(wù)ID。
請(qǐng)求接口總結(jié):
請(qǐng)求方法 GET
URI地址 /v5/iot/{project_id}/devices/{device_id}/properties
傳輸協(xié)議 HTTPS
?
拼接好的地址:
https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/0e5957be8a00f53c2fa7c0045e4d8fbf/devices/61df9a6bc7fb24029b0c160d_1126626497/properties?service_id=1126626497
?
其中的project_id和device_id需要根據(jù)自己的設(shè)備信息修改。
?
?
請(qǐng)求頭:
{
"User-Agent": "API Explorer",
"X-Auth-Token": "******", 這個(gè)是鑒權(quán)用的token
"Content-Type": "application/json"
}
?
?
響應(yīng)體(設(shè)備上傳的數(shù)據(jù))
{
"response": {
"services": [
{
"service_id": "healthy",
"properties": {
"HeartRate": 127
}
},
{
"service_id": "healthy",
"properties": {
"motion": 2000
}
},
{
"service_id": "healthy",
"properties": {
"temperature": 36.2
}
}
]
}
}
請(qǐng)求頭里需要填X-Subject-Token
參數(shù),這個(gè)參數(shù)只要是訪問任何華為云都需要填,獲取具體的流程可以看這里。https://bbs.huaweicloud.com/blogs/317759 翻到第3小節(jié)。
(2)設(shè)備上傳數(shù)據(jù)
應(yīng)用層向設(shè)備端請(qǐng)求查詢?cè)O(shè)備屬性
時(shí),設(shè)備端會(huì)收到如下的消息:
$oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/properties/get/request_id=336bcb57-0e0a-44d0-90f7-31386cb54a3c{"service_id":"1126626497"}
這個(gè)消息里有一個(gè)主要參數(shù)request_id
請(qǐng)求ID,設(shè)備端需要解析出這個(gè)參數(shù),給應(yīng)用層響應(yīng)數(shù)據(jù)時(shí),需要帶上這個(gè)ID。
這個(gè)請(qǐng)求屬性詳細(xì)幫助文檔看這里: https://support.huaweicloud.com/api-iothub/iot_06_v5_3011.html
設(shè)備響應(yīng)的數(shù)據(jù)格式:
主題格式: $oc/devices/{device_id}/sys/properties/get/response/request_id={request_id}
?
示 例:
$oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/properties/get/response/request_id=336bcb57-0e0a-44d0-90f7-31386cb54a3c
?
響應(yīng)的數(shù)據(jù)格式:
{"services": [{"service_id": "healthy","properties":{"HeartRate":127}},{"service_id": "healthy","properties":{"motion":2000}},{"service_id": "healthy","properties":{"temperature":36.2}}]}
響應(yīng)的數(shù)據(jù)格式可以看這里的介紹: https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html
4.3 在線API調(diào)試結(jié)合設(shè)備模擬
下面使用MQTT客戶端與在線API接口聯(lián)合模擬一下接口效果:
(1)先打開調(diào)試頁面: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ListProperties
然后填好設(shè)備DI和服務(wù)ID:
(2)、打開MQTT客戶端,登錄華為云物聯(lián)網(wǎng)平臺(tái)(也就是模擬設(shè)備上線):
(3)、打開在線API調(diào)試頁面,點(diǎn)擊調(diào)試: 點(diǎn)擊后可以看到頁面上已經(jīng)在等待客戶端的響應(yīng)了。
(4)、MQTT客戶端響應(yīng)詳細(xì)
按照前面說的響應(yīng)格式,拼接好接口,數(shù)據(jù)。然后發(fā)布主題。
(5)、應(yīng)用層收到客戶端響應(yīng),調(diào)試成功
調(diào)試成功后,響應(yīng)體里收到的就是設(shè)備端上傳的設(shè)備屬性數(shù)據(jù)。
4.4 應(yīng)用層核心代碼
/*
功能: 獲取token
*/
void Widget::GetToken()
{
//表示獲取token
function_select=3;
?
QString requestUrl;
QNetworkRequest request;
?
//設(shè)置請(qǐng)求地址
QUrl url;
?
//獲取token請(qǐng)求地址
requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
.arg(SERVER_ID);
?
//自己創(chuàng)建的TCP服務(wù)器,測(cè)試用
//requestUrl="http://10.0.0.6:8080";
?
//設(shè)置數(shù)據(jù)提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));
?
//構(gòu)造請(qǐng)求
url.setUrl(requestUrl);
?
request.setUrl(url);
?
QString text =QString("{"auth":{"identity":{"methods":["password"],"password":"
"{"user":{"domain": {"
""name":"%1"},"name": "%2","password": "%3"}}},"
""scope":{"project":{"name":"%4"}}}}")
.arg(MAIN_USER)
.arg(IAM_USER)
.arg(IAM_PASSWORD)
.arg(SERVER_ID);
?
//發(fā)送請(qǐng)求
manager- >post(request, text.toUtf8());
}
?
//查詢?cè)O(shè)備屬性
void Widget::Get_device_properties()
{
//表示獲取token
function_select=0;
?
QString requestUrl;
QNetworkRequest request;
?
//設(shè)置請(qǐng)求地址
QUrl url;
?
//獲取token請(qǐng)求地址
requestUrl = QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/properties?service_id=%4")
.arg(SERVER_ID)
.arg(PROJECT_ID)
.arg(device_id)
.arg(service_id);
?
//自己創(chuàng)建的TCP服務(wù)器,測(cè)試用
//requestUrl="http://10.0.0.6:8080";
?
//設(shè)置數(shù)據(jù)提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
?
//設(shè)置token
request.setRawHeader("X-Auth-Token",Token);
?
//構(gòu)造請(qǐng)求
url.setUrl(requestUrl);
?
request.setUrl(url);
?
//發(fā)送請(qǐng)求
manager- >get(request);
}