简体中文
简体中文
English
联系我们
注册
登录
语言
简体中文
简体中文
English
联系我们
登录
注册
返回主站
layout空间导航

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

更新时间:2021-11-17 06:19:45下载pdf

本文介绍如何基于涂鸦云开发开放的能力和 SDK,开发一个控制 Connected by Tuya 的智能设备的程序。

前提条件

操作步骤

第一步:配置开发环境

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

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

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

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

  3. 在 IntelliJ IDEA 修改 JDK 版本为 JDK8。
    开发设备控制和消息订阅服务(Java SDK)

    说明: 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
  4. 添加 tuya-spring-boot-starter-sample Module。
    开发设备控制和消息订阅服务(Java SDK)

    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。
      开发设备控制和消息订阅服务(Java SDK)
    # ClientId & SecretKey generated on the Tuya Cloud Development Platform
    connector.ak= fsxg5c9jasdrolc**** //ClientId
    connector.sk= d064654cd2714286a3823f16a223**** //SecretKey
    
    

第三步:控制设备

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

说明: 本程序控制的设备为一个灯带,控制其开关的标准指令集为 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 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;
    
    @SpringBootTest
    public class DemoAplicationTest {
    
        @Autowired
        DeviceConnector deviceConnector;
    
        @Test
        void DevicegetById(){
            System.out.println(deviceConnector.getById("vdevo16274430851****"));
        }
        @Test
        void Controldevice(){
            CommandWrapper cmdWrapper = new CommandWrapper();
            cmdWrapper.commands = new ArrayList<>();
            cmdWrapper.commands.add(new Command());
            cmdWrapper.commands.get(0).code = "switch_led";
            cmdWrapper.commands.get(0).value = true;
            System.out.println(deviceConnector.commands("vdevo16274430851****",cmdWrapper));
        }
        static class Command{
            String code;
            Object value;
        }
        static class CommandWrapper{
            List<Command> 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}]}
    

小结

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