更新时间:2024-06-20 06:44:45下载pdf
本文介绍了如何使用 Java SDK 基于云开发,调用设备相关 API 控制一个智能设备和监听设备信息。基于涂鸦设备体系严格的统一性,您可以将这个控制方式拓展到其他设备中。让您无需担心设备差异性,快速基于智能设备开发 SaaS 应用。
本文基于 Tuya-connector-Java SDK。Tuya-connector 集成了您在涂鸦云云对接(OpenAPI 或者消息订阅)项目过程中的云端连接和处理过程,可以让您如同本地开发一样,聚焦于自身的业务逻辑。克隆步骤如下:
在 Tuya-connector-Java 获取 SDK 地址。
在 Projects > Get from VCS > URL,输入 SDK 地址,单击 Clone。
在 IntelliJ IDEA 修改 JDK 版本为 JDK8:
Tuya-connector Java SDK 目前已兼容 JDK8 和 JDK11,变更为 JDK11 的操作方法和 JDK8 类似。
1.8.0_***
版本 JDK。1.8.0_***
版本 JDK。添加 tuya-spring-boot-starter-sample
Module:
在 File > Project Structure > Modules,单击 + > Import Module。
在 SDK 文件地址导入 tuya-spring-boot-starter-sample
。
选择 Maven 导入。
单击 Finish。
开发前您需要在 application.properties
文件配置环境变量。
在 已创建项目 的 概览 页面,获取用于 API 调用的 授权密钥,即 Access ID 和 Access Secret。
在 application.properties
文件配置环境变量。
connector.ak:授权密钥 中的 Access ID。
connector.sk:授权密钥 中的 Access Secret。
connector.region:数据中心 参照 TuyaRegion.java 文件。
# ClientId & SecretKey generated on the Tuya Cloud Development Platform
connector.ak=fsxg5c9jasdrolc****//ClientId
connector.sk=d064654cd2714286a3823f16a223****//SecretKey
connector.region=CN //Data Center
完成环境编辑配置后,您可以开始代码开发。
本程序控制的设备为一个灯带,控制其开关的标准指令集为 switch_led
。如果您是其它设备,需要查询标准指令集后修改代码。
创建 Connector 接口(OpenAPI 的映射类)。
代码示例:
package com.tuya.open.spring.boot.sample.ability.api;
import com.tuya.connector.api.annotations.*;
import com.tuya.open.spring.boot.sample.ability.model.Device;
public interface DeviceConnector {
//Get the device information
@GET("/v1.0/iot-03/devices/{device_id}")
Device getById(@Path("device_id") String deviceId);
//Send commands
@POST("/v1.0/iot-03/devices/{device_id}/commands")
Boolean commands(@Path("device_id") String deviceId, @Body Map<String, Object> commands);
}
导入 DeviceConnector
。
代码示例:
package com.tuya.open.spring.boot.sample.service;
import com.tuya.open.spring.boot.sample.ability.api.DeviceConnector;
import com.tuya.open.spring.boot.sample.ability.model.Device;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class DeviceService {
@Autowired
private DeviceConnector connector;
public Device getById(String deviceId) {
return connector.getById(deviceId);
}
public Boolean commands(String deviceId, Map<String, Object> commonds) {
return connector.commands(deviceId, commonds);
}
}
创建测试接口。
代码示例:
package com.tuya.open.spring.boot.sample;
import com.tuya.open.spring.boot.sample.ability.api.DeviceConnector;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@SpringBootTest
public class DemoAplicationTest {
@Autowired
DeviceConnector deviceConnector;
@Test
void DevicegetById(){
System.out.println(deviceConnector.getById("vdevo16274430851****"));
}
@Test
void Controldevice(){
List<Map<String, Object>> commandsList = new ArrayList<>();
Map<String, Object> commandMap = new HashMap<>();
commandMap.put("code", "switch_led");
commandMap.put("value", true);
commandsList.add(commandMap);
Map<String, Object> commands = new HashMap<>();
commands.put("commands", commandsList);
System.out.println(deviceConnector.commands("vdevo16274430851****",commands));
}
}
返回结果示例:
获取设备信息:
2021-08-03 20:17:15.625 INFO 34281 --- [ main] c.t.o.s.boot.sample.DemoAplicationTest : Started DemoAplicationTest in 3.49 seconds (JVM running for 5.157)
2021-08-03 20:17:16.408 INFO 34281 --- [ main] c.t.c.o.api.header.TuyaHeaderProcessor : URL PATH: /v1.0/iot-03/devices/vdevo162799080003567
2021-08-03 20:17:16.431 INFO 34281 --- [ main] c.t.c.o.api.header.TuyaHeaderProcessor : URL PATH: /v1.0/token
2021-08-03 20:17:16.441 INFO 34281 --- [ main] c.t.c.o.api.header.TuyaHeaderProcessor : headers==>{t=1627993036432, sign_method=HMAC-SHA256, sign=DDE5D9982B2DF6C****875D332****01F06F****4173A78C47064DBAB291D, lang=zh, nonce=, client_id=fsxg5c9jasdrolc****, Signature-Headers=}
2021-08-03 20:17:16.839 INFO 34281 --- [ main] c.t.c.open.api.token.TuyaTokenManager : Get token success, token: TuyaToken(access_token=3ce6061f2****6772216****fef9, expire_time=5030, refresh_token=e0f****8177b970b85****456dcd, uid=******869632028HJBe)
2021-08-03 20:17:16.840 INFO 34281 --- [ main] c.t.c.o.api.header.TuyaHeaderProcessor : headers==>{access_token=3ce6061****f2791****32b9863fef9, t=1627993036840, sign_method=HMAC-SHA256, sign=44D74E6D08B6248260B4D6BDA****AD61475C31D3E****E73078E97612, lang=zh, nonce=, client_id=fsxg5c9jasdrolc****, Signature-Headers=}
Device(active_time=1627990800, biz_type=0, category=dj, create_time=1627990800, icon=smart/program_****_****/dj.png, id=vdevo16274430851****, ip=, local_key=25bfe******5b257, model=, name=smart bulb, online=true, owner_id=null, product_id=yju2e******jr5zx, product_name=smart bulb, status=null, sub=false, time_zone=+08:00, uid=null, update_time=1627990800, uuid=vdevo16274430851****)
2021-08-03 20:17:16.972 INFO 34281 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
下发指令:
2021-08-03 20:20:30.101 INFO 34299 --- [ main] c.t.o.s.boot.sample.DemoAplicationTest : Started DemoAplicationTest in 3.401 seconds (JVM running for 5.127)
2021-08-03 20:20:31.192 INFO 34299 --- [ main] c.t.c.o.api.header.TuyaHeaderProcessor : URL PATH: /v1.0/iot-03/devices/vdevo16274430851****/commands
2021-08-03 20:20:31.216 INFO 34299 --- [ main] c.t.c.o.api.header.TuyaHeaderProcessor : URL PATH: /v1.0/token
2021-08-03 20:20:31.227 INFO 34299 --- [ main] c.t.c.o.api.header.TuyaHeaderProcessor : headers==>{t=1627993231217, sign_method=HMAC-SHA256, sign=8589C29441071F26************3178E2426DCD425DF****89ACDFB01882A, lang=zh, nonce=, client_id=fsxg5c9jasdrolc****, Signature-Headers=}
2021-08-03 20:20:31.738 INFO 34299 --- [ main] c.t.c.open.api.token.TuyaTokenManager : Get token success, token: TuyaToken(access_token=3ce6061f279186772****2b9863fef9, expire_time=4835, refresh_token=e0fbd2e****177b970b854e456dcd, uid=*******869632028HJBe)
2021-08-03 20:20:31.741 INFO 34299 --- [ main] c.t.c.o.api.header.TuyaHeaderProcessor : headers==>{access_token=3ce6061f2****772216632b9863fef9, t=1627993231739, sign_method=HMAC-SHA256, sign=1570645BFE1716C7C1CF9****413B928EFAC7CBE84D****A175671396, lang=zh, nonce=, client_id=fsxg5c9jasdrolc****, Signature-Headers=}
true
本代码实现了 connector 框架消息分发接口,支持顺序订阅云端消息、数据解密、构建精确的具体消息类型并通过 Spring 事件机制分发。
该功能需要开通 消息订阅 服务。
Spring 应用启动类添加 @ConnectorScan 扫描路径,如果需要消息订阅,可以通过 @EnableMessaging 开启。
代码示例:
package com.tuya.open.spring.boot.sample;
import com.tuya.connector.open.messaging.autoconfig.EnableMessaging;
import com.tuya.connector.spring.annotations.ConnectorScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@ConnectorScan(basePackages = "com.tuya.open.spring.boot.sample.ability.api")
@EnableMessaging //开启消息订阅
@SpringBootApplication
public class TuyaSpringBootStarterSampleApplication {
public static void main(String[] args) {
SpringApplication.run(TuyaSpringBootStarterSampleApplication.class, args);
}
}
订阅消息事件:
您需要针对需要订阅的事件添加相应的 ApplicationListener 即可。框架内置了涂鸦所有云端消息事件类型,订阅的消息数据包括原始加密消息数据以及解密后的结构化的消息数据。
代码示例:
package com.tuya.open.spring.boot.sample.ability.messaging;
import com.tuya.connector.open.messaging.event.NameUpdateMessage;
import com.tuya.connector.open.messaging.event.StatusReportMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class TuyaMessageListener {
@EventListener
public void updateStatusEvent(StatusReportMessage message) {
log.info("StatusReport event happened: {}", message);
}
@EventListener
public void nameUpdateMessage(NameUpdateMessage message) {
log.info("NameUpdate event happened: {}", message);
}
}
返回结果示例:
2021-07-27 10:37:28,087 INFO 33746 --- [pool-2-thread-1] c.t.o.s.b.s.a.m.TuyaMessageListener : StatusReport event happened: {"356c93f2-3929-4a8f-ae28-ae5607efc7ad","devId":"***1626937310799","productKey":"yju2******ujr5zx","sourceMessage":{"data":"AAAADN2q/ueLzZE78ubHsQ9Nk+iUBd7QOfPyB78P2Fspm2rMMHYymWYVnZL1m*****/kpPaGVDXsAIlrIIaM6k6wWWAezW7SJLF6gER*****/GQ24QYahT3UvadDx4v45sWuyssg33sX1uC0PFP9kvghc8o9Q1QELGFgmc7JPb0FQ4HDxW98DJPCeIgYTWmmz+BHoaDbH6iOV0SEcsi6vlFGtYQ*****/t/O/g0bTT9RdnmLbGxllJjedwBA2c6XPKNv7HHrouF7LfTDmXwFHml5q6*****","protocol":4,"pv":"2.0","sign":"65f7dcb59************74e93484e7************fae4dcb3e******fbee66","t":1627353446615},"status":[{"code":"switch_led","t":1627353446615,"value":False}]}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈