查看: 2112|回复: 7

[入门] 【IOT专区】基于NB-IOT的MQTT服务器简单通信实验

[复制链接]
本帖最后由 Chocho2017 于 2018-4-16 16:05 编辑

    今天我们用一个SIM7000C Arduino NB-IoT/LTE/GPRS 扩展板和MQTT服务器进行通信。这里只是实现的简单的通信,你可以添加更多的功能进去。
FrzuhKkJn-xUaItp3m6StsTOxrGG.JPG


材料准备:
SIM7000C Arduino NB-IOT/LTE/GPRS 扩展板     ×1
Arduino UNO主控板   ×1
7~12V电源    ×1

库文件下载:
       DFRobot_SIM
       DFRobot_SIM7000

       首先我们来简要说说MQTT协议。MQTT协议是IBM开发的基于TCP/IP的即时通信协议,可以连接大量的远程传感器和控制设备。
MQTT协议中有三种身份:发布者(Publish)、代理(Broker)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,代理是服务器。这里我们的客户端作为消息发布者和订阅者。客户端与服务器建立连接后,发布其他客户端可能会订阅的信息,服务器接收并转发来自客户端发布的信息,当客户端Subscribe主题(Topic)后,即可订阅服务器的信息。
      由于MQTT只是一个协议,不能直接用,需要服务器来运行。这里我们用到已经搭建好的服务器。


1、打开DFRobot的MQTT服务器iot.dfrobot.com.cn
图1.png



2、点击右上角的注册/登录按钮,进行注册和登录。
图2.png


3、点击如下图红色方框中的眼睛即可查看服务器的用户名和密码。
图3.png


4、点击添加一个新设备,这里你可以添加多个设备。
图4.png


5、点击MQTT服务器上的查看详情
图5.png


6、按照下图连接硬件
图6.jpg


7、按照MQTT服务器上的内容修改下面程序中的用户、密码和topic
[AppleScript] 纯文本查看 复制代码
#include <Wire.h>
#include <DFRobot_SIM7000.h>

#define serverIP        "iot.dfrobot.com.cn"
#define IOT_CLIENT      "test"
#define IOT_USERNAME   "Sy-L52b3vM"
#define IOT_KEY         "BJfL5hWhwf"
#define IOT_TOPIC       "B1vc7qtoz"
#define PIN_TX           7
#define PIN_RX           8

SoftwareSerial           mySerial(PIN_RX,PIN_TX);
DFRobot_SIM7000          sim7000;

void setup()
{
    Serial.begin(115200);
    sim7000.begin(mySerial);
    
    sim7000.turnOFF();
    if(sim7000.turnON())  //Turn on SIM7000   
    {
        Serial.println("Turn on SIM7000 succeed");
    }else{
        Serial.println("Turn on SIM7000 failed");
                while(1);    
    }

    if(sim7000.setBaudRate(19200))  //set baud rate from 115200 to 19200
    {
        Serial.println("Set SIM7000 baud rate:19200");
    }else{
        Serial.println("Set SIM7000 baud rate failed");
                while(1);
    }

    if(sim7000.checkSIMStatus())  //check SIM card
    {
        Serial.println("SIM card ready");
    }else{
        Serial.println("SIM card failed");
                while(1);
    }

    if(sim7000.setNet(NB))  //Set net mod NB-IOT
    {
        Serial.println("Set NB-TOT mode");
    }else{
        Serial.println("failed to set mode"); 
                while(1);
    }

    Serial.print("current signalStrength: ");
    Serial.println(sim7000.checkSignalQuality()); //Check signal quality form 0 to 30

    if(sim7000.attacthService())  //open the connection
    {
        Serial.println("Attach service succeed");
    }else{
        Serial.println("failed to attach service"); 
        while(1);
    }

      if(sim7000.connect(TCP, serverIP, 1883))  //Connect to server
    {
        Serial.println("Connect succeed");
    }else{
        Serial.println("Connect failed");
                while(1);
    }

    if(sim7000.MQTTconnect(IOT_CLIENT, IOT_USERNAME, IOT_KEY))   //Connect to request
    {
        Serial.println("Connected");
    }else{
        Serial.println("Failed to connect");
                while(1);
    }
}

void loop()
{
    char sendData[30];
    char recvBuffer[50];
    
     
        Serial.println("input data:");
        readSerial(sendData);
    Serial.println(sendData);
    Serial.println("...................");
        
    if(sim7000.MQTTsend(IOT_TOPIC, sendData))
    {
        Serial.println("Send OK");
     }else
     {  
        Serial.println("Failed to send"); while(1);
     }
        if(sim7000.MQTTsubscribe(IOT_TOPIC))
        {
            int i = 0;
            Serial.println("Subscribe OK! Recive data");
            while(i<3)
            {
                char recvBuffer[30] = {0};
                if(sim7000.MQTTrecv(IOT_TOPIC, recvBuffer, 30)) //Recive data from topic
                {
                    Serial.print("Recive data:");
                    Serial.println(recvBuffer);
                    i++;
                 }
             }
             sim7000.MQTTunsubscribe(IOT_TOPIC);
             if(sim7000.recv(recvBuffer, 10, 100))
             {
                Serial.println(recvBuffer);
              }
         }
    delay(5000); 
}

int readSerial(char result[])
{
    int i = 0;
     while(1){
        while(Serial.available() > 0)
        {
            char inChar = Serial.read();
            if(inChar == '\n'){
                result[i] = '\0';
                Serial.flush();
                return 0;
            }
            if(inChar != '\r'){
                result[i] = inChar;
                i++;
            }
        }
    }  
}



8、打开arduino IDE,选择开发板的型号和串口,将修改后的代码下载到开发板中。打开串口监视器,将波特率设为115200。在发送框中输入“hello”,点击发送。
图7.png


在MQTT服务器上可以看到终端设备发送的“hello”。在发送新消息的消息发送框中输入“this message”,点击发送。
图8.png


至此,基于NB-IOT的MQTT服务器简单通信实验完成。

hnyzcj  超级版主

发表于 2018-4-17 08:15:02

楼主又给我们开辟了新航道
回复 支持 反对

使用道具 举报

Chocho2017  版主
 楼主|

发表于 2018-4-17 09:14:36

hnyzcj 发表于 2018-4-17 08:15
楼主又给我们开辟了新航道

哈哈,谢谢。
回复 支持 反对

使用道具 举报

ricky  NPC

发表于 2018-4-17 10:50:29

这个好。
回复 支持 反对

使用道具 举报

Chocho2017  版主
 楼主|

发表于 2018-4-17 11:24:49


谢谢。
回复 支持 反对

使用道具 举报

gray6666  中级技匠

发表于 2018-4-17 15:21:23

好像有个板子试试。。。。。。。。。
回复 支持 反对

使用道具 举报

Chocho2017  版主
 楼主|

发表于 2018-4-17 15:26:53

gray6666 发表于 2018-4-17 15:21
好像有个板子试试。。。。。。。。。

可以呀,
回复 支持 反对

使用道具 举报

微草  学徒

发表于 2018-4-20 13:42:52

截图201804201342488134.png
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail