云服务

云服务提供应用数据的云端存储。

与机智云的关系

云服务采用机智云的云服务。机智云网站:http://site.gizwits.com/developer。

数据的定义

进入机智云平台,注册账号并登录。选择“硬件接入”进入后点击“创建新产品”,在“添加产品”页面填上“设备名称”,“通讯方式”选择“BLE”,“设备类型”没有特别要求,然后点击确定。进入新设备接入向导,点击“手动编辑数据点”,再点击“新建数据点”,在这里输入“数据点名称”和“数据类型”。机智云支持布尔、枚举、数字、字符串类型。之后一直点击下一步,直到点击完成,最后可以看到生成的设备详细信息,其中“APP ID”和“产品标识码”我们后面会用到。

类和接口:

CloudServiceManager:
云管理者类,可以用这个类登录云、注册云账号、查询云数据、插入云数据等操作。

CloudQuery:
云数据查询条件类。支持子条件,可以通过子条件组合成复杂条件

CloudDataValues:
云数据类。存放数据库的一行数据,一行数据包含多项数据,每项数据以 key-value 的方式存放。

AccountListener:
监听账号处理相关操作的执行结果

LoginListener:
监听登录操作的执行结果

DataInfoListener:
监听数据更新操作的执行结果,如果查询成功 则以List<CloudDataValues>的形式返回查询结果。

DataInsertListener:
监听数据插入操作的执行结果

DataOperationListener:
监听数据更新删除操作的执行结果

服务获取和初始化:

为了使用云首先需要连接云服务。你需要先实例化ServiceClient并传递SERVICE_CLOUD作为参数。
代码如下:

private ServiceClient mClient 
    = new ServiceClient(this, ServiceManagerContext.SERVICE_CLOUD, this);
...
mClient.connect()

然后获取mClient 连接成功后获取CloudServiceManager对象。代码如下:

private CloudServiceManager mCloudService;
@Override
public void onConnected(ServiceClient serviceClient) {
   mCloudService = (CloudServiceManager) mClient.getServiceManagerContext();
}

CloudServiceManager的使用:

初始化:

在开始使用之前要先初始化,指定要操作的数据库的APP_KEY 和 PRODUCT_KEY,即数据定义中提到的“APP ID”和“产品标识码”。
代码如下:

public final static String APP_ID = "7a9a7b387df64979ac67518fb0b6649e";
public final static String PRODUCT_KEY = "25ee6d29f9f74743a6ee4fdcca8d4869";
mCloudService.init(APP_ID, PRODUCT_KEY);

登录:

登录分为普通登录、匿名登录、第三方账号登录分别为:
    public void login(String userName, String password, LoginListener listener);
    public void loginAnonymous(LoginListener listener);
    public void loginWithThirdAccount(int accountType, String uid, String token, LoginListener listener);

普通登录使用用户名密码登录,登录结果通过LoginListener返回。
普通登录的代码:

mCloudService.login(userName, password,
        new LoginListener() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onFailure(int errCode, String errMsg) {
                IwdsLog.d(this, "login failure: " + errMsg);
            }
        });

匿名登录不需要用户名密码,登录结果通过LoginListener返回。
代码如下:

mCloudService.loginAnonymous(
        new LoginListener() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onFailure(int errCode, String errMsg) {
                IwdsLog.d(this, "login failure: " + errMsg);
            }
        });

第三方登录

首先需要在第三方平台注册应用,并得到该应用的id,然后给机智云邮箱open@gizwits.com发邮件,请求绑定第三方应用和机智云产品并提供双方id。然后下载第三方sdk,用该sdk实现登录,登录成功后会得到uid和token,再调用loginWithThirdAccount传入 uid 和 token 实现登录。

登录成功之后就可以插入数据和查询数据了。

数据的表示

CloudDataValues 用来保存数据库的一行数据。例如下面的表,

name

age

weight

jack

17

120

tom

21

150

可表示为两个 CloudDataValues 对象,如下:

CloudDataValues data1 = new CloudDataValues();
data1.put("name", "jack");
data1.put("age", 17);
data1.put("weight", 120);

CloudDataValues data2 = new CloudDataValues();
data2.put("name", "tom");
data2.put("age", 21);
data2.put("weight", 150);

插入数据

插入数据用 insertData,传入数据CloudDataValues 的List,结果通过DataInsertListener返回。

函数声明:

    void insertData(List<CloudDataValues> data, DataInsertListener listener);

插入数据代码:

List<CloudDataValues> dataList = new ArrayList<CloudDataValues>();
CloudDataValues data;

data = new CloudDataValues();
data.put("name", "jack");
data.put("age", 17);
data.put("weight", 120);
data.put("ts", System.currentTimeMillis());
dataList.add(data);

data = new CloudDataValues();
data.put("name", "tom");
data.put("age", 21);
data.put("weight", 150);
data.put("ts", System.currentTimeMillis());
dataList.add(data);

mCloudService.insertData(dataList,
    new DataInsertListener() {
        @Override
        public void onSuccess() {
            Log.v(TAG, "insertData success");
        }

        @Override
        public void onFailure(int errCode, String errMsg) {
            Log.v(TAG, "insertData failure: " + errMsg);
        }
    });
 

注意:机智云中每条数据都有一个时间戳属性"ts",其值为时间的毫秒值。时间戳属性不用创建默认就有。插入数据时如果没有指定时间戳则该值默认为当前时间。

查询数据

CloudQuery是查询条件类。支持子条件,可以通过子条件组合成复杂条件。

下面是两个条件:

CloudQuery query1 = new CloudQuery("ts", ">=", 1422720000295);
CloudQuery query2 = new CloudQuery("ts", "<=", 1433174399297);

可以把她们作为子条件组合成一个条件:

    CloudQuery query = new CloudQuery("ts", ">=", 1422720000295).and(new CloudQuery("ts", "<", 1433174399297));

查询数据使用queryData方法,传入查询条件query、每次返回的数据条数limit、跳过的数据条数skip。查询结果通过DataInfoListener 返回,如果查询成功通过onSuccess的list参数返回查询结果。如果查询结果不能一次全部返回,需要多次调用queryData,每次调整skip值,从而得到全部查询结果。

方法声明:

    void queryData(CloudQuery query, int limit, int skip, DataInfoListener listener);

下面是一个查询的代码:

CloudQuery query = new CloudQuery("ts", ">=", 1422720000295).and(new CloudQuery("ts", "<", 1433174399297));

mCloudService.queryData(query, 50, 0,
        new DataInfoListener() {
            @Override
            public void onSuccess(List<CloudDataValues> list) {

            }

            @Override
            public void onFailure(int errCode, String errMsg) {

            }
        });

数据更新和删除目前不支持。

账号管理

账号管理提供用户的注册和密码重置功能。

普通用户注册:
void registerUser(String userName, String password, AccountListener listener)

邮箱用户注册:
void registerUserWithEmail(String email, String password, AccountListener listener)

手机用户注册:
void registerUserWithPhone(String phone, String password, String verifyCode, AccountListener listener)
其中 verifyCode 为手机验证码,手机验证码通过requestPhoneVerifyCode方法获得。
方法声明如下:
void requestPhoneVerifyCode(String phone, AccountListener listener)

邮箱用户密码重置:
void resetPasswordWithEmail(String email, AccountListener listener)

手机用户密码重置:
void resetPasswordWithPhone(String phone, String verifyCode, String newPassword, AccountListener listener)

普通用户不提供密码重置功能