Android 开发文档¶
注意:该版本的SDK已经不再维护,新接入用户请集成 V2.0 SDK¶
概述¶
App 开发之前请先申请相关账号:
- 申请第三方平台登录账号目前支持 QQ,微信,微博,Google,Twitter,Facebook
- 申请个推账号
- 申请Hekr平台企业账号,并完善相关信息
开发准备¶
使用SDK开发之前请务必通读本文档
集成准备¶
1、下载SDK配置文件¶
2、快速导入SDK¶
- 
Gradle: compile 'me.hekr.hekrsdk:hekrsdk:1.2.4'
- Maven:
<dependency> <groupId>me.hekr.hekrsdk</groupId> <artifactId>hekrsdk</artifactId> <version>1.2.4</version> <type>pom</type> </dependency>
- Or download hekrSDK aar
一、配置¶
- 说明:本SDK中已使用以下依赖,请勿重复配置!
android-async-http-1.4.9.jar annotations-java5-15.0.jar eventbus-3.0.0.jar fastjson-1.1.52.android.jar httpclient-4.4.1.2.jar jmdns-3.2.2.jar lite-common-1.1.3.jar websocket.jar //第三方登录 qq/wechat/weibo libammsdk.jar mta-sdk-1.6.2.jar weiboSDKCore_3.1.2.jar open_sdk_r5509.jar
- 在项目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、在项目Application下进行sdk的初始化工作¶
HekrSDK.init(getApplicationContext(), R.raw.config);
//打开log,默认为false
HekrSDK.openLog(true);
二、用户接口¶
氦氪用户接口包括了用户的注册、登录等部分。开发者需要先通过1.1和1.2正确初始化SDK后进行操作。
2.1、用户注册¶
用户注册分为手机号码注册和邮箱注册。
手机号注册 流程示例code
//1.获取图形验证码
hekrUserAction.getImgCaptcha()
//2.校验图形验证码
hekrUserAction.checkCaptcha()
//3.发送短信验证码
hekrUserAction.getVerifyCode()
//4.校验短信验证码
hekrUserAction.checkVerifyCode()
//5.使用手机号注册
hekrUserAction.registerByPhone()
//使用邮箱注册
hekrUserAction.registerByEmail()
2.2、用户登录¶
hekrUserAction.login(String userName,String passWord,HekrUser.LoginListener loginListener);
| key | 类型及范围 | 说明 | 
|---|---|---|
| userName | String | 用户名 | 
| passWord | String | 用户密码 | 
返回结果
{
    "access_token": "xxx",
    "refresh_token": "xxx",
    "token_type": "bearer",
    "expires_in": 86399,
    "jti": "7ee5ade2-3d6b-4581-93b6-fea526337742"
}
import me.hekr.hummingbird.action.HekrUser;
import me.hekr.hummingbird.action.HekrUserAction;
private HekrUserAction hekrUserAction;
hekrUserAction = HekrUserAction.getInstance(context);
hekrUserAction.login(userName, passWord, new HekrUser.LoginListener() {
    @Override
    public void loginSuccess(String str) {
            //登录成功
        }
    @Override
    public void loginFail(int errorCode) {
            //登录失败            
        }
    });
2.3、第三方登录¶
注意:
- 若要使用第三方登录,必须先在各大平台中申请第三方登录权限,申请通过后将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(LoginActivity.this, HekrOAuthLoginActivity.class);
                    //第二个参数为第三方类型
                intent.putExtra(HekrOAuthLoginActivity.OAUTH_TYPE, HekrUserAction.OAUTH_QQ);
                    //第二个参数为第三方类型
                startActivityForResult(intent, HekrUserAction.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 HekrUserAction.OAUTH_QQ:
                        //之后可通过 氦氪openapi文档中3.13 或者 3.17 进行操作
                        break;
                    case HekrUserAction.OAUTH_WECHAT:
                        //之后可通过 氦氪openapi文档中3.13 或者 3.17 进行操作
                        break;
                    case HekrUserAction.OAUTH_SINA:
                        //之后可通过 氦氪openapi文档中3.13 或者 3.17 进行操作
                        break;
                }
            }
        }
    }
注意:移动端第三方登录中微博登录需要uid参数,sdk中已直接将uid参数封装至获取到certificate中,所以微博登录时可省略掉uid参数。或者直接使用SDK中的hekrUserAction.OAuthLogin();
https://uaa-openapi.hekr.me/MOAuth?type=SINA&pid=0000000000&clientType=ANDROID&certificate=certificate
SDK示例Code
//通过上一步拿到的certificate进行第三方登录
hekrUserAction.OAuthLogin(HekrUserAction.OAUTH_SINA,certificate, new HekrUser.MOAuthListener() {
    @Override
    public void mOAuthSuccess(MOAuthBean moAuthBean) {
        //该OAuth账号还未和主账号绑定
        }
    @Override
    public void mOAuthSuccess(JWTBean jwtBean) {
         //该OAuth账号已经和主账号绑定
        }
    @Override
   public void mOAuthFail(int errorCode) {
        //失败
        }
    });
2.4、当前用户token¶
示例code(调用此接口前用户必须登录成功)
//用户token
hekrUserAction.getJWT_TOKEN();
//用户唯一ID
hekrUserAction.getUserId();
三、设备配网¶
配网说明:仅适用于氦氪固件4.1.11.1及以上版本 配网示例
3.0、App配网流程¶
1、App获取PINCode
2、App将ssid、pwd、PINCode采用UDP协议发送至模块。
3、App在做第二步的同时,获取当前局域网设备直至配网结束。
3.1、开始配网¶
操作说明:请让模块处于配网模式
/**
* @param ssid wifi名称
* @param pwd wifi密码
* @param number 单次配网总时间
*/
smartConfig.startConfig(ssid, pwd, number, new SmartConfig.NewDeviceListener() {
            //单次配网时间内查询到的所有新设备(回调每次查询到的新设备)
            @Override
            public void getDeviceList(List<NewDeviceBean> newDeviceList) {
            }
            //单次配网时间内查询到的新设备(一旦有新的设备就会触发该回调接口)
            //只有newDeviceBean中属性bindResultCode值为0才算真正将该设备绑定到了自己账号下
            @Override
            public void getNewDevice(NewDeviceBean newDeviceBean) {
            }
            //单次配网时间内查到新设备
            @Override
            public void getDeviceSuccess() {
            }
            //单次配网时间内未查询到任何新设备
            @Override
            public void getDeviceFail() {
            }
        });
3.2、停止配网¶
注:(如不主动停止,将会在开始配网设置的时间内结束配网)
smartConfig.stopConfig();
3.3、补充说明¶
配网模式: wifi模块在间隔2秒闪烁表示进入配网模式
新设备定义: App配网过程中,模块处于以下情况App查询到的设备
- 模块处于配网模式,成功绑定自己本次配网所用账号的设备,判定依据NewDeviceBean 属性bindResultCode值为0
- 模块处于配网模式,但已被别人绑定的设备,判定依据NewDeviceBean 属性bindResultCode值为1 属性bindResultMsg值为E001:xxx,xxx即为真正绑定者的账号信息
- 模块处于配网模式,但模块pk与自定义App配置文件config.json所写Appid(console平台pid)不匹配,判定依据NewDeviceBean 属性bindResultCode值为1 属性bindResultMsg值为E003
- 模块处于配网模式,已被自己账号绑定上并未删除解绑的设备,判定依据NewDeviceBean 属性bindResultCode值为1 属性bindResultMsg值为E004
四、设备控制(Android Native)¶
控制先决条件:用户登录成功
4.1、发送控制命令¶
Json48透传协议:App下发数据->云端->模块->单片机
Json主控协议:App下发数据->云端->模块(含特殊外围电路直接响应)
4.1.1 SDK版本(≤1.1.2)¶
请求参数
| key | 类型及范围 | 说明 | 
|---|---|---|
| object | Object | 当前activity 例如:MainActivity.this | 
| devTid | String | 设备tid | 
| protocol | JSONObject | 参考协议 该协议中包含的msgID和appTid字段将由SDK自动补全 | 
| dataReceiverListener | DataReceiverListener | 命令发送回调 | 
| isAutoPassageway | boolean | false:只使用云端通道发送控制命令,true: 当前局域网内有设备时优先使用局域网通道发送控制命令(3秒未回复使用云端通道发送)局域网无设备直接使用云端通道发送控制命令 | 
回调返回值
{
  "msgId" : 291,
  "action" : "appSendResp",
  "code" : 200,
  "desc" : "success",
  "params" : {
    "devTid" : "xxxxxxx",
    "ctrlKey" : "xxxxxxxxxx",
    "appTid" : "xxxxxxxx",
    "data" : {
      "raw" : "48xxxxx"
    }
  }
}
String command={
  'action' : 'appSend',
  'params' : {
    'devTid' :'devTid',                 
    'ctrlKey' :'xxxxxx',             
    'data' : {
      'raw':'48xxxxxxx'
    }
  }
}
MsgUtil.sendMsg(TemplateActivity.this, tid, new JSONObject(command), new DataReceiverListener() {
        @Override
        public void onReceiveSuccess(String msg) {
            //接收返回命令                        
        }
        @Override
        public void onReceiveTimeout() {
            //命令接收超时                       
        }
    },false);
4.1.2 SDK版本(≥1.1.3)¶
48透传数据示例:480E02010201000000000000005C 具体设计在氦氪console平台
Json主控数据示例:"{\"R\":0,\"G\":255,\"B\":89,\"W\":0,\"bright\":1,\"cmdId\":1}" 具体设计在氦氪console平台
新增如下使用方法
请求参数
| key | 类型及范围 | 说明 | 
|---|---|---|
| object | Object | 当前activity 例如:MainActivity.this | 
| devTid | String | 设备tid | 
| ctrlKey | String | 设备ctryKey | 
| isAutoPassageway | boolean | isAutoPassageway为false 只使用云端通道发送控制命令,isAutoPassageway为true 当前局域网内有设备时优先使用局域网通道发送控制命令(3秒未回复使用云端通道发送)局域网无设备直接使用云端通道发送控制命令 | 
| protocolType | int | 数据类型 MsgUtil.PASSTHROUGH(48 透传数据)或 MsgUtil.MASTERCONTROL(Json 主控数据) | 
| protocolContent | String | 48透传字符串 或 Json主控字符串 | 
| dataReceiverListener | DataReceiverListener | 命令发送回调 | 
示例code
MsgUtil.sendMsg(TemplateActivity.this, deviceTid, ctrlKey, false, protocolType, protocolContent, new DataReceiverListener() {
        @Override
        public void onReceiveSuccess(String msg) {
            //接收返回命令                        
        }
        @Override
        public void onReceiveTimeout() {
            //命令接收超时                       
        }
    });
4.1.3 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、主动接收设备上报控制命令¶
4.2.1 SDK版本(≤1.1.2)¶
请求参数
| key | 类型及范围 | 说明 | 
|---|---|---|
| object | Object | web控制页面对象,若控制页为Android Native编写可直接当前activity的引用 例:MainActivity.this,额外说明:标识对象 当该对象释放后将不再接收消息 | 
| filter | JSONObject | 过滤条件 如果某个key的值为NULL表示只检查该key是否存在 | 
| dataReceiverListener | DataReceiverListener | 命令接收回调接口 | 
回调函数
void onReceiveSuccess(String msg);
void onReceiveTimeout();
示例code
String filter={
    'action' : 'devSend',
    'params' : {
    'devTid' : 'xxxxxxx'
    }
}
MsgUtil.receiveMsg(TemplateActivity.this, new JSONObject(filter), new DataReceiverListener() {
        @Override
        public void onReceiveSuccess(String msg) {
            //设备主动上报命令                                
        }
        @Override
        public void onReceiveTimeout() {
           //暂无用处
        }
    });
4.2.2 SDK版本(≥1.1.3)¶
请求参数
| key | 类型及范围 | 说明 | 
|---|---|---|
| object | Object | web控制页面对象,若控制页为Android Native编写可直接当前activity的引用 例:MainActivity.this,额外说明:标识对象 当该对象释放后将不再接收消息 | 
| deviceTid | String | 设备tid | 
| dataReceiverListener | DataReceiverListener | 数据接收回调接口 | 
回调函数
void onReceiveSuccess(String msg);
void onReceiveTimeout();
示例code
MsgUtil.receiveDevSendMsg(this, deviceTid, new DataReceiverListener() {
                @Override
                public void onReceiveSuccess(String msg) {
                    Log.i(TAG, "receive:onReceiveSuccess: " + msg);
                }
                @Override
                public void onReceiveTimeout() {
                }
            });
4.3、云端返回所有协议信息¶
作用:接收云端所有协议信息(例如appResp、devSend、appLoginResp等等动作信息),便于后续自行开发处理。
示例code
    import android.content.BroadcastReceiver;
    import android.content.Intent;
    import android.content.IntentFilter;
    public class DeviceCtrlActivity extends Activity{
        private MsgBroadReceiver msgBroadReceiver;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_xxx);
            createBroadcast();
        }
        /**
        * 创建广播接收器,用来接收SDK中发出的云端协议信息
        */
        private void createBroadcast() {
            msgBroadReceiver = new MsgBroadReceiver();
            IntentFilter filter = new IntentFilter();
            //只有持有相同的action的接受者才能接收此广播
            filter.addAction(ConstantsUtil.ActionStrUtil.ACTION_WS_DATA_RECEIVE);
            registerReceiver(msgBroadReceiver, filter);
        }
        class MsgBroadReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                //云端返回所有信息
                String backData=intent.getStringExtra(ConstantsUtil.HEKR_WS_PAYLOAD);
                Log.i("broadReceiver", backData);
            }
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (msgBroadReceiver != null) {
                unregisterReceiver(msgBroadReceiver);
            }
        }
    }
五、设备控制(Android Web)¶
控制先决条件:用户登录成功、hekrsdk版本更新至1.1.2及以上版本
5.1、接入指南¶
    //初始化HekrJSSDK
    hekrJSSDK=HekrJSSDK.getInstance(AppCompatActivity activity, RelativeLayout layout, WebView initView, DeviceBean deviceBean, String pushJsonMessage, boolean isOpenWebCache);
    //设置webview状态监听器
    hekrJSSDK.setWebViewPageStatusListener(new HekrJSSDK.WebViewPageStatusListener{});
    //开始加载deviceBean中的控制url
    hekrJSSDK.initUrl();
| key | 类型及范围 | 说明 | 
|---|---|---|
| activity | AppComapActivity | web控制Activity | 
| layout | RelativeLayout | web控制Activity根布局 | 
| initView | WebView | web控制Activity初始webView可以xml也可以new出来的 | 
| deviceBean | DeviceBean | hekr云端获取的设备信息对象 | 
| pushMessage | String | 推送消息预留入口,置空即可 | 
| isOpenWebCache | boolean | 是否采用webView页面缓存机制,true:首次打开该页面将自动下载控制页面zip包至手机SD卡 | 
六、云端接口¶
6.1、HekrUserAction接口说明¶
云端接口访问包括http get、post、delete、put、patch操作,请直接使用hekrUserAction操作,hekrUserAction可自动管理token,此类中封装了大量的常见接口。
示例code
import me.hekr.hummingbird.action.HekrUser;
import me.hekr.hummingbird.action.HekrUserAction;
private HekrUserAction hekrUserAction;
hekrUserAction = HekrUserAction.getInstance(context);
//3.18获取图形验证码
hekrUserAction.getImgCaptcha()
//3.19校验图形验证码
hekrUserAction.checkCaptcha()
//3.1 发送短信验证码
hekrUserAction.getVerifyCode()
//3.2 校验短信验证码
hekrUserAction.checkVerifyCode()
//3.3 使用手机号注册用户
hekrUserAction.registerByPhone()
//3.4 使用邮箱注册用户
hekrUserAction.registerByEmail()
//3.5 用户登录
hekrUserAction.login()
//3.6 重置密码
hekrUserAction.resetPwd()
//3.7 修改密码
hekrUserAction.changePassword()
//3.8 修改用户手机号
hekrUserAction.changePhoneNumber()
//3.9 发送重置密码邮件
hekrUserAction.sendResetPwdEmail()
//3.10 重新发送确认邮件
hekrUserAction.reSendVerifiedEmail()
//3.11 发送修改邮箱邮件
hekrUserAction.sendChangeEmailStep1Email()
//3.12 刷新Access Token
hekrUserAction.refresh_token()
//3.13 移动端OAuth
hekrUserAction.OAuthLogin()
//3.14 将OAuth账号和主账号绑定
hekrUserAction.bindOAuth()
//3.15 解除OAuth账号和主账号的绑定关系
hekrUserAction.unbindOAuth()
//3.16 移动端使用微信第三方账号登录
hekrUserAction.weChatMOAuth()
//3.17 创建匿名Hekr主账户并与当前登录三方账户绑定
hekrUserAction.createUserAndBind()
//4.1.1 绑定设备
hekrUserAction.bindDevice()
//4.1.2 列举设备列表
hekrUserAction.getDevices()
//4.1.3 删除设备
hekrUserAction.deleteDevice()
//4.1.4 更改设备名称/描述
hekrUserAction.renameDevice()
//4.1.5 获取当前局域网内所有设备绑定状态
hekrUserAction.deviceBindStatus()
//4.1.8 查询设备属主
hekrUserAction.queryOwner()
//4.2.1 添加目录
hekrUserAction.addFolder()
//4.2.2 列举目录
hekrUserAction.getFolder()
//4.2.3 修改目录名称
hekrUserAction.renameFolder()
//4.2.4 删除目录
hekrUserAction.deleteFolder()
//4.2.5 将设备挪到指定目录
hekrUserAction.devicesPutFolder()
//4.2.6 将设备从目录挪到根目录下
hekrUserAction.folderToRoot()
//4.3.2 反向授权创建 -1.授权用户创建授权二维码
hekrUserAction.oAuthCreateCode()
//4.3.2 反向授权创建 -2.被授权用户扫描该二维码
hekrUserAction.registerAuth()
//4.3.2 反向授权创建 -3.授权用户收到被授权者的请求
hekrUserAction.getOAuthInfoRequest()
//4.3.2 反向授权创建 -4.授权用户同意
hekrUserAction.agreeOAuth()
//4.3.2 反向授权创建 -5.授权用户拒绝
hekrUserAction.refuseOAuth()
//4.3.4 取消授权
hekrUserAction.cancelOAuth()
//4.3.5 列举授权信息
hekrUserAction.getOAuthList()
//4.4.5 添加预约任务/4.4.5.1 添加一次性预约任务/4.4.5.2 添加循环预约任务
hekrUserAction.creatRule()
//4.4.6 列举预约任务
hekrUserAction.getRules()
//4.4.7 编辑预约任务
hekrUserAction.editRule()
//4.4.8 删除预约任务
hekrUserAction.deleteRules()
//4.5.1 获取用户档案
hekrUserAction.getProfile()
//4.5.2 更新用户档案
hekrUserAction.setProfile()
//4.5.16 上传文件
hekrUserAction.uploadFile()
//4.5.17 列举已上传文件
hekrUserAction.getUserFiles()
//4.5.18 删除已上传文件
hekrUserAction.deleteUserFile()
//4.5.19 绑定推送标签接口
hekrUserAction.pushTagBind()
//4.7.2 列举群组
hekrUserAction.getGroup()
//4.7.2 列举群组
hekrUserAction.renameGroup()
//4.7.3 群组改名
hekrUserAction.deleteGroup()
//5.1 判断设备模块固件是否需要升级
hekrUserAction.checkFirmwareUpdate()
//5.2 根据pid获取企业资讯
hekrUserAction.getNewsByPid()
//5.5 售后管理 - 针对设备反馈问题
hekrUserAction.feedback()
//退出登录
hekrUserAction.userLogout()
//获取登录用户UID
hekrUserAction.getUserId()
//获取缓存到本地的用户档案
hekrUserAction.getUserCache()
6.2、其他未封装的接口操作请直接使用¶
hekrUserAction.getHekrData()
hekrUserAction.postHekrData()
hekrUserAction.putHekrData()
hekrUserAction.deleteHekrData()
hekrUserAction.patchHekrData()
//上传文件 uri为文件路径
hekrUserAction.uploadFile(String uri)
 private HekrUserAction hekrUserAction;
 hekrUserAction = HekrUserAction.getInstance(context);
 //get
 hekrUserAction.getHekrData(url, new HekrUserAction.GetHekrDataListener() {
        @Override
        public void getSuccess(Object object) {
            //get成功
        }
        @Override
        public void getFail(int errorCode) {
            //get失败
            String errorMsg = HekrCodeUtil.errorCode2Msg(errorCode);
        }
    });
 //post entity
 hekrUserAction.postHekrData(url, entity, new HekrUserAction.GetHekrDataListener() {
        @Override
        public void getSuccess(Object object) {
            //post成功
        }
        @Override
        public void getFail(int errorCode) {
            //post失败
            String errorMsg = HekrCodeUtil.errorCode2Msg(errorCode);
        }
    });
七、消息推送¶
7.1、推送配置¶
注:第三步资源文件及配置引入 方法一
7.2、接收推送消息示例¶
八、错误码使用说明¶
Hekr SDK中可以直接通过errorCode获取到对应的errorMessage
String errorMsg = HekrCodeUtil.errorCode2Msg(errorCode);
具体错误码如下:
设备控制错误码¶
| 错误码 | 提示信息 | 中文释义 | 可能造成的原因 | 
|---|---|---|---|
| 1200000 | Success | 调用成功 | 无 | 
| 1400000 | Error | 未知错误 | 该行以下所有1400开头的错误码需要单独处理 | 
| 1400001 | Json parse error | json解析错误 | json格式错误 | 
| 1400002 | JWT parse error | jwt_token解析错误 | jwt token错误 | 
| 1400003 | The field {0} contains a value that is too high | 属性值过高 | 发送报文中某属性的值超过了其上限 | 
| 1400004 | The field {0} contains a value that is too low | 属性值过低 | 发送报文中某属性的值低于了其下限 | 
| 1400005 | The value of the field {0} must be an enumerated value | 属性值必须为范围内枚举值 | 发送报文中某属性值不符合其定义的取值范围 | 
| 1400006 | Field not exist | 属性不存在 | 发送报文中存在了未定义的属性 | 
| 1400008 | devTid not match | 设备ID不匹配 | 报文填写的devTid与登录设备的devTid不一致 | 
| 1400009 | App repeat login | APP重复登录 | 同一个appTid的app重复登录 | 
| 1400010 | User does not exist | 用户不存在 | 用户不存在或者uid填错了 | 
| 1400011 | The device does not have this instruction | 设备不具有该指令 | 设备不具备该指令 | 
| 1400012 | Device does not belong to user | 设备不属于该用户 | 设备不再属于该用户 | 
| 1400013 | Device repeat login | 设备重复登录 | 设备同时登录 | 
| 1400014 | Frame parse error | 帧解析错误 | 报文格式或内容错误 | 
| 1400015 | Device last token can not use | 设备上一次token已过期无法使用 | 使用的旧token已经超过上限 | 
| 1400016 | Action not support | 该帧行为不被支持 | 报文中的action填错了 | 
| 1400017 | Device token can not verification | 设备token校验错误 | 设备token错误 | 
| 1400018 | Device not online | 设备不在线 | 设备离线 | 
| 1400019 | App is not logged in | app未登录 | app未登录或其他原因导致云端认为app已经离线 | 
| 1400020 | Device is not logged in | 设备未登录 | 设备未登录或其他原因导致云端认为设备已经离线 | 
| 1400022 | The device is not found | 找不到指定(devTid)设备 | 当前产品下不存在该设备 | 
| 1400023 | appTid does not match | app设备id不匹配 | 当前发送报文的appTid与绑定设备时的appTid不一致 | 
| 1400024 | You report info does not match your connect server | 上报节点信息与实际不符 | 上报的内容与当时连接节点信息不一致 | 
| 1400025 | RAW not valid, Please check your protocol template | 协议不合法,请参照协议模板 | 48协议串不合法 | 
| 1400026 | AuthKey can't auth | authKey 认证失败 | 填写了错误的authkey | 
| 1400027 | Product key not available | 不是有效的pk | 填写了错误的pk | 
| 1400028 | PinCode or SSID not available | pinCode或者ssid无效 | 填写了无效的pinCode或者ssid | 
| 1400029 | Bind failed due to timeout error | 绑定设备超时错误 | 绑定设备超时 | 
| 1400030 | Can not bind other manufacture's device | 无法绑定其它厂商的设备 | APP绑定了非该厂家的设备 | 
| 1400039 | Device license can not verification | 设备license不合法 | 请填写正确的license | 
| 1400031 | Can not force bind device | 无法强绑设备 | 设备设定为无法强绑,强绑失败 | 
| 1400032 | Invalid Param | 参数不合法 | 协议参数不合法 | 
| 1400040 | frame payload error | 帧内容校验失败 | 可能帧内容或者求和不对 | 
| 1500000 | Internal error | 内部错误 | 服务内部错误 | 
| 1500001 | Link error | 链路错误 | 链路错误 | 
认证授权错误码¶
用户API错误码¶
| 错误码 | 提示信息 | 中文释义 | 可能造成的原因 | 
|---|---|---|---|
| 5200000, 620000 | Success | 成功 | 无 | 
| 5400000 | Error | 未知错误 | 该行下面的以5400、6400开头的错误码需要单独处理 | 
| 5400002 | App repeat login error | app重复登录 | 同一个appTid的app重复登录 | 
| 5400003 | appTid can not be empty | appTid不能为空 | appTid不能为空 | 
| 5400004 | Authorization already exists | 授权关系已存在 | 授权关系已存在 | 
| 5400005 | Authorization does not exist | 授权关系不存在 | 授权关系不存在 | 
| 5400006 | Bind failed due to network error | 因网络原因绑定失败 | 因网络原因绑定失败 | 
| 5400007 | Bind failed due to timeout error | 因超时原因绑定失败 | 因超时原因绑定失败 | 
| 5400008 | Can not bind other manufacture's device | 无法绑定其他厂商设备 | 非公版用户无法绑定非该pid设备 | 
| 5400009 | Modified user profile failed | 修改用户档案失败 | 修改用户档案失败 | 
| 5400010 | Check verify code error | 校验code失败 | 校验code失败 | 
| 5400011 | You have reached your device's authorization limits | 设备授权次数达到上限 | 设备授权次数达到上限,无法再次授权 | 
| 5400012 | Bind failed due to internal error | 因内部错误绑定失败 | 因内部错误绑定失败,一般是因为bindKey不对或者是devTid不对 | 
| 5400013 | Bind failed due to repeat bind | 因重复绑定绑定失败 | 因重复绑定绑定失败 | 
| 5400014 | Device does not belong to user | 设备不属于用户 | 设备不再属于该用户 | 
| 5400015 | No such instruction error | 没有这样的指令 | 没有这样的指令 | 
| 5400016 | Device can not repeat login | 设备无法重复登录 | 设备无法同时登录 | 
| 5400017 | devTid can not be empty | devTid不能为空 | devTid不能为空 | 
| 5400018 | Create timer task failed due to counts reach limit | 创建定时预约次数达到上限 | 创建定时预约次数达到上限 | 
| 5400019 | Instruction expired | 授权的指令已过期 | 授权的指令已过期 | 
| 5400020 | Instruction not support | 不支持该指令 | 不支持该指令,可能是指令填错了 | 
| 5400021 | Invalid email token | 不合法的邮件token | 不合法的邮件token | 
| 5400022 | Invalid old password | 不合法的旧密码 | 不合法的旧密码 | 
| 5400023 | Invalid verify code | 不合法的校验code | 不合法的校验code | 
| 5400024 | Device does not found due to internal error, please reconnect | 由于内部错误设备无法找到,请重连 | |
| 5400025 | No such manufacture id | 不存在该pid | 不存在该pid | 
| 5400026 | No permission to access the instruction | 没有对该指令的权限 | 没有对该指令的权限 | 
| 5400027 | Template with given id does not exist | 指定模板不存在 | 指定模板不存在 | 
| 5400028 | Device does not found due to incorrect status | 由于内部不正确的状态导致设备无法被找到 | |
| 5400035 | TaskId does not exist | 指定任务不存在 | 指定任务不存在 | 
| 5400036 | Can not create duplicate template | 无法创建重复模板 | 无法创建重复模板 | 
| 5400037 | devTid not match | 设备id 不匹配 | 报文填写的devTid与登录设备的devTid不一致 | 
| 5400039 | User does not exist | 用户不存在 | 用户不存在 | 
| 5400045 | 短码或者短码密码错误 | ||
| 5400046 | 短码不足(系统错误) | ||
| 5400047 | 无权修改其他用户绑定设备 | ||
| 5400043 | Device can not force bind | 设备无法强制绑定 | 设备无法强制绑定 | 
| 5500000 | Internal error | 内部错误 | 内部服务错误 | 
| 6400001 | Reverse auth template with given id does not exist | 指定id的反向注册申请不存在 | 请求已经被同意或拒绝 | 
| 6400002 | Invalid reverse authorization request | 不合法的反向授权请求 | 设备此时已经不属于该授权者;调用者不是授权者;反向授权请求id错误 | 
| 6400003 | Only owner can authorize | 只有属主可以授权设备给其他人 | 非属主尝试授权设备给其他人 | 
| 6400004 | Device with given devTid does not exist | 指定devTid的设备不存在 | 操作不存在的设备 | 
| 6400005 | Reached the maximum number of device the folder can hold | 达到文件夹所能容纳设备数量的上限 | 达到文件夹所能容纳设备数量的上限 | 
| 6400006 | Can not create duplicate template folder | 无法创建同名文件夹 | 创建同名文件夹 | 
| 6400007 | Folder with given id does not exist | 指定id的文件夹不存在 | 操作不存在的文件夹 | 
| 6400008 | Reached the maximum number of folder the user can create | 达到创建文件夹数量上限 | 达到创建文件夹数量上限 | 
| 6400009 | Can not remove root folder | 无法删除根目录 | 删除根目录 | 
| 6400010 | Can not rename root folder | 无法给根目录改名 | 给根目录改名 | 
| 6400011 | Rule with given id does not exist | 指定的规则不存在 | 操作不存在的规则 | 
| 6400012 | Scheduler task with given id does not exist | 指定的定时预约任务不存在 | 操作不存在的定时预约任务 | 
| 6400013 | Can not create duplicate rule | 无法创建相同的规则 | 创建相同的规则 | 
| 6400014 | Can not create duplicate scheduler task | 无法创建相同的定时预约 | 创建相同的定时预约 | 
| 6400015 | Invalid prodPubKey | 不合法的产品公共秘钥 | 不合法的产品公共秘钥 | 
| 6400016 | Has no privilege do that | 没有权限这样做 | 操作没有权限 | 
| 6400017 | Invalid Param {0} | 参数错误 | 请求参数错误 | 
| 6400018 | Cloud storage file with given name does not exist | 指定的网盘文件不存在 | 操作不存在的网盘文件 | 
| 6400020 | Can not find this infrared code | 找不到这个红外码 | 操作不存在的红外码 | 
| 6400021 | Infrared code request without response | 红外服务请求出错 | |
| 6400022 | Can not find instruction set | 无法找到指令集 | 操作不存在的指令集 | 
| 6400023 | Request params not supported | 参数不支持 | 请求参数错误 | 
| 6400024 | Translating Json to String failure | 解析json失败 | |
| 6400025 | Scheduler not supported | 不支持定时预约 | 该设备不支持定时预约功能 | 
| 6500001 | Delete cloud storage file failed | 删除网盘文件失败 | 网盘操作失败 | 
| 6500002 | Upload cloud storage file failed | 上传网盘文件失败 | 网盘操作失败 | 
| 6500003 | Server use httpClient invoke failed | http网络调用失败 | http调用失败 | 
企业API错误码¶
| 错误码 | 提示信息 | 中文释义 | 
|---|---|---|
| 8200000 | Success | 调用成功 | 
| 8400000 | Product does not exist | 产品不存在 | 
| 8400001 | Protocol template does not exist | 协议模板不存在 | 
| 8400002 | Illegal argument | 非法参数 | 
| 8400003 | The param of platform is not illegal. The client should be Android or IOS | 平台参数错误;应为Android或IOS | 
| 8400004 | The pid does not exist | 指定pid不存在 | 
| 8400005 | The h5 template does not exist | h5模板不存在 | 
| 8400028 | 产品类型错误,目前只支持48产品 | |
| 8400030 | 未找到设备长短码信息 | |
| 8400029 | 权限错误,无权查看该设备信息 | |
| 8400031 | 缺少配额 |