本文介绍如何快速地使用Java Link SDK,通过MQTT协议,实现设备与物联网平台之间连接和通信的整体操作

前提条件

已开通物联网平台服务。

说明 开通阿里云物联网平台不收费。开通后,您可以根据免费额度试用服务,试用流程,请参见物联网平台试用中心

背景信息

本文以夜灯开关为例,通过配置Java Link SDK,模拟设备使用MQTT协议接入物联网平台。设备通过自定义Topic,将数据上报至物联网平台

创建产品和设备

  1. 登录物联网平台控制台,单击公共实例卡片
  2. 在左侧导航栏,选择设备管理 > 产品,单击创建产品
  3. 新建产品页面,输入产品名称:夜灯开关,所属品类选择自定义品类其他参数使用默认值,单击确认
    创建产品
  4. 在完成创建产品的页面,单击添加设备下的前往添加
  5. 设备页面,单击添加设备
  6. 添加设备对话框中,输入设备名称,例如:LightSwitch。然后,单击确认
    添加设备
  7. 添加完成对话框中,单击一键复制设备证书。将设备证书信息保存至本地备用。关于设备证书的更多信息,请参见设备证书

准备开发环境

本示例的开发环境为Java 15,开发工具为IntelliJ IDEA社区版2020.1。关于环境的更多说明,请参见环境说明

  1. 安装Java开发环境。
    更多信息,请参见Java官方网站
  2. 安装开发工具IntelliJ IDEA。
    更多信息,请参见IntelliJ IDEA

配置设备端SDK

  1. 下载Demo文件至开发环境并解压。
    说明 下载本Demo将默认您同意本软件许可协议
  2. 打开IntelliJ IDEA,选择File > Open...,找到相应的工程文件后,单击OK
  3. 配置项目中以下文件代码中的参数。
    • 配置设备接入信息,使设备接入物联网平台。
      文件 参数 示例 说明
      ./device_id.jason productKey a18wP****** 设备认证信息。即完成添加设备后,您保存至本地的设备证书。

      您也可以在物联网平台的设备详情页查看设备的认证信息。更多信息,请参见获取设备认证信息

      deviceName LightSwitch
      deviceSecret uwMTmVAMnGGHaAkqmeDY6cHxxB******
      ./src/main/java/com/aliyun/alink/devicesdk/demo/DeviceInfoData.java region cn-shanghai 设备接入的地域ID。更多信息,请参见地域和可用区
      ./src/main/java/com/aliyun/alink/devicesdk/demo/HelloWorld.java channelHost "a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883" 该参数的值由接入域名和端口号组成。
      • 企业版实例和新版公共实例:该参数值的格式为"接入域名:1883"
      • 旧版公共实例:直接输入值pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883"

      其中,1883为端口号。

      新旧版公共实例和企业版实例、以及接入域名的更多信息,请参见实例管理

    • 配置设备用于发送信息的Topic,例如/a18wP******/LightSwitch/user/update,并设置要发送的信息内容。示例代码如下:
      
          public void publish() {
              MqttPublishRequest request = new MqttPublishRequest();
              request.topic = "/" + productKey + "/" + deviceName + "/user/update";
              request.qos = 0;
              request.payloadObj = "{\\\"id\\\":\\\"1\\\",\\\"version\\\":\\\"1.0\\\",\\\"params\\\":{\\\"LightSwitch\\\":0}}";
              LinkKit.getInstance().publish(request, new IConnectSendListener() {
                  @Override
                  public void onResponse(ARequest aRequest, AResponse aResponse) {
                      // 发布结果
                      ALog.d(TAG, "onResponse " + (aResponse == null ? "" : aResponse.data));
                  }
      
                  @Override
                  public void onFailure(ARequest aRequest, AError aError) {
                      // 发布失败
                      ALog.d(TAG, "onFailure " + (aError == null ? "" : (aError.getCode() + aError.getMsg())));
                  }
              });
          }
      文件 参数 示例 说明
      ./src/main/java/com/aliyun/alink/devicesdk/demo/MqttSample.java topic "/" + productKey + "/" + deviceName + "/user/update" 具有发布权限的Topic,设备通过该Topic向物联网平台发送消息。

      您可以在物联网平台的产品详情页的Topic类列表下的自定义Topic页签下,查看您的自定义Topic。更多信息,请参见什么是Topic

      示例值中的user/update为Topic的后缀,将其修改为指定值后,可向对应的Topic发送消息。

      本示例要发送消息的Topic为/a18wP******/LightSwitch/user/update
      • a18wP******为设备的ProductKey
      • LightSwitch为设备的DeviceName
      payloadObj {\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}} 上报至物联网平台的消息内容。

      本示例使用自定义Topic,您可自定义消息的数据格式。

    • 配置设备订阅Topic,例如/a18wP******/LightSwitch/user/get,以接收来自物联网平台的消息。示例代码如下:
          public void subscribe() {
              MqttSubscribeRequest request = new MqttSubscribeRequest();
              request.topic = "/" + productKey + "/" + deviceName + "/user/get";
              request.isSubscribe = true;
              LinkKit.getInstance().subscribe(request, new IConnectSubscribeListener() {
                  @Override
                  public void onSuccess() {
                      // 订阅成功
                      ALog.d(TAG, "onSuccess ");
                  }
      
                  @Override
                  public void onFailure(AError aError) {
                      // 订阅失败
                      ALog.d(TAG, "onFailure " + getError(aError));
                  }
              });
          }
      
                                      
      文件 参数 示例 说明
      ./src/main/java/com/aliyun/alink/devicesdk/demo/MqttSample.java topic "/" + productKey + "/" + deviceName + "/user/get" 具有订阅权限的Topic,设备通过该Topic,可接收物联网平台的消息。

      您可以在物联网平台的产品详情页的Topic类列表下的自定义Topic页签下,查看您的自定义Topic。更多信息,请参见什么是Topic

      示例值中的user/get为Topic的后缀,将其修改为指定值后,可订阅对应的Topic。

      本示例订阅的Topic为/a18wP******/LightSwitch/user/get
      • a18wP******为设备的ProductKey
      • LightSwitch为设备的DeviceName

运行结果

  • 项目文件配置完成后,单击Run运行Demo可执行文件./demo/HelloWorld.java您可以在设备端查看运行结果。
    • 以下日志显示设备LightSwitch与物联网平台连接成功。
      2021-05-07 06:32:05.360 - 20/? D/ConnectManager:CommonNofity, onConnectStateChange(),state = CONNECTED
    • 以下日志显示设备LightSwitch订阅了Topic /a18wP******/LightSwitch/user/get
      2021-05-07 06:32:05.493 - null[MqttSendExecutor.java] - asyncSend(162):MqttSendExecutor:subscribe: topic: [ /a18wP******/LightSwitch/user/get ]
      Topic订阅成功后,您可以返回物联网平台,在设备详情页面的Topic列表页签,单击订阅的Topic操作栏的发布消息,然后在发布消息对话框的消息输入栏中,输入一条消息,例如:This is a test message from Alibaba Iot Platform.,模拟从物联网平台向设备发送消息。发送消息
    • 以下日志显示设备LightSwitch通过Topic /a18wP******/LightSwitch/user/update,向物联网平台上报了一条消息。
      2021-05-07 06:32:05.488 - null[MqttSendExecutor.java] - asyncSend(129):MqttSendExecutor:publish: topic: [ /a18wP******/LightSwitch/user/update ]
      2021-05-07 06:32:05.489 - null[MqttSendExecutor.java] - asyncSend(130):MqttSendExecutor:publish: payload: [ {\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}} ]
  • 您可以在物联网平台控制台查看设备的状态和运行日志。

    • 左侧导航栏,选择设备管理 > 设备,找到设备,查看设备状态。设备状态显示为在线,则表示设备与物联网平台成功连接。查看设备状态
    • 在左侧导航栏,选择监控运维 > 日志服务,选择夜灯开关产品后,查看设备上线、订阅Topic和上报消息的日志。Python设备的日志
      说明 您可以忽略日志中有关OTA升级、物模型、子设备等日志信息。这些信息关于SDK自带的高级功能,不会影响您的体验。

如果在调试过程中出现错误,请参见设备端接收的错误码,根据提示解决问题。若未能解决问题,您可以提交工单

后续步骤

设备接入物联网平台后,您可以管理设备并对其进行监控运维。关于物联网平台的更多功能,请参见物联网平台产品功能

使用Java Link SDK配置相关高级功能,请参见Java Link SDK概述