物联网平台实用技巧:调用API获取设备状态

简介: 物联网很多业务场景中,时常需要获取设备的实时状态,以便根据不同状态(在线或离线)做不同处理。阿里云物联网平台提供多个云端API来获取设备的状态信息。本文介绍这些API的调用方法。

产品推荐:阿里云物联网开发者工具(IoT Studio),立刻免费体验吧!  
 

原文链接
物联网很多业务场景中,时常需要获取设备的实时状态,以便根据不同状态(在线或离线)做不同处理。阿里云物联网平台提供多个云端API来获取设备的状态信息。本文介绍这些API的调用方法。

原理

以下五个API可以获得设备状态。请根据业务需要,选择调用的接口。
image.png

实现

本文示例使用Java SDK,需准备Java开发环境。
在Maven项目中,需添加如下pom依赖,安装阿里云IoT SDK。

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>3.5.1</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-iot</artifactId>
  <version>6.11.0</version>
</dependency>
<dependency>
  <groupId>commons-codec</groupId>
  <artifactId>commons-codec</artifactId>
  <version>1.13</version>
</dependency>

Config.*参数值中,需传入您的阿里云账号AccessKey信息和设备信息。

  // 地域ID,根据您的物联网平台服务地域获取对应ID,https://help.aliyun.com/document_detail/40654.html
  private static String regionId = "cn-shanghai";
  // 您的阿里云账号AccessKey ID
  private static String accessKeyID = "Config.accessKey";
  // 您的阿里云账号AccesseKey Secret
  private static String accessKeySecret = "Config.accessKeySecret";
  // 要查询的设备所属产品的ProductKey
  private static String productKey = "Config.productKey";
  // 要查询的设备的名称DeviceName
  private static String deviceName = "Config.deviceName";

完整代码示例如下:

/*   
 * Copyright © 2019 Alibaba. All rights reserved.
 */
package com.aliyun.iot.demo.checkstatus;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.codec.binary.Base64;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateRequest;
import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateResponse;
import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateResponse.DeviceStatus;
import com.aliyuncs.iot.model.v20180120.BatchQueryDeviceDetailRequest;
import com.aliyuncs.iot.model.v20180120.BatchQueryDeviceDetailResponse;
import com.aliyuncs.iot.model.v20180120.BatchQueryDeviceDetailResponse.DataItem;
import com.aliyuncs.iot.model.v20180120.GetDeviceStatusRequest;
import com.aliyuncs.iot.model.v20180120.GetDeviceStatusResponse;
import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailRequest;
import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailResponse;
import com.aliyuncs.iot.model.v20180120.RRpcRequest;
import com.aliyuncs.iot.model.v20180120.RRpcResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

public class GetDeviceStatusByApi {

  // ===================需要用户填写的参数开始===========================
  // 修改Config.*的参数为您的实际信息
  // 地域ID,根据您的物联网平台服务地域获取对应ID,https://help.aliyun.com/document_detail/40654.html
  private static String regionId = "cn-shanghai";
  // 用户账号AccessKey ID
  private static String accessKeyID = "Config.accessKey";
  // 用户账号AccesseKey Secret
  private static String accessKeySecret = "Config.accessKeySecret";
  // 要查询的设备所属的产品ProductKey
  private static String productKey = "Config.productKey";
  // 要查询的设备名称deviceName
  private static String deviceName = "Config.deviceName";
  // ===================需要用户填写的参数结束===========================

  private static DefaultAcsClient client = null;

  private static DefaultAcsClient getClient(String accessKeyID, String accessKeySecret) {

    if (client != null) {
      return client;
    }

    try {
      IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyID, accessKeySecret);
      DefaultProfile.addEndpoint(regionId, regionId, "Iot", "iot." + regionId + ".aliyuncs.com");
      client = new DefaultAcsClient(profile);
    } catch (Exception e) {
      System.out.println("create Open API Client failed !! exception:" + e.getMessage());
    }

    return client;
  }

  /**
   * 设备状态获取
   * 方法一、二、三、四是基于状态查询的,获取的状态值可能会因为网络和心跳包延迟而延时更新;
   * 方法五是基于同步通信的,结果比较精准
   * 
   * @param args
   * @throws ServerException
   * @throws ClientException
   */
  public static void main(String[] args) throws ServerException, ClientException {

    // 获取服务端请求客户端
    DefaultAcsClient client = getClient(accessKeyID, accessKeySecret);

    GetDeviceStatusByApi api = new GetDeviceStatusByApi();

    // 方法一
    api.ByGetDeviceStatus(client);

    // 方法二
    api.ByBatchGetDeviceState(client);

    // 方法三
    api.ByQueryDeviceDetail(client);

    // 方法四
    api.ByBatchQueryDeviceDetail(client);

    // 方法五
    api.ByRRpc(client);
  }

  /**
   * 查询单设备运行状态
   * GetDeviceStatus https://help.aliyun.com/document_detail/69617.html
   * 
   * @param client 服务端请求客户端
   * @throws ServerException
   * @throws ClientException
   */
  public void ByGetDeviceStatus(DefaultAcsClient client) throws ServerException, ClientException {

    // 填充请求
    GetDeviceStatusRequest request = new GetDeviceStatusRequest();
    request.setProductKey(productKey); // 目标设备产品key
    request.setDeviceName(deviceName); // 目标设备名

    // 获取结果
    GetDeviceStatusResponse response = (GetDeviceStatusResponse) client.getAcsResponse(request);
    if (response != null && response.getSuccess()) {
      GetDeviceStatusResponse.Data data = response.getData();
      // ONLINE:设备在线。
      // OFFLINE:设备离线。
      // UNACTIVE:设备未激活。
      // DISABLE:设备已禁用。
      if ("ONLINE".equals(data.getStatus())) {
        System.out.println("GetDeviceStatus 检测:" + deviceName + " 设备在线");
      } else { // 其他状态归结为设备不在线,也可以根据业务情况自行区分处理
        System.out.println("GetDeviceStatus 检测:" + deviceName + " 设备不在线");
      }
    } else {
      System.out.println("GetDeviceStatus 检测:" + "接口调用不成功,可能设备 " + deviceName + " 不存在");
    }
  }

  /**
   * 批量查询设备运行状态
   * BatchGetDeviceState https://help.aliyun.com/document_detail/69906.html
   * 
   * @param client 服务端请求客户端
   * @throws ServerException
   * @throws ClientException
   */
  public void ByBatchGetDeviceState(DefaultAcsClient client) throws ServerException, ClientException {

    // 填充请求
    BatchGetDeviceStateRequest request = new BatchGetDeviceStateRequest();
    request.setProductKey(productKey); // 目标设备产品key
    List<String> deviceNames = new ArrayList<String>(); // 目标设备名列表
    deviceNames.add(deviceName);
    request.setDeviceNames(deviceNames);

    // 获取结果
    BatchGetDeviceStateResponse response = (BatchGetDeviceStateResponse) client.getAcsResponse(request);
    if (response != null && response.getSuccess()) {
      List<DeviceStatus> dsList = response.getDeviceStatusList();
      for (DeviceStatus ds : dsList) {
        // ONLINE:设备在线。
        // OFFLINE:设备离线。
        // UNACTIVE:设备未激活。
        // DISABLE:设备已禁用。
        if ("ONLINE".equals(ds.getStatus())) {
          System.out.println("BatchGetDeviceState 检测:" + ds.getDeviceName() + " 设备在线");
        } else { // 其他状态归结为设备不在线,也可以根据业务情况自行区分处理
          System.out.println("BatchGetDeviceState 检测:" + ds.getDeviceName() + " 设备不在线");
        }
      }
    } else {
      System.out.println("BatchGetDeviceState 检测:" + "接口调用不成功,可能设备 " + deviceName + " 不存在");
    }
  }

  /**
   * 查询单设备详细信息
   * QueryDeviceDetail https://help.aliyun.com/document_detail/69594.html
   * 
   * @param client 服务端请求客户端
   * @throws ServerException
   * @throws ClientException
   */
  public void ByQueryDeviceDetail(DefaultAcsClient client) throws ServerException, ClientException {

    // 填充请求
    QueryDeviceDetailRequest request = new QueryDeviceDetailRequest();
    request.setProductKey(productKey); // 目标设备产品key
    request.setDeviceName(deviceName); // 目标设备名

    // 获取结果
    QueryDeviceDetailResponse response = (QueryDeviceDetailResponse) client.getAcsResponse(request);
    if (response != null && response.getSuccess()) {
      QueryDeviceDetailResponse.Data data = response.getData();
      // ONLINE:设备在线。
      // OFFLINE:设备离线。
      // UNACTIVE:设备未激活。
      // DISABLE:设备已禁用。
      if ("ONLINE".equals(data.getStatus())) {
        System.out.println("QueryDeviceDetail 检测:" + deviceName + " 设备在线");
      } else { // 其他状态归结为设备不在线,也可以根据业务情况自行区分处理
        System.out.println("QueryDeviceDetail 检测:" + deviceName + " 设备不在线");
      }
    } else {
      System.out.println("QueryDeviceDetail 检测:" + "接口调用不成功,可能设备 " + deviceName + " 不存在");
    }
  }

  /**
   * 批量查询设备详细信息
   * BatchQueryDeviceDetai https://help.aliyun.com/document_detail/123470.html
   * 
   * @param client 服务端请求客户端
   * @throws ServerException
   * @throws ClientException
   */
  public void ByBatchQueryDeviceDetail(DefaultAcsClient client) throws ServerException, ClientException {

    // 填充请求
    BatchQueryDeviceDetailRequest request = new BatchQueryDeviceDetailRequest();
    request.setProductKey(productKey); // 目标设备产品key
    List<String> deviceNames = new ArrayList<String>(); // 目标设备名列表
    deviceNames.add(deviceName);
    request.setDeviceNames(deviceNames);

    // 获取结果
    BatchQueryDeviceDetailResponse response = (BatchQueryDeviceDetailResponse) client.getAcsResponse(request);
    if (response != null && response.getSuccess()) {
      List<DataItem> diList = response.getData();
      for (DataItem di : diList) {
        // ONLINE:设备在线。
        // OFFLINE:设备离线。
        // UNACTIVE:设备未激活。
        // DISABLE:设备已禁用。
        if ("ONLINE".equals(di.getStatus())) {
          System.out.println("BatchQueryDeviceDetail 检测:" + di.getDeviceName() + " 设备在线");
        } else { // 其他状态归结为设备不在线,也可以根据业务情况自行区分处理
          System.out.println("BatchQueryDeviceDetail 检测:" + di.getDeviceName() + " 设备不在线");
        }
      }
    } else {
      System.out.println("BatchQueryDeviceDetail 检测:" + "接口调用不成功,可能设备 " + deviceName + " 不存在");
    }
  }

  /**
   * RRPC 检测设备状态
   * RRpc https://help.aliyun.com/document_detail/69797.html
   * 
   * @param client 服务端请求客户端
   * @throws ServerException
   * @throws ClientException
   */
  public void ByRRpc(DefaultAcsClient client) throws ServerException, ClientException {

    // 填充请求
    RRpcRequest request = new RRpcRequest();
    request.setProductKey(productKey);// 目标设备产品key
    request.setDeviceName(deviceName);// 目标设备名
    request.setRequestBase64Byte(Base64.encodeBase64String("Hello World".getBytes())); // 消息内容,必须base64编码字符串
    request.setTimeout(5000); // 响应超时设置,可根据实际需要填写数值

    // 获取结果
    RRpcResponse response = (RRpcResponse) client.getAcsResponse(request);
    if (response != null) { // 不要使用response.getSuccess()判断,非SUCCESS都是false;直接使用RrpcCode判断即可
      // UNKNOWN:系统异常
      // SUCCESS:成功
      // TIMEOUT:设备响应超时
      // OFFLINE:设备离线
      // HALFCONN:设备离线(设备连接断开,但是断开时间未超过一个心跳周期)
      if ("SUCCESS".equals(response.getRrpcCode())) {
        System.out.println("RRPC 检测:" + deviceName + " 设备在线");
      } else if (response.getRrpcCode() == null) {
        System.out.println("RRPC 检测:" + deviceName + " 设备可能不存在");
      } else { // 其他状态归结为设备不在线,也可以根据业务情况自行区分处理
        System.out.println("RRPC 检测:" + deviceName + " 设备不在线:");
      }
      // RRPC 还可以实现更复杂的设备状态检测方法
      // 请参考 https://help.aliyun.com/document_detail/101133.html
    } else {
      System.out.println("RRPC 检测:" + "接口调用不成功");
    }
  }
}
相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
28天前
|
消息中间件 网络协议 物联网
MQTT常见问题之物联网设备端申请动态注册时MQTT服务不可用如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
2月前
|
小程序 安全 API
社区每周丨小程序基础API新增获取设备、系统等多个接口
社区每周丨小程序基础API新增获取设备、系统等多个接口
108 0
|
1月前
|
监控 安全 数据挖掘
物联网平台中如何快速检测设备异常
物联网平台中如何快速检测设备异常
29 0
|
1月前
|
存储 监控 安全
Java基于物联网技术的智慧工地云管理平台源码 依托丰富的设备接口标准库,快速接入工地现场各类型设备
围绕施工安全、质量管理主线,通过物联感知设备全周期、全覆盖实时监测,将管理动作前置,实现从事后被动补救到事前主动预防的转变。例如塔吊运行监测,超重预警,升降机、高支模等机械设备危险监控等,通过安全关键指标设定,全面掌握现场安全情况,防患于未然。
148 5
|
1月前
|
编解码 API Android开发
深入了解设备交互 API 如何改变我们的生活
深入了解设备交互 API 如何改变我们的生活
29 3
|
1月前
|
XML JSON 网络协议
【开源视频联动物联网平台】设备接入
【开源视频联动物联网平台】设备接入
27 2
|
1月前
|
存储 运维 网络协议
【开源物联网平台】物联网设备上云提供开箱即用接入SDK
IOTDeviceSDK是物联网平台提供的设备端软件开发工具包,可简化开发过程,实现设备快速接入各大物联网平台。设备厂商获取SDK后,根据需要选择相应功能进行移植,即可快速集成IOTDeviceSDK,实现设备的接入。
118 0
|
1月前
|
安全 搜索推荐 物联网
物联网设备的OTA基本原理
物联网设备的OTA基本原理
39 1
|
3月前
|
供应链 NoSQL 物联网
链接全球数十亿台设备!物联网行业如何应对数据管理、实时分析和供应链优化的挑战?
物联网已成为面向未来的解决方案的关键组成部分,且其所蕴含的巨大经济价值潜力有待挖掘
1440 0
链接全球数十亿台设备!物联网行业如何应对数据管理、实时分析和供应链优化的挑战?
|
3月前
|
NoSQL 安全 物联网
检索时间减少83%!部署MongoDB后,通用电气医疗集团狠狠提升了物联网设备的利用效率!
作为医疗技术领域的全球领导者,通用电气医疗集团选择了 MongoDB由其管理旗下物联网设备,从部署(生命周期初期,即 BoL)到报废(生命周期结束,即 EoL)的整个生命周期
1828 3
检索时间减少83%!部署MongoDB后,通用电气医疗集团狠狠提升了物联网设备的利用效率!

相关产品

  • 物联网平台