如何使用 NB-Iot + Arduino 通过MQTT协议上传数据至阿里云平台

如何使用 NB-Iot + Arduino 通过MQTT协议上传数据至阿里云平台,第1张

有很多通信模块只有TCP功能,没有MQTT功能,比如WIFI,W5500等模块,还有一些NBIOT模块,但是又想连接阿里云物联网平台,官方提供了 *** 作系统,需要自己移植,很麻烦,比较难看得懂。就在想有没有一些简单一定的方法。
心想MQTT是基于TCP的,能否使用TCP转MQTT?因此就想使用TCP协议然后转MQTT协议连接阿里云物联网平台,经过试验证明是可以的。
首先我们先分析一下如何登陆接入Onenet平台。
先从它数据格式开始分析。首先我们要从后台取出三个信息,我们以这个为例。
我们把产品ID,设备名称,设备秘钥,简称三要素 (具体是什么看你自己的设备)
其实阿里云物联网平台的MQTT协议用的就是标准的,不过它加入了自己的认证方式。
MQTT协议需要上传四个参数,报活时间,clientID,用户名,密码。
那么阿里云的就在clientID,用户名,密码做了手脚。
clientID比较长,按照一定的格式
用户名:设备名和秘钥组成
密码:使用了加密串进行了加密,有sha1或者MD5加密方式
下面我们来介绍一下
MQTT接入都是发十六进制的数据。
么我们发送的时候就是这样子的一串数据
0x74 0x00 0x04 0x4d 0x51 0x54 0x54 0x04 0xC0 0078 0033 0x61 0x62 0x63 0x7c 0x73 0x65 0x63 0x75 0x72 0x65 0x6d 0x6f 0x64 0x65 0x3d 0x33 0x2c 0x73 0x69 0x67
0x6e 0x6d 0x65 0x74 0x68 0x6f 0x64 0x3d 0x68 0x6d 0x61 0x63 0x73 0x68 0x61 0x31 0x2c 0x74 0x69 0x6d 0x65 0x73 0x74 0x61 0x6d 0x70 0x3d 0x31 0x32 0x30 0x7c 0009
0x35 0x36 0x37 0x38 0x26 0x31 0x32 0x33 0x34 0028 0x32 0x32 0x32 0x37 0x35 0x30 0x44 0x45 0x44 0x46 0x45 0x34 0x46 0x37 0x37 0x34 0x30 0x30 0x32 0x45 0x45 0x38 0x37 0x45 0x45 0x44 0x32 0x39 0x43 0x46 0x44 0x30 0x36 0x33 0x38 0x43 0x35 0x46 0x36 0x36
十六进制解释
数据长度:0x74
协议数据长度 0x00 0x04
协议类型: 0x4d 0x51 0x54 0x54
协议数据: 0x04 0xC0
keepAlive数据:0078
ClientID长度:0033
ClientID: 0x61 0x62 0x63 0x7c 0x73 0x65 0x63 0x75 0x72 0x65 0x6d 0x6f 0x64 0x65 0x3d 0x33 0x2c 0x73 0x69 0x67 0x6e 0x6d 0x65 0x74 0x68 0x6f 0x64 0x3d 0x68 0x6d 0x61 0x63 0x73 0x68 0x61 0x31 0x2c 0x74 0x69 0x6d 0x65 0x73 0x74 0x61 0x6d 0x70 0x3d 0x31 0x32 0x30 0x7c
用户名:0009
用户名: 0x35 0x36 0x37 0x38 0x26 0x31 0x32 0x33 0x34
密码长度:0028
密码: 0x32 0x32 0x32 0x37 0x35 0x30 0x44 0x45 0x44 0x46 0x45 0x34 0x46 0x37 0x37 0x34 0x30 0x30 0x32 0x45 0x45 0x38 0x37 0x45 0x45 0x44 0x32 0x39 0x43 0x46 0x44 0x30 0x36 0x33 0x38 0x43 0x35 0x46 0x36 0x36复制代码上面的就是连接服务器的连接包
下面呢,我们来做个发布包(上传数据到服务器)
0x30 0x1D 0009 2f7379732f706f7374 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d
十六进制数据解释
数据头:0x30
数据长度:0x1D
TopicName数据长度:0009
TopicName数据内容:2f7379732f706f7374
主体json数据: 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d复制代码以上就是连接阿里云的数据包格式及发布数据的格式,由于时间问题没有做订阅的数据包分析,下一次更新订阅的内容。

问题1:工业物联网是什么?

简单来说,就是物联网在工业控制上的具体应用。

问题2:SSL/TLS是什么?

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种 安全协议 。TLS与SSL在传输层对网络连接进行加密。大部分互联网登录都是用的SSL/TLS,可以去网易邮箱>

这里我们使用了一个库: PubSubClient

创建产品

创建新设备

(1) 产品ID, 用户ID,和登录key

(2) 设备名称, ID和 设备key

OneNet MQTTS用携带token的方式进行鉴权

访问者(可以为应用或者设备)固化访问密钥于软件中,在需要进行服务访问时,通过密钥计算临时token,通过临时token进行服务访问认证

访问者首先通过访问管理者获取临时访问token,访问管理者可根据需要自定义该token的访问有效期(即过期时间),访问者获取该token后方才能访问OneNET

访问管理者直接将密钥授权给访问者(例如,直接为设备烧写key),访问者通过密钥生成token进行访问

计算方法: >

  MQTT 协议 是基于发布/订阅模式的物联网通信协议,凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山。
  常用于 IOT 物联网和一些需要服务端主动通知客户端的场景。

1 导入依赖

2 创建 MqttHelper 辅助类,设置回调监听

3 连接 MQTT

  连接成功或失败,以及中途的连接掉线,会触发 OnMqttStatusChangeListener 回调

4 MQTT 连接状态监听

5 MQTT 收发消息监听

  onSubMessage 订阅的消息回调,因为存在订阅多个 topic 的情况,所以回调能知道是来自哪个 Topic 的消息;
  onPubMessage 发布的消息回调,用于确认发布的消息是否发送成功。

6 MQTT 订阅 Topic

  需要在 MQTT 连接成功后才能订阅 topic,否则订阅 Topic 不成功,收不到对应消息

7 MQTT 取消订阅 Topic

8 MQTT 发布消息

9 MQTT 断开连接

10 通知设置
  由于 MQTT 启动了一个 Service,而 Android 80 以上对于后台 Service 限制时长 5 秒;所以将 MqttService 绑定到 Notification 上成为了一个前台通知;通知的标题和内容显示可以在 stringsxml 中设置,对应属性如下:

  Android 80 及以上开启前台服务绑定到通知,80 以下默认不启用,可将 mqtt_foreground_notification_low_26 设为 true,将 80 以下设备也开启前台通知服务

  创建 MQTT 实例时需要传送参数 MqttOptions,下面将介绍下部分参数;

1 Topic
  MQTT 是一种发布/订阅的消息协议, 通过设定的主题 Topic,
发布者向 Topic 发送的 payload 负载消息会经过服务器, 转发到所有订阅
该 Topic 的订阅者
   通配符 : 假想移动端消息推送场景,有的系统消息是全体用户接收,有的消息是 Android 或 iOS 设备接收, 又或者是某些消息具体推送到用户,当然, 对应的多种类型消息可以通过多订阅几个对应的 Topic 解决,也可以使用通配符;
  通配符有两个, " + " 和 " # ", 与正斜杠 " / " 组合使用;加号只能表示一级Topic, 井号可以表示任意层级 Topic; 例如: 订阅 Topic为 " System/+ ", 发布者发布的 Topic 可以是 System、System/Android、System/iOS; 但是不能是 System/iOS/123, 而订阅的 Topic 如果是" System/# " 则可以收到;
   注意,只有订阅的 Topic 才可以使用 通配符, 发布和遗嘱的 Topic 不能包含通配符

2 ClientID
  发布者和订阅者都是属于客户端, 客户端与服务端建立连接之后,发送的第一个报文消息必须是 Connect 消息,而 Connect 的消息载荷中必须包含 clientID 客户端唯一标识;
  如果两个客户端的 clientID 一样, 则服务端记录第一个客户端连接之后再收到第二个客户端连接请求,则会向一个客户端发送 Disconnect 报文断开连接, 并连接第二个客户端, 而如果此时设置了自动重连, 第一个客户端再次连接,服务端又断开与第二个的连接, 连上第一个客户端, 如此将导致两个客户端不断的被挤掉重连
  注意: clientID 使用的字符最好是 大小写字母和数字, 长度最好限制在[1, 23] 之间;

3 遗嘱消息
  可选参数, 客户端没有主动向服务端发起 disconnect 断开连接消息,然而服务端检测到和客户端之间的连接已断开, 此时服务端将该客户端设置的遗嘱消息发送出去
  应用场景: 客户端因网络等情况掉线之后, 可以及时通知到所有订阅该遗嘱 Topic 的客户端;
  遗嘱 Topic 中不能存在通配符

4 Session
  客户端和服务端之间建立的会话状态, 一般用于消息保存, 如果设置清除 Session,则每次客户端和服务端建立连接会创建一个新的会话,之前连接中的消息不能恢复,
  而设置不清除会话, 对应发布者发送的 qos 为 1和2 的消息,还未被订阅者接收确认,则需要保存在会话中, 以便订阅者下次连接可以恢复这些消息;
  注意: Session 存储的消息是保存在内容中的, 所以如果不是重要的消息,最好是设置清除 Session, 或者设置 qos = 0;

5 心跳包
  标识客户端传输一次控制报文到下一次传输之间允许的空闲时间;在这段时间内,如果客户端没有其他任何报文发送,必须发送一个 PINGREQ 报文到服务器,而如果服务端在 15 倍心跳时间内没有收到客户端消息,则会主动断开客户端的连接,发送其遗嘱消息给所有订阅者。而服务端收到 PINGREQ 报文之后,立即返回 PINGRESP 报文给客户端
  心跳时间单位为秒,占用2个字节,最大 2^16 - 1 = 65535秒(18小时12分钟15秒),设置为 0 表示不使用心跳机制; 心跳时间一般设置为几分钟或几十秒即可,时间短点可以更快的发出遗嘱消息通知掉线,但是时间短会增加消息频率,影响服务端并发; 微信长连接为 300 秒,而三大运营商貌似也有个连接时间最小的为 5 分钟。

6 qos
  服务质量等级 qos 对应两部分,一是客户端到服务端发送的消息, 一是服务端到客户端订阅的消息; 从发布者到订阅者实际 qos 为两段路中 qos 最小的。
  qos 可选值 0(最多交付一次)、1(最少交付一次)、2(正好交付一次);
   qos = 0 :接收方不发送响应,发送方不进行重试;发送方只管发一次,不管是否发成功,也不管接收方是否成功接收,适用于不重要的数据传输;
   qos = 1 :确保消息至少有一次到达接收方,发送方向接收方发送消息,需要等待接收方返回应答消息,如果发送方在一定时间之内没有收到应答,发送方继续下一次消息发送,直到收到应答消息,删除本地消息缓存,不再发送;所以接收方可能收到1-n次消息;适用于需要收到所有消息,客户端可以处理重复消息。
   qos = 2 :确保消息只一次到达接收方,发送方和接收方之间消息处理流程最复杂;
   Mqtt Qos 深度解读 MQTT协议QoS2 准确一次送达的实现

7 payload 负载消息
  字节流类型, 是 MQTT 通信传输的真实数据

8 保留消息
  发布消息时设置, 对应参数 retain, 服务端将保留对应 Topic 最新的一条消息记录; 保留消息的作用是每次客户端连接上线都会收到其 Topic 的最后一条保留消息, 所以可能存在网络不稳定,频繁掉线重连,每次重连重复收到保留消息;
   可以向对应的 Topic 发送一条 空消息,用于清除保留消息。

MQTT 服务搭建 Apache Apollo 服务器 搭建 MQTT 服务
Github 仓库
mqtt 协议

物联网主要功能是将用户端的所有需要的信息互通互联,实现全方位的远程识别、读取和 *** 控、互动。
应用层位于物联网三层结构中的最顶层,其功能为“处理”,即通过云计算平台进行信息处理。应用层与最低端的感知层一起,是物联网的显著特征和核心所在,应用层可以对感知层采集数据进行计算、处理和知识挖掘,从而实现对物理世界的实时控制、精确管理和科学决策。
从结构上划分,物联网应用层包括以下三个部分:
1. 物联网中间件:物联网中间件是一种独立的系统软件或服务程序,中间件将各种可以公用的能力进行统一封装,提供给物联网应用使用。
2. 物联网应用:物联网应用就是用户直接使用的各种应用,如智能 *** 控、安防、电力抄表、远程医疗、智能农业等等。
3. 云计算:云计算可以助力物联网海量数据的存储和分析。依据云计算的服务类型可以将云分为:基础架构即服务(IaaS)、平台即服务(PaaS)、服务和软件即服务(SaaS)
从物联网三层结构的发展来看,网络层已经非常成熟,感知层的发展也非常迅速,而应用层不管是从受到的重视程度还是实现的技术成果上,以前都落后于其他两个层面。但因为应用层可以为用户提供具体服务,是与我们最紧密相关的,因此应用层的未来发展潜力很大。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/13488691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-17
下一篇 2023-08-17

发表评论

登录后才能评论

评论列表(0条)

保存