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 {
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 开发者生态,一起创造无限可能!