Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MQTT MbedJSONValue mbed mtsas
Fork of DragonflyMQTT by
main.cpp
- Committer:
- miaotwilio
- Date:
- 2017-05-12
- Revision:
- 1:5a896191c3c4
- Parent:
- 0:b32fa0c757d7
- Child:
- 2:d4dcf1ebaa99
File content as of revision 1:5a896191c3c4:
#include "MTSCellularManager.hpp"
#include "TlsMQTTClient.hpp"
#include "Certificates.h"
#include <mbed.h>
#include <mtsas.h>
#include <ssl.h>
// This line controls the regulator's battery charger.
// BC_NCE = 0 enables the battery charger
// BC_NCE = 1 disables the battery charger
DigitalOut bc_nce(PB_2);
DigitalOut ledMQTTYield(D5);
DigitalOut ledGPS(D8);
static const int VEHICLE_DATA_POLLING_PERIOD_MS = 5000;
static bool exitCmd = false;
static void sendVehicleData(MTSCellularManager::GPSStatus& gpsStatus);
static void test2Handler(MQTT::MessageData& data);
int main() {
// Disable the battery charger unless a battery is attached.
bc_nce = 1;
ledMQTTYield = 1;
ledGPS = 1;
// Change the baud rate of the debug port from the default 9600 to 115200.
Serial debug(USBTX, USBRX);
debug.baud(115200);
//Sets the log level to INFO, higher log levels produce more log output.
//Possible levels: NONE, FATAL, ERROR, WARNING, INFO, DEBUG, TRACE
mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
logInfo("Program started");
logInfo("Initializing cellular");
MTSCellularManager cellularManager("wireless.twilio.com");
if (! cellularManager.init()) {
while (true) {
logError("failed to initialize cellular radio");
wait(1);
}
}
{
logInfo("Initializing GPS");
cellularManager.enableGps();
logInfo("GPS Initialized");
}
logInfo("Initializing CyaSSL");
CyaSSL_Init();
while (!exitCmd) {
MTSCellularManager::GPSStatus gpsStatus = cellularManager.gpsPollStatus();
if (gpsStatus.success) {
ledGPS = 0;
sendVehicleData(gpsStatus);
} else {
ledGPS = 1;
}
wait_ms(VEHICLE_DATA_POLLING_PERIOD_MS);
}
logInfo("Cleaning up CyaSSL");
CyaSSL_Cleanup();
logInfo("Shutting down cellular");
cellularManager.uninit();
logInfo("Program finished");
wait(1E12);
return 0;
}
static void sendVehicleData(MTSCellularManager::GPSStatus& gpsStatus) {
ledMQTTYield = 0;
logInfo("Connecting MQTT Client");
TlsMQTTClient client = TlsMQTTClient();
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
// Account: AC79339963a99f476e6f0b3214abd48a9d
// Fleet: FL1a84e19cd6014020b7a26a6f89521d4f
// Deployment: DL1daae5d60c5941aea5cd8cf2b693e990
// Sync List: https://preview.twilio.com/Sync/Services/IS1a84e19cd6014020b7a26a6f89521d4f/Lists/
// Device: TH6008344511ed4286b249c3d21891b5ae
data.clientID.cstring = "dragonfly-mqtt";
data.username.cstring = "KY977b46cdd67645b494da001ced07e40f";
data.password.cstring = "RteF2I/fwCjmmdIOoe32qw";
if (MQTT::SUCCESS == client.connect("mqtt-sync.us1.twilio.com", 8883, NULL /*MQTT_GATEWAY_PROD_ROOT_CA_PEM*/, data)) {
MQTT::Message message;
char buf[512];
logInfo("MQTT connected");
sprintf(buf, "{"
"\"driver_id\": 1,"
"\"runtime\": 10,"
"\"miles\": 10,"
"\"speed\": %f,"
"\"minT\": 40,"
"\"maxT\": 60,"
"\"avgT\": 50,"
"\"fuel\": 50,"
"\"brake\": 0,"
"\"lat\": %lf,"
"\"lon\": %lf"
"}",
gpsStatus.speedVal,
gpsStatus.latitudeVal,
gpsStatus.longitudeVal);
message.qos = MQTT::QOS1;
message.payload = (void*)buf;
message.payloadlen = strlen(buf) + 1;
logInfo("MQTT message publishing buf: %s", buf);
int rc = client.publish("sync/lists/vehicle0-data", message);
logInfo("MQTT message publish result: %d", rc);
logInfo("MQTT disconnecting");
client.disconnect();
}
ledMQTTYield = 1;
}
/*
static void subscribeToTest2() {
rc = client.subscribe("sync/lists/test2", MQTT::QOS1, test2Handler);
logInfo("MQTT subscription result: %d", rc);
}
static void test2Handler(MQTT::MessageData& data) {
static const size_t MAX_DISPLAY_MESSAGE_SIZE = 30;
char buf[MAX_DISPLAY_MESSAGE_SIZE + 1];
if (data.message.payloadlen <= MAX_DISPLAY_MESSAGE_SIZE) {
strncpy(buf, (char*)data.message.payload, data.message.payloadlen);
buf[data.message.payloadlen] = '\0';
} else {
strncpy(buf, (char*)data.message.payload, MAX_DISPLAY_MESSAGE_SIZE - 3);
buf[MAX_DISPLAY_MESSAGE_SIZE-3] = '.';
buf[MAX_DISPLAY_MESSAGE_SIZE-2] = '.';
buf[MAX_DISPLAY_MESSAGE_SIZE-1] = '.';
buf[MAX_DISPLAY_MESSAGE_SIZE] = '\0';
}
logDebug("topic %s payload received len %d data %s", data.topicName.lenstring.data, data.message.payloadlen, buf);
// sync client can send binary data using payload format:
// {
// "payload": "ZXhpdA==", # base64 encoded "exit"
// "_iot_meta": {
// "payload_encoding": "base64",
// "payload_type": "application/octet-stream",
// }
// }
if (0 == strncmp((char*)data.message.payload, "exit", data.message.payloadlen)) {
exitCmd = true;
}
}*/
