HarmonyOS開發者創新大賽已於2021年5月24日落幕,在本次賽事中,來自古都西安的開拓者戰隊憑藉《智慧農場》這款作品最終獲得大賽三等獎,該作品通過HarmonyOS的分散式軟匯流排、分散式資料庫技術、分散式任務排程、分散式跨裝置資料流轉等能力實現了多裝置(感測器、智慧屏等)的互聯互通、自動控制,實現了農場場景下多裝置協同智慧養殖體驗,令人印象深刻。
以下是“開拓者戰隊”基於HarmonyOS打造《智慧農場》作品的相關思考以及關鍵技術的簡單分享:
1.背景介紹
目前,市面上智慧農業相關的廠商裝置(感測器等)相對獨立,沒有統一的作業系統平臺,互聯互通困難,且大多數裝置部署需要連線,部署成本時間長,成本高,維護複雜度高。隨著5G網路的覆蓋,下一代全場景作業系統(HarmonyOS)的出現,讓萬物互聯變得更加方便,可以實現一部手機操作所有IoT裝置,實現各個IoT裝置的互聯互通。智慧農場系統是基於HarmonyOS實現了多個IoT裝置(感測器,電機,大屏等裝置)的互聯互通、自動控制,並實現全場景化的智慧養殖。智慧農場通過各項感測器裝置對農場的各項環境指標進行實時檢測,並且可以進行自適應調節,讓動物一直處於一個良好的生長環境。通過本系統可以實現指標超過閾值預警,智慧提醒,智慧求助等功能,讓農場養殖門檻變低,讓農場主輕鬆成為養殖專家。
2.需求分析
智慧農場系統通過對農場的空氣溫,溼度、光照度等各項環境引數進行實時採集,確保農場主可隨時通過智慧手機APP瞭解農場狀況。同時,系統可以根據農場內外環境因子的變化進行自適應調解,不僅能保證農場中的動物長期處於良好的生長環境中,還能提升動物的產量和質量。本系統的特色業務功能包括:精細化智慧提醒,專家視訊求助等。
智慧提醒功能體現在多個場景中,如:農場溫度過高,降溫裝置有損壞或者指定時間內溫度沒有降下來等異常情況出現時,系統會直接給管理者進行電話提醒或者訊息推送;不僅如此,系統還會根據動物的年齡,對不同動物的生長週期進行預測,提醒管理者為動物打疫苗。智慧求助功能則體現為,當管理者遇到一些養殖常識問題,可以通過智慧求助查到相關幫助資訊;同時,也提供了養殖專家視訊求助功能,幫助管理者及時的解決養殖方面遇到的疑難雜症。
3.解決方案
本解決方案涉及角色:農場主,養殖專家;涉及硬體裝置:手機、智慧屏、開發板,各型別感測器(比如:溫溼度感測器、可燃氣體感測器、光敏感測器、人體紅外感測器等)以及各項外設(比如:風扇,加水裝置,取暖裝置等)。手機、智慧屏、開發板基於HarmonyOS,通過WIFI組網,實現各項裝置之間的互聯互通。農場主可以通過手機APP對養殖場景中的各項環境指標(溫溼度閾值範圍、可燃氣體濃度範圍、光照強度等)進行設定,也可設定定時任務(比如:定時加水、加料,定時播放音樂等),實現智慧化提醒和自動化控制。解決方案中養殖技術和案例等資訊的查詢和分析等服務,由雲端的資料服務提供,專家視訊求助功能的視訊通話服務由雲端提供。
4.主要模組介紹
資料採集模組 (以採集溼度為例)
系統啟動成功後,資料採集模組會啟動定時任務採集溫度資料,定時從溫度感測器採集一次當前溫度資料。如果採整合功,存入分散式資料庫(KV方式儲存),採集到的溫度資料會實時重新整理到溫度顯示介面。溫度資料範圍:-40~80℃。採集到的資料,可以流轉到大屏方便使用者檢視。(採集流程見下圖1)
業務流程:
圖1採集溫度資料流程
自動控制模組(以溫度控制為例)
定時獲取當前溫度資料與使用者設定的正常閾值範圍或者最大閾值範圍(來自:Preferences)進行比較。如果當前溫度在正常閾值範圍內,不做處理;如果超過正常閾值範圍,未超過最大閾值範圍(比如:正常範圍:5~30℃),包括兩種情況:
1.低於5℃,開啟加熱裝置,並呼叫智慧提醒模組通知使用者;溫度恢復正常範圍,關閉裝置。
2.高於30℃,開啟風扇降溫,並呼叫智慧提醒模組通知使用者;溫度恢復正常範圍,關閉裝置。
如果超過最大閾值範圍(比如:最大閾值範圍:<-20℃或>60℃),包括兩種情況:
1.低於-20℃,開啟多個加熱裝置,並呼叫智慧提醒模組,傳送通知,並撥打電話通知使用者;溫度恢復正常範圍,關閉裝置。
2.高於60℃,開啟噴水降溫,並呼叫智慧提醒模組,傳送通知,並撥打電話通知使用者;溫度恢復正常範圍,關閉裝置。(控制流程見下圖2)
圖2 溫度控制流程
5.關鍵技術細節實現
1)分散式多裝置發現,實現多裝置協同、排程
分散式裝置發現關鍵程式碼:
List onlineDevices = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
分散式裝置任務排程關鍵程式碼:
Intent intent = new Intent();
Operation operation =
new Intent.OperationBuilder()
.withDeviceId(devicesId)
.withBundleName(getBundleName())
.withAbilityName(Ability.class.getName())
.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
.build();
intent.setOperation(operation);
2)分散式資料流轉
呼叫continueAbility進行實現資料流轉(關鍵程式碼)
continueAbility(chooseDevice.getDeviceInfo().getDeviceId());
3)socket通訊實現裝置間互聯互通(如下關鍵程式碼)
//呼叫NetManager.getInstance(Context)獲取網路管理的例項物件。
NetManager netManager = NetManager.getInstance(context);
//呼叫NetManager.getDefaultNet()獲取預設的資料網路。
NetHandle netHandle = netManager.getDefaultNet();
//呼叫NetHandle.bindSocket()繫結網路。
DatagramSocket socket = new DatagramSocket();
netHandle.bindSocket(socket);
//使用socket傳送資料
socket.send(request);
4)踩坑(分散式任務排程和分散式資料庫技術配合使用)(功能:智慧農場手機端採集的資料實時同步到TV端)
當手機端收到採集到的環境資料(如溫度、溼度及可燃氣體濃度),需要流轉到智慧屏上進行顯示,團隊一開始使用的分散式任務排程,流轉到TV端後,發現TV端顯示的資料並沒有實時重新整理,顯然不符合現實需求。
為了實現資料的實時重新整理,團隊發現HarmonyOS有分散式資料服務的能力,可以實現同應用,同網路,同賬號在不同裝置之間實現資料實時共享,因此最終採用了HarmonyOS的分散式資料庫技術,確保了手機端和TV端資料同步重新整理的功能。在不依賴雲端服務的情況下,實現此功能。
下面是實現的關鍵程式碼:
手機端資料儲存:
//初始化獲取SingleKvStore物件
KvManagerConfig kvManagerConfig = new KvManagerConfig(context);
kvManager = KvManagerFactory.getInstance().createKvManager(kvManagerConfig);
Options options = new Options();
options.setCreateIfMissing(true)
.setEncrypt(false)
.setKvStoreType(KvStoreType.SINGLE_VERSION)
.setAutoSync(true);
SingleKvStore singleKvStore = kvManager.getKvStore(options, storeId);
將採集到的感測器資料,儲存在分散式資料庫:
singleKvStore.putString(“key”,
“ +…此處省略
“}”);
TV端進行資料獲取:
//初始化singleKvStore,併為其註冊監聽器kvStoreObserverClient,觀察資料變化:
KvManagerConfig config = new KvManagerConfig(getContext());
KvManager kvManager = KvManagerFactory.getInstance().createKvManager(config);
Options CREATE = new Options();
CREATE.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION)
.setAutoSync(true);
singleKvStore = kvManager.getKvStore(CREATE, Constant.KV_STORE_NAME);
kvStoreObserverClient = new KvStoreObserverClient();
singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, kvStoreObserverClient);
//實現KvStoreObserver,重新onChange()方法,獲取分散式資料,更新UI需要切換到主執行緒。
private class KvStoreObserverClient implements KvStoreObserver {
@Override
public void onChange(ChangeNotification notification) {
String value = singleKvStore.getString(“***”);
DataCollectionEntry entry = ZSONObject.stringToClass(value, DataCollectionEntry.class);
getUITaskDispatcher().asyncDispatch(() -> initView(entry));
}
}
從報名HarmonyOS開發者創新大賽開始,團隊從一群從來沒有配合過的HarmonyOS新手開發者成長為了專業開發者。參加大賽也讓團隊深刻感受到了HarmonyOS強大的分散式技術以及先進的設計理念,為今後開發更具創意和社會價值的作品打下了堅實的基礎。
星光不問趕路人,每一位HarmonyOS開發者都是華為匯聚的星星之火,希望越來越多的開發人才能夠加入到HarmonyOS開發者生態,一起創造無限可能!
本作品採用《CC 協議》,轉載必須註明作者和本文連結