AiCloud Android SDK 开发指导
AiCloud Android SDK 开发指导
v1.4.0
修订历史
版本 | 修订内容 | 修订人 | 审核人 | 修订日期 |
1.0.0 | 创建文档 | 白雪茹 | 2016.8.23 | |
1.0.1 | 添加SDK所需权限 | 白雪茹 | 2016.8.24 | |
1.0.2 | 修改使用权限 | 白雪茹 | 2016.8.25 | |
1.0.3 | 添加智能连接,入网成功两个接口回调,修改错误信息 | 白雪茹 | 2016.8.30 | |
1.0.4 | 合并用户绑定方法 | 白雪茹 | 2016.8.31 | |
1.1.0 | 添加批量部署接口 | 白雪茹 | 2016.9.5 | |
1.1.1 | 修改初始化控制信息接口,增加了用户名,密码两个参数 | 白雪茹 | 2016.9.6 | |
1.1.2 | 修改MQTT订阅返回信息,将返回的topic修改为device_id | 白雪茹 | 2016.9.7 | |
1.2.0 | 添加局域网控制 | 白雪茹 | 2016.9.18 | |
1.2.1 | 修改球泡灯数据点 | 白雪茹 | 2016.10.9 | |
1.3.0 | 与ios统一方法名称,修改部署方法,取消单个部署,修改绑定方法,修改MQTT服务,现在获取设备列表和部署同时进行 | 白雪茹 | 2016.10.28 | |
1.3.2 | 修改openMQTTServer()接口 | 白雪茹 | 2016.11.2 | |
1.4.0 | 更新命名方式,以及无数API | 白雪茹 | 2016.11.22 |
环境配置
使用sdk所需要添加的依赖
compile files('libs/javastruct-0.1.jar') compile 'com.google.code.gson:gson:2.2.4' compile 'com.koushikdutta.async:androidasync:2.1.8' compile 'com.koushikdutta.ion:ion:2.1.8' compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'
配置信息说明
static{ //TODO:处理配置信息,配置信息根据厂商不同会发生改变 CommConfig.NETWORK_URL="http://api.vcd.io:4568/v1/"; CommConfig.ACCESS_SECRET="cafdeb099d45eee7e2faddea091fd609"; CommConfig.ACCESS_KEY="8e0bb23839955bde1346b6e9395347ff"; Commconfig.VENDOR_ID="2D8UbrFaRDDvWbhCaqQc8"; Commconfig.APPNAME="SmartDevice" }
配置信息建议写到Application类中
SDK所需权限说明
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <!--网络状态--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 访问网络 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 网络通信 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 获取设备信息 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 读写sdcard,storage等等 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <!-- 用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据?--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="com.android.providers.media.MediaProvider"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> <!-- 网络状态 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 访问网络 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 网络通信 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 获取设备信息 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 读写sdcard,storage等等 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <!-- 用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="com.android.providers.media.MediaProvider"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
设备配置说明
球泡灯:连续开关三次球泡灯进入智能连接模式,此时灯泡表现为红色闪烁状态,连续开关四次球泡灯进入AP连接模式,此时球泡灯表现为颜色不停变换,连续开关十次球泡灯初始化完成并进入智能连接状态。
插座:长按开关按钮,小绿灯慢闪为智能连接状态,五秒钟后小驴灯中闪,此时为AP连接状态,长按10秒小绿灯变为超快闪,此时插座为初始化状态,松手后进入智能连接模式。
控制流程
API调用说明
本部分主要介绍SDK中API的使用
登录
获取UserManager实例
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
无 | 无 | 无 | 无 | 无 |
返回参数
参数 | 类型 | 说明 |
instance | UserManger | UserManger实体对象 |
方法调用说明
UserManager.getInstance();
返回实例
return instance;
短信验证
请求示例
参数 | 类型 | 必须 | 默认 | 说明 |
phone | String | 是 | 无 | 手机号码 |
1 | int | 是 | 无 | 重置密码获取验证码时传2,注册账号获取验证码传1 |
context | Context | 是 | 无 | 上下文对象 |
callback | Callback | 是 | 无 | 接口回调 |
返回参数
参数 | 类型 | 说明 |
user_code | String | 用户code,注册时会用到 |
方法调用示例
userManager.getMessage(phone, 1, this, new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){ } });
返回示例
{ "success":true, "data":{ "userCode":"sa4nUnfQisGTZH3EmE8JEE" } }
注册
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
mobile | String | 是 | 无 | 手机号码 |
password | String | 是 | 无 | 登陆时密码 |
messageCode | String | 是 | 无 | 短信验证码 |
userCode | String | 是 | 无 | 获取短信验证码方法中返回 |
context | Context | 是 | 无 | 上下文对象 |
callback | Callback | 是 | 无 | 接口回调 |
返回参数
参数 | 类型 | 说明 |
userId | String | 用户id,用户的唯一身份标识 |
方法调用示例
UserManager.register(username, password, message_code, user_code, mobile, newCallback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){ } }, this);
返回示例
{ "success":true, "data":{ "userId":"sa4nUnfQisGTZH3EmE8JEE" } }
登录
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
username | String | 是 | 无 | 手机号码/用户昵称 |
password | String | 是 | 无 | 登录密码 |
context | Context | 是 | 无 | 上下文对象 |
callback | Callback | 是 | 无 | 接口回调 |
返回参数
参数 | 类型 | 说明 |
userToken | String | 用户token(2小时过期) |
userId | String | 用户id |
方法调用示例
UserManager.login(username, password, new Callback<JsonObject>() { @Override public void onCompleted(Exception e, JsonObject jsonObject){ }, this);
返回示例
{ "success":true, "data":{ "userToken":"350cfc21-cc96-4a59-8570-d4d1e40b1ebe", "userId":"sa4nUnfQisGTZH3EmE8JEE" } }
修改密码
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
mobile | String | 是 | 无 | 手机号码/用户昵称 |
password | String | 是 | 无 | 新用户密码 |
messageCode | String | 是 | 无 | 短信验证码 |
userCode | String | 是 | 无 | 获取短信验证码时可返回 |
context | Context | 是 | 无 | 上下文对象 |
callback | Callback | 是 | 无 | 接口回调 |
返回参数
参数 | 类型 | 说明 |
true(false) | boolean | 修改密码是否成功 |
方法调用说明
userManager.resetPwd(mobile, password, messageCode, userCode, this, new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){ if(jsonObject!=null && jsonObject.toString().length()>0){ } } );
返回示例
{ "success":true, "data":{ "success":"true" } }
获取用户信息
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
userId | String | 是 | 无 | 用户Id |
context | Context | 是 | 无 | 上下文对象 |
callback | Callback | 是 | 无 | 接口回调 |
返回参数
参数 | 类型 | 说明 |
username | String | 用户昵称 |
mobile | String | 用户手机号码 |
方法调用示例
userManager.getUserInfo(userId, new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){} }, getContext() );
返回示例
{ "success":true, "data":{ "username":"葫芦小金刚", "mobile":"15723652874" } }
修改用户信息
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
userId | String | 是 | 无 | 用户Id |
username | String | 是 | 无 | 用户新昵称 |
context | Context | 是 | 无 | 上下文对象 |
callback | Callback | 是 | 无 | 接口回调 |
返回参数
{ "success":true, "data":{ "success":"true" } }
获取设备
获取设备有两种,一种是获取用户已经绑定过的设备,一种是用户未绑定过的设备
获取绑定设备是从服务器上直接获得已经与用户建立过连接的设备,这些设备又分为两种,一种是在线设备,一种是离线设备。用户可以直接操控在线设,但不能操控离线设备,用户可以对所有设备进行解绑和更改用户信息的操作。
获取绑定设备
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
ssid | String | 是 | 无 | 设备要接入WiFi的名称 |
password | String | 是 | 无 | 设备要接入WiFi的密码 |
callback | CallBack | 是 | 无 | 请求成功的接口回调 |
返回参数
参数 | 类型 | 说明 |
deviceId | String | 设备id |
devicePassword | String | 设备密码 |
productId | String | 产品id(判断设备类型) |
status | String | 设备在线离线状态(“0”:离线,“1”:在线) |
server | String | 设备服务器地址 |
deviceName | String | 设备名 |
logo | String | 设备logo |
productName | String | 产品名 |
方法调用示例
userManager.getDeviceList(token, new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){ } },this );
返回示例
{ "success":true, "data":[{ "deviceId":"vkCEgh3L3c4oywmuFBgnXS", "devicePassword":"4a24f36fed73ca66a24e9fd0c3760ac0", "productId":"kc9dRAXr35PEA7PCZcR4z9", "status":"1", "server":"mqtt://221.122.108.89:1883", "deviceName":"设备名称" "logo":"http://doss.ai-thinker.com/devicexx/esp8266.png" "productName":"球泡灯" }] }
解除绑定
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
user_token | String | 是 | 无 | 用户token,有过期时间,用户登录时获得 |
device_id | string | 是 | 无 | 设备唯一id,用户查询已绑定列表时可以获得 |
device_password | string | 是 | 无 | 设备密码,用户查询已绑定列表时可以获得 |
callback | Callback | 是 | 无 | 请求成功的接口回调 |
context | Context | 是 | 无 | 上下文对象 |
返回参数
参数 | 类型 | 说明 |
result | String | 解除设备是否成功 |
方法调用示例
userManager.unbindDevice(token, device_id, device_password, newCallback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){ } }, DeviceListActivity.this);
返回示例
{ "success":true, "data":{ "result":"SUCCESS" } }
修改设备信息
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
deviceId | String | 是 | 无 | 设备唯一id,用户查询已绑定列表时可以获得 |
deviceName | string | 是 | 无 | 用户给设备的命名 |
callback | Callback | 是 | 无 | 修改成功接口回调 |
返回参数
参数 | 类型 | 说明 |
true | boolean | 解除设备是否成功 |
方法调用示例
userManager.updateDeviceInfo(bean.getDevice_id(), name, new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){ } }, getContext());
返回示例
{ "success":true, "data":{ "success":"true" } }
获取厂商信息
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
context | Context | 是 | 无 | 上下文对象 |
callback | Callback | 是 | 无 | 接口回调 |
返回参数
参数 | 类型 | 必须 | 默认 | 说明 |
productId | String | 是 | 无 | 产品Id |
productName | String | 是 | 无 | 产品名称 |
方法调用示例
userManager.getVendorInfo(getContext(), new Callback<JsonObject>() { @Override public void onCompleted(Exception e, JsonObject jsonObject) { Log.e(TAG, "getVendor:"+e); Log.i(TAG,"getVendorInfo:" + jsonObject); saveVendorInfo(e, jsonObject); } });
返回示例
{ "success":true, "data":{ "productVList":[ { "productId":"3G8pAXs2kppdLwHZHqTeWH" "productName”:"AiBo" }] } }
发现先未绑定设备
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
callback | CallBack | 是 | 无 | 请求成功的接口回调 |
返回参数
参数 | 类型 | 说明 |
productId | String | 产品Id |
deviceId | String | 设备Id |
mac | String | 设备mac |
deviceHost | String | 设备Ip |
devicePort | String | 设备端口 |
方法调用示例
deviceManager.discoverDevice(new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){ } });
返回示例
{ "productId":"kc9dRAXr35PEA7PCZcR4z9"", "deviceId":"JiEbsXMdn2W5uZtMm6fmr6", "mac":"001122334455", "deviceHost":"225.224.224.0", "devicePort":"8080" }
绑定设备
参数 | 类型 | 必须 | 默认 | 说明 |
deviceManager | DeviceManager | 无 | DeviceManager的实体类 | |
deviceHost | String | 是 | 无 | 设备IP,可在发现未绑定设备时获取 |
devicePort | string | 是 | 无 | 设备端口,可在发现未绑定设备时获取 |
user_token | String | 是 | 无 | 用户token,有过期时间,用户登陆时获取 |
callback | CallBack | 是 | 无 | 请求成功的接口回调 |
context | Contex | 是 | 无 | 上下文对象 |
返回参数
参数 | 类型 | 说明 |
true | boolean | 绑定是否成功 |
请求示例
new Thread(){ @Override public void run(){ super.run(); userManager.bindingDevice(deviceManager, deviceHost, devicePort, token, new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject){ } }, DeviceListActivity.this); } }.start();
返回示例
{ "success":true, "data":{ "success":"true" } }
控制设备
控制设备有两种请况,一种是通过广域网控制设备,一种是通过局域网控制设备
局域网控制设备
局域网控制设备的前提是必须开启TCP服务
打开TCP服务
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
device_ip | String | 是 | 无 | 硬件TCP?IP地址,可在发现设备时获得 |
device_id | String | 是 | 无 | 设备id,可以在获取绑定列表时获取 |
device_password | String | 是 | 无 | 设备密码,可以在获取绑定列表时获取 |
callback | Callbackt | 是 | 无 | TCP服务开启成功接口回调 |
返回参数
无
方法调用示例
deviceManager.openTCPServer(device_ip, deviceId, device_password,new Callback<JsonObject>() { @Override public void onCompleted(Exception e, JsonObject jsonObject){ } });
返回示例
无
关闭TCP服务
请求参数
无
返回参数
无
请求方法示例
deviceManager.closeTCPServer();
返回示例
无
发布控制信息
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
jsonObject | JsonObject | 是 | 无 | json字符串形式的参数 |
callback<JsonObject> | Callback | 是 | 无 | 控制数据发送成功接口回调(返回类型为json字符串) |
Callback<byte[]> | Callback | 是 | 无 | 控制数据发送成功接口回调(返回类型为字节数组) |
返回参数
根据不同控制信息设备返回控制参数有所不同,详见返回示例
方法调用示例(发送json字符串,返回json字符串和byte[])
deviceManager.tcpSendData(params, new Callback<JsonObject>() { @Override public void onCompleted(Exception e, JsonObject jsonObject){ } new Callback<byte[]>() { @Override public void onCompleted(Exception e, byte[] bytes){ } } });
方法调用示例(发送byte[],返回byte[])
deviceManager.tcpSendData(params.toString().getBytes(), new Callback<byte[]>() { @Override public void onCompleted(Exception e, byte[] bytes) { } });
方法调用示例(发送json,返回json)
deviceManager.tcpSendData(params, new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject) { } });
方法调用示例(发送byte[],返回jsonhebyte[])
deviceManager.tcpSendData(params.toString().getBytes(), new Callback<JsonObject>(){ @Override public void onCompleted(Exception e, JsonObject jsonObject) { } },new Callback<byte[]>() { @Override public void onCompleted(Exception e, byte[] bytes) { } });
发送参数params示例
写球泡灯
{ "i":4, "d":{ "s":0, "m":1, "hue":0.5, "lit":0.5, "sat":0.5, "lum":0.5, "tem":0.5 }, "t":1464714257 "device_id":"PGiHMkrgyxrUCuLgEfubUU" }
读球泡灯
{ "i":4, "d":{[ "s":0, "m":1, "hue":0.5, "lit":0.5, "sat":0.5, "lum":0.5, "tem":0.5 ]}, "t":1464714257 }
返回参数示例
读(写)球泡灯
{ "i":4, "d":{ "s":0, "m":1, "hue":0.5, "lit":0.5, "sat":0.5, "lum":0.5, "tem":0.5 }, "t":1464714257 "device_id":"PGiHMkrgyxrUCuLgEfubUU" }
广域网控制设备
广域网控制设备的前提是必须先建立MQTT连接
设备部署
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
user_token | String | 是 | 无 | 用户token,有过期时间 |
callback | Callback | 是 | 无 | 部署成功接口回调 |
context? | Context | 是 | 无 | 上下文对象 |
返回参数
参数 | 类型 | 说明 |
server | String | 设备所连接服务器地址 |
username | String | (用户昵称) |
password | String | 用户密码(加密后) |
pubkey | String | ? |
pubVersion | String | 硬件固件版本 |
方法调用说明
instance.batchDeploy(token, new Callback<JsonObject>() { @Override public void onCompleted(Exception e, JsonObject jsonObject) { } }, this);
返回说明
返回值示例(接口回掉返回json字符串)
{ "success":true, "data":{ "server_list":[( { "server":"mqtt://s1.vcd.io:1883", "username":"tNb3ZgG9HLNiCEfNnushp6", "password":"dmUxHriiFrsAxJNTNd9Pz3", "pubkey":"", "pk_version":"" } ], "signature":"8e0bb23839955bde1346b6e9395347ff" } }
建立MQTT连接
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
serverUrl | String | 是 | 无 | MQTT请求地址,用户部署时返回,用户部署,绑定设备,获得绑定设备中可以获得该地址。 |
username | String | 是 | 无 | 登录MQTT时的用户名,在部署时可获得 |
password | String | 是 | 无 | 登录MQTT时的用密码,在部署时可获得 |
user_id | String | 是 | 无 | 用户ID,用户登录时返回,用户登录时可以获得 |
uuid | String | 是 | 无 | 用户第一次登录设备时生成,详见特殊说明,uuid说明 |
callback(JsonObject) | CallBack | 是 | 无 | 请求成功的接口回调(返回值类型为JsonObject) |
callback(byte[]) | Callback | 是 | 无 | 请求成功的接口回调(返回值类型为byte[]) |
返回参数
返回值为广域网控制设备时设备的反馈信息,详见局域网控制信息返回
方法调用示例
deviceManager.openMQTTServer(server,userName,userPassword,userId,uuid,new DataCallback<String,{ JsonObject>() @Override public void onCompleted(Exception e, String device_id, JsonObject jsonObject) {} },new DataCallback<String, byte[]>(){ @Override public void onCompleted(Exception e, String s, byte[] bytes) { } } );
返回示例
见TCP控制返回示例
控制设备
请求参数
参数 | 类型 | 必须 | 默认 | 说明 |
serverUrl | String | 是 | 无 | MQTT请求地址,用户部署时返回,用户部署,绑定设备,获得绑定设备中可以获得该地址。 |
deviceId | String | 是 | 无 | 要控制设备的id |
params | String | 是 | 无 | 发送的控制数据 |
context | String | 是 | 无 | 上下文对象 |
返回参数
无
方法调用示例(发送json)
deviceManager.publishMessage(serverUrl, deviceId, params, this);
方法调用示例(发送byte[])
deviceManager.publishMessage(serverUrl, deviceId, params.toString().getBytes(), this);
Parms示例
见TCP控制params示例
返回示例
无
免责声明和版权公告
本文中的信息,包括供参考的URL地址,如有变更,恕不另行通知。
档“按现状”提供,不负任何担保责任,包括对适销性、适于特定途或侵权性的任何担保,和任何提案、规格或样品在他处提到的任何担保。本档不负任何责任,包括使本档内信息产的侵犯任何专利权为的责任。本档在此未以禁反或其他式授予任何知识产权使许可,不管是明许可还是暗许可。
Wi-Fi联盟成员标志归Wi-Fi联盟所有。中提到的所有商标名称、商标和注册商标均属其各所有者的财产,特此声明。