开发设备控制和消息订阅服务(Java SDK)

更新时间:2023-08-25 02:39:17下载pdf

本文介绍了如何使用 Java SDK 基于云开发,调用设备相关 API 控制一个智能设备和监听设备信息。基于涂鸦设备体系严格的统一性,您可以将这个控制方式拓展到其他设备中。让您无需担心设备差异性,快速基于智能设备开发 SaaS 应用。

前提条件

准备工作

本文基于 Tuya-connector-Java SDK。Tuya-connector 集成了您在涂鸦云云对接(OpenAPI 或者消息订阅)项目过程中的云端连接和处理过程,可以让您如同本地开发一样,聚焦于自身的业务逻辑。克隆步骤如下:

  1. Tuya-connector-Java 获取 SDK 地址。

    开发设备控制和消息订阅服务(Java SDK)
  2. Projects > Get from VCS > URL,输入 SDK 地址,单击 Clone

    开发设备控制和消息订阅服务(Java SDK)

操作步骤

第一步:修改 JDK 版本

在 IntelliJ IDEA 修改 JDK 版本为 JDK8:

Tuya-connector Java SDK 目前已兼容 JDK8JDK11,变更为 JDK11 的操作方法和 JDK8 类似。

  1. File > Project Structure> Project > Project SDK,选择 Add SDK > Download JDK
    开发设备控制和消息订阅服务(Java SDK)
  2. 选择任意厂商的 1.8.0_*** 版本 JDK。
    开发设备控制和消息订阅服务(Java SDK)
  3. Project SDK 选择 1.8.0_*** 版本 JDK。
    开发设备控制和消息订阅服务(Java SDK)
  4. Project language level 选择 8。
    开发设备控制和消息订阅服务(Java SDK)
  5. 单击 Apply > OK

第二步:添加依赖

添加 tuya-spring-boot-starter-sample Module:

  1. File > Project Structure > Modules,单击 + > Import Module

    开发设备控制和消息订阅服务(Java SDK)
  2. 在 SDK 文件地址导入 tuya-spring-boot-starter-sample
    开发设备控制和消息订阅服务(Java SDK)

  3. 选择 Maven 导入。
    开发设备控制和消息订阅服务(Java SDK)

  4. 单击 Finish

第三步:编辑配置文件

开发前您需要在 application.properties 文件配置环境变量。

  1. 已创建项目概览 页面,获取用于 API 调用的 授权密钥,即 Access ID 和 Access Secret。

    开发设备控制和消息订阅服务(Java SDK)
  2. application.properties 文件配置环境变量。

    • connector.ak:授权密钥 中的 Access ID。

    • connector.sk:授权密钥 中的 Access Secret。

    • connector.region:数据中心 参照 TuyaRegion.java 文件。
      开发设备控制和消息订阅服务(Java SDK)

      # ClientId & SecretKey generated on the Tuya Cloud Development Platform
      connector.ak=fsxg5c9jasdrolc****//ClientId
      connector.sk=d064654cd2714286a3823f16a223****//SecretKey
      connector.region=CN //Data Center
      

第四步:控制设备

完成环境编辑配置后,您可以开始代码开发。

本程序控制的设备为一个灯带,控制其开关的标准指令集为 switch_led。如果您是其它设备,需要查询标准指令集后修改代码。

  1. 创建 Connector 接口(OpenAPI 的映射类)。

    开发设备控制和消息订阅服务(Java SDK)

    代码示例

    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);
    }
    
  2. 导入 DeviceConnector

    开发设备控制和消息订阅服务(Java SDK)

    代码示例

    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);
        }
    
    }
    
  3. 创建测试接口。

    开发设备控制和消息订阅服务(Java SDK)

    代码示例

    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 事件机制分发。

该功能需要开通 消息订阅 服务。

  1. Spring 应用启动类添加 @ConnectorScan 扫描路径,如果需要消息订阅,可以通过 @EnableMessaging 开启。

    开发设备控制和消息订阅服务(Java SDK)

    代码示例

    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);
        }
    
    }
    
    
  2. 订阅消息事件:

    您需要针对需要订阅的事件添加相应的 ApplicationListener 即可。框架内置了涂鸦所有云端消息事件类型,订阅的消息数据包括原始加密消息数据以及解密后的结构化的消息数据。

    开发设备控制和消息订阅服务(Java SDK)

    代码示例

    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}]}