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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用 NB-Iot + Arduino 通过MQTT协议上传数据至阿里云平台相关的知识,希望对你有一定的参考价值。

参考技术A 有很多通信模块只有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复制代码以上就是连接阿里云的数据包格式及发布数据的格式,由于时间问题没有做订阅的数据包分析,下一次更新订阅的内容。

arduino连接NB-IOT模块M5310-A教程,app实时控制

第一 、先上效果图

第二、原理讲解

原理简述:利用发布订阅模式。第一步,新建主题,第二步,arduino通过nb-iot模块订阅这个主题。第三步、通过app往这个主题发消息。由于单片机订阅了这个主题,所以可以实时收到发往这个主题的消息。从而达到通过app或者小程序控制arduino单片机的目的。

关于发布订阅:

订阅(订阅):订阅给定的一个主题。
发布(发布)将信息发送到指定的主题。

只有订阅该主题的设备才可以收到发往该主题的消息。

通俗的来讲:就是像博客订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果博主发表了文章,那么100个人就会同时收到通知邮件,订阅/发布模式就是这样的原理。

如果还不理解的话再通俗讲一下,就像生活中听收音机,要想听收音机,肯定就是调频啦,只有在正确的频道上面,我们才能听得到好听的节目,所以说订阅首先要订阅一个频道/主题,只有订阅了该主题,我们才能收到发往该频道/主题的消息。

在本例程中,arduino借助nb-iot网络订阅主题,app或者小程序发布消息,arduino会实时收到消息,就可以实时控制arduino了。

第三、下载程序到arduino

开发环境:arduino IDE
M5310不需要编程。

arduino 示例程序下载:点击下载

程序说明,波特率9600

具体连接:
M5310 ----------arduino
5v-------------5V
GND-----------GND
TX-------------pin13
RX----------------pin12

用arduino打开程序,需要修改用户私钥等信息

/***********************需要修改的地方************************/
String uid ="4d9ec352e0376f2110a0c601a2857225";    //用户私钥,巴法云控制台获取
String myTopic ="light002";                      //用户主题,巴法云控制台创建
const int LED_Pin = 2;       //需要控制的LED引脚值
//***********************************************************/

巴法创客云控制台 新建一个主题,主题名字随意,例如light002,本实例用用light002,使用示例代码时应修改为自己的主题名字,字母或数字或字母加数字组合。UID为用户私钥,在 巴法创客云控制台 注册登陆后可获得。
登陆完成后,可在控制台看到自己的私钥UID,如图所示:

在这里插入图片描述

创建主题,在控制台,可创建主题。

  • 第一输入主题,字母或数字或字母+数字组合。
  • 点击创建主题。

在这里插入图片描述

重要代码讲解:

/*
 * 检查收到的信息 
 * 字符串匹配,匹配到开灯指令,进行开灯,匹配到关灯指令,进行关灯
 * 匹配到错误信息,进行重启启动(一般为网络情况的故障)
 */
void check_msg(String myMsg){
  if((myMsg.indexOf("&msg=on") >= 0)) {   //如果检测到开灯指令
    turnOnLed();  //执行开灯函数
  }else if((myMsg.indexOf("&msg=off") >= 0)) { //如果检测到关灯指令
    turnOffLed(); //执行关灯函数
  }else if(myMsg.indexOf("SOCLI") >= 0){  //检测到断开服务器连接,重新连接
       InitNBIOT();//创建TCP连接,并且订阅巴法云
    }
}

对收到的消息,进行字符串匹配,收到带on的消息,把pin2引脚置高,收到带off的消息,把Pin2口置低电平。

具体接口可参考:巴法云官方文档

如果所在区域有NB网络的话,nbiot会自动连接服务器,可在巴法创客云控制台 刷新网页,查看订阅设备是否在线。如果在线的话,可以在控制台推送on或许off消息,可以在串口调试助手查看单片机是否收到指令。波特率9600。

当检测到消息为on 时,执行开灯,当检测到消息为off 时,执行关灯。开发者可在控制台推送on或者off,然后检测arduino是否收到,如果收到,说明正常可进行下一步app编写。

说明:消息不单单局限于on或off,开发者可以张大脑洞随意定义的,你推送什么消息,在单片机处做什么消息检测就可以了。

第四 app inventor 开发

原理:同样通过TCP 长连接,连接到服务器,当按下按钮,就向服务器该主题推送个消息,arduino就可以收到该消息了。

简介:Google App Inventor是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆叠法来完成您的Android程式。 而且这款编程软件不一定非要是专业的研发人员,甚至根本不需要掌握任何的程序编制知识。因为这款软件已经事先将软件的代码全部编写完毕,用户只需要根据自己的需求向其中添加服务选项即可。也就是我们所要做的只是写简单的代码拼装程序。

在appInventor 点击跳转国内站创建账号,并登陆。

本操作只提供一个app的demo,界面过于丑陋,大家可自由发挥更改界面。

demo 下载点击下载

顶部导航栏,依次点击(项目-->导入项目aia),选择上一步骤下载的aia文件导入即可。点击导入的项目,即可看到控制面板,面板主要分为在组建设计和逻辑设计,用户可在右上角进行模式切换。

app

(组建设计)面板可以向屏幕添加组建以进行二次开发。(逻辑面板)则进行相关逻辑编写。

app
导入aia文件后,如果只是简单使用,只需要修改两个地方,一个是主题名字,一个是UID,均需开发者置换成自己的topic(主题名字)和UID(用户私钥),均可在创客云控制台获取点击跳转

此处的主题topic应该和arduino程序里面设定的主题修改为一样,不然会收不到消息。UID修改为自己的私钥。

在这里插入图片描述

app

控制逻辑

当按钮\'打开\'被点击,发送on,arduino即可收到on消息

在这里插入图片描述

具体发送的消息,开发者可自定义,例程中只是发送简单的字符串,开发者也可发送json之类的,

不过在arduino端要对json消息体进行解析。更多指令格式说明:接入文档

如果想控制家里的灯具,加个继电器即可,通过引脚输出高低电平控制继电器的开和关,从而达到控制220v交流电的效果。继电器需要用3.3V继电器。

第五、小程序开发

教程:https://www.cnblogs.com/bemfa/p/13209704.html

以上是关于如何使用 NB-Iot + Arduino 通过MQTT协议上传数据至阿里云平台的主要内容,如果未能解决你的问题,请参考以下文章

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

NB-IOT物联网4G模组--M5310-A/取代GSM/GPRS无线数传

如何通过 arduino 代码关闭或重置?

如何使用arduino通过说出歌曲的名字来播放音乐?

NB-IOT与物联网

Arduino如何同时使用多个串口