开发准备
要求使用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())