开发准备

要求使用JDK v1.7及以上的版本。

AbleCloud环境配置

建议ACConfig及AC在实例化时做全局单例处理。

ACConfig

ACConfig是抽象类,要求开发者在实际应用中提供关于ACConfig的具体实现。 本SDK定义的配置信息如下:

/**
 * AbleCloud Java API配置信息。
 * <p/>
 * ACConfig是一个抽象类。开发者应依据具体应用场景的需求,提供本抽象类的实现。
 */
public abstract class ACConfig {
    public static final String TEST_MODE       = "test";        /// 运行模式:测试模式。
    public static final String PRODUCTION_MODE = "production";  /// 运行模式:生产模式。

    // 需要重载的抽象方法。

    /**
     * 取开发者在AbleCloud平台上的帐号的ID(可登录AbleCloud管理控制台查看)。
     *
     * @return 返回开发者帐号的ID。
     */
    public abstract long getDeveloperId();

    /**
     * 取开发者在AbleCloud平台上对应的主域的名字(可登录AbleCloud管理控制台查看)。
     *
     * @return 开发者的主域的名字。
     */
    public abstract String getMajorDomain();

    /**
     * 取运行模式:ACConfig.TEST_MODE 或 ACConfig.PRODUCTION_MODE。
     *
     * @return 返回运行模式:ACConfig.TEST_MODE 或 ACConfig.PRODUCTION_MODE。
     */
    public abstract String getMode();

    // 下列方法均有默认的实现,开发者可选择性地重载。

    /**
     * 取服务所关联的子域的名字。
     *
     * @return 缺省情况下返回空字符串。
     */
    public String getSubDomain() {
        return "";
    }

    /**
     * 设置开发者密钥对。
     *
     * @param ak Access Key。
     * @param sk Secret Key。
     */
    public void setAuthKeyPair(String ak, String sk) {
        synchronized (lockOfAuthKeyPair) {
            authAccessKey = ak;
            authSecretKey = sk;
        }
    }

    /**
     * 取开发者密钥对中的Access Key(可登录AbleCloud管理控制台查看)。
     *
     * @return 开发者密钥对中的Access Key。
     */
    public String getAuthAccessKey() {
        synchronized (lockOfAuthKeyPair) {
            return authAccessKey;
        }
    }

    /**
     * 取开发者密钥对中的Secret Key(可登录AbleCloud管理控制台查看)。
     *
     * @return 开发者密钥对总的Secret Key。
     */
    public String getAuthSecretKey() {
        synchronized (lockOfAuthKeyPair) {
            return authSecretKey;
        }
    }

    /**
     * 设置AbleCloud云端服务的入口地址。
     *
     * @param addrs 可以用英语逗号(,)分隔多个地址。如:"192.168.0.1:5000",或者"192.168.0.1:5000,192.168.0.2:5000",
     *              或者"http://192.168.0.1:5000",或者"http://192.168.0.1:5000,https://192.168.0.2:5000",或者"192.168.0.1:5000,https://192.168.0.2:5000"。
     *              如果地址中没有指定协议(http或者https),则使用http协议。
     */
    public void setRouterAddr(String addrs) {
        synchronized (lockOfRouterAddress) {
            routerAddresses = addrs;
        }
    }

    /**
     * 取AbleCloud云端服务的入口地址。
     *
     * @return 返回的地址的格式是:http://host:port 或 https://host:port。
     */
    public String getRouterAddr() {
        synchronized (lockOfRouterAddress) {
            if (routerAddresses == null || routerAddresses.isEmpty())
                return "";

            // 随机取一个地址
            String[] routerList = routerAddresses.split(",");
            int routerIdx = random.nextInt(routerList.length);
            String addr = routerList[routerIdx].trim();
            if (!addr.startsWith("http://") && !addr.startsWith("https://"))
                addr = "http://" + addr;
            return addr;
        }
    }

    /**
     * 设置代理服务的入口地址。
     *
     * @param addrs 可以用英语逗号(,)分隔多个地址。如:"192.168.0.1:5000",或者"192.168.0.1:5000,192.168.0.2:5000",
     *              或者"http://192.168.0.1:5000",或者"http://192.168.0.1:5000,https://192.168.0.2:5000",或者"192.168.0.1:5000,https://192.168.0.2:5000"。
     *              如果地址中没有指定协议(http或者https),则使用http协议。
     */
    public void setProxyAddr(String addrs) {
        synchronized (lockOfProxyAddress) {
            proxyAddresses = addrs;
        }
    }

    /**
     * 取代理服务的入口地址。
     *
     * @return 返回的地址的格式是:http://host:port 或 https://host:port。
     */
    public String getProxyAddr() {
        synchronized (lockOfProxyAddress) {
            if (proxyAddresses == null || proxyAddresses.isEmpty())
                return "";

            // 随机取一个地址
            String[] proxyList = proxyAddresses.split(",");
            int routerIdx = random.nextInt(proxyList.length);
            String addr = proxyList[routerIdx].trim();
            if (!addr.startsWith("http://") && !addr.startsWith("https://"))
                addr = "http://" + addr;
            return addr;
        }
    }

    public int getAuthTimeout() {
        return 5000;
    }

    public int getClientTimeout() {
        return 5000;
    }

    public int getRetryCount() {
        return 1;
    }
}
  • 开发UDS时,SDK内部提供了ACConfig的实现,所以开发者只需要配置cloudservice-conf.xml中的参数即可,无需再实现ACConfig。
  • 非UDS在实现ACConfig抽象类之后,即可以通过AC ac = new ACCloud(config)获取AC实例,从而通过AC调用各个通用模块接口。AC的具体接口如下所示。

AC

AC实际上是AbleCloud对抽象服务框架的具体实现,其实现过程对开发者透明。通过AC,开发者可以根据需要获取一系列内嵌服务的功能接口。AC的定义如下:

public abstract class AC {
    protected ACConfiguration config;

    /**
     * 构建一个开发者上下文
     * @return
     */
    public ACContext newContext() {}

    /**
     * 构建一个用户上下文,由于是框架创建的,因此也会带着开发者信息,一般用于单测
     * @param userId
     * @return
     */
    public ACContext newContext(long userId) {}

    /**
     * 构建一个用于数据查询的过滤器
     *
     * @return
     */
    public ACFilter filter(){}

    /**
     * 用于对数据分类进行具体的操作,如create/find/delete/update/scan等
     *
     * @param className     要操作的分类名
     * @param context       要进行操作的开发者context
     * @return
     */
    public abstract ACStore store(String className, ACContext context);

    /**
     * 则用于创建数据分类/清空数据等操作。
     * 用于测试之用。
     *
     * @return
     */
    public abstract ACStoreForTest storeForTest(ACContext context);

    /**
     * 往某一服务发送命令/消息
     *
     * @param subDomain 该服务所在产品名
     * @param name      服务名
     * @param version   服务版本
     * @param req       具体的消息内容,此处req无需构造ACContext
     * @return 服务端相应的消息
     * @throws Exception
     */
    public abstract ACMsg sendToService(String subDomain, String name, int version, ACMsg req) throws Exception;

    /**
     * 往JD service发送命令/消息,上报设备上的所有Stream点到JINGDONG Service
     *
     * @param context          设备的上下文,其中uid字段为系统填充
     * @param physicalDeviceId 设备的物理id
     * @param req              请求消息体(Stream数组)
     * @return 服务端相应的消息
     * @throws Exception
     */
    public abstract ACMsg sendToJDService(ACContext context, String physicalDeviceId, List<ACJDMsg> req) throws Exception;

    /**
     * 由于uds本身无法访问正常的外网服务,所以AbleCloud内部实现了正向代理,并提供ACHttpClient访问外网服务
     *
     * @param url 访问外网的url
     * @return ACHttpClient
     * @throws IOException
     */
    public abstract ACHttpClient getHttpClient(String url) throws IOException;

    /**
     * 获取帐号管理器。开发者组实现自定义服务时,
     * 可以调用ACAccountMgr提供的各个通用接口
     *
     * @param context   开发者的context
     * @return
     */
    public abstract ACAccountMgr accountMgr(ACContext context);

    /**
     * 获取用于单元测试的帐号管理器,可以注册用户等
     *
     * @param context   开发者的context
     * @return
     */
    public abstract ACAccountMgrForTest accountMgrForTest(ACContext context);

    /**
     * 获取设备绑定管理器。开发者在实现自定义服务时,
     * 可以调用ACBindMgr提供的各个通用接口
     *
     * @param context 用户的context
     * @return
     */
    public abstract ACBindMgr bindMgr(ACContext context);

    /**
     * 获取用于单元测试的设备绑定管理器,可以绑定/解绑设备等
     *
     * @param context 用户的context
     * @return
     */
    public abstract ACBindMgrForTest bindMgrForTest(ACContext context);

    /**
     * 获取推送通知管理器,可以给用户发送通知消息
     *
     * @param context   开发者的context
     * @return
     */
    public abstract ACNotificationMgr notificationMgr(ACContext context);

    /**
     * 获取用于单元测试的推送通知管理器
     *
     * @param context 开发者的context
     * @return
     */
    public abstract ACNotificationMgrForTest notificationMgrForTest(ACContext context);

    /**
     * 获取定时管理器,可以定时给设备发送消息
     *
     * @param context 开发者的context
     * @return
     */
    public abstract ACTimerTaskMgr timerTaskMgr(ACContext context);

    /**
     * 获取用于单元测试的定时管理器
     *
     * @param context 开发者的context
     * @return
     */
    public abstract ACTimerTaskMgrForTest timerTaskMgrForTest(ACContext context);

    /**
     * 获取数据分析管理器
     *
     * @param context 开发者的context
     * @return
     */
    public abstract ACInspireMgr inspireMgr(ACContext context);

    /**
     * 获取文件管理器,可以上传下载文件。
     * 注意:当前版本的ACFileMgr适用于直接连接互联网的服务器环境,而不适于在UDS中使用。
     *
     * @param context 开发者的context
     * @return
     */
    public abstract ACFileMgr fileMgr(ACContext context);

    /**
     * 获取天气管理器,可以获取pm25,空气质量等相关天气信息
     *
     * @param context 开发者的context
     * @return
     */
    public abstract ACWeatherMgr weatherMgr(ACContext context);

    /**
     * 取设备管理器。
     *
     * @param context  开发者的context
     * @return ACWarehouseMgr对象的实例。
     */
    public abstract ACWarehouseMgr warehouseMgr(ACContext context);

    /**
     * 取产品管理器。
     *
     * @param context 开发者的context
     * @return ACProductMgr实例。
     */
    public abstract ACProductMgr productMgr(ACContext context);

    /**
     * 取用户反馈意见管理器。
     *
     * @param context 开发者的context
     * @return ACFeedbackMgr实例。
     */
    public abstract ACFeedbackMgr feedbackMgr(ACContext context);

    /**
     * 为便于测试,开发者可实现一个服务的桩
     * 在框架中添加一个服务桩,即mock
     *
     * @param name  服务名
     * @param stub  服务桩的实现,实际上也是一个ACService
     */
    public abstract void addServiceStub(String name, ACService stub);

    /**
     * 为便于测试,开发者可实现一个设备的桩
     *
     * @param subDomain     设备所属子域
     * @param stub          设备桩
     */
    public abstract void addDeviceStub(String subDomain, ACDeviceStub stub);

    /**
     * 获取用于单元测试的服务框架ac
     * @param config    单元测试环境构造的config
     * @return
     * @throws Exception
     */
    public static final AC getTestAc(ACConfiguration config) throws Exception {}
}

注意:由于开发者具有超级权限,所以AbleCloud除了提供正常的服务管理器接口外,还提供一些用于单元测试的管理器接口,如ac.accountMgrForTest(ac.newContext())