物联网平台实用技巧:通过服务端订阅(HTTP/2)获取设备状态

简介: 物联网很多业务场景中,时常需要获取设备的实时状态,以便根据不同的状态(在线或离线)做不同的处理。阿里云物联网平台提供服务端订阅功能来获取设备的状态信息。本文介绍通过HTTP/2通道订阅获取设备状态的方法

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

原理

在物联网平台控制台,设置服务端订阅设备状态变化通知消息后,物联网平台会将该产品下的设备上下线消息推送到您的服务端。服务端通过HTTP/2 SDK接收设备状态变化消息。

流程图
image.png
说明 步骤1.1和2.1物联网平台判断是否已配控制台已配置服务端订阅设备状态变化通知。
设备状态变化通知消息的数据格式

    "status":"online|offline",
    "productKey":"al123455****",
    "deviceName":"deviceName1234",
    "time":"2018-08-31 15:32:28.205",
    "utcTime":"2018-08-31T07:32:28.205Z",
    "lastTime":"2018-08-31 15:32:28.195",
    "utcLastTime":"2018-08-31T07:32:28.195Z",
    "clientIp":"123.123.***.***"
}

订阅

在物联网平台控制台,设置HTTP/2服务端订阅设备状态变化通知。
1、登录物联网平台控制台。
2、左侧导航栏选择设备管理 > 产品。
3、在产品列表中,搜索到要配置服务端订阅的产品,并单击该产品对应的查看按钮。
4、在产品详情页,单击服务端订阅 > 设置。
5、选择推送的消息类型为设备状态变化通知,单击保存
image.png

接收

服务端通过HTTP/2 SDK接收设备状态消息。本示例以配置Java HTTP/2 SDK为例。

说明
仅支持JDK8。
如果同一个阿里云账号信息用于启动了多个HTTP/2 SDK,物联网平台会将设备状态消息随机推送到其中一个客户端。
在Maven项目中,添加以下pom依赖,安装阿里云IoT SDK。

  <groupId>com.aliyun.openservices</groupId>
  <artifactId>iot-client-message</artifactId>
  <version>1.1.3</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>3.7.1</version>
</dependency>

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

  private static String accessKeyID = "Config.accessKey";
  // 您的阿里云账号AccesseKey Secret
  private static String accessKeySecret = "Config.accessKeySecret";
  // 您的阿里云账号ID
  private static String uid = "Config.uid";
  // regionId
  private static String regionId = "cn-shanghai";
  // endPoint: https://${uid}.iot-as-http2.${region}.aliyuncs.com
  private static String endPoint = "https://" + uid + ".iot-as-http2." + regionId + ".aliyuncs.com";

完整示例代码如下:

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

import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.openservices.iot.api.Profile;
import com.aliyun.openservices.iot.api.message.MessageClientFactory;
import com.aliyun.openservices.iot.api.message.api.MessageClient;
import com.aliyun.openservices.iot.api.message.callback.MessageCallback;
import com.aliyun.openservices.iot.api.message.entity.MessageToken;
import com.google.common.util.concurrent.ThreadFactoryBuilder;

public class GetDeviceStatusByH2 {

  // ===================需要用户填写的参数开始===========================
  // 修改Config.*的参数为您的账号信息
  // 各项信息的获取方式请参考 https://help.aliyun.com/document_detail/89227.html
  // 用户账号AccessKey
  private static String accessKeyID = "Config.accessKey";
  // 用户账号AccesseKeySecret
  private static String accessKeySecret = "Config.accessKeySecret";
  // 用户uid
  private static String uid = "Config.uid";
  // regionId
  private static String regionId = "cn-shanghai";
  // endPoint: https://${uid}.iot-as-http2.${region}.aliyuncs.com
  private static String endPoint = "https://" + uid + ".iot-as-http2." + regionId + ".aliyuncs.com";
  // ===================需要用户填写的参数结束===========================

  private static ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
      Runtime.getRuntime().availableProcessors() * 2, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100),
      new ThreadFactoryBuilder().setDaemon(true).setNameFormat("http2-downlink-handle-%d").build(),
      new ThreadPoolExecutor.AbortPolicy());

  /**
   * 1、设置服务端订阅
   * 2、启动本程序
   * 3、启动您的设备,使设备在线
   * 4、关闭您的设备,使设备离线
   * 5、查看本程序打印的日志
   * 
   * @param args
   */
  public static void main(String[] args) {

    // 连接配置
    Profile profile = Profile.getAccessKeyProfile(endPoint, regionId, accessKeyID, accessKeySecret);

    // 构造客户端
    MessageClient client = MessageClientFactory.messageClient(profile);

    // 消息回调处理
    MessageCallback messageCallback = new MessageCallback() {
      @Override
      public Action consume(MessageToken messageToken) {
        // 返回消费成功,业务另起线程处理,以免堵塞回调
        executorService.submit(() -> handleDownLinkMessage(messageToken));
        // 收到消息应该尽快return commitSuccess
        return MessageCallback.Action.CommitSuccess;
      }
    };

    // 本地过滤。物联网平台会将已订阅的全部设备消息推送下来,这里通过匹配Topic,过滤出要处理的消息
    // 这里只处理Topic为 /as/mqtt/status 开头的消息,其他消息也会收到但不处理
    // Topic及其对应的消息格式请参考 https://help.aliyun.com/document_detail/73736.html
    client.setMessageListener("/as/mqtt/status/#", messageCallback);

    // 通用回调,setMessageListener中未匹配的消息在这里处理
    MessageCallback messageCallbackCommon = new MessageCallback() {

      @Override
      public Action consume(MessageToken messageToken) {
        // 如果有业务处理,建议另起线程处理
        return MessageCallback.Action.CommitSuccess;
      }
    };

    // 数据接收
    client.connect(messageCallbackCommon);
  }

  private static void handleDownLinkMessage(MessageToken messageToken) {
    // 整个消息体内容是JSON
    String message = new String(messageToken.getMessage().getPayload());
    // 获取其中的status字段,就是设备在线状态
    JSONObject json = (JSONObject) JSON.parse(message);
    String deviceName = json.getString("deviceName");
    String status = json.getString("status");
    System.out.println("消息原始内容: " + message);
    System.out.println(deviceName + " 在线状态: " + status);
    // 其他自定义实现
  }
}

服务端接收订阅消息的Java HTTP/2 SDK配置详细说明,请参见开发指南(Java)。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
1天前
|
安全 物联网 定位技术
2G网络和基站的撤销对物联网设备的影响
2G网络和基站的撤销对物联网设备的影响是多方面的,以下是对这一影响的详细分析:
2G网络和基站的撤销对物联网设备的影响
|
8天前
|
存储 安全 物联网
智能家居安全:物联网设备的风险与防护
在智能家居的浪潮中,物联网技术让生活更加便捷。然而,随之而来的安全问题也不容忽视。本文将揭示智能家居设备可能面临的安全风险,并提供实用的防护措施,帮助用户构建一个更安全的智能生活环境。
|
12天前
|
传感器 监控 物联网
物联网卡在不同应用设备中的基本操作
物联网卡(IoT SIM卡)在物联网(IoT)设备中扮演着至关重要的角色,它们为设备提供网络连接能力,使得设备能够远程交换数据。物联网卡的应用设备广泛,涵盖了从智能家居、智能城市、工业自动化到远程监控等多个领域。以下是物联网卡在不同应用设备中的基本操作流程概述:
|
11天前
|
监控 安全 物联网
智能家居安全:物联网设备的风险与防护
在智能家居的便捷背后,潜藏着不容忽视的安全风险。本文旨在揭示物联网设备可能遭遇的网络攻击类型,并探讨如何通过合理的预防措施来加固我们的智能家园。从技术角度出发,我们将深入分析黑客入侵的途径,并提出有效的防御策略,以期为打造一个更安全的智能家居环境提供指导。
25 1
|
23天前
|
机器学习/深度学习 安全 物联网
智能家居安全:物联网设备的双刃剑
【8月更文挑战第28天】 随着物联网技术的飞速发展,智能家居已成为现代生活的一部分。然而,随之而来的安全问题也日益凸显。本文将深入探讨智能家居中的安全挑战,分析物联网设备如何成为一把双刃剑,既带来便利也可能引发风险。通过案例分析和专家建议,为读者提供实用的防护措施和未来趋势的展望。
|
16天前
|
机器学习/深度学习 人工智能 算法
物联网(IoT)就像是一个大型派对,无数的设备都在欢快地交流着信息
【9月更文挑战第4天】在这个万物互联的时代,物联网(IoT)犹如一场盛大的派对,各类设备欢聚一堂。然而,如何让这些设备互相理解并协同工作呢?这就需要机器学习与人工智能的助力。例如,智能空调通过学习你的使用习惯来调节温度,使你更加舒适;智能安防系统则能识别异常行为并及时报警,保障家庭安全。此外,智能农业、交通等领域也因机器学习和人工智能的应用变得更加高效。下面通过一个简单的温度预测代码示例,展示机器学习在物联网中的实际应用,让我们一起感受其强大潜力。
20 0
|
28天前
|
物联网 C语言
C语言与物联网:设备间的通信与控制
C语言与物联网:设备间的通信与控制
36 0
|
Web App开发 新零售 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
1.尽可能地了解需求,系统层面适用开闭原则 2.模块化,低耦合,能快速响应变化,也可以避免一个子系统的问题波及整个大系统 3.
735 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Found lingering reference异常 ERROR: Found lingering reference file hdfs://jiujiang1:9000/hbase/month_hotstatic/...
709 0
|
Web App开发 前端开发 Java
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
java链接MongoDB处理大量数据时经常碰到cursor not found 的异常,其实是超时所致 Exception in thread "main" com.
823 0

相关产品

  • 物联网平台