物联网平台实用技巧:调用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
相关文章
|
6天前
|
Web App开发 网络协议 安全
基于Web攻击的方式发现并攻击物联网设备介绍
基于Web攻击的方式发现并攻击物联网设备介绍
|
17天前
|
安全 物联网 物联网安全
智能物联网安全:物联网设备的防护策略与最佳实践
【10月更文挑战第26天】随着物联网(IoT)技术的快速发展,智能设备已广泛应用于智能家居、工业控制和智慧城市等领域。然而,设备数量的激增也带来了严重的安全问题,如黑客攻击、数据泄露和恶意控制,对个人隐私、企业运营和国家安全构成威胁。因此,加强物联网设备的安全防护至关重要。
42 7
|
19天前
|
监控 安全 物联网
确保互联世界中物联网设备安全的三个技巧
确保互联世界中物联网设备安全的三个技巧
|
1月前
|
物联网 5G 智能硬件
物联网卡:物联网卡不支持语音通话,是如何实现设备间的数据传输和通信的?
物联网卡(IoT SIM卡)通常被设计用于支持物联网(IoT)设备之间的数据传输,而不直接支持语音通话功能。这是因为物联网设备主要关注的是数据的收集、传输和处理,而不是语音通信。为了实现设备间的数据传输和通信,物联网卡及其背后的技术采用了多种方法,主要包括但不限于以下几种方式:
物联网卡:物联网卡不支持语音通话,是如何实现设备间的数据传输和通信的?
|
27天前
|
物联网
物联网卡不能使用在什么设备上
“物联网卡不能使用在什么设备上”这一操作或规定,通常基于物联网卡的特性、使用条款以及设备兼容性等因素。以下是对这一问题的详细分析和操作建议:
|
30天前
|
存储 监控 物联网
医疗物联网设备精细化管理系统解决方案
华汇数据智慧医院物联网管理系统解决方案是一种集物联网、云计算、大数据和人工智能等先进技术于一体的综合性解决方案,旨在提升医院的运营效率、医疗质量和患者满意度。
69 3
|
1月前
|
安全 物联网
物联网卡不能更换设备使用吗
物联网卡(IoT SIM卡)是否允许更换设备使用,这主要取决于物联网服务提供商的具体政策和服务条款。通常,物联网卡是为特定设备或应用场景设计的,因此一些服务提供商会限制卡的更换使用,主要是出于安全、管理、网络优化和避免滥用等考虑
|
16天前
|
安全 物联网 物联网安全
智能物联网安全:物联网设备的防护策略与最佳实践
【10月更文挑战第27天】随着物联网技术的快速发展,智能设备已广泛应用于生活和工业领域。然而,物联网设备的安全问题日益凸显,主要威胁包括中间人攻击、DDoS攻击和恶意软件植入。本文探讨了物联网设备的安全防护策略和最佳实践,包括设备认证和加密、定期更新、网络隔离以及安全标准的制定与实施,旨在确保设备安全和数据保护。
34 0
|
1月前
|
人工智能 安全 物联网
|
1月前
|
存储 安全 物联网

相关产品

  • 物联网平台