edit

Android SDK2.0.X开发文档

概述

App 开发之前请先申请相关账号:

  • 申请第三方平台登录账号,目前支持 QQ,微信,微博,Google,Twitter,Facebook。如果不需要第三方登录,可以不用申请
  • 申请个推账号。如果不需要推送,可以不用申请
  • 申请Hekr平台企业账号,并完善相关信息

开发准备

使用SDK开发之前请务必通读本文档

集成准备

1、下载SDK配置文件

2、快速导入SDK

  • 请确保您下载或引用的是最新的SDK版本

1.core模块:这是SDK的主要部分,必须要引入 Download

Gradle:

compile 'me.hekr.sdk:core:x.x.x'

Maven:

<dependency>
  <groupId>me.hekr.sdk</groupId>
  <artifactId>core</artifactId>
  <version>x.x.x</version>
  <type>pom</type>
</dependency>

AndroidManifest.xml 权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

2.config模块:如果App需要给设备配网,请引入config模块 Download Gradle:

compile 'me.hekr.sdk:config:x.x.x'

Maven:

<dependency>
  <groupId>me.hekr.sdk</groupId>
  <artifactId>config</artifactId>
  <version>x.x.x</version>
  <type>pom</type>
</dependency>

3.web模块:如果需要使用H5设备控制功能,请引入web模块 Download

compile 'me.hekr.sdk:web:x.x.x'

Maven:

<dependency>
  <groupId>me.hekr.sdk</groupId>
  <artifactId>web</artifactId>
  <version>x.x.x</version>
  <type>pom</type>
</dependency>

当你引入web模块时,由于我们使用了CrossWalk开源项目,所以必须在项目根目录下的gradle文件中加入Crosswalk的Maven仓库

allprojects {
    repositories {
        maven {
            url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'
        }
    }
}

在项目的gralde文件中加入

ndk {
    abiFilters "armeabi-v7a"
}

AndroidManifest.xml 权限

    <uses-permission android:name="android.permission.VIBRATE" />

4.moauth模块:如果需要使用第三方登录功能,请引入moauth模块 Download

compile 'me.hekr.sdk:moauth:x.x.x'

Maven:

<dependency>
  <groupId>me.hekr.sdk</groupId>
  <artifactId>moauth</artifactId>
  <version>x.x.x</version>
  <type>pom</type>
</dependency>

一、配置

  • 说明:本SDK中已使用以下依赖,请勿重复配置!
// 只在web模块中使用,如果不引用web模块,那么xwalk_core_library不会被依赖
org.xwalk:xwalk_core_library:23.53.589.4
// 以下三个在引入core模块时被依赖
org.jmdns:jmdns:3.5.1
com.neovisionaries:nv-websocket-client:2.2
netty-all-4.1.9.Final.jar
  • 如果引入本SDK时发生引用资源冲突,请在项目的gradle的dependencies依赖中,exclude相关冲突的包。如:
    // 排除一个依赖
    compile('me.hekr.sdk:core:x.x.x'){
        exclude group: 'org.jmdns', module: 'jmdns'
    }
    // 或者需要排除多个依赖
    compile('me.hekr.sdk:core:x.x.x'){
        exclude(group: 'org.jmdns', module: 'jmdns')
        exclude(group: 'com.neovisionaries', module: 'nv-websocket-client')
    }
    compile('me.hekr.sdk:web:x.x.x'){
        exclude group: 'org.xwalk', module: 'xwalk_core_library'
    }
  • 在项目res目录下创建raw目录,将下载包中的config.json复制进去,config.json为项目的配置文件和第三方登录配置文件(填写各大平台申请的参数)。
  • config.json文件配置说明:文件格式不可变,pid为在氦氪console平台 注册企业开发者后在个人中心->认证信息中相应的企业pid,配置文件中其他第三方登录数据在各大第三方平台申请填写,如不需要使用某些第三方登录则在相应位置留空即可。
"Hekr": {
    "AppId": "xxxxxx"
}

配置文件中Hekr之下AppId:氦氪console平台的pid,登录氦氪console平台之后可在右上角个人中心查看。
配置文件中的Social、push为第三方登录、个推推送平台信息,如不需要置""即可。
  • 如果需要第三方微信登录,则必须将下载包中的wxapi文件夹复制项目包名目录(微信开放平台填写的包名)下!【具体参考微信开放平台文档
  • 请在氦氪console平台申请App定制开发。

1.1、设置AndroidManifest.xml声明Activity

<!--第三方登录 qq 如果需要qq登录则配置,不需要则不用配置-->
<activity
    android:name="com.tencent.tauth.AuthActivity"
    android:launchMode="singleTask"
    android:noHistory="true"
    android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <!--此处为腾讯开放平台申请的ApiId-->
            <data android:scheme="tencent0000000000" />
        </intent-filter>
</activity>
<activity
    android:name="com.tencent.connect.common.AssistActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:screenOrientation="portrait" />

<!--第三方登录 weibo 如果需要weibo登录则配置,不需要则不用配置-->
 <activity
    android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
    android:configChanges="keyboardHidden|orientation"
    android:exported="false"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="adjustResize" />
<!--第三方登录 wechat 如果需要wechat登录则配置,不需要则不用配置-->
<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:screenOrientation="portrait">
        <intent-filter>
             <category android:name="android.intent.category.default" />
        </intent-filter>
</activity>

1.2、在开始使用前进行SDK的初始化工作

// 初始化SDK
HekrSDK.init(this, R.raw.config);
// 是否开启日志,默认开启
HekrSDK.enableDebug(true);
// 如果使用第三方登录,初始化第三方模块
HekrMOAuth.init(getApplicationContext(),R.raw.config);

二、用户接口

氦氪用户接口包括了登录等部分。开发者需要先通过1.1和1.2正确初始化SDK后进行操作,用户注册等功能详见云端API。

2.1、用户登录

Hekr.getHekrUser().login(username, password, callback);

参数

key 类型及范围 说明
userName String 用户名
passWord String 用户密码
callback HekrCallback 登录后的回调

示例code

import me.hekr.sdk.Hekr;
import me.hekr.sdk.HekrSDK;
import me.hekr.sdk.inter.HekrCallback;

Hekr.getHekrUser().login("xxxxxxxxxxx", "xxxxxx", new HekrCallback() {
    @Override
    public void onSuccess() {
        Log.d(TAG, "Success");
    }

    @Override
    public void onError(int errorCode, String errorMsg) {

    }
});

2.2、当前用户token

当用户登录以后,可以通过SDK获取

SDK示例code(调用此接口前用户必须登录成功)

// 获取user Id
String userId = Hekr.getHekrUser().getUserId();
// 获取登录后的token
String accessToken = Hekr.getHekrUser().getToken();
// token失效后刷新
Hekr.getHekrUser().refreshToken(callback);

2.3、登出

SDK示例code

// 用户登出
Hekr.getHekrUser().logout(callback);
key 类型及范围 说明
callback HekrCallback 回调

2.4、第三方登录

注意:

  • 若要使用第三方登录,必须先在各大平台中申请第三方登录权限,申请通过后将key值填写至config.json中,根据1.1中的说明将第三方的Activity在AndroidManifest.xml中填写完整!
  • 在hekr console平台 定制App管理之下的OAUTH账号管理填写相关ApiKey ApiSecret,如第三方平台无该项直接留空即可。

示例code

qq_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, HekrOAuthLoginActivity.class);
                //第二个参数为第三方类型
                intent.putExtra(HekrOAuthLoginActivity.OAUTH_TYPE, MOAuthUtil.OAUTH_QQ);
                //第二个参数为第三方类型
                startActivityForResult(intent, MOAuthUtil.OAUTH_QQ);
            }
        });

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null) {
            String certificate = data.getStringExtra(HekrOAuthLoginActivity.OAUTH_CODE);
            if (!TextUtils.isEmpty(certificate)) {
                switch (requestCode) {
                    case MOAuthUtil.OAUTH_QQ:
                        //之后可通过 氦氪openapi文档中3.13 或者 3.17 进行操作
                        break;
                    case MOAuthUtil.OAUTH_WECHAT:
                        //之后可通过 氦氪openapi文档中3.13 或者 3.17 进行操作
                        break;
                    case MOAuthUtil.OAUTH_SINA:
                        //之后可通过 氦氪openapi文档中3.13 或者 3.17 进行操作
                        break;
                }
            }
        }
    }
第三方类型 说明
MOAuthUtil.OAUTH_QQ QQ
MOAuthUtil.OAUTH_WECHAT 微信
MOAuthUtil.OAUTH_SINA 微博

注意:第三方登录中微博登录需要uid参数,sdk中已直接将uid参数封装至获取到certificate中,所以微博登录时可省略掉uid参数。

https://uaa-openapi.hekr.me/MOAuth?type=SINA&pid=0000000000&clientType=ANDROID&certificate=certificate

三、设备配网

配网说明:仅适用于氦氪固件4.1.22.1及以上版本 配网意义:

  • 设备接入氦氪云
  • 将设备与账号进行绑定

3.1、区分设备配网类型

  1. 获取厂家所有产品

  2. 根据bindtype字段区分不同产品的配网方式

  • WIFI (带有氦氪WIFI模块的设备)

  • QRSCAN(网关设备)

  • ZIG_BEE(网关子设备)

3.2、WIFI设备配网流程

WIFI设备配网方式 1.udp发包配网 2.ap模式配网(可做为第一种失败后的兼容方式)

1、App获取PINCode

2、App将ssid、pwd、PINCode采用UDP协议发送至模块

3、App在做第二步的同时,获取当前局域网设备直至配网结束

3.2.1、WIFI设备SmartConfig配网

操作说明:请让模块处于配网模式

    private INewConfig config;

    /**
     * 开始配网
     */
    private void config(){
        config = Hekr.getHekrConfig().getNewConfig(ConfigType.COMMON_DEV);
        config.startConfig(this, getConfiguation(), new ConfigCallback());
    }

    private Map<String, String> getConfiguation() {
        HashMap<String, String> configuration = new HashMap<>();
        // 路由器的SSID
        configuration.put("ssid", "xxxxxx");
        // 路由器的密码
        configuration.put("password", "xxxxxx");
        // 获取的PinCode
        configuration.put("pinCode", "xxxxxx");
        return configuration;
    }

    private class ConfigCallback implements HekrConfigCallback {

        @Override
        public void onStart() {
            // 配网开始
        }

        @Override
        public void onAdd(ConfigDevice device) {
            // 配网时发现新的设备
        }

        @Override
        public void onUpdate(ConfigDevice device) {
            // 设备时设备状态更新
        }

        @Override
        public void onResult(List<ConfigDevice> result) {
            // 调用stopConfigSafely时返回配网结束时的设备最终状态,直接调用stop不会有这个回调
        }

        @Override
        public void onStop() {
            // 结束配网的回调
        }

        @Override
        public void onError() {
            // 配网错误
        }
    }

    // WIFI设备SmartConfig停止配网
    config.stopConfig();

3.2.2、WIFI设备兼容模式配网

操作说明:请让模块处于兼容模式,同时让手机连接到设备的SoftAP,设备的AP以SmartDeivce开头。在配网过程中,由于手机会切换连接的AP,所以很大概率会收不到局域网消息。

    /**
     * 开始配网
     */
    private void configAP(){
        config = Hekr.getHekrConfig().getNewConfig(ConfigType.COMMON_DEV);
        config.startSoftAPConfig(this, getConfiguation(), new ConfigCallback());
    }

    private Map<String, String> getConfiguation() {
        HashMap<String, String> configuration = new HashMap<>();
        // 路由器的SSID
        configuration.put("ssid", "xxxxxx");
        // 路由器的密码
        configuration.put("password", "xxxxxx");
        // 获取的PinCode
        configuration.put("pinCode", "xxxxxx");
        return configuration;
    }

    private class ConfigCallback implements HekrConfigCallback {

        @Override
        public void onStart() {
            // 配网开始
        }

        @Override
        public void onAdd(ConfigDevice device) {
            // 配网时发现新的设备
        }

        @Override
        public void onUpdate(ConfigDevice device) {
            // 设备时设备状态更新
        }

        @Override
        public void onResult(List<ConfigDevice> result) {
            // 调用stopConfigSafely时返回配网结束时的设备最终状态,直接调用stop不会有这个回调
        }

        @Override
        public void onStop() {
            // 结束配网的回调
        }

        @Override
        public void onError() {
            // 配网错误
        }
    }

   // WIFI设备兼容模式停止配网
    config.stopConfig();

3.3、网关设备扫码配网

网关设备二维码生成:氦氪console平台的网关设备批量生成

3.3.1、扫描设备上所贴二维码(扫码自行实现)

3.3.2、解析返回字符串(获取配网所需devtid,bindKey)

public static HashMap<String, String> urlSplit(String url) {
        HashMap<String, String> hashMap = new HashMap<>();
        if (!TextUtils.isEmpty(url) && url.contains("?") && url.contains("&") && url.contains("=")) {
            String str = url.substring(url.indexOf("?") + 1, url.length());
            String cookieParams[] = str.split("&");

            if (cookieParams.length > 0) {
                for (String cookieParam : cookieParams) {
                    String kvParam[] = cookieParam.split("=");

                    if (kvParam.length == 2) {
                        hashMap.put(kvParam[0].trim(), kvParam[1].trim());
                    }
                }
            }
            return hashMap;
        } else {
            return null;
        }
}
String devTid;
String bindKey;
if (hashMap != null && hashMap.containsKey("action")) {
        switch (hashMap.get("action")) {
            case "bind":
            if (!TextUtils.isEmpty(hashMap.get("devTid")) &&
                    !TextUtils.isEmpty(hashMap.get("bindKey"))) {
                        devTid=hashMap.get("devTid")
                        bindKey=hashMap.get("bindKey");
                break;
            default:
                break;
 }

3.3.3、根据扫码解析的数据,进行设备配网

protected IConfig iConfig;
protected HashMap<String, String> configParam;

configParam = new HashMap<>();
iConfig = Hekr.getHekrConfig().getConfig(ConfigType.GATEWAY_DEV);

configParam.put("devTid",devTid);
configParam.put("bindKey",bindKey);

iConfig.startConfig(ScanAddDeviceActivity.this, configParam, new HekrConfigDeviceListener() {
            @Override
            public void getNewDevice(JSONObject device) {

            }

            @Override
            public void getDeviceSuccess() {

            }

            @Override
            public void getDeviceFail(int error ,String errorMsg) {
                if(error==5400044) {
                // 网关不在线
                }
            }
        });

3.4、网关子设备配网

网关子设备配网前提:当前账号至少有一个网关且该网关在线(确保网关已经连接网线)

获取当前用户下的所有网关

  • 获取所有设备并根据devtype字段筛选出网关设备,devtype字段为GATEWAY的是网关设备

3.4.1、网关子设备配网

protected IConfig iConfig;

iConfig = Hekr.getHekrConfig().getConfig(ConfigType.GATEWAY_SUB_DEV);

protected HashMap<String, String>  configParam = new HashMap<>();

/**
* devTid:网关devTid(子设备即将绑定的网关):网关设备信息中
* ctrlKey:网关ctrlKey:网关设备信息中
* subMid:所需配网的网关子设备mid :厂家所有产品接口中该子设备mid
*/
configParam.put("devTid", xxxx);
configParam.put("ctrlKey", xxxx);
configParam.put("subMid", product.getMid());

if (Hekr.getHekrClient().isOnline()) {
            iConfig.startConfig(GateSubDeviceLinkActivity.this, configParam, new HekrConfigDeviceListener() {
                @Override
                public void getNewDevice(JSONObject device) {
                    // 子设备配网命令返回值
                }

                @Override
                public void getDeviceSuccess() {

                }

                @Override
                public void getDeviceFail(int error, String errorMsg) {
                    // 子设备配网命令返回值
                }
            });
} else {
    // Websocket未链接
}

// 停止网关子设备配网
// 必须主动在getDeviceFail()或者getDeviceSuccess中调用
iConfig.stopConfig();

3.5、WIFI设备配网状态

当有新设备或者设备更新时会返回ConfigDevice对象。ConfigDevice中可以获取到两个状态,一个是currentStatus,一个是errorStatus。状态由ConfigStatus这个枚举类指定。有NONE, GET_SECURITY_CODE, DEVICE_CONNECTED_ROUTER, CLOUD_VERIFY_DEVICE, DEVICE_LOGIN_CLOUD, DEVICE_BIND_SUCCESS这几个状态。

1. NONE:没有状态。errorStatus = NONE 表示没有错误。
2. GET_SECURITY_CODE:设备获取到安全码(PinCode)
3. DEVICE_CONNECTED_ROUTER:设备连接到路由器
4. CLOUD_VERIFY_DEVICE:云端校验设备成功
5. DEVICE_LOGIN_CLOUD:设备登录到云端

currentStatus指的是已经正确的步骤,errorStatus指的是错误的步骤。当没有错误时,errorStatus = NONE

currentStatus = DEVICE_BIND_SUCCESS 时或者 errorStatus = DEVICE_BIND_SUCCESS,可以通过

device.getJson();

获取到配网的Json数据,这个json数据中包含了设备配网的信息

3.6、补充说明

配网模式: wifi模块在间隔2秒闪烁表示进入配网模式

新设备定义: App配网过程中,模块处于以下情况App查询到的设备

  • 模块处于配网模式,成功绑定自己本次配网所用账号的设备,判定依据json 属性bindResultCode值为0
  • 模块处于配网模式,但已被别人绑定的设备,判定依据json 属性bindResultCode值为1 属性bindResultMsg值为E001:xxx,xxx即为真正绑定者的账号信息
  • 模块处于配网模式,但模块pk与自定义App配置文件config.json所写Appid(console平台pid)不匹配,判定依据json 属性bindResultCode值为1 属性bindResultMsg值为E003
  • 模块处于配网模式,已被自己账号绑定上并未删除解绑的设备,判定依据json 属性bindResultCode值为1 属性bindResultMsg值为E004

四、设备控制(Android Native)

控制先决条件:用户登录成功

4.1、发送控制命令

Json48透传协议:App下发数据->云端->模块->单片机

Json主控协议:[App下发数据->云端->模块(含特殊外围电路直接响应)][402]

4.1.1 发送消息

48透传数据示例:480E02010201000000000000005C 具体设计在氦氪console平台

Json主控数据示例:"{\"R\":0,\"G\":255,\"B\":89,\"W\":0,\"bright\":1,\"cmdId\":1}" 具体设计在氦氪console平台

新增如下使用方法

请求参数

key 类型及范围 说明
message JSONObject 设备控制命令
callback HekrMsgCallback 命令发送回调

示例code

    private void sendMessage(){
        String command="{\"action\": \"appSend\",\"params\": {\"devTid\": \"xxxxxx\", \"ctrlKey\": \"xxxxxx\", \"data\": {\"raw\": \"48xxxxxxx\"}}}";
        try {
            JSONObject object = new JSONObject(command);
            Hekr.getHekrClient().sendMessage(object, new HekrMsgCallback() {
                @Override
                public void onReceived(String msg) {
                    // 收到云端返回的消息
                }

                @Override
                public void onTimeout() {
                    // 发送消息超时
                }

                @Override
                public void onError(int errorCode, String message) {
                    // 发送消息错误
                }
            });

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

回调返回值

{
  "msgId" : xxx,
  "action" : "appSendResp",
  "code" : 200,
  "desc" : "xxx",
  "params" : {
    "devTid" : "xxxxxxx",
    "ctrlKey" : "xxxxxxxxxx",
    "appTid" : "xxxxxxxx",
    "data" : {
      "raw" : "48xxxxx"
    }
  }
}

4.1.2 App返回帧错误表

App发送命令之后收到的返回帧 说明
{"msgId":4,"action":"errorResp","code":1400006,"desc":"Field cmdId not exist"} App未按照氦氪console平台所填写的模板发送数据。
{"msgId":4,"action":"appSendResp","code":2000115,"desc":"uart timeout"} MCU未在收到模块数据后3秒内回复模块数据。
正确做法:3秒内回复数据。

MCU回复模块的数据中帧序号、帧类型是错的。
正确做法:应该和模块发的帧类型、帧序号一致。

MCU回复模块的数据中检验码出错。
正确做法:发送正确的检验码。

4.2、主动接收设备上报控制命令

设备上报数据->模块->云端->App

4.2.1 主动接收消息

请求参数

key 类型及范围 说明
filter MessageFilter 消息过滤器
dataReceiverListener HekrMsgCallback 数据接收回调接口

回调函数

void onReceived(String message);
void onError(int errorCode, String message);
params 说明
message 符合条件的协议 参考协议

示例code

    /**
     * 主动接收消息
     */
    private void receiveMessage() {
        try {
            JSONObject filterObject = new JSONObject();
            JSONObject params = new JSONObject();
            params.put("devTid", "xxxxxxxx");
            filterObject.put("params", params);
            filter = new MessageFilter(filterObject);
            Hekr.getHekrClient().receiveMessage(filter, new HekrMsgCallback() {
                @Override
                public void onReceived(String msg) {
                    // 收到消息
                }

                @Override
                public void onTimeout() {
                    // 超时
                }

                @Override
                public void onError(int errorCode, String message) {
                    // 接收错误
                }
            });

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    /**
     * 取消接收
     */
    private void deceiveMessage() {
        // 主动接收消息后,如果想取消接收,必须调用这个方法,不然会造成内存泄漏
        if (filter != null) {
            Hekr.getHekrClient().deceiveMessage(filter);
            filter = null;
        }
    }

4.3、云端返回所有协议信息

作用:接收云端所有协议信息(例如appResp、devSend、appLoginResp等等动作信息),便于后续自行开发处理。

示例code

    /**
     * 主动接收消息
     */
    private void receiveAllMessage() {
        filter = new IMessageFilter() {
            @Override
            public boolean doFilter(String in) {
                return true;
            }
        };
        Hekr.getHekrClient().receiveMessage(filter, new HekrMsgCallback() {
            @Override
            public void onReceived(String msg) {
                // 收到消息
            }

            @Override
            public void onTimeout() {
                // 主动接受不会有这个回调
            }

            @Override
            public void onError(int errorCode, String message) {
                // 接收错误
            }
        });
    }

五、设备控制(Android Web)

控制先决条件:用户登录成功

5.1、接入指南

// 获取一个实例
IHekrWebClient hekrWeb = Hekr.getHekrWeb().createWebClient();
// 初始化web页面
hekrWeb.init(this, layout, hekrWebBeanpushMessageuseCache);
// 加载页面
hekrWeb.load();

参数:

key 类型及范围 说明
webInterface HekrWebInterface Activity或者Fragment需要实现的接口
hekrWebBean HekrWebBean 传入的设备数据
pushMessage String 推送消息预留入口,置空即可
useCache boolean 是否采用webView页面缓存机制,true:首次打开该页面将自动下载控制页面zip包至手机SD卡

示例code

public class WebActivity extends AppCompatActivity implements HekrWebInterface {

    private IHekrWebClient mHekrWeb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        FrameLayout layout = (FrameLayout) findViewById(R.id.layout_web);
        // 创建一个Web Client
        mHekrWeb = Hekr.getHekrWeb().createWebClient();
        // 设置页面的监听
        mHekrWeb.setWebActionListener(new MyWebViewPageStatusListener());
        // 设置页面必须的信息
        HekrWebBean hekrWebBean = getHekrWebBean();
        mHekrWeb.init(this, layout, hekrWebBean, "", true);
        // 加载
        mHekrWeb.load();
    }

    private HekrWebBean getHekrWebBean() {
        HekrWebBean hekrWebBean = new HekrWebBean();
        // 设置H5页面的下载地址
        hekrWebBean.setH5Zip("xxxxxxxx");
        // 设置H5页面的地址
        hekrWebBean.setH5Url("xxxxxxxx");
        // 设置CtrlKey
        hekrWebBean.setCtrlKey("xxxxxxxx");
        // 设置产品公共秘钥
        hekrWebBean.setPpk("xxxxxxxx");
        // 设置为独立设备
        hekrWebBean.setType(DeviceType.DEVICE_INDEPENDENT);
        // 设备DevTid
        hekrWebBean.setDevTid("xxxxxxxx");
        // 设备信息,从云端API获取的设备json字符串
        hekrWebBean.setDeviceInfo("xxxxxxxx");

        return hekrWebBean;
    }

    @Override
    public Context getContext() {
        return this;
    }

    @Override
    public void onFinish() {
        finish();
    }

    /**
     * 对SDK中页面的监听
     */
    private class MyWebViewPageStatusListener implements HekrWebActionListener {

        @Override
        public void onPageStarted(String url) {
            // 页面加载开始
        }

        @Override
        public void onPageError(int errorCode, String description) {
            // 页面加载错误
        }

        @Override
        public void onPageFinished(String url) {
            // 页面加载完成
        }

        @Override
        public void onAllPageClosed() {
            finish();
        }

        @Override
        public void openScan(int requestCode) {

        }

        @Override
        public void openFingerPrint(int requestCode) {

        }

        @Override
        public void takePhoto(String key) {

        }

        @Override
        public void onProgressChanged(int progressInPercent) {
            // 加载进度
        }

        @Override
        public void onGetBackgroundColor(String s) {

        }
    }

    /**
     * 返回键处理
     */
    @Override
    public void onBackPressed() {
        if (mHekrWeb != null) {
            mHekrWeb.notifyBackPressed();
        } else {
            finish();
        }
    }

    /**
     * 当页面销毁时,销毁H5页面
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mHekrWeb != null) {
            mHekrWeb.destroy();
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="me.hekr.sdkdemo.WebActivity">

    <FrameLayout
        android:id="@+id/layout_web"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.constraint.ConstraintLayout>

Web控制页面开发JS指南

六、混淆设置

core模块需要添加混淆规则

# Netty
-keep class io.netty.** {*;}
-dontwarn io.netty.**

web模块中需要添加混淆

# Crosswalk
-keep class org.xwalk.core.**{*;}
-keep class org.chromium.** {*;}
-keepattributes ** 

七、错误码使用说明

Hekr SDK中可以直接通过errorCode获取到对应的errorMessage

String errorMsg = ErrorCodeUtil.getErrorDesc(code);
errorCode 说明
11001 消息格式错误
11002 消息内容为空
11003 发送消息时App ID为空
11004 消息json字符串中没有params参数
11005 发送消息时没有连接
12001 网络错误
13001 局域网连接失败
13002 局域网授权超时
20001 没有发现配网设备
30001 网页加载错误

其他具体错误码参见API文档

错误码表