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