云端接入

云端接入

接入体式格局

澳门金沙ag官网

如上图所示,涂鸦云支撑第三方云以HTTPS、Kafka体式格局接入涂鸦云。HTTPS接入的场景重要有:装备指令下发、装备状况数据获得、用户信息同步等。Kafka接入等场景有:定阅装备及时数据。

名词解释:

  • HTTPS 涂鸦的API是基于HTTPS和谈去挪用的,开发者能够凭据涂鸦的API和谈去封装HTTPS恳求停止挪用。

  • Kafka Kafka是一种下吞吐量的分布式公布定阅新闻体系,它能够处置惩罚消费者范围的网站中的一切行动流数据。涂鸦云平台支撑Kafka体式格局挪用,并提供响应的accessId取accessKey供用户运用。

发起:

  • 若是需求获得剖析统计类或用户、装备类等非及时数据,推荐运用HTTPS。
  • 若是需求及时的硬件上报数据类数据,推荐运用Kafka定阅。

挪用入口

涂鸦云凭据中国企业内内销地区联合海底光缆散布和环球各城市的实测效果,布置掩盖亚、欧、美三个可用区。

挪用API的效劳域名以下:

可用区 和谈 域名 数据安全级别 效劳地区
AY https *.tuyacn.com HTTPS+AES 亚洲
AZ https *.tuyaus.com HTTPS+AES 美洲
EU https *.tuyaeu.com HTTPS+AES 欧洲

注: 涂鸦云供应Https等多种通信协议,凭据业务需求能够天真挑选运用。第三方云获得及时数据推荐运用Kafka。

  • https: a1.tuya(cn/eu/us).com/api.json(云端挪用,如:https: )
  • Kafka: kafka.cloud.tuyacn/eu/us.com:8092(云端挪用,如:kafka.cloud.tuyacn.com:8092)

和谈概述

HTTPS

  • 挪用流程 凭据A的和谈,经由过程HTTPS挪用云效劳的具体步调为:添补参数 > 天生署名 > 拼装HTTPS恳求 > 提议HTTPS恳求> 获得HTTPS相应 > 注释json效果。

    大抵的挪用历程如下图所示: 澳门金莎国际欢迎您

  • 大众参数 挪用任何一个API皆必需传入的大众参数有:

参数称号 参数范例 是不是必需 是不是署名 参数形貌
a String API称号
v String API接口版本
sid String 用户登录受权胜利后,A发表给运用的用户session
time String 工夫戳,花样为数字,巨细到秒非毫秒,时区为标准时区,比方:1458010495。API服务端许可客户端恳求最大工夫偏差为540分钟。
sign String API输入参数署名效果,署名算法参照上面的引见
clientId String 用户的APPID(注各平台不一样如:ios、android、如此对接的id皆不一样)
lang String APP的言语,如"en",“zh_cn”,错误信息凭据言语主动翻译
ttid String APP渠道或云端渠道,如公司名,用于数据剖析跟踪
os String 手机操作系统,如"Android",“ios”,云端能够写linux或写公司名

注:由于局部云对云接口能够供应客户端的信息,如获得装备掌握面板,这时候需求凭据差别的客户端为os赋值,不然没法得到准确的数据。 如Android则os=Android

接入教程

QuickStart(SDK体式格局)

涂鸦推荐运用SDK的体式格局接入涂鸦云,本节将为您离别引见运用 HTTPS SDK 和 Kafka SDK 接入涂鸦云。若是您需求运用API的体式格局接入涂鸦云效劳,您能够间接检察下一节的内容。

若是需求挪用涂鸦云效劳,您需求:

1.注册账号并登录涂鸦开发者

2.正在我的账号的下拉菜单栏里挑选“云API受权”,再点击页面的“点此申请”停止提交,涂鸦的工作人员会正在1个工作日阁下停止处置惩罚

申请云API受权

申请云API受权

HTTPS SDK

1.要运用HTTPS SDK,请先下载SDK:

2.将SDK引入到本身的工程的classpath中

3.本例顶用到了fastjson,故需求正在pom.xml中增加响应的依靠(读者也可自行挑选喜好的JSON东西)

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.14</version>
</dependency>

4.SDK需求运用到Apache的一些工具包,故也需求正在pom.xml中增加响应依靠。

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpcore</artifactId>
  <version>4.4.5</version>
</dependency>
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.5.2</version>
</dependency>
<dependency>
  <groupId>commons-lang</groupId>
  <artifactId>commons-lang</artifactId>
  <version>2.6</version>
</dependency>

5.编写代码

此处以获得考证码为例,解说SDK的运用

起首,建立TuyaCloudClient工具,它是我们接见涂鸦云的客户端。传入accessId&accessKey(联络涂鸦获得)和指定可用区API的URI。

然后,建立request工具,并指定HTTP属性。

正在某些API中能够需求恳求参数,我们需求将这些参数以key-value对的情势封装到Map中,再将Map传给Request工具。

最初,经由过程client.sendRequest()要领收回恳求,相应结果是该要领的返回值。

上面的代码是获得考证码的示例顺序,供开发者参考:

 	public class HttpSDKTest {-www.6060.com

private static final String END_URI = "https://a1.tuyacn.com/api.json";// 挪用中国区的API(您可换成其他可用区)

private static final String ACCESS_ID = "xxxx"; // TODO: 请联络涂鸦获得

private static final String ACCESS_KEY = "xxxxxxxxxxx"; // TODO: 请联络涂鸦获得

public static void main(String[] args) {
/*
建立client,accessId&accessKey由涂鸦供应
accessId作为clientId
accessKey用于署名
*/
TuyaCloudClient client = new TuyaCloudClient(ACCESS_ID, ACCESS_KEY, END_URI);

// 组织HTTPS恳求
RequestMessage request = new RequestMessage();
request.setApi("tuya.m.user.mobile.sendcode"); //经由过程手机号注册的API
request.setApiVersion("1.0");
request.setOs("Linux");
request.setLang("zh");

// 封装恳求参数(接口需求的详细参数请参考API手册)
Map<String, String> params = new HashMap<String, String>();
params.put("countryCode", "86");
params.put("mobile", "186xxxx7671");

/*
注:
除注册及获得统计数据等少许接口,大部份接口皆需求sessionId。
详细是不是需求sessionId请参考API手册。
您能够从注册和登录接口返回效果获得,返回效果字段为sid
*/

// 将恳求参数到场到HTTPS恳求中
request.setParams(params);

/*
提议恳求,得到相应
若是恳求胜利, 则response里的result会是个JSON工具封装的效果.
若是恳求失利, 请检察errorMsg和errorCode,停止响应的处置惩罚.
*/
ResponseMessage response = client.sendRequest(request);
}
}

运转顺序,发明胜利实行,同时手机也可以或许收到考证码:

www.6060.com

更多API请参考云端API界说。

HTTPS接入体式格局

业务参数

API挪用除必需包罗大众参数中,若是API自己有业务级的参数也必需传入,每一个API的业务级参数请考API文档阐明。业务参数悉数放入postData中传到服务端,比方API有一个参数countryCode,则花样为postData={“countryCode”:“CN”}

署名

为了防备API挪用历程中被黑客歹意窜改,挪用任何一个API皆需求照顾署名,A服务端会凭据恳求参数,对署名停止考证,署名不合法的恳求将会被谢绝。A现在支撑多种署名算法,但所有的署名算法皆需求做MD5择要。

注重:关于非必填参数且到场署名的,正在值为空的状况下不到场署名,只要正在有值状况下才到场署名。

若是挪用SDK实现如此对接,则不必体贴署名的详细实现体式格局。

若是需求间接挪用API,则可参照以下步调停止署名:

1.对一切API恳求参数(包孕大众参数和业务参数postData)postData需求对值停止组装署名。 比方,有如下恳求参数:

a=tuya.p.weather.city.info.list,v=1.0,lang=zh-Hans,os=Linux,clientId=accessId,postData={“countryCode”:“CN”},time=1490003743

2.凭据参数称号的字典递次排序,按参数称号停止排序后的参数以下: a=tuya.p.weather.city.info.list,clientId=accessId,lang=zh-Hans,os=Linux,postData={“countryCode”:“CN”},time=1490003743,v=1.0

3.将排序好的参数名和参数值拼装在一起,参数间经由过程|衔接,拼接后的效果为:

a=tuya.p.weather.city.info.list|clientId=accessId|lang=zh-Hans|os=Linux|postData={“countryCode”:“CN”}|time=1490003743|v=1.0

至此,参数的组装便完成了。接下来,便需求对参数停止署名了。

涂鸦云凭据差别的业务场景供应多套署名算法,云对云署名算法详细阐明以下:

4.正在上面曾经拼接好的恳求串的最前面增加accessKey,假定accessKey为accesskey,则最初署名的字符串为:

accessKeya=tuya.p.weather.city.info.list|clientId=accessId|lang=zh-Hans|os=Linux|postData={“countryCode”:“CN”}|time=1490003743|v=1.0

5.把拼装好的字符串接纳utf-8编码,运用MD5算法对编码后的字节流进止择要,择要后的值为9aa12fb3dde7fb89146aba0bb3abfb97

6.组装HTTPS恳求,将一切参数名和参数值接纳utf-8停止URL编码(参数递次可随便,但必需要包孕署名参数),然后经由过程GET或POST提议恳求。组装的恳求以下:

详细的署名东西类实现以下:

    public class AThirdCloudMobileSignUtil {

//封装恳求参数
private static TreeMap<String, String> paramsBuild(ApiRequestDO apiRequestDo) {
TreeMap<String, String> params = new TreeMap<String, String>();
params.put("a", apiRequestDo.getApi());
params.put("v", apiRequestDo.getApiContextDo().getApiVersion());
params.put("lat", apiRequestDo.getApiContextDo().getLat());
params.put("lon", apiRequestDo.getApiContextDo().getLon());
params.put("lang", apiRequestDo.getApiContextDo().getLang());
params.put("deviceId", apiRequestDo.getApiContextDo().getDeviceid());
params.put("appVersion", apiRequestDo.getApiContextDo().getAppVersion());
params.put("ttid", apiRequestDo.getApiContextDo().getTtid());
params.put("os", apiRequestDo.getApiContextDo().getOs());
params.put("clientId", apiRequestDo.getAppInfoDo().getClientId());
if (StringUtils.isNotBlank(apiRequestDo.getN4h5())) {
params.put("n4h5", apiRequestDo.getN4h5());
}
params.put("sp", apiRequestDo.getSp());
params.put("time", apiRequestDo.getT());
if (StringUtils.isNotBlank(apiRequestDo.getSession())) {
params.put("sid", apiRequestDo.getSession());-澳门金沙ag官网
}
if (StringUtils.isNotBlank(apiRequestDo.getData())) {
params.put("postData", apiRequestDo.getData());-66883.com金沙
}
return params
}

//拼接参数字符串
private static String signAssembly(TreeMap<String, String> params, String secretKey) {
StringBuilder str = new StringBuilder();
str.append(secretKey);
Set<String> keySet = params.keySet();
Iterator<String> iter = keySet.iterator();
while (iter.hasNext()) {
String key = iter.next();
if (StringUtils.isBlank(params.get(key))) {
continue;
}
str.append(key);
str.append("=");
str.append(params.get(key));
str.append("|");
}
String strValue = str.toString();
strValue = strValue.substring(0, (strValue.length() - 1));
return strValue;
}

//获得署名
private static String getSign(ApiRequestDO apiRequestDo, String secretKey) {
TreeMap<String, String> params = paramsBuild(apiRequestDo);
String signString = signAssembly(params, secretKey);
return signString;
}

//对署名停止MD5
public static String getMD5(byte[] source) {-澳门金莎国际欢迎您
String s = null;
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(source);
byte tmp[] = md.digest(); // MD5 的盘算结果是一个 128 位的少整数,
// 用字节示意就是 16 个字节
char str[] = new char[16 * 2]; // 每一个字节用 16 进制表示的话,运用两个字符,
// 以是示意成 16 进造需求 32 个字符
int k = 0; // 示意转换效果中对应的字符位置
for (int i = 0; i < 16; i++) { // 从第一个字节最先,对 MD5 的每个字节
// 转换成 16 进造字符的转换
byte byte0 = tmp[i]; // 与第 i 个字节
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 与字节中高 4 位的数字转换,
// >>> 为逻辑左移,将标记位一同左移
str[k++] = hexDigits[byte0 & 0xf]; // 与字节中低 4 位的数字转换
}
s = new String(str); // 换后的效果转换为字符串

} catch (Exception e) {
logger.warn("MD5加密非常!", e);
}
return s;
}

public static void main(String[] args) {
ApiRequestDO apiRequestDo = new ApiRequestDO();-www.7249.com金沙

apiRequestDo.setApi("tuya.p.weather.city.info.list");
ApiContextDO apiContextDO = new ApiContextDO();
apiContextDO.setApiVersion("1.0");
apiContextDO.setOs("Linux");
apiContextDO.setLang("zh-Hans");

AppInfoDO appInfoDO = new AppInfoDO();
appInfoDO.setClientId("accessId");
apiRequestDo.setAppInfoDo(appInfoDO);

apiRequestDo.setT("1490004310");
apiRequestDo.setData("{\"countryCode\":\"CN\");

apiRequestDo.setApiContextDo(apiContextDO);

String s = getSign(apiRequestDo, "accessKey");
String sign = MD5Util.getMD5(s.getBytes());
System.out.println(sign);
}
}

注重:

  • 所有的请乞降相应数据编码皆为utf-8花样,URL里的一切参数名和参数值请做URL编码
  • postData运用POST传输,别的参数支撑POST和GET
  • 恳求差别的可用区,请运用响应的域名
  • 供应多个差别域名的缘由:

1.差别的域名能够由差别的DNS服务商停止剖析,以供应各区域最好的剖析稳定性和减速效劳;

2.能够更有用的制止运营商挟制题目;

3.削减剖析次数,能够更稳固的优化局部偏僻区域的DNS服务商机能题目。

400-881-8611