2.3.2 家居设备同步上传更新操作

## 2.3.2 家居设备同步更新上传操作(可选功能) * 如果开发者要接入家居控制功能,需要做设备同步更新上传操作。在新加入家居设备或者家居设备属性状态值有改变以及需要对设备进行分组编号的情况时,需要将家居设备的状态属性及分组信息同步更新上传,设备属性状态信息更新上传要求一次上传所有的设备,上传过的设备才能进行指令控制,否则默认显示找不到设备。设备分组信息更新要求一次上传所有分组情况,更新上传设备属性状态需要在ChatRobotBuilder初始化完成之后。可通过ChatRobotBuilder.RobotInitListener()的初始化监听回调方法initComplete(inti)获取初始化是否完成; * 如果返回i=0表示ChatRobotBuilder初始化完成,如果i=-1表示初始化失败。建议在初始化完成之后可根据需要更新或上传设备信息及设备分组信息,参照demo中的initComplete(int i)方法: * 通过调用TerminalAccessor接口的upload(JSONArray array)、upload(List\<Equipment\>list)上传设备信息; * 其中以JSONArray作为参数的上传方法需要构造JSONArray,每种设备具有的属性参见sdk文档的附录一表格,将需要更新或上传的设备属性在构造JSONArray过程中传入即可,需要注意的是上传设备的equip_id和name需要保证是唯一的。   JSON上传示例: ~~~ private String uploadEquipmentJson() { JSONArray equipmentArray = new JSONArray(); JSONObject deng1 = new JSONObject(); JSONObject deng2 = new JSONObject(); try { //equip_id与name需要保证唯一性,且不能为空,否则将报设备找不到 deng1.put("id",301); deng1.put("equip_type",1000); deng1.put("equip_id","d1"); deng1.put("name","灯1"); deng1.put("alias","厨房灯"); deng1.put("equip_location","厨房"); deng1.put("brightness",new Progress("80").toJsonString()); equipmentArray.put(deng1); deng2.put("id",301); deng2.put("equip_type",1000); deng2.put("equip_id","d2"); deng2.put("name","灯2"); deng2.put("alias","厕所灯"); deng2.put("equip_location","厕所"); deng2.put("brightness",new Progress("70").toJsonString()); equipmentArray.put(deng2); } catch (JSONException e) { e.printStackTrace(); } return AndroidChatRobotBuilder.get().robot().terminalAccessor().upload(equipmentArray); } ~~~ * 以List\<Equipment\>作为参数的上传方法需要将设备的实体类对象添加到list中上传,设备实体类以Equipment作为父类,已定义的设备实体类详见API文档。如果需要上传的设备没有定义过相应的实体类,则只能通过构造JSONArray的方式上传。   list上传示例: ~~~ private String uploadEquipmentList() { final List<Equipment> list = new ArrayList<Equipment>(); //equip_id与name需要保证唯一性,且不能为空,否则将报设备找不到 Deng e = new Deng(); e.setEquip_id("d3"); e.setBrightness(new Progress("80")); e.setName("灯3"); e.setEquip_location("客厅"); e.setAlias("客厅灯"); e.setStatus("OPEN"); list.add(e); e = new Deng(); e.setBrightness(new Progress("80")); e.setEquip_id("d4"); e.setName("灯4"); e.setEquip_location("走廊"); e.setAlias("走廊灯"); e.setStatus("CLOSE"); list.add(e); KongTiao k = new KongTiao(); k.setEquip_location("客厅"); k.setEquip_id("k1"); k.setName("空调"); k.setLevel(3); k.setStatus("OPEN"); list.add(k); return AndroidChatRobotBuilder.get().robot().terminalAccessor().upload(list); } ~~~ 注:upload(JSONArray array)、upload(List\<Equipment\> list)属于访问网络操作,请另起线程执行。 * 通过调用uploadGroup(JSONArray array)、uploadGroup(List\<EquipmentGroup\>list)方法上传设备分组信息;其中以JSONArray作为参数的设备分组上传方法需要构造设备分组的JSONArray,包括组名name、分组group、时间戳timestamp等。JSON上传示例: ~~~ private String uploadEquipmentGroupJson() { JSONArray equipmentGroup = new JSONArray(); JSONArray jsonArray1 = new JSONArray(); JSONArray jsonArray2 = new JSONArray(); JSONObject object1 = new JSONObject(); JSONObject object2 = new JSONObject(); try { object1.put("name","白天"); jsonArray1.put("x1"); jsonArray1.put("x2"); jsonArray1.put("x3"); object1.put("group",jsonArray1); object1.put("timestamp",new java.util.Date().getTime()); object2.put("name","晚上"); jsonArray2.put("y1"); jsonArray2.put("y2"); jsonArray2.put("y3"); object2.put("group",jsonArray2); object2.put("timestamp",new java.util.Date().getTime()); equipmentGroup.put(object2); } catch (JSONException e) { e.printStackTrace(); } return AndroidChatRobotBuilder.get().robot().terminalAccessor().uploadGroup(equipmentGroup); } ~~~ * 以List\<EquipmentGroup\>作为参数的设备分组上传方法需要将EquipmentGroup分组对象添加至list中上传。EquipmentGroup对象包括组名name、分组group、时间戳timestamp等属性。 list上传示例: ~~~ private String uploadEquipmentGroup() { List<EquipmentGroup> list = new ArrayList<EquipmentGroup>(); EquipmentGroup g = new EquipmentGroup(); g.setName("晚上"); List<String> gids = new ArrayList<String>(); gids.add("l1"); gids.add("k1"); g.setGroup(gids); list.add(g); g = new EquipmentGroup(); g.setName("中午"); gids = new ArrayList<String>(); gids.add("l2"); gids.add("k2"); g.setGroup(gids); list.add(g); return AndroidChatRobotBuilder.get().robot().terminalAccessor().uploadGroup(list); } ~~~ 注:uploadGroup(JSONArray array)、uploadGroup(List\<EquipmentGroup\> list)属于访问网络操作,请另起线程执行。另外设备功能属于可选功能,用户可根据需要决定是否对接。 * 通过调用getGroup()获取设备分组信息;通过getLastEquipments()获取最近一次设备集合信息。详见API文档。