Peng Jing Xuan / Mbed OS MQTT_PM25_1

Dependencies:   mbed-os-example-wifi-DISCO_IOTBOARD_MQTT MQTT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //MQTT+WIFI
00002 
00003 
00004 #define logMessage printf
00005 #define MQTTCLIENT_QOS2 1
00006 
00007 #include "MQTTNetwork.h"
00008 #include "MQTTmbed.h"
00009 #include "MQTTClient.h"
00010 
00011 int arrivedcount = 0;
00012 //
00013 
00014 
00015 #include "mbed.h"
00016 #include "TCPSocket.h"
00017 
00018 #define WIFI_IDW0XX1    2
00019 
00020 #if (defined(TARGET_DISCO_L475VG_IOT01A) || defined(TARGET_DISCO_F413ZH))
00021 #include "ISM43362Interface.h"
00022 ISM43362Interface wifi(MBED_CONF_APP_WIFI_SPI_MOSI, MBED_CONF_APP_WIFI_SPI_MISO, MBED_CONF_APP_WIFI_SPI_SCLK, MBED_CONF_APP_WIFI_SPI_NSS, MBED_CONF_APP_WIFI_RESET, MBED_CONF_APP_WIFI_DATAREADY, MBED_CONF_APP_WIFI_WAKEUP, false);
00023 
00024 #else // External WiFi modules
00025 
00026 #if MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1
00027 #include "SpwfSAInterface.h"
00028 SpwfSAInterface wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX);
00029 #endif // MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1
00030 
00031 #endif
00032 
00033 
00034 void messageArrived(MQTT::MessageData& md)
00035 {
00036     MQTT::Message &message = md.message;
00037     //logMessage("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
00038     //logMessage("Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
00039     //++arrivedcount;
00040 }
00041 
00042 
00043 const char *sec2str(nsapi_security_t sec)
00044 {
00045     switch (sec) {
00046         case NSAPI_SECURITY_NONE:
00047             return "None";
00048         case NSAPI_SECURITY_WEP:
00049             return "WEP";
00050         case NSAPI_SECURITY_WPA:
00051             return "WPA";
00052         case NSAPI_SECURITY_WPA2:
00053             return "WPA2";
00054         case NSAPI_SECURITY_WPA_WPA2:
00055             return "WPA/WPA2";
00056         case NSAPI_SECURITY_UNKNOWN:
00057         default:
00058             return "Unknown";
00059     }
00060 }
00061 
00062 int scan_demo(WiFiInterface *wifi)
00063 {
00064     WiFiAccessPoint *ap;
00065 
00066     printf("Scan:\n");
00067 
00068     int count = wifi->scan(NULL,0);
00069     printf("%d networks available.\n", count);
00070 
00071     /* Limit number of network arbitrary to 15 */
00072     count = count < 15 ? count : 15;
00073 
00074     ap = new WiFiAccessPoint[count];
00075     count = wifi->scan(ap, count);
00076     for (int i = 0; i < count; i++)
00077     {
00078         printf("Network: %s secured: %s BSSID: %hhX:%hhX:%hhX:%hhx:%hhx:%hhx RSSI: %hhd Ch: %hhd\n", ap[i].get_ssid(),
00079                sec2str(ap[i].get_security()), ap[i].get_bssid()[0], ap[i].get_bssid()[1], ap[i].get_bssid()[2],
00080                ap[i].get_bssid()[3], ap[i].get_bssid()[4], ap[i].get_bssid()[5], ap[i].get_rssi(), ap[i].get_channel());
00081     }
00082 
00083     delete[] ap;
00084     return count;
00085 }
00086 
00087 void http_demo(NetworkInterface *net)
00088 {
00089     TCPSocket socket;
00090     nsapi_error_t response;
00091 
00092     printf("Sending HTTP request to www.arm.com...\n");
00093 
00094     // Open a socket on the network interface, and create a TCP connection to www.arm.com
00095     socket.open(net);
00096     response = socket.connect("www.arm.com", 80);
00097     if(0 != response) {
00098         printf("Error connecting: %d\n", response);
00099         socket.close();
00100         return;
00101     }
00102 
00103     // Send a simple http request
00104     char sbuffer[] = "GET / HTTP/1.1\r\nHost: www.arm.com\r\n\r\n";
00105     nsapi_size_t size = strlen(sbuffer);
00106     response = 0;
00107     while(size)
00108     {
00109         response = socket.send(sbuffer+response, size);
00110         if (response < 0) {
00111             printf("Error sending data: %d\n", response);
00112             socket.close();
00113             return;
00114         } else {
00115             size -= response;
00116             // Check if entire message was sent or not
00117             printf("sent %d [%.*s]\n", response, strstr(sbuffer, "\r\n")-sbuffer, sbuffer);
00118         
00119         }
00120     }
00121 
00122     // Recieve a simple http response and print out the response line
00123     char rbuffer[64];
00124     response = socket.recv(rbuffer, sizeof rbuffer);
00125     if (response < 0) {
00126         printf("Error receiving data: %d\n", response);
00127     } else {
00128         printf("recv %d [%.*s]\n", response, strstr(rbuffer, "\r\n")-rbuffer, rbuffer);
00129     }
00130 
00131     // Close the socket to return its memory and bring down the network interface
00132     socket.close();
00133 }
00134 
00135 
00136 Serial particle_sensor(PA_0,PA_1);//TX,RX
00137 Serial pc(USBTX,USBRX);
00138 
00139 float SDS018 ()
00140 {
00141     uint8_t oneByte =0, myData[10],mCheck =0;
00142     uint32_t samples_par = 1000;
00143     int aux=0, t_init =0,i=0;
00144     float PM2_5_A = 0, PM10_A = 0, PM2_5_sum = 0, PM10_sum = 0,PM2_5_avg = 0, PM10_avg = 0,PM2_5,PM10;
00145     Timer t;
00146     
00147     time_t seconds = time(NULL);  
00148     //printf("Unix Epoch time = %d\r\n", seconds);
00149     //while(true){
00150        // t.start();
00151        // int time_start=t.read_ms();
00152         //pc.printf("\nPARTICLE\n\r");
00153         while (aux < samples_par) //while(t.read_ms()-t_init < time_avg)
00154         {
00155             if (aux==0)           
00156             t_init = t.read_ms();
00157             while (particle_sensor.readable()) { // whenever sensor transmits packet (every 1 s)
00158                 oneByte = particle_sensor.getc();   
00159                 if(oneByte == 0xAA) { 
00160                     myData[0] =  oneByte;
00161                     oneByte = particle_sensor.getc();
00162                 if(oneByte == 0xC0) { 
00163                     myData[1] =  oneByte;
00164                     mCheck = 0;
00165                     for(i=0; i < 6; i++) { // DATA 1-6 received and crc calc
00166                         myData[i+2] = particle_sensor.getc();
00167                         //wait_ms(2);
00168                         mCheck += myData[i+2];
00169                         if(myData[6]==0x91)
00170                        {
00171                         //pc.printf("91\n\r");
00172                         }
00173                        if(myData[7]==0xA1)
00174                        {
00175                            //pc.printf("A1\n\r");
00176                         }
00177                     }
00178                     myData[8] = particle_sensor.getc();
00179                     myData[9] = particle_sensor.getc(); // tail (AB)
00180                     if(mCheck == myData[8]) { // if checksum OK
00181                         PM2_5 = ((uint16_t)myData[2] | (uint16_t)(myData[3]<<8));
00182                         PM10 = ((uint16_t)myData[4] | (uint16_t)(myData[5]<<8));        
00183                         PM2_5_A = (float) PM2_5/10;
00184                         PM10_A = (float) PM10/10;       
00185                         if(PM2_5_A*10 > 9999)
00186                             PM2_5_A = 999.9;
00187                         if(PM10_A*10 > 9999)
00188                             PM10_A = 999.9;                     
00189                         aux++;
00190                         PM2_5_sum+=PM2_5_A;  // sum samples for future averaging
00191                         
00192                         PM10_sum+=PM10_A;  // sum samples for future averaging
00193                         //printf("%3.2f,\t%3.2f\n\r", PM2_5_A, PM10_A); // CSV print:  PM2.5,  PM10
00194                         //printf("PM2_5_A = %3.2f", PM2_5_A); //PM2.5
00195                         return PM2_5_A;                   
00196                         } 
00197                     } // head2
00198                 } // head1 
00199                                 
00200             } // while readable()
00201            
00202           } 
00203 }
00204 
00205 
00206 
00207 
00208 
00209 
00210 int main()
00211 
00212 {    
00213 
00214 
00215 
00216     pc.baud (115200) ;                       
00217                      
00218     int count = 0;
00219 
00220     printf("WiFi example\n\n");
00221 
00222     count = scan_demo(&wifi);
00223     if (count == 0) {
00224         printf("No WIFI APNs found - can't continue further.\n");
00225         return -1;
00226     }
00227 
00228     printf("\nConnecting to %s...\n", MBED_CONF_APP_WIFI_SSID);
00229     int ret = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
00230     //int ret = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA);
00231     if (ret != 0) {
00232         printf("\nConnection error\n");
00233         return -1;
00234     }
00235 
00236     printf("Success\n\n");
00237     printf("MAC: %s\n", wifi.get_mac_address());
00238     printf("IP: %s\n", wifi.get_ip_address());
00239     printf("Netmask: %s\n", wifi.get_netmask());
00240     printf("Gateway: %s\n", wifi.get_gateway());
00241     printf("RSSI: %d\n\n", wifi.get_rssi());
00242 
00243     http_demo(&wifi);
00244 
00245     //wifi.disconnect();
00246 
00247     printf("\Wifi Example Done,MQTT Example Start\n");
00248     
00249     // MQTT Example Start
00250     float version = 0.6;
00251     char* topic = "test";
00252 
00253     //logMessage("HelloMQTT: version is %.2f\r\n", version);
00254 
00255     NetworkInterface* network = &wifi;
00256     if (!network) {
00257         return -1;
00258     }
00259 
00260     MQTTNetwork mqttNetwork(network);
00261 
00262     MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);
00263 
00264     const char* hostname = "172.20.10.3";
00265     int port = 1883;
00266     logMessage("Connecting to %s:%d\r\n", hostname, port);
00267     
00268     
00269     
00270     int rc = mqttNetwork.connect(hostname, port);
00271     
00272     if (rc != 0)
00273         logMessage("rc from TCP connect is %d\r\n", rc);
00274 
00275     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
00276     data.MQTTVersion = 3;
00277     data.clientID.cstring = "mbed-sample";
00278     data.username.cstring = "testuser";
00279     data.password.cstring = "testpassword";
00280     if ((rc = client.connect(data)) != 0)
00281         logMessage("rc from MQTT connect is %d\r\n", rc);
00282 
00283     if ((rc = client.subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
00284         logMessage("rc from MQTT subscribe is %d\r\n", rc);
00285 
00286 
00287 
00288 
00289 
00290 
00291   while(1)
00292   {
00293    
00294     MQTT::Message message;
00295     // QoS 0
00296     
00297     
00298     char buf[100];       
00299     printf("PM2.5 = %3.2f\r\n",SDS018 ());
00300     sprintf(buf, "PM2.5 = %3.2f\r\n",SDS018 ());
00301     
00302        
00303     message.qos = MQTT::QOS1;
00304     message.retained = false;
00305     message.dup = false;
00306     message.payload = (void*)buf;
00307     message.payloadlen = strlen(buf)+1;
00308     rc = client.publish(topic, message);
00309     client.yield(100);
00310      
00311     
00312    }
00313      
00314       
00315         
00316 }