Chocho2017 发表于 2018-4-16 16:04:20

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

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


材料准备:
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



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


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


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


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


6、按照下图连接硬件


7、按照MQTT服务器上的内容修改下面程序中的用户、密码和topic
#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;
    char recvBuffer;
   
   
      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 = {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 = '\0';
                Serial.flush();
                return 0;
            }
            if(inChar != '\r'){
                result = inChar;
                i++;
            }
      }
    }
}



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


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


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

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

楼主又给我们开辟了新航道

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

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

哈哈,谢谢。

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

这个好。

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

ricky 发表于 2018-4-17 10:50
这个好。

谢谢。

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

return_o 发表于 2018-7-17 20:40:36

是不是没有外接9v电源 代码就上传不了啊

ningxpsny 发表于 2018-12-23 10:35:44

我一直卡在Fail to Attach service这一步,是怎么回事

gada888 发表于 2018-12-23 13:46:40

这个实用

lcx 发表于 2019-5-17 11:32:53

class DFRobot_SIM7000' has no member named 'setNet   出现这个怎么解决?
页: [1]
查看完整版本: 【IOT专区】基于NB-IOT的MQTT服务器简单通信实验