![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
INSAT_MiniPRoject
Dependencies: MQTT NDefLib NetworkSocketAPI Servo Light_Sensor_Nucleo X_NUCLEO_IDW01M1v2 mbed
Fork of IDW01M1_Cloud_IBM by
Diff: main.cpp
- Revision:
- 23:43f9e34781f2
- Parent:
- 22:d278e4bb5ded
- Child:
- 24:a59eb8bdc431
--- a/main.cpp Wed Oct 19 09:46:27 2016 +0000 +++ b/main.cpp Wed Oct 26 15:28:35 2016 +0000 @@ -21,6 +21,9 @@ #include "MQTTWiFi.h" #include <ctype.h> #include "x_nucleo_iks01a1.h" +#include "X_NUCLEO_NFC01A1.h" +#include "NDefLib/NDefNfcTag.h" +#include "NDefLib/RecordType/RecordURI.h" //------------------------------------ // Hyperterminal configuration @@ -31,23 +34,27 @@ SpwfSAInterface spwf(D8, D2, false); bool quickstartMode = true; -#define ORG_QUICKSTART // comment to connect to play.internetofthings.ibmcloud.com +#define ORG_QUICKSTART // comment to connect to play.internetofthings.ibmcloud.com +//#define SUBSCRIBE // uncomment to subscribe to broker msgs (not to be used with IBM broker) +#define X_NUCLEO_NFC01A1_PRESENT // uncomment to add NFC support #define MQTT_MAX_PACKET_SIZE 250 #define MQTT_MAX_PAYLOAD_SIZE 300 // Configuration values needed to connect to IBM IoT Cloud +#define BROKER_URL ".messaging.internetofthings.ibmcloud.com"; #ifdef ORG_QUICKSTART #define ORG "quickstart" // connect to quickstart.internetofthings.ibmcloud.com/ For a registered connection, replace with your org #define ID "" #define AUTH_TOKEN "" #define DEFAULT_TYPE_NAME "iotsample-mbed-Nucleo" -#else +#else // not def ORG_QUICKSTART #define ORG "play" // connect to play.internetofthings.ibmcloud.com/ For a registered connection, replace with your org -#define ID "testnucleo2" // For a registered connection, replace with your id -#define AUTH_TOKEN "centrallab"// For a registered connection, replace with your auth-token +#define ID "" // For a registered connection, replace with your id +#define AUTH_TOKEN ""// For a registered connection, replace with your auth-token #define DEFAULT_TYPE_NAME "sensor" #endif +#define TOPIC "iot-2/evt/status/fmt/json" #define TYPE DEFAULT_TYPE_NAME // For a registered connection, replace with your type #define MQTT_PORT 1883 @@ -66,50 +73,71 @@ char type[30] = TYPE; char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode bool netConnecting = false; -//int connectTimeout = 1000; -int connectTimeout = 10; +int connectTimeout = 1000; bool mqttConnecting = false; bool netConnected = false; bool connected = false; int retryAttempt = 0; +char subscription_url[MQTT_MAX_PAYLOAD_SIZE]; PressureSensor *pressure_sensor; HumiditySensor *humidity_sensor; TempSensor *temp_sensor1; +MQTT::Message message; +MQTTString TopicName={TOPIC}; +MQTT::MessageData MsgData(TopicName, message); + +void subscribe_cb(MQTT::MessageData & msgMQTT) { + char msg[MQTT_MAX_PAYLOAD_SIZE]; + msg[0]='\0'; + strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen); + printf ("--->>> subscribe_cb msg: %s\n\r", msg); +} + +int subscribe(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack) +{ + char* pubTopic = TOPIC; + return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb); +} int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack) -{ - const char* iot_ibm = ".messaging.internetofthings.ibmcloud.com"; +{ + const char* iot_ibm = BROKER_URL; + char hostname[strlen(org) + strlen(iot_ibm) + 1]; sprintf(hostname, "%s%s", org, iot_ibm); SpwfSAInterface& WiFi = ipstack->getWiFi(); ip_addr = WiFi.get_ip_address(); - printf ("ID: %s\n\r",id); // Construct clientId - d:org:type:id - char clientId[strlen(org) + strlen(type) + strlen(id) + 5]; - sprintf(clientId, "d:%s:%s:%s", org, type, id); + char clientId[strlen(org) + strlen(type) + strlen(id) + 5]; + sprintf(clientId, "d:%s:%s:%s", org, type, id); + sprintf(subscription_url, "%s.%s/#/device/%s/sensor/", org, "internetofthings.ibmcloud.com",id); + // Network debug statements LOG("=====================================\n\r"); LOG("Connecting WiFi.\n\r"); - LOG("IP ADDRESS: %s\n\r", WiFi.get_ip_address()); - LOG("MAC ADDRESS: %s\n\r", WiFi.get_mac_address()); - LOG("Server Hostname: %s\n\r", hostname); + LOG("Nucleo IP ADDRESS: %s\n\r", WiFi.get_ip_address()); + LOG("Nucleo MAC ADDRESS: %s\n\r", WiFi.get_mac_address()); + LOG("Server Hostname: %s port: %d\n\r", hostname, IBM_IOT_PORT); // for(int i = 0; clientId[i]; i++){ // clientId[i] = tolower(clientId[i]); // } - LOG("Client ID: %s\n\r", clientId); + LOG("Client ID: %s id: %s\n\r", clientId, id); + LOG("Topic: %s\n\r",TOPIC); + LOG("Subscription URL: %s\n\r", subscription_url); LOG("=====================================\n\r"); netConnecting = true; ipstack->open(&ipstack->getWiFi()); - int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout); + int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout); if (rc != 0) { WARN("IP Stack connect returned: %d\n", rc); return rc; } + printf ("--->TCP Connected\n\r"); netConnected = true; netConnecting = false; @@ -124,11 +152,14 @@ { data.username.cstring = "use-token-auth"; data.password.cstring = auth_token; - } + } if ((rc = client->connect(data)) == 0) { connected = true; - printf ("--->Connected\n\r"); + printf ("--->MQTT Connected\n\r"); +#ifdef SUBSCRIBE + if (!subscribe(client, ipstack)) printf ("--->>>MQTT subscribed to: %s\n\r",TOPIC); +#endif } else { WARN("MQTT connect returned %d\n", rc); @@ -152,15 +183,14 @@ while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED) { if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) { - printf ("File: %s, Line: %d\n\r",__FILE__,__LINE__); + printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc); return; // don't reattempt to connect if credentials are wrong - } + } int timeout = getConnTimeout(++retryAttempt); WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout); // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed - // or maybe just add the proper members to do this disconnect and call attemptConnect(...) - + // or maybe just add the proper members to do this disconnect and call attemptConnect(...) // this works - reset the system when the retry count gets to a threshold if (retryAttempt == 5) NVIC_SystemReset(); @@ -172,7 +202,7 @@ int publish(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack) { MQTT::Message message; - char* pubTopic = "iot-2/evt/status/fmt/json"; + char* pubTopic = TOPIC; char buf[MQTT_MAX_PAYLOAD_SIZE]; float temp, press, hum; @@ -188,7 +218,7 @@ message.payload = (void*)buf; message.payloadlen = strlen(buf); - LOG("Publishing %s\n", buf); + LOG("Publishing %s\n\r", buf); return client->publish(pubTopic, message); } @@ -202,8 +232,7 @@ DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL); i2c->frequency(400000); - X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(i2c); - + X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(i2c); pressure_sensor = mems_expansion_board->pt_sensor; temp_sensor1 = mems_expansion_board->ht_sensor; humidity_sensor = mems_expansion_board->ht_sensor; @@ -234,14 +263,36 @@ while (true) wait(1.0); // Permanent failures - don't retry } +#ifdef X_NUCLEO_NFC01A1_PRESENT + // program NFC with broker URL + X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(*i2c, NULL, X_NUCLEO_NFC01A1::DEFAULT_GPO_PIN, X_NUCLEO_NFC01A1::DEFAULT_RF_DISABLE_PIN, NC,NC,NC); + NDefLib::NDefNfcTag& tag = nfcNucleo->getM24SR().getNDefTag(); + printf("NFC Init done: !\r\n"); + //open the i2c session with the nfc chip + if(tag.openSession()){ + //create the NDef message and record + NDefLib::Message msg; + NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTPS, subscription_url); + msg.addRecord(&rUri); + //write the tag + if(tag.write(msg)){ + printf("Tag writed \r\n"); + } + //close the i2c session + if(!tag.closeSession()){ + printf("Error Closing the session\r\n"); + } + }else printf("Error open Session\r\n"); +#endif int count = 0; // tyeld.start(); while (true) { if (++count == /*100*/2) { // Publish a message every second - if (publish(&client, &ipstack) != 0) - attemptConnect(&client, &ipstack); // if we have lost the connection + if (publish(&client, &ipstack) != 0) { + attemptConnect(&client, &ipstack); // if we have lost the connection + } count = 0; } // int start = tyeld.read_ms();