当前位置:网站首页>【涂鸦物联网足迹】涂鸦云平台接口说明
【涂鸦物联网足迹】涂鸦云平台接口说明
2020-11-09 19:12:00 【IoT云工坊】
前序系列文章>>>【涂鸦物联网足迹】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
- 业务接口:
待签名字符串:1KAD46OrT9HafiKdsXeg3f4eda2bdec17232f67c0b188af3eec11588925778000
签名结果:HMAC-SHA256(1KAD46OrT9HafiKdsXeg3f4eda2bdec17232f67c0b188af3eec11588925778000,4OHBOnWOqaEC1mWXOpVL3yV50s0qGSRC)
36c30e300f226b68add014dd1ef56a81edb7b7a817840485769b9d6c96d0faa1
转大写为:36C30E300F226B68ADD014DD1EF56A81EDB7B7A817840485769B9D6C96D0FAA1
- 各类语言 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。
版权声明
本文为[IoT云工坊]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4765312/blog/4710201
边栏推荐
- Openocd-jtag debugging
- Installation and deployment of Flink
- Git + -- Code hosting in the history of version management
- andorid实例-简单登录布局
- (3)ASP.NET Core3.1 Ocelot认证
- 菜鸟福音,28本书籍循序渐进让你成为大牛!(附学习大纲一份)
- How to edit summation formula in MathType
- Using powerful powerbi Sangji diagram to express complex operation business flow
- How to page query after the 10 billion level data sub table?
- OpenOCD-JTAG调试
猜你喜欢
深入分析商淘多用户商城系统如何从搜索着手打造盈利点
【STM32H7】第6章 ThreadX GUIX上手之STM32H7 DMA2D加速
分享用MathType编辑字母与数学公式的技巧
都要2021年了,现代C++有什么值得我们学习的?
非常值得一看的 Curl 用法指南
零基础小白python入门——深入Python中的文件操作
【云小课】版本管理发展史之Git+——代码托管
Rabbitmq installation
High performance library dpdk concise understanding
Day83: Luffy: add shopping cart & navigation bar shopping cart digital display & shopping cart page display
随机推荐
Four solutions of Android soft keyboard occlusion
Android软键盘遮挡的四种解决方案
谷粒商城学习笔记,第五天:ES全文检索
andorid实例-简单登录布局
企业公司开发微信小程序适用于哪些行业?
Single linked list inversion
Experts' interpretation of four hot industries in 2020 China telecom terminal technology and Standards Forum
(3) ASP.NET Core3.1 Ocelot certification
如何使用RTSP推流组件EasyPusher将MP4文件推到EasyDarwin开源平台?
dat.GUI 打造可视化工具(一)
Configure static IP address in ubuntu18.04 NAT mode -2020.11.09
第三阶段 Day20 购物车模块实现 添加拦截器 添加用户权限校检 实现订单模块
Hand in hand to teach you to use container service tke cluster audit troubleshooting
R8 编译器: 为 Kotlin 库和应用 '瘦身'
如何运用二分查找算法
Gesture switch background, let live with goods more immersive
【云小课】版本管理发展史之Git+——代码托管
Installation and deployment of Flink
深入分析商淘多用户商城系统如何从搜索着手打造盈利点
Introduction to zero base little white Python