本帖最后由 Genius 于 2017-1-11 12:43 编辑
第一步:我们要下载开源框架,这样子做起来会非常简单(开源框架下载),下载完成后导入eclipse,如果你用的是Android Studio,那就要百度一下怎么导入了。
第二步:改sdk版本号,因为你下载的包可能跟机智云开发时用的版本可能不一样,我的是19,根据自己的环境修改
第三步:修改Json文件,在/GOpenSource_AppKit/assets/UIConfig.json下,首先我们要先创建一个APP,然后把app_id和app_secret填进去,如下图所示:
第四步:找到res/layout文件夹下面的:activity_gos_device_control.xml面局文件,我们拖一个开关进来,然后再添加id,如下图所示:
第五步:加入控制代码。找到/GOpenSource_AppKit/src/com/gizwits/opensource/appkit/ControlModule/GosDeviceControlActivity.java
在里面加入控制代码:
我们先写一个控制函数:
- /**
- * 发送指令
- *
- * @param key
- * 数据点对应的标识名
- * @param value
- * 需要改变的值
- */
- private void sendCommand(String key, Object value) {
- int sn = 5;
- ConcurrentHashMap<String, Object> hashMap = new ConcurrentHashMap<String, Object>();
- hashMap.put(key, value);
- device.write(hashMap, sn);
- Log.i("Apptest", hashMap.toString());
- }
复制代码 机智云的控制其实思想其实就是对Map数据的改变和读取。APP和MCU一起对Map进行改变。所以我们只要改变里面的值,就可以完成控制。
- private void initView() {
- btn_on = (ToggleButton) findViewById(R.id.btn_on);
- <blockquote>btn_on.setOnCheckedChangeListener(new OnCheckedChangeListener() {
复制代码 这样就实现了对一个灯的控制。
那现在我有这样一个需求,我上一次开了灯,但是我把APP关了,我现在重新打开,但是现在UI上显示灯是关的,实际上是开的,那我点一个这个按键,开灯,此时灯还是开的。再点一下才是关灯。那我怎么读取灯的状态呢?
下面就来说一下怎么去读取状态并更新UI的这么一个功能。
首先,我们要设置一个**,里面有回调函数:
- /** 设备** */
- private GizWifiDeviceListener deviceListener = new GizWifiDeviceListener() {
- // 接收数据回调
- public void didReceiveData(GizWifiErrorCode result,
- GizWifiDevice device,
- ConcurrentHashMap<String, Object> dataMap, int sn) {
- Message msg = new Message();
- if (GizWifiErrorCode.GIZ_SDK_SUCCESS != result) {
- // 查询成功
- } else {
- //查询失败
- }
- // 已定义的设备数据点,有布尔、数值和枚举型数据
- if (dataMap.get("data") != null) {
- deviceStatu = (ConcurrentHashMap<String, Object>) dataMap
- .get("data");
- // 根据标识名,在回调的map中找到设备上报的值
- if (deviceStatu.get("switch_onoff") != null) {
- // 根据设备上报的值更改按钮的图标
- msg.what = UPDATE_UI;
- handler.sendMessage(msg);
- }
- }
- }
- };
复制代码 didReceiveData(GizWifiErrorCode result,GizWifiDevice device,ConcurrentHashMap<String, Object> dataMap, int sn)是回调函数。
这里面dataMap.get("data"),是读取数据的意思,不是叫你把data改成你想要读的那个值。然后我们还要调用这个监听事件,否则不起作用。
- private void initDevice() {
- Intent intent = getIntent();
- device = (GizWifiDevice) intent.getParcelableExtra("GizWifiDevice");
- device.setListener(deviceListener);
- deviceStatu = new ConcurrentHashMap<String, Object>();
- Log.i("Apptest", device.getDid());
- }
复制代码 然后再用Handler去更新UI,安卓里面不能用Theard去更新,程序会狗带。
- private Handler handler = new Handler() {
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- switch (msg.what) {
- case UPDATE_UI:
- updataUI();
- break;
- }
- };
- };
复制代码 这样就可以读到数据了,但是还有一个问题,就是如果只是退出了当前的Activity,没有退出APP时,再次进入,UI不会更新。此时就要重写这一个函数:
- @Override
- protected void onDestroy() {
- super.onDestroy();
- // 退出控制页面,取消设备订阅
- device.setSubscribe(false);
- }
复制代码 这样就大功告成了。本人小白,初学Android,大神轻喷。
|