热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于MQTT通道的设备动态注册

在物联网平台为产品开启动态注册功能后,直连设备可使用一型一密安全认证方式完成动态注册,通过MQTT通信协议连接物联网平台。设备先基于TLS建立与物联网平

在这里插入图片描述

 

在物联网平台为产品开启动态注册功能后,直连设备可使用一型一密安全认证方式完成动态注册,通过MQTT通信协议连接物联网平台。设备先基于TLS建立与物联网平台的连接,获取MQTT连接所需的设备密钥,再断开连接,然后重新建立MQTT连接进行通信。本文介绍动态注册流程。


前提条件

已完成一型一密文档中的以下步骤:

注意 目前仅华东2(上海)地域支持设备进行一型一密免预注册认证。

  1. 创建产品。
  2. 开启动态注册。
  3. 添加设备。
  4. 产线烧录。

动态注册流程

流程

  1. 设备发送CONNECT报文,报文中包含动态注册参数,请求建立连接。

    说明 目前,动态注册只支持使用TLS建立连接,不支持TCP直连。动态注册时,物联网平台不会校验MQTT连接的Keep Alive(保活时间),因此可以不用设置Keep Alive时间。

    • MQTT连接域名说明:公共实例和企业版实例中,MQTT的接入域名,请参见查看实例终端节点。
    • CONNECT报文的动态注册参数:
      • 当设备属于企业版实例,且使用一型一密免预注册认证方式时,动态注册参数如下:

        mqttClientId: clientId+"|securemode=-2,authType=xxxx,random=xxxx,signmethod=xxxx,instanceId=xxxx|"
        mqttUserName: deviceName+"&"+productKey
        mqttPassword: sign_hmac(productSecret,content) 

      • 当设备属于公共实例,或使用一型一密预注册认证方式时,动态注册参数如下:

        mqttClientId: clientId+"|securemode=2,authType=xxxx,random=xxxx,signmethod=xxxx|"
        mqttUserName: deviceName+"&"+productKey
        mqttPassword: sign_hmac(productSecret,content) 

      参数说明:

      • mqttClientId

        参数取值中包含的详细参数如下表所示。

        参数说明
        clientId客户端ID,可自定义,长度在64个字符内。建议使用设备的MAC地址或SN码,方便您识别区分不同的客户端。
        securemode安全模式。
        • 一型一密预注册认证方式:固定取值为2。
        • 一型一密免预注册认证方式:固定取值为-2。
        authType一型一密认证方式,不同类型将返回不同的认证参数:
        • register:一型一密预注册认证方式,返回DeviceSecret。
        • regnwl:一型一密免预注册认证方式,返回DeviceToken、ClientID。
        random随机数。您自定义随机数。
        signMethod签名算法。目前支持hmacmd5、hmacsha1、hmacsha256。
        instanceId实例ID。请登录物联网平台控制台,在实例概览页面查看。
      • mqttUserName

        组成结构:deviceName+"&"+productKey

        示例:device1&al123456789

      • mqttPassword

        计算方法:sign_hmac(productSecret,content)

        其中,content的值是提交给服务器的必需参数和值(deviceName、productKey、random)按照字母顺序排序、拼接(无拼接符号)的字符串。然后,将content的值通过mqttClientId中的signMethod指定的算法,使用产品的ProductSecret进行签名计算。

        示例:hmac_sha1(h1nQFYPZS0mW****, deviceNamedevice1productKeyal123456789random123)

  2. 物联网平台返回CONNECT ACK。
    • 返回0,表示设备动态注册成功。
    • 返回其他值,表示设备动态注册失败。请根据返回的错误码,确定错误原因。

    设备发送连接请求后,物联网平台返回的结果状态码和说明如下表。

    结果码消息说明
    0CONNECTION_ACCEPTED动态注册成功。
    2IDENTIFIER_REJECTED参数错误。原因可能是:
    • 必填参数缺失或格式错误。
    • 您使用了TCP直连注册。动态注册只能使用TLS通道。
    3SERVER_UNAVAILABLE云端错误。请稍后再试。
    4BAD_USERNAME_OR_PASSWORD动态注册失败,鉴权未通过。

    请检查传入的mqttUserName和mqttPassword取值是否正确。

  3. 建立连接后,物联网平台通过推送证书的Topic,根据CONNECT报文中的authType,返回不同的认证参数。

    说明 设备无需订阅推送证书的Topic。

    • 一型一密预注册认证方式:Topic为/ext/register,authType取值为register,返回DeviceSecret。

      物联网平台推送的消息Payload格式如下:

      {"productKey" : "***","deviceName" : "***","deviceSecret" : "***"
      }

    • 一型一密免预注册认证方式:Topic为/ext/regnwl,authType取值为regnwl,返回ClientID、DeviceToken。

      物联网平台推送的消息Payload格式如下:

      {"productKey" : "***","deviceName" : "***","clientId" : "***","deviceToken" : "***"
      }

  4. 设备收到并保存DeviceSecret,或ClientID和DeviceToken的组合,断开当前MQTT连接。

    设备可以通过发送DISCONNECT报文或直接断开TCP连接,断开当前连接。

    如果设备未断开此连接,15秒之后,物联网平台会主动断开连接。

    如果您使用Eclipse Paho MQTT客户端,需设置MqttConnectOptions.setAutomaticReconnect(false)关闭自动重连。否则,注册成功且TCP断连后,重连逻辑会发起新的动态注册请求。

  5. 设备使用DeviceSecret,或使用ClientID和DeviceToken的组合,再次发起MQTT连接请求,建立设备与物联网平台的连接,进行消息通信。具体操作,请参见MQTT-TCP连接通信。

操作样例

直连设备的动态注册示例,请参见一型一密动态注册(MQTT通道)。

 


推荐阅读
  • 本文详细解析了微信服务端示例类的功能与应用。其中,`ClientResponseHandler` 类主要用于处理微信支付所需的响应数据,而 `TenpayHttpClient` 则是对 HTTP 请求(包括 GET 和 POST 方法)进行了封装,以便在内部调用时更加便捷和高效。这些工具类在实际开发中起到了关键作用,开发者无需深入了解其底层实现细节,即可轻松集成微信支付功能。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 利用 Python Socket 实现 ICMP 协议下的网络通信
    在计算机网络课程的2.1实验中,学生需要通过Python Socket编程实现一种基于ICMP协议的网络通信功能。与操作系统自带的Ping命令类似,该实验要求学生开发一个简化的、非标准的ICMP通信程序,以加深对ICMP协议及其在网络通信中的应用的理解。通过这一实验,学生将掌握如何使用Python Socket库来构建和解析ICMP数据包,并实现基本的网络探测功能。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 本文详细探讨了在ASP.NET环境中通过加密数据库连接字符串来提升数据安全性的方法。加密技术不仅能够有效防止敏感信息泄露,还能增强应用程序的整体安全性。文中介绍了多种加密手段及其实施步骤,帮助开发者在日常开发过程中更好地保护数据库连接信息,确保数据传输的安全可靠。 ... [详细]
author-avatar
会说话的鱼911
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有