nbiot mqtt test

Dependencies:   mbed itoa DFRobot_SIM7000-master millis

Committer:
s107062534
Date:
Tue May 21 10:52:54 2019 +0000
Revision:
2:62b58f79338f
Parent:
1:450535d62644
downlink

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nobelkuo 0:8864eb729b32 1 #include "mbed.h"
s107062534 1:450535d62644 2 #include <iostream>
s107062534 1:450535d62644 3 #include <string>
s107062534 1:450535d62644 4 #include "DFRobot_SIM7000.h"
nobelkuo 0:8864eb729b32 5
s107062534 1:450535d62644 6 #define server_ip "140.114.78.140" //140.114.89.66 //140.114.78.140
s107062534 1:450535d62644 7 #define PORT 1883 //TCP: 3307 //MQTT: 1883
s107062534 1:450535d62644 8 #define CLIENT_ID ""
s107062534 1:450535d62644 9 #define USERNAME "delta"
s107062534 1:450535d62644 10 #define PASSWORD "delta"
s107062534 1:450535d62644 11 #define SUBSCRIBE_TOPIC_PREFIX "nbiot/"
s107062534 1:450535d62644 12 #define PUBLISH_TOPIC "nbiot/gw"
s107062534 1:450535d62644 13
s107062534 1:450535d62644 14 DFRobot_SIM7000 sim7000;
s107062534 1:450535d62644 15 DigitalOut myled(LED1);
s107062534 1:450535d62644 16
s107062534 2:62b58f79338f 17 Serial pc(USBTX, USBRX, 57600);
s107062534 1:450535d62644 18 Serial nbiot_shield(PA_9, PA_10, 19200); //(tx,rx,baud)
s107062534 1:450535d62644 19
s107062534 1:450535d62644 20 char IMSI[20];
s107062534 1:450535d62644 21 string str_IMSI;
s107062534 1:450535d62644 22 char *cTopic;
nobelkuo 0:8864eb729b32 23
s107062534 1:450535d62644 24 void PC_callback() { //useless now
nobelkuo 0:8864eb729b32 25 // Note: you need to actually read from the serial to clear the RX interrupt
s107062534 1:450535d62644 26 // nbiot_shield.putc(pc.getc());
s107062534 1:450535d62644 27 char cmd[20];
s107062534 1:450535d62644 28 pc.gets(cmd, 20);
s107062534 1:450535d62644 29 pc.printf("Command from PC: %s", cmd);
s107062534 1:450535d62644 30 nbiot_shield.printf(cmd);
nobelkuo 0:8864eb729b32 31 }
s107062534 2:62b58f79338f 32
s107062534 1:450535d62644 33 void NBIOT_callback() { //useless now
s107062534 1:450535d62644 34 //pc.printf("NBIOT_callback\r\n");
s107062534 2:62b58f79338f 35 pc.putc(nbiot_shield.getc());
s107062534 1:450535d62644 36
s107062534 2:62b58f79338f 37 //char msg[20];
s107062534 2:62b58f79338f 38 //nbiot_shield.gets(msg, 20);
s107062534 2:62b58f79338f 39 //pc.printf("Message from SIM: %s", msg);
nobelkuo 0:8864eb729b32 40 }
s107062534 1:450535d62644 41
s107062534 1:450535d62644 42
s107062534 1:450535d62644 43 void connect_to_server(){
s107062534 2:62b58f79338f 44 pc.printf("Connecting to the server %s......\r\n", server_ip);
s107062534 1:450535d62644 45 while(1){
s107062534 1:450535d62644 46 if(sim7000.openNetwork(TCP,server_ip,PORT)){ //Start up TCP connection //TCP: 3307 //MQTT: 1883
s107062534 2:62b58f79338f 47 pc.printf("Connect OK\r\n");
s107062534 1:450535d62644 48 break;
s107062534 1:450535d62644 49 }else{
s107062534 2:62b58f79338f 50 pc.printf("Fail to connect\r\n");
s107062534 1:450535d62644 51 wait(10);
s107062534 1:450535d62644 52 }
s107062534 1:450535d62644 53 }
s107062534 1:450535d62644 54
s107062534 2:62b58f79338f 55 pc.printf("Connecting to the MQTT......\r\n");
s107062534 1:450535d62644 56 if(sim7000.mqttConnect(IMSI,USERNAME,PASSWORD)){ //MQTT connect request
s107062534 2:62b58f79338f 57 pc.printf("OK\r\n");
s107062534 1:450535d62644 58 }else{
s107062534 2:62b58f79338f 59 pc.printf("Failed\r\n");
s107062534 1:450535d62644 60 //return;
s107062534 1:450535d62644 61 }
s107062534 1:450535d62644 62
s107062534 1:450535d62644 63 string topic = SUBSCRIBE_TOPIC_PREFIX + str_IMSI.substr(5); //first 5 number are fixed
s107062534 1:450535d62644 64
s107062534 1:450535d62644 65 cTopic = new char[topic.length() + 1];
s107062534 1:450535d62644 66 strcpy(cTopic, topic.c_str());
s107062534 2:62b58f79338f 67 pc.printf("Subscribe to the MQTT Topic %s......\r\n", cTopic);
s107062534 1:450535d62644 68 if(sim7000.mqttSubscribe(cTopic)){
s107062534 2:62b58f79338f 69 pc.printf("OK\r\n");
s107062534 1:450535d62644 70 }else{
s107062534 2:62b58f79338f 71 pc.printf("Failed\r\n");
s107062534 1:450535d62644 72 //return;
s107062534 1:450535d62644 73 }
s107062534 1:450535d62644 74
s107062534 1:450535d62644 75 }
s107062534 1:450535d62644 76
nobelkuo 0:8864eb729b32 77
nobelkuo 0:8864eb729b32 78 int main() {
s107062534 1:450535d62644 79 millisStart();
s107062534 1:450535d62644 80
s107062534 1:450535d62644 81 sim7000.begin(nbiot_shield);
s107062534 1:450535d62644 82
s107062534 2:62b58f79338f 83 pc.printf("Turn ON SIM7000......\r\n");
s107062534 1:450535d62644 84 if(sim7000.turnON()){ //Turn ON SIM7000
s107062534 2:62b58f79338f 85 pc.printf("Turn ON !\r\n");
s107062534 1:450535d62644 86 }
s107062534 1:450535d62644 87
s107062534 2:62b58f79338f 88 pc.printf("Set baud rate......\r\n");
s107062534 1:450535d62644 89 while(1){
s107062534 1:450535d62644 90 if(sim7000.setBaudRate(19200)){ //Set SIM7000 baud rate from 115200 to 19200 reduce the baud rate to avoid distortion
s107062534 2:62b58f79338f 91 pc.printf("Set baud rate:19200\r\n");
s107062534 1:450535d62644 92 break;
s107062534 1:450535d62644 93 }else{
s107062534 2:62b58f79338f 94 pc.printf("Faile to set baud rate\r\n");
s107062534 1:450535d62644 95 wait(1);
nobelkuo 0:8864eb729b32 96 }
s107062534 1:450535d62644 97 }
s107062534 1:450535d62644 98
s107062534 2:62b58f79338f 99 pc.printf("Set the APN......\r\n");
s107062534 1:450535d62644 100 while(1){
s107062534 1:450535d62644 101 if (sim7000.check_send_cmd("AT+CSTT=\"internet.iot\"\r\n","OK")){
s107062534 2:62b58f79338f 102 pc.printf("OK\r\n");
s107062534 1:450535d62644 103 break;
s107062534 1:450535d62644 104 }
s107062534 1:450535d62644 105 else{
s107062534 2:62b58f79338f 106 pc.printf("Faile to set the APN\r\n");
s107062534 1:450535d62644 107 wait_ms(1000);
s107062534 1:450535d62644 108 }
s107062534 1:450535d62644 109 }
s107062534 1:450535d62644 110
s107062534 2:62b58f79338f 111 pc.printf("Bring Up Wireless Connection with GPRS......\r\n");
s107062534 1:450535d62644 112 while(1){
s107062534 1:450535d62644 113 if(sim7000.check_send_cmd("AT+CIICR\r\n","OK")){
s107062534 2:62b58f79338f 114 pc.printf("Successfully\r\n");
s107062534 1:450535d62644 115 break;
s107062534 1:450535d62644 116 }else{
s107062534 2:62b58f79338f 117 pc.printf("Faile to bring Up Wireless Connection with GPRS\r\n");
s107062534 1:450535d62644 118 wait_ms(1000);
s107062534 1:450535d62644 119 }
s107062534 1:450535d62644 120 }
s107062534 1:450535d62644 121
s107062534 2:62b58f79338f 122 pc.printf("Get local IP address......\r\n");
s107062534 1:450535d62644 123 char gprsBuffer[32];
s107062534 1:450535d62644 124 while(1){
s107062534 1:450535d62644 125 sim7000.cleanBuffer(gprsBuffer,32);
s107062534 1:450535d62644 126 sim7000.send_cmd("AT+CIFSR\r\n");
s107062534 1:450535d62644 127 sim7000.readBuffer(gprsBuffer, 32, DEFAULT_TIMEOUT);
nobelkuo 0:8864eb729b32 128
s107062534 1:450535d62644 129 if(NULL != strstr(gprsBuffer, "ERROR")){
s107062534 2:62b58f79338f 130 pc.printf("Faile to Get local IP address\r\n");
s107062534 1:450535d62644 131 wait_ms(1000);
s107062534 1:450535d62644 132 }
s107062534 1:450535d62644 133 else{
s107062534 1:450535d62644 134 //strcpy(local_IP, gprsBuffer+strlen("AT+CIFSR\r\n")+1); //implement issue here
s107062534 2:62b58f79338f 135 pc.printf("OK\r\n");
s107062534 1:450535d62644 136 break;
s107062534 1:450535d62644 137 }
s107062534 1:450535d62644 138 }
s107062534 2:62b58f79338f 139
s107062534 2:62b58f79338f 140
s107062534 2:62b58f79338f 141 pc.printf("Get IMSI......\r\n");
s107062534 1:450535d62644 142 while(1){
s107062534 1:450535d62644 143 sim7000.cleanBuffer(gprsBuffer,32);
s107062534 1:450535d62644 144 sim7000.send_cmd("AT+CIMI\r\n");
s107062534 1:450535d62644 145 sim7000.readBuffer(gprsBuffer, 32, DEFAULT_TIMEOUT);
nobelkuo 0:8864eb729b32 146
s107062534 1:450535d62644 147 if(NULL != strstr(gprsBuffer, "ERROR")){
s107062534 2:62b58f79338f 148 pc.printf("Faile to Get IMSI\r\n");
s107062534 1:450535d62644 149 wait_ms(1000);
s107062534 1:450535d62644 150 }
s107062534 1:450535d62644 151 else{
s107062534 1:450535d62644 152 strncpy(IMSI, gprsBuffer+strlen("AT+CIMI\r\n")+1, 15); //implement issue here
s107062534 1:450535d62644 153 //Serial.println(gprsBuffer);
s107062534 2:62b58f79338f 154 pc.printf("%s\r\n", IMSI);
s107062534 1:450535d62644 155 str_IMSI = IMSI;
s107062534 1:450535d62644 156 break;
s107062534 1:450535d62644 157 }
s107062534 1:450535d62644 158 }
s107062534 1:450535d62644 159
s107062534 1:450535d62644 160 connect_to_server();
s107062534 1:450535d62644 161
s107062534 1:450535d62644 162
s107062534 1:450535d62644 163 bool send_flag = true;
s107062534 1:450535d62644 164 int count = 0;
s107062534 1:450535d62644 165 char msg[100];
s107062534 1:450535d62644 166 string str_msg;
s107062534 1:450535d62644 167 unsigned long previousTime = 0;
s107062534 1:450535d62644 168 unsigned long currentTime;
s107062534 1:450535d62644 169 int disconnection_count = 0;
s107062534 1:450535d62644 170 //string str_test = "aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj"; //100bytes
s107062534 1:450535d62644 171
s107062534 1:450535d62644 172 //pc.attach(&PC_callback);
s107062534 1:450535d62644 173 //nbiot_shield.attach(&NBIOT_callback);
s107062534 1:450535d62644 174
s107062534 2:62b58f79338f 175
s107062534 1:450535d62644 176 while(1) {
s107062534 1:450535d62644 177
s107062534 1:450535d62644 178 if(nbiot_shield.readable()){ //check downlink
s107062534 2:62b58f79338f 179 char recv_msg[64];
s107062534 2:62b58f79338f 180 string str_recv_msg;
s107062534 2:62b58f79338f 181 pc.printf("received: ");
s107062534 2:62b58f79338f 182 sim7000.cleanBuffer(recv_msg,64);
s107062534 2:62b58f79338f 183 //wait_ms(100);
s107062534 2:62b58f79338f 184 sim7000.readBuffer(recv_msg, 64, DEFAULT_TIMEOUT);
s107062534 2:62b58f79338f 185
s107062534 2:62b58f79338f 186 pc.printf("%s\r\n", recv_msg);
s107062534 2:62b58f79338f 187
s107062534 2:62b58f79338f 188 str_recv_msg = recv_msg;
s107062534 2:62b58f79338f 189 int i = str_recv_msg.find(cTopic);
s107062534 2:62b58f79338f 190 if (i>=0){
s107062534 2:62b58f79338f 191 str_recv_msg = str_recv_msg.substr(i+strlen(cTopic));
s107062534 2:62b58f79338f 192 }
s107062534 2:62b58f79338f 193 pc.printf("payload: %s\r\n", str_recv_msg);
s107062534 2:62b58f79338f 194
s107062534 1:450535d62644 195 }
s107062534 1:450535d62644 196
s107062534 1:450535d62644 197 currentTime = millis();
s107062534 1:450535d62644 198 if(currentTime - previousTime > 600000 || send_flag == true){
s107062534 1:450535d62644 199 send_flag = false;
s107062534 2:62b58f79338f 200 pc.printf("---------------------------\r\n");
s107062534 1:450535d62644 201 sprintf(msg, "delta%d,%s", count, IMSI);
s107062534 2:62b58f79338f 202 pc.printf("%s\r\n", msg);
s107062534 1:450535d62644 203 str_msg = msg;
s107062534 1:450535d62644 204 if (sim7000.mqttPublish(PUBLISH_TOPIC, str_msg)){
s107062534 2:62b58f79338f 205 pc.printf("Send OK\r\n");
s107062534 1:450535d62644 206 }else{
s107062534 2:62b58f79338f 207 pc.printf("Failed to send\r\n"); //Can do reconnection here
s107062534 1:450535d62644 208 disconnection_count++;
s107062534 1:450535d62644 209 sim7000.closeNetwork();
s107062534 1:450535d62644 210 wait_ms(1000);
s107062534 1:450535d62644 211 connect_to_server();
s107062534 1:450535d62644 212 send_flag = true;
s107062534 1:450535d62644 213 }
s107062534 2:62b58f79338f 214 pc.printf("Disconnection count: %d\r\n", disconnection_count);
s107062534 1:450535d62644 215 previousTime = currentTime;
s107062534 1:450535d62644 216 count++;
s107062534 1:450535d62644 217 }
s107062534 2:62b58f79338f 218 //wait_ms(10);
nobelkuo 0:8864eb729b32 219
nobelkuo 0:8864eb729b32 220 }
s107062534 1:450535d62644 221
nobelkuo 0:8864eb729b32 222 }