# **智能语音垃圾桶——数字管家** ## 一、 控制页xml的布局 控制页对我们来说至关重要,是软件实现功能的第一步,我们需要对xml文件有一定的熟悉程度,此次项目中,我们需要写四个垃圾桶的控制布局。在resources->base->layout新建xxx.xml文件 该布局分为三段式:最上面为导航栏布局,中间布局是Dustbin的logo,下方布局是四个垃圾桶的控制部分 **页面代码展示:** [【点击跳转】](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/blob/master/FA/DistSchedule/entry/src/main/resources/base/layout/ability_dustbin.xml) **效果图如下:** ![Dustbin_control_page](https://gitee.com/giteehmz/smart_dustbin/raw/master/Media/Dustbin_control_page.png) ## **二、** **数字管家服务器更改** ### 1、创建iot云产品 ​ **IoT** 是指将装置、机器、产品和设备连接到云并配置为收集和安全地传输数据,我们以华为IoT为例 [【点击跳转】](https://gitee.com/giteehmz/smart_dustbin/blob/master/DOC/%E6%99%BA%E8%83%BD%E8%AF%AD%E9%9F%B3%E5%9E%83%E5%9C%BE%E6%A1%B6%E2%80%94%E2%80%94%E5%88%9B%E5%BB%BAIoT%E4%BA%91.md) ### 2、创建服务器 [【点击跳转】](https://gitee.com/giteehmz/smart_dustbin/blob/master/DOC/%E6%99%BA%E8%83%BD%E8%AF%AD%E9%9F%B3%E5%9E%83%E5%9C%BE%E6%A1%B6%E2%80%94%E2%80%94%E5%88%9B%E5%BB%BAIoT%E4%BA%91.md#4%E5%88%9B%E5%BB%BA%E6%95%B0%E5%AD%97%E7%AE%A1%E5%AE%B6%E6%9C%8D%E5%8A%A1%E5%99%A8) ### 3、让数字管家接入服务器 #### (1)在DeviceStateListener.java中修改下列信息: ![change_DeviceStateListener](https://gitee.com/giteehmz/smart_dustbin/raw/master/Media/change_DeviceStateListener.png) #### (2)在OKHttpUtilRx2.java文件中修改成自己的服务器IP: ![change_OKHttpUtilRx2](https://gitee.com/giteehmz/smart_dustbin/raw/master/Media/change_OKHttpUtilRx2.png) ## 三、 控制功能的编写 ​ 接下来就是控制页业务逻辑的编写,在slice目录下新建 DustbinAbilitySlice.java文件(可自定义),我们设想对于开关的图片点击来对垃圾桶发送指令,首先我们需要在slice页面中的onstart()方法中使用findComponentById来找到图像、文本组件,(以可回收垃圾桶为例)将图像组件赋值给Recyclables变量,将文本组件值赋给currentDustbinRValue,开关图像用于点亮图标SwitchImg_R, ##### 1、定义全局变量Recyclables和SwitchImg_R、currentDustbinRValue ```java private Image SwitchImg_R; private Text currentDustbinRValue; Image Recyclables; ``` ##### 2、在onStart()里面写找到按钮方法 ​ 因为我们使用的是接口,所以需要重写onclick()方法,此时我们的括号里可以写上this,表示点击该图片时,调用本方法。 ```java Recyclables = (Image) findComponentById(ResourceTable.Id_dustbin_Recyclables_image_switch);////找到可回收开关组件 Recyclables.setClickedListener(this);//绑定单击事件 ``` ##### 3、在initComponents()中添加以下代码 ```java SwitchImg_R = (Image) findComponentById(ResourceTable.Id_dustbin_Recyclables_image_switch);//可回收开关图像 currentDustbinRValue = (Text) findComponentById(ResourceTable.Id_dustbin_current_valueR);//可回收容量文本 ``` ##### 4、在CommandUtil.java中添加发送到华为iot云命令 ​ 以下服务名和命令可参考Dustbin的profile文件 ```java public static Command Dustbin_OpenRecyclables_Command(boolean isOn) { JSONObject params = new JSONObject(); if (isOn) { params.put("OpenRecyclables", "ON"); } else { params.put("OpenRecyclables", "OFF"); } return new Command("Open_R", "SmartDustbin_DATA", JSONObject.toJSONString(params)); } ``` ##### 5、添加更新容量代码 ​ 如需要进入控制页更新,可在onStart()中调用initDeviceState() ```java private void initDeviceState() { KLog.i("[220207x01]initDevice"); OKHttpUtilsRx2.INSTANCE.getApi().getDeviceInfo(deviceId, PreferencesUtil.getUserId(getContext())) .compose(OKHttpUtilsRx2.INSTANCE.ioMain()) .subscribe(new OKHttpUtilsRx2.SubjectImpl>() { @Override public void onNext(RespondBase deviceInfo) { KLog.i(deviceInfo); if(deviceInfo.isSuccess()){ KLog.i("isSuccess"); } if (deviceInfo.isSuccess() && deviceInfo.getResult().isOnline()) { // 更新状态 String property = deviceInfo.getResult().getProperty(); KLog.i(property); String value_RC = DeviceStateUtil.getKeyValue(property, "Recyclables_Capacity"); String value_UC = DeviceStateUtil.getKeyValue(property, "Unrecyclable_Capacity"); String value_KC = DeviceStateUtil.getKeyValue(property, "KitchenGarbage_Capacity"); String value_OC = DeviceStateUtil.getKeyValue(property, "OtherRubbish_Capacity"); if (value_RC.equals("100")||value_UC.equals("100")||value_KC.equals("100")||value_OC.equals("100")) { // 告警页面 KLog.i("Alert Dustbin"); isAlertDustbinON = true; goToAlert(); } currentDustbinRValue.setText(String.format("%s", value_RC)); currentDustbinUValue.setText(String.format("%s", value_UC)); currentDustbinKValue.setText(String.format("%s", value_KC)); currentDustbinOValue.setText(String.format("%s", value_OC)); } else { initDustbinState(); } } @Override public void onError(Throwable throwable) { initDustbinState(); } }); }//初始化垃圾桶状态 ``` ##### 6、点击开关发送命令 ```java private void Recyclables(Component component) { isONR = !isONR; if (isONR) { ; SwitchImg_R.setPixelMap(ResourceTable.Media_icon_switch_on); } else { SwitchImg_R.setPixelMap(ResourceTable.Media_icon_switch_off); } // 发送命令 if (!isSetCommand) { sendCommand(CommandUtil.Dustbin_OpenRecyclables_Command(isONR)); }//Recyclables } ``` ##### 7、NFC配网打开自定义控制页 ###### (1)在DeviceControlAbility()添加Dusbtin控制页面信息 ```java public static final String ACTION_DUSTBIN = "action.dustbin"; addActionRoute(ACTION_DUSTBIN, DustbinAbilitySlice.class.getName()); //智能语音垃圾桶 ``` ###### (2)应用配置文件config.json中注册信息 ![add_action.dustbin](https://gitee.com/giteehmz/smart_dustbin/raw/master/Media/add_action.dustbin.png) 完成以上步骤,我们就完成了数字管家的功能代码编写。