基于LiteOS的智慧農(nóng)業(yè)案例實(shí)驗(yàn)分享
掃描二維碼
隨時(shí)隨地手機(jī)看文章
最近在指導(dǎo)一位讀者朋友做畢業(yè)設(shè)計(jì),該畢設(shè)是關(guān)于端云互通的,基于小熊派+LiteOS+華為云。
在指導(dǎo)他的過程中我也學(xué)到了不少東西,這里通過一個(gè)案例實(shí)驗(yàn)(智慧農(nóng)業(yè))給大家分享一些知識(shí)。
實(shí)驗(yàn)框圖
相關(guān)模塊簡介
1、STM32L431RCT6
2、LiteOS
LiteOS
是華為開發(fā)的輕量級(jí)實(shí)時(shí)操作系統(tǒng):
LiteOS
源碼GitHub
倉庫鏈接:
https://github.com/LiteOS/LiteOS
其源碼一級(jí)目錄結(jié)構(gòu)如下:
其內(nèi)核包括任務(wù)管理、內(nèi)存管理、時(shí)間管理、通信機(jī)制、中斷管理、隊(duì)列管理、事件管理、定時(shí)器等操作系統(tǒng)基礎(chǔ)組件,可以單獨(dú)運(yùn)行。
Huawei LiteOS是一個(gè)支持多任務(wù)的操作系統(tǒng)。在Huawei LiteOS中,一個(gè)任務(wù)表示一個(gè)線程。 其任務(wù)是搶占式調(diào)度機(jī)制,同時(shí)支持時(shí)間片輪轉(zhuǎn)調(diào)度方式。
高優(yōu)先級(jí)的任務(wù)可打斷低優(yōu)先級(jí)任務(wù),低優(yōu)先級(jí)任務(wù)必須在高優(yōu)先級(jí)任務(wù)阻塞或結(jié)束后才能得到調(diào)度。
創(chuàng)建任務(wù)示例:
左右滑動(dòng)查看全部代碼>>>
UINT32 creat_test_task(VOID)
{
UINT32 uwRet = LOS_OK;
TSK_INIT_PARAM_S task_init_param;
UINT32 TskHandle;
task_init_param.usTaskPrio = TASK_PRIO; /* 任務(wù)優(yōu)先級(jí) */
task_init_param.pcName = "test_task"; /* 任務(wù)名稱 */
task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)test_task; /* 任務(wù)入口函數(shù) */
task_init_param.uwStackSize = STACK_SIZE; /* 任務(wù)棧大小 */
/* 任務(wù)創(chuàng)建 */
uwRet = LOS_TaskCreate(&TskHandle, &task_init_param);
if(LOS_OK != uwRet)
{
return uwRet;
}
return uwRet;
}
3、華為云平臺(tái)
本次實(shí)驗(yàn)的云平臺(tái)為華為的OceanConnect
物聯(lián)網(wǎng)平臺(tái):
其云端開發(fā)框圖如下:
我們主要是用來做實(shí)驗(yàn),著重關(guān)注紅框里的內(nèi)容
。
下面簡單介紹一下Profile文件
、編解碼器插件
這兩塊大家可能比較陌生的部分:
(1)Profile文件開發(fā)
Profile
(即產(chǎn)品模型)是用來描述一款產(chǎn)品中的設(shè)備“是什么”、“能做什么”以及“如何控制該設(shè)備”的文件。
在物聯(lián)網(wǎng)平臺(tái)集成對(duì)接中需要先創(chuàng)建Profile,因?yàn)镻rofile里面定義了設(shè)備上報(bào)的數(shù)據(jù)和應(yīng)用服務(wù)器下發(fā)的命令包含了哪些字段。
定義Profile,即在物聯(lián)網(wǎng)平臺(tái)構(gòu)建一款設(shè)備的抽象模型
,使平臺(tái)理解該款設(shè)備支持的服務(wù)、屬性、命令、升級(jí)能力等信息。
Profile主要包含產(chǎn)品信息、服務(wù)能力和維護(hù)能力三部分:
本次實(shí)驗(yàn)我們主要關(guān)注紅框部分
,其具體表現(xiàn)如:
(2)編解碼插件開發(fā)
一款產(chǎn)品的設(shè)備上報(bào)數(shù)據(jù)時(shí),如果“數(shù)據(jù)格式”為二進(jìn)制碼流
,則該產(chǎn)品需要進(jìn)行編解碼插件開發(fā);如果“數(shù)據(jù)格式”為JSON
,則該產(chǎn)品下不需要進(jìn)行編解碼插件開發(fā)。兩種數(shù)據(jù)舉例:
作為物聯(lián)網(wǎng)的終端設(shè)備,比較講究的就是功耗
問題了,這個(gè)問題也關(guān)乎到通信傳輸?shù)臄?shù)據(jù)量的問題。
上圖舉例的兩種數(shù)據(jù)格式其實(shí)代表著同樣的信息,雖然對(duì)于我們程序員而言,我們更容易讀懂JSON
格式的數(shù)據(jù)包含的信息;但是對(duì)于設(shè)備而言,其更喜歡二進(jìn)制流格式的數(shù)據(jù)了。
因?yàn)槭褂枚M(jìn)制流來表示的話傳輸?shù)臄?shù)據(jù)量就會(huì)小很多,進(jìn)而可以降低功耗
。其實(shí)這個(gè)二進(jìn)制流格式也很好理解,是按照特定格式的,比如:
本次實(shí)驗(yàn)我們?cè)O(shè)備端發(fā)送與接收的數(shù)據(jù)均為二進(jìn)制流格式數(shù)據(jù),因此需要進(jìn)行云端編碼器插件的開發(fā)。下面是設(shè)備數(shù)據(jù)上報(bào)的流程:
4、BH1750光強(qiáng)度傳感器
BH1750
是一種用于兩線制串行總線接口的16位
數(shù)字型光強(qiáng)度傳感器集成電路。利用它的高分辨率可以探測較大范圍的光強(qiáng)度變化。(1lx~65535lx
)。
主要特性:
-
支持 IIC BUS 接口 -
光源依賴性弱 -
有兩種可選的 IIC slave 地址 -
最小誤差變動(dòng)在±20%
5、SHT30溫濕度模塊
溫濕度傳感器 SHT30
的溫度范圍為-40℃~125℃
,濕度范圍為0%RH~100%RH
。
主要特性:
-
完全校準(zhǔn)的線性化,溫度補(bǔ)償式的數(shù)字輸出 -
電壓范圍 2.4V-5.5V -
通信速度高達(dá) 1MHz 的 IIC 接口,兩個(gè)可選的用戶地址 -
相對(duì)濕度誤差± 2%RH -
溫度誤差± 0.3%
6、補(bǔ)光燈模塊
與普通的LED的控制一樣,通過一個(gè)GPIO來控制其亮、滅。
7、直流電機(jī)模塊
通過一個(gè)GPIO來控制其轉(zhuǎn)、停。
重要步驟解析
我們可以用Keil MDK
來編寫、編譯代碼,也可以使用LiteOS Studio
來編寫、編譯代碼。
在解析重要步驟之前有必要介紹一下LiteOS Studio
。
LiteOS Studio
是LiteOS集成開發(fā)環(huán)境,一站式開發(fā)工具,支持C、C++、匯編等語言,讓您快速,高效的進(jìn)行物聯(lián)網(wǎng)開發(fā)。
主題默認(rèn)是大家都喜歡的暗黑色,使用起來也比較簡單,其用Makefile來管理工程,使用時(shí)添加新的源文件需要同步更新Makefile
文件:
1、讀取傳感器數(shù)據(jù)并顯示至LCD
準(zhǔn)備BH1750
與SHT30
傳感器驅(qū)動(dòng)。這里跟初學(xué)者分享一點(diǎn)經(jīng)驗(yàn),看這些傳感器驅(qū)動(dòng)代碼的時(shí)候不要只看代碼。
這種與實(shí)際硬件(芯片)密切相關(guān)的代碼光看代碼是沒有多大意義的,只會(huì)越看越懵。
因此正確姿勢應(yīng)該是對(duì)照著datasheet
一起看,需要寫出這些代碼得好好研讀datasheet
。
一般比較成熟的傳感器驅(qū)動(dòng)網(wǎng)上都有很多現(xiàn)成的可以直接用的,多數(shù)情況下我們很少去親自寫這個(gè)。
特別是工作之后,能copy的代碼堅(jiān)決不自己寫,老板可不看你代碼寫得多秀,只看你任務(wù)完成得怎么樣。
但是還是有必要了解一下這些驅(qū)動(dòng)代碼怎么寫出來的方法,萬一某天需要我們自己寫呢。下面我們從例程代碼中扣出一些核心代碼:
我們最終要用到的就是最后一個(gè)函數(shù)來讀取傳感器數(shù)據(jù),然后顯示在LCD上,核心代碼:
結(jié)果:
這個(gè)結(jié)果多了一個(gè)煙感數(shù)據(jù)。這里簡單說明一下:寫這篇筆記時(shí)用的是智慧農(nóng)業(yè)的模塊。后來才加了一個(gè)煙感模塊,改起來比較麻煩就沒去改了,所以上面的一些圖的說明沒有煙感模塊。
2、云端配置
在設(shè)備端接入云端之前,遇到對(duì)云端進(jìn)行相應(yīng)的配置。這里也是抽取出重要的步驟,具體的步驟可以查看華為云上相關(guān)的文檔,很詳細(xì):
文檔鏈接:
https://support.huaweicloud.com/devg-IoT/iot_02_9994.html
(1)創(chuàng)建產(chǎn)品:
有幾種方式創(chuàng)建產(chǎn)品,這里我們選擇自定義的方式,學(xué)會(huì)了自定義的方式創(chuàng)建產(chǎn)品了,其它幾種方式就更簡單了。
(2)Profile、編解碼器插件開發(fā)
接著進(jìn)行產(chǎn)品開發(fā),主要是進(jìn)行Profile文件與編解碼器插件的開發(fā)。
Profile文件有兩種開發(fā)方式:離線的方式與在線的方式。我們使用在線的方式創(chuàng)建,創(chuàng)建的Profile文件如下:
編解碼器插件的開發(fā)依賴與Profile文件,我們創(chuàng)建的編解碼器插件如下:
(3)調(diào)測
接著驗(yàn)證我們的Profile文件與編解碼器插件,這里有兩種方法驗(yàn)證.
一是創(chuàng)建真實(shí)的設(shè)備
,這個(gè)需要我們真實(shí)的設(shè)備端進(jìn)行連接測試,下面我們?cè)僮鲞@一步;
二是使用虛擬的設(shè)備
。這里我們使用虛擬的設(shè)備進(jìn)行驗(yàn)證:
3、設(shè)備端開發(fā)
設(shè)備端我們使用LiteOS SDK端云互通組件agent tiny
對(duì)接IoT平臺(tái)。
借助這個(gè)組件我們只需要調(diào)用幾個(gè)API函數(shù)就可以很方便地連接華為IOT平臺(tái),其重要接口函數(shù)如下:
左右滑動(dòng)查看全部代碼>>>
/* LiteOS SDK端云互通組件的初始化接口 */
int atiny_init(atiny_param_t* atiny_params, void** phandle);
/* LiteOS SDK端云互通組件的主函數(shù)體 */
int atiny_bind(atiny_device_info_t* device_info, void* phandle);
/* LwM2M標(biāo)準(zhǔn)對(duì)象向設(shè)備下發(fā)命令的統(tǒng)一入口 */
int atiny_cmd_ioctl(atiny_cmd_e cmd, char* arg, int len);
/* LiteOS SDK端云互通組件數(shù)據(jù)上報(bào)接口 */
int atiny_data_report(void* phandle, data_report_t* report_data);
設(shè)備對(duì)接IOT平臺(tái)的流程示意圖:
其實(shí)本云端互通實(shí)驗(yàn)主要圍繞的就是一個(gè)agent_tiny
任務(wù),其任務(wù)入口函數(shù)就是這個(gè)流程圖上的agent_tiny_entry
函數(shù)。
這個(gè)入口函數(shù)里面主要做的內(nèi)容是:atiny的初始化、對(duì)于入?yún)tiny_params的設(shè)定(要根據(jù)具體的業(yè)務(wù)來進(jìn)行)。
還有創(chuàng)建一些子任務(wù)(數(shù)據(jù)采集任務(wù)、數(shù)據(jù)上報(bào)任務(wù)、下發(fā)命令的應(yīng)答任務(wù)),最后進(jìn)行到。
核心代碼如端云互通組件的主函數(shù)體,具體核心代碼如:
左右滑動(dòng)查看全部代碼>>>
void agent_tiny_entry(void)
{
UINT32 uwRet = LOS_OK;
atiny_param_t *atiny_params;
atiny_security_param_t *iot_security_param = NULL;
atiny_security_param_t *bs_security_param = NULL;
atiny_device_info_t *device_info = &g_device_info;
// 省略部分內(nèi)容。。。。。。。。。。。。
device_info->endpoint_name = g_endpoint_name;
atiny_params = &g_atiny_params;
atiny_params->server_params.binding = "UQ";
// 省略部分內(nèi)容。。。。。。。。。。。。
/* LiteOS SDK端云互通組件的初始化接口 */
if(ATINY_OK != atiny_init(atiny_params, &g_phandle))
{
return;
}
/* 創(chuàng)建數(shù)據(jù)采集任務(wù) */
uwRet = creat_collection_task();
if (uwRet != LOS_OK)
{
return ;
}
/* 創(chuàng)建數(shù)據(jù)上報(bào)任務(wù) */
uwRet = creat_report_task();
if(LOS_OK != uwRet)
{
return;
}
/* 創(chuàng)建一個(gè)信號(hào)量 */
uwRet = LOS_SemCreate(0,&reply_sem);
if (uwRet != LOS_OK)
{
return ;
}
/* 創(chuàng)建下發(fā)命令的應(yīng)答任務(wù) */
uwRet = creat_reply_report_task();
if (uwRet != LOS_OK)
{
return ;
}
/* LiteOS SDK端云互通組件的主函數(shù)體 */
(void)atiny_bind(device_info, g_phandle);
}
更具體的代碼就不展開了,篇幅好像有點(diǎn)長了。。。
除此之外,在對(duì)接云端之前,還需要一個(gè)可以聯(lián)網(wǎng)的媒介,這里我們選用的是ESP8266,使用AT設(shè)備框架來管理我們的ESP8266設(shè)備:
現(xiàn)在,我們就可以使用真實(shí)的設(shè)備對(duì)接云端了,對(duì)接云端需要一個(gè)設(shè)備標(biāo)識(shí)碼,用ESP8266
模塊時(shí)需要我們自己創(chuàng)建一個(gè)標(biāo)識(shí)碼。
用其它聯(lián)網(wǎng)模塊如NB-IOT
模塊則只需使用模塊出廠自帶的設(shè)備碼即可。這里我們創(chuàng)建的設(shè)備標(biāo)識(shí)碼為:
這個(gè)標(biāo)識(shí)碼其實(shí)就是在我們上面的agent_tiny_entry
函數(shù)中有配置給device_info
設(shè)備結(jié)構(gòu)體了。然后使用這個(gè)標(biāo)識(shí)碼在云端創(chuàng)建設(shè)備:
4、web應(yīng)用開發(fā)
上面在調(diào)試階段已經(jīng)可以上傳云端到IOT平臺(tái)了,也可以看到數(shù)據(jù)了。但是那些數(shù)據(jù)對(duì)于用戶來說總歸是看不習(xí)慣吧,我們開發(fā)產(chǎn)品就是為了給用戶使用、給用戶看的。
所以最終體現(xiàn)出來給用戶的不應(yīng)該是一堆數(shù)據(jù),而是一個(gè)對(duì)用戶較友好的可視化界面。
華為物聯(lián)網(wǎng)開發(fā)平臺(tái)也給我們提供了web應(yīng)用開發(fā)的環(huán)境:
這里的應(yīng)用開發(fā)也比較簡單,通過拖拽一些空間,簡單修改一下控件的一些屬性即可:
最終效果:
實(shí)驗(yàn)結(jié)果演示視頻
總結(jié)
以上就是本次分享的智慧農(nóng)業(yè)案例實(shí)驗(yàn),本次實(shí)驗(yàn)用了華為IOT平臺(tái),其實(shí)其它平臺(tái)用起來也是類似的,之后有時(shí)間再分享其它云平臺(tái)的案例實(shí)驗(yàn)。
上面分享的很多步驟其實(shí)不算詳細(xì),關(guān)于這個(gè)實(shí)驗(yàn)更詳細(xì)的步驟內(nèi)容可以聯(lián)系我獲取相關(guān)文檔資料、包括代碼。
原創(chuàng)不易,感謝閱讀,期待在看、分享~
猜你喜歡:
AT指令測試ESP8266通信模組并獲取天氣數(shù)據(jù)
后臺(tái)回復(fù):加群。添加小編,加入技術(shù)交流群
點(diǎn)個(gè)贊,證明你還愛我
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請(qǐng)聯(lián)系我們,謝謝!