美文网首页MQTT入门
建立到MQTT Broker的连接

建立到MQTT Broker的连接

作者: Sun橙子 | 来源:发表于2019-12-12 14:45 被阅读0次
Client链接Broker

1、CONNECT

连接的建立由Client端发起,Client端首先向Broker发送一个CONNECT数据包,每一个数据包都包含

  • 固定头(Fixed header):存在于所有的 MQTT 数据包中,用于表示数据包类型及对应标识,表明数据包大小;
  • 可变头(Variable header):存在于部分类型的 MQTT 数据包中,具体内容由相应类型的数据包决定;
  • 消息体(Payload):存在于部分 MQTT 数据包中,存储消息的具体数据

其中固定头可参考我的另一篇文章 MQTT协议的基础概念 这里我们略过

1.1 可变头(Variable header)

在 CONNECT 数据包可变头中,含有以下信息。

  • 协议名称(Protocol Name):值固定为字符 “MQTT”。
  • 协议版本(Protocol Level):对 MQTT 3.1.1 来说,值为 4。
  • 用户名标识(User Name Flag):消息体中是否有用户名字段,1bit,0 或者 1。
  • 密码标识(Password Flag):消息体中是否有密码字段,1bit,0 或者 1。
  • 遗愿消息 Retain 标识(Will Retain):标识遗愿消息是否是 Retain 消息,1bit,0 或者 1。
  • 遗愿消息 QOS 标识(Will QOS):标识遗愿消息的 QOS,2bit,0、1 或者 2。
  • 遗愿标识(Will Flag):标识是否使用遗愿消息,1bit,0 或者 1。
  • 会话清除标识(Clean Session):标识 Client 是否建立一个持久化的会话,1bit,0 或者 1,当 Clean Session 的标识设为 0 时,代表 Client 希望建立一个持久会话的连接,Broker 将存储该 Client 订阅的主题和未接受的消息,否则 Broker 不会存储这些数据,同时在建立连接时清除这个 Client 之前存在的持久化会话所保存的数据。
  • 连接保活(Keep Alive): 设置一个单位为秒的时间间隔,Client 和 Broker 之间在这个时间间隔之内需要至少有一次消息交互,否则 Client 和 Broker 会认为它们之间的连接已经断开
1.2 消息体(Payload)

CONNECT 数据包的消息体中包含以下数据。

  • 客户端标识符(Client Identifier):Client Identifier 是用来标识 Client 身份的字段,在 MQTT 3.1.1 的版本中,这个字段的长度是 1 到 23 个字节,而且只能包含数字和 26 个字母(包括大小写),Broker 通过这个字段来区分不同的 Client。所以在连接的时候,Client 应该保证它的 Identifier 是唯一的,通常我们可以使用比如 UUID,唯一的设备硬件标识,或者 Android 设备的 DEVICE_ID 等作为 Client Identifier 的取值来源。
  • MQTT 协议中要求 Client 连接时必须带上 Client Identifier,但是也允许 Broker 在实现时 Client Identifier 为空,这时 Broker 会为 Client 分配一个内部唯一的 Identifier。如果你需要使用持久化会话,那就必须自己为 Client 设定一个唯一的 Identifier。
  • 用户名(Username):如果可变头中的用户名标识设为 1,那么消息体中将包含用户名字段,Broker 可以使用用户名和密码来对接入的 Client 进行验证,只允许已授权的 Client 接入。注意不同的 Client 需要使用不同的 Client Identifier,但它们可以使用同样的用户名和密码进行连接。
  • 密码(Password):如果可变头中的密码标识设为 1,那么消息体中将包含密码字段。
  • 遗愿主题(Will Topic):如果可变头中的遗愿标识设为 1,那么消息体中将包含遗愿主题,当 Client 非正常地中断连接的时候,Broker 将向指定的遗愿主题中发布遗愿消息。
  • 遗愿消息(Will Message):如果可变头中的遗愿标识设为 1,那么消息体中将包含遗愿消息,当 Client 非正常地中断连接的时候,Broker 将向指定的遗愿主题中发布由该字段指定的内容。
1.3 代码实现

在这里我们使用 Node.js 的 MQTT 库,请确保已安装 Node.js,并通过 npm install mqtt --save 安装了 MQTT 库。
这里我们使用一个公共的 Broker:mqtt.eclipse.org:1883。
本次建立的是一个持久化的连接,如果需要非持久的连接只需要把clean的参数设为True,新建client_borker.js文件

var mqtt = require('mqtt')
var client = mqtt.connect('mqtt://mqtt.eclipse.org:1883',{
    clientId:"mqtt_sample_id_1",
    clean:false
})

client.on('connect',function(connack){
    console.log(`return code:${connack.returnCode},sessionPresent:${connack.sessionPresent}`)
    client.end()
})

在终端上运行node client_borker.js,输出以下

输出结果
连接成功,因为是“mqtt_sample_id_1”的 Client 第一次建立连接,所以 SessionPresent 为 false。

本次先到这里了,有兴趣的可以尝试打开两个终端分别运行该程序看看会输出什么。

相关文章

网友评论

    本文标题:建立到MQTT Broker的连接

    本文链接:https://www.haomeiwen.com/subject/rhqtnctx.html