Last active
September 19, 2016 14:14
-
-
Save jkachmar/e4328d879f4b39f3f79eca9ab74e9b91 to your computer and use it in GitHub Desktop.
TTN OTAA Test w/ Multitech mDot
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> | |
#define SLEEPTIME 5*60*1000 | |
static uint8_t config_appEui[] = { <appEUI> }; | |
static uint8_t config_appKey[] = { <appKey> }; | |
static uint8_t config_frequency_sub_band = 2; | |
std::vector<uint8_t> data; | |
mDot* dot; | |
void setupNetwork(); | |
int main() { | |
setupNetwork(); | |
int32_t ret; | |
float _temperature = 73.45; | |
uint32_t temperature = (_temperature * 1000000); | |
uint8_t tByteArr[4]; | |
for (int i = 0; i < 4; i++) { | |
tByteArr[i] = (temperature >> (i * 8)); | |
} | |
// push 1 byte chunks of 'temperature' into a byte vector | |
for (int i = 0; i < 4; i++) { | |
data.push_back(tByteArr[i]); | |
} | |
// Send the data | |
if ((ret = dot->send(data)) != mDot::MDOT_OK) { | |
// Oops, there was an error, check the debug screent | |
logError("Failed to send", ret, mDot::getReturnCodeString(ret).c_str()); | |
} else { | |
// Sent the data | |
logInfo("Successfully sent data"); | |
} | |
// Enter deep sleep | |
uint32_t sleep_time = SLEEPTIME; | |
sleep_time = sleep_time / 1000; | |
dot->sleep(sleep_time, dot->RTC_ALARM, true); | |
} | |
void setupNetwork() { | |
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 | |
logInfo("Setting TX spreading factor"); | |
if ((ret = dot->setTxDataRate(mDot::SF_7)) != 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(100); | |
} | |
logInfo("Joined Network"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment