Last active
August 30, 2016 18:06
-
-
Save jkachmar/12357012e59144a94a6e05ce91307fab to your computer and use it in GitHub Desktop.
mDot TTN OTAA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "mbed.h" | |
#include "mDot.h" | |
#include "MTSLog.h" | |
#include <string> | |
#include <vector> | |
#include <algorithm> | |
static uint8_t config_appEui[] = { <AppEUI> }; // MUST be MSB-format | |
static uint8_t config_appKey[] = { <AppKey> }; // MUST be MSB-format | |
static uint8_t config_frequency_sub_band = 2; | |
mDot* dot; | |
void setupNetwork(); | |
int main() { | |
Serial pc(USBTX, USBRX); | |
// Set up the network | |
setupNetwork(); | |
// Message you want to send | |
std::string data_str = "Hello!"; | |
// Copy the message in an array of bytes | |
std::vector<uint8_t> data; | |
for (std::string::iterator it = data_str.begin(); it != data_str.end(); it++) | |
data.push_back((uint8_t) *it); | |
// Start the loop | |
int32_t ret; | |
while (true) { | |
// Send the data | |
if ((ret = dot->send(data)) != mDot::MDOT_OK) { | |
// Oops, there was an error, check the debug screen | |
logError("Failed to send", ret, mDot::getReturnCodeString(ret).c_str()); | |
//pc.printf("Failed to send"); | |
} else { | |
// Sent the data | |
logInfo("Successfully sent data"); | |
//pc.printf("Successfully sent data"); | |
} | |
// Sleep for 10 seconds | |
uint32_t sleep_time = std::max((uint32_t)10000, | |
(uint32_t)dot->getNextTxMs()); | |
sleep_time = sleep_time / 1000; | |
dot->sleep(sleep_time); | |
} | |
} | |
void setupNetwork() { | |
//Serial pc(USBTX, USBRX); | |
int32_t ret; | |
// get a mDot handle | |
dot = mDot::getInstance(); | |
// print library version information | |
logInfo("Version: %s", dot->getId().c_str()); | |
// reset to default config so we know what state we're in | |
dot->resetConfig(); | |
dot->setLogLevel(mts::MTSLog::INFO_LEVEL); | |
//joinmode: [MANUAL = ABP]/[OTA]/[AUTO_OTA] | |
dot->setJoinMode(mDot::AUTO_OTA); | |
// set up the mDot with our network information: frequency sub band, network name, and network password | |
// these can all be saved in NVM so they don't need to be set every time - see mDot::saveConfig() | |
// frequency sub band is only applicable in the 915 (US) frequency band | |
logInfo("Setting frequency sub band"); | |
if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) { | |
logError("Failed to set frequency sub band %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); | |
} | |
std::vector<uint8_t> temp; | |
if ((ret = dot->setPublicNetwork(true)) != mDot::MDOT_OK) { | |
logError("Failed to enable public network %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); | |
} | |
for (int i = 0; i < 8; i++) { | |
temp.push_back(config_appEui[i]); | |
} | |
logInfo("setting App EUI "); | |
if ((ret = dot->setNetworkId(temp)) != mDot::MDOT_OK) { | |
logError("failed to set App EUI %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); | |
} | |
temp.clear(); | |
for (int i = 0; i < 16; i++) { | |
temp.push_back(config_appKey[i]); | |
} | |
logInfo("setting App Key "); | |
if ((ret = dot->setNetworkKey(temp)) != mDot::MDOT_OK) { | |
logError("failed to set AppKey %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); | |
} | |
// a higher spreading factor allows for longer range but lower throughput | |
// in the 915 (US) frequency band, spreading factors 7 - 10 are available | |
// in the 868 (EU) frequency band, spreading factors 7 - 12 are available | |
logInfo("Setting TX spreading factor"); | |
if ((ret = dot->setTxDataRate(mDot::SF_8)) != mDot::MDOT_OK) { | |
logError("Failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); | |
} | |
// request receive confirmation of packets from the gateway | |
logInfo("Disabling ACKs"); | |
if ((ret = dot->setAck(0)) != mDot::MDOT_OK) { | |
logError("Failed to enable ACKs %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); | |
} | |
// save this configuration to the mDot's NVM | |
logInfo("Saving config"); | |
if (! dot->saveConfig()) { | |
logError("Failed to save configuration"); | |
} | |
logInfo("Joining Network"); | |
while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) { | |
logError("failed to join network [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str()); | |
wait_ms(dot->getNextTxMs() + 1); | |
} | |
logInfo("Joined Network"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment