共计 5068 个字符,预计需要花费 13 分钟才能阅读完成。
_前序系列文章 >>>【涂鸦物联网脚印】API 及 SDK 介绍
咱们系列文章,都会围绕如何实现一款智能“隔空接吻机”的开发。心愿能帮到各异地恋 or 异国恋的情侣们!
本文咱们会大略解说基于 OpenAPI 进行开发时所波及到的 API 调用办法、标准、示例以及集成 SDK 相干内容。内容会比拟硬核,请各单位留神!
一、开发流程
- 注册开发者账号。
- 云开发创立云利用我的项目,获取 client_id & secret。
阐明:开发者平台 key 的名称为 accessId & accessKey。
- 创立 SDK:在涂鸦 IoT 平台,抉择 App 工作台 > App SDK > 获取 SDK > 按要求填写参数 > 获取schema(渠道标识)。
- 基于 OpenAPI 进行业务开发。
- 测试无误后,开发者自行公布。
二、受权流程
每个业务 OpenAPI 都须要进行 token 校验。
阐明:涂鸦 OpenAPI 遵循 OAuth 2.0 协定规范。
三、简略模式
针对云云对接场景,涂鸦提供了隐式受权的形式获取:
- 依照涂鸦云 OpenAPI 接口标准对开发者 client_id 和 secret 进行签名认证。
- 涂鸦云校验并颁发令牌给第三方云。
阐明:隐式受权形式获取的 token,权限维度为开发者维度,token 的操作权限范畴为该开发者有权限操作的范畴,例如操作(增、删、改、查)开发者的利用用户数据,产品下的设施数据和利用下用户绑定的设施数据。
四、接口标准
环境阐明
各接口应用方请依据本身所在区域调用相应接口。
中国区
https://openapi.tuyacn.com
美洲区
https://openapi.tuyaus.com
欧洲区
https://openapi.tuyaeu.com
印度区
https://openapi.tuyain.com
申请形式
反对的申请形式如下:
- GET
- PUT
- POST
- DELETE
阐明 :当申请形式为POST
时,Content-Type
需应用application/json
。
申请头设置
任意接口都须要在 header 中退出如下参数:
阐明:业务接口(非 token 接口)申请时须要参数access_token
。
五、签名标准
涂鸦云采纳 HMAC-SHA256 创立摘要,依据不同利用场景,以后提供两套签名算法:
- 令牌治理接口(获取令牌、刷新令牌)
sign = HMAC-SHA256(client_id + t, secret).toUpperCase()
应用申请到的 client_id 与以后申请的 13 位规范工夫戳拼接成待签名的字符串,采纳申请到的云利用 secret 作为密钥参加哈希摘要,失去的字符串,最初转大写;
- 业务接口
sign = HMAC-SHA256(client_id + access_token + t, secret).toUpperCase()
应用申请到的云利用 client_id + 以后无效的申请令牌 + 以后申请的 13 位规范工夫戳拼接成待签名的字符串,采纳申请到的云利用 secret 作为密钥参加哈希摘要,失去的字符串,最初转大写。
- 签名示例
- 筹备参数:
client_id:1KAD46OrT9HafiKdsXeg
secret:4OHBOnWOqaEC1mWXOpVL3yV50s0qGSRC
t:1588925778000
access_token:3f4eda2bdec17232f67c0b188af3eec1
- 令牌治理接口签名:
待签名字符串:1KAD46OrT9HafiKdsXeg1588925778000
签名后果:HMAC-SHA256(1KAD46OrT9HafiKdsXeg1588925778000,4OHBOnWOqaEC1mWXOpVL3yV50s0qGSRC)
ceaafb5ccdc2f723a9fd3e91d3d2238ee0dd9a6d7c3c365deb50fc2af277aa83
转大写为:CEAAFB5CCDC2F723A9FD3E91D3D2238EE0DD9A6D7C3C365DEB50FC2AF277AA83
3 业务接口:
待签名字符串:1KAD46OrT9HafiKdsXeg3f4eda2bdec17232f67c0b188af3eec11588925778000
签名后果:HMAC-SHA256(1KAD46OrT9HafiKdsXeg3f4eda2bdec17232f67c0b188af3eec11588925778000,4OHBOnWOqaEC1mWXOpVL3yV50s0qGSRC)
36c30e300f226b68add014dd1ef56a81edb7b7a817840485769b9d6c96d0faa1
转大写为:36C30E300F226B68ADD014DD1EF56A81EDB7B7A817840485769B9D6C96D0FAA1
4 各类语言 HMAC SHA256 的实现:
Javascript HMAC SHA256
/**
Run the code online with this jsfiddle. Dependent upon an open source js library calledhttp://code.google.com/p/crypto-js/.
**/
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha256.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>
<script> var hash = CryptoJS.HmacSHA256("Message", "secret");
var hashInBase64 = hash.toString().toUpperCase();
document.write(hashInBase64); </script>
PHP HMAC SHA256
/**
PHP has built in methods for hash_hmac (PHP 5) and base64_encode (PHP 4, PHP 5) resulting in no outside dependencies. Say what you want about PHP but they have the cleanest code for this example.
**/
$s = hash_hmac('sha256', 'Message', 'secret', true);
echo strtoupper(var_dump($s));
Java HMAC SHA256
/**
Dependent on Apache Commons Codec to encode in base64.
**/
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class ApiSecurityExample {public static void main(String[] args) {
try {
String secret = "secret";
String message = "Message";
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
String hash = new HexBinaryAdapter().marshal(bytes).toUpperCase();
System.out.println(hash);
}
catch (Exception e){System.out.println("Error");
}
}
}
C# HMAC SHA256
using System;
using System.Security.Cryptography;
namespace Test
{
public class MyHmac
{public static string Encrypt(string message, string secret)
{
secret = secret ?? "";
var encoding = new System.Text.UTF8Encoding();
byte[] keyByte = encoding.GetBytes(secret);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new HMACSHA256(keyByte))
{byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashmessage.Length; i++)
{builder.Append(hashmessage[i].ToString("x2"));
}
return builder.ToString().ToUpper();
}
}
}
}
返回后果 对立返回 JSON,个别格局如下:
申请胜利
{
"success": true,
"result": {//object}
}
申请异样
{
"success": false,
"code": 1010,
"msg": "token 非法"
}
六、集成 SDK Java 概述
目前提供的基于 Java 的 Tuya Cloud SDK 封装了 token 相干、用户相干以及设施相干的接口,以便减速云云对接的开发。
开发者只须要关注所应用的业务性能办法的调用,构建对应的 TuyaClient 实例,实例会自动更新 token 以及实现对应 API 的调用。SDK 次要包含了以下性能, 具体接口信息请参考后文对应模块:
token 相干(无需用户调用)
用户相干(获取用户列表、注册用户、获取用户下的设施列表)
设施相干(获取设施配网 token、获取配网 token 下所有设施列表等接口)
集成 SDK
IDEA 导入 jar 包:https://jingyan.baidu.com/article/0f5fb0993e9e1f6d8334ead2.html
Eclipse 导入 jar 包:https://jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html
GitHub 地址
https://github.com/TuyaInc/tuya_cloud_sdk_java
通用模块
因为局部新增接口无奈及时同步集成至 SDK,开发者可通过 SDK 通用接口进行程度扩大满足开发。
获取 Header 列表:
/**
* 获取 Header 列表
* @param isToken 是否是 token 相干申请,个别是 false
* @return
*/
public List<Header> getHeaders(Boolean isToken)
万能涂鸦接口:
/**
* 万能涂鸦接口
* @param url
* @param method 申请类型(例如:GET)* @param headers 申请头内容(额定新增的 header)* @param body
* @return
*/
public String commonHttpRequest(String url, HttpMethod method, Map<String, String> headers, Object body)
调用示例
以下为注册用户的示例:
TuyaClient client = new TuyaClient(clientId, secret, RegionEnum.CN);
String uid = client.registerUser("testApp","86","18212345678", MD5Util.getMD5("123456")"nickName",UserTypeEnum.MOBLIE);
System.out.println("胜利同步用户:"+ uid);
Golang
Golang SDK 源码地址,请参见 Golang SDK。