更新时间:2024-09-23 GMT+08:00

使用设备SDK进行消息收发

概述

华为云IoTDA服务多种语言SDK,通过SDK设备可以快速连接华为云IoTDA并进行消息上下行通信,本文基于Java示例代码演示设备通过MQTTS/MQTT协议接入华为云IoTDA服务并通过Topic发布和订阅消息。

图1 SDK与IoTDA的消息交互流程

设备侧SDK发送消息

  1. 配置设备侧SDK的Maven依赖。
    <dependency>
    	<groupId>com.huaweicloud</groupId>
    	<artifactId>iot-device-sdk-java</artifactId>
    	<version>[1.2.1,)</version>
    </dependency>
  2. 建立设备与华为云IoTDA的连接。
    1. 参考样例代码,在建立连接之前,修改设备连接参数。
      // 请将 xxx.st1.iotda-device.cn-north-4.myhuaweicloud.com 替换为自己的接入地址。
      //域名获取方式:登录华为云IoTDA控制台左侧导航栏“总览”页签,在选择的实例基本信息中,单击“接入信息”。选择“设备接入”8883端口对应的接入地址。
      IoTDevice device = new IoTDevice("ssl://xxx.st1.iotda-device.cn-north-4.myhuaweicloud.com:8883", "your device id",
      		"your device secret", tmpCAFile);
      device.getClient().setConnectListener(new MessageSample(device));
      
      if (device.init() != 0) {
      	return;
      }
      
    2. 设备接入平台后,参考如下代码订阅平台下发的消息。
          @Override
          public void connectComplete(boolean reconnect, String serverURI) {
              // 订阅下行消息
              device.getClient().subscribeTopic("/test/cloudToDevice", new ActionListener() {
                  @Override
                  public void onSuccess(Object context) {
                      System.out.println("subscribeTopic success");
                  }
      
                  @Override
                  public void onFailure(Object context, Throwable var2) {
                      System.out.println("subscribeTopic failure");
                  }
              } , rawMessage -> {
                  System.out.println(" on receive message topic : " + rawMessage.getTopic() + " , payload : " + new String(
                      rawMessage.getPayload(), StandardCharsets.UTF_8));
              }, 1);
          }
    3. 完成上述信息的修改后,运行程序,在平台可以看到设备显示在线。
      图2 设备列表-设备在线
  3. 上报设备消息,参考样例代码,在建立连接后,指定Topic上报消息。
    device.getClient().publishRawMessage(new RawMessage("/test/deviceToCloud", "hello", 1), new ActionListener() {
        @Override
        public void onSuccess(Object context) {
            System.out.println("reportDeviceMessage success: ");
        }
        @Override
        public void onFailure(Object context, Throwable var2) {
            System.out.println("reportDeviceMessage fail: " + var2);
        }
    });

  1. 访问设备接入服务,单击“控制台”进入设备接入控制台。选择左侧导航栏“IoTDA实例”,单击您需要的实例卡片进入实例。在左侧导航栏选择“设备>所有设备”,单击“详情”,在设备详情的消息跟踪页面可以查看平台是否收到对应消息。
    图3 消息跟踪-查看消息跟踪

应用侧SDK接收消息

设备通过SDK将消息发送到平台后,可以配置数据转发将设备上报的消息平滑流转至消息中间件、存储、数据分析或业务应用。本文以Java SDK接入示例接收设备上报的消息并进行业务处理。

应用侧SDK下发消息

配置应用侧SDK下发消息。

  1. 配置Maven依赖,本示例使用的开发环境为JDK 1.8及以上版本。SDK代码获取:SDK下载
    <dependency>
        <groupId>com.huaweicloud.sdk</groupId>
        <artifactId>huaweicloud-sdk-core</artifactId>
        <version>[3.0.40-rc, 3.2.0)</version>
    </dependency>
    <dependency>
        <groupId>com.huaweicloud.sdk</groupId>
        <artifactId>huaweicloud-sdk-iotda</artifactId>
        <version>[3.0.40-rc, 3.2.0)</version>
    </dependency>
  2. 应用侧向指定设备下发消息样例如下:
    public class MessageDistributionSolution {
        // REGION_ID:如果是上海一,请填写"cn-east-3";如果是北京四,请填写"cn-north-4";如果是华南广州,请填写"cn-south-4"
        private static final String REGION_ID = "<YOUR REGION ID>";
        // ENDPOINT:请在控制台的"总览"界面的"平台接入地址"中查看“应用侧”的https接入地址。
        private static final String ENDPOINT = "<YOUR ENDPOINT>";
        // 标准版/企业版:需自行创建Region对象
        public static final Region REGION_CN_NORTH_4 = new Region(REGION_ID, ENDPOINT);
        public static void main(String[] args) {
            String ak = "<YOUR AK>";
            String sk = "<YOUR SK>";
            String projectId = "<YOUR PROJECTID>";
            // 创建认证
            ICredential auth = new BasicCredentials().withDerivedPredicate(AbstractCredentials.DEFAULT_DERIVED_PREDICATE)
                .withAk(ak)
                .withSk(sk)
                .withProjectId(projectId);
            // 创建IoTDAClient实例并初始化
            IoTDAClient client = IoTDAClient.newBuilder().withCredential(auth)
                // 基础版:请选择IoTDARegion中的Region对象
                //.withRegion(IoTDARegion.CN_NORTH_4)
                // 标准版/企业版:需自行创建Region对象
                .withRegion(REGION_CN_NORTH_4).build();
            // 实例化请求对象
            CreateMessageRequest request = new CreateMessageRequest();
            request.withDeviceId("<YOUR DEVICE_ID>");
            DeviceMessageRequest body = new DeviceMessageRequest();
            body.withPayloadFormat("raw");
            body.withTopicFullName("/test/cloudToDevice");
            body.withMessage("hello");
            request.withBody(body);
            try {
                CreateMessageResponse response = client.createMessage(request);
                System.out.println(response.toString());
            } catch (ConnectionException e) {
                e.printStackTrace();
            } catch (RequestTimeoutException e) {
                e.printStackTrace();
            } catch (ServiceResponseException e) {
                e.printStackTrace();
                System.out.println(e.getHttpStatusCode());
                System.out.println(e.getRequestId());
                System.out.println(e.getErrorCode());
                System.out.println(e.getErrorMsg());
            }
        }
    }

  1. 查看设备端日志,可以看到应用给设备下发的消息如下:
    on receive message topic : /test/cloudToDevice , payload : hello