MultiTech / Mbed OS mDot_LoRa_Connect_Example_CUSTOM_AS923

Dependencies:   libmDot-Custom

Fork of mDot_LoRa_Connect_Example by MultiTech

The project is a starting point for the AS923 channel plan.

Default frequencies are 923.2 and 923.4 Join Datarate is set to DR2:SF10BW125 Additional channels can be added in JoinAccept message or through new channel mac commands

New MAC commands in LoRaWAN 1.02 have NOT been included to set the DwellTime and MaxEIRP Overriding this function is available to someone who would like to do this. virtual uint8_t HandleMacCommands(uint8_t* payload, uint8_t index, uint8_t end_index);

Committer:
mfiore
Date:
Wed Sep 30 19:49:02 2015 +0000
Revision:
4:36e214ebfa56
Parent:
2:6e2c378339d9
Child:
5:e9d78a9bafc5
add comments clarifying configuration and behavior

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfiore 0:09250cd371d2 1 #include "mbed.h"
mfiore 0:09250cd371d2 2 #include "mDot.h"
mfiore 4:36e214ebfa56 3 #include "MTSLog.h"
mfiore 0:09250cd371d2 4 #include <string>
mfiore 0:09250cd371d2 5 #include <vector>
mfiore 4:36e214ebfa56 6 #include <algorithm>
mfiore 0:09250cd371d2 7
mfiore 2:6e2c378339d9 8 // these options must match the settings on your Conduit
mfiore 2:6e2c378339d9 9 // uncomment the following lines and edit their values to match your configuration
mfiore 2:6e2c378339d9 10 //static std::string config_network_name = "<lora network id>";
mfiore 2:6e2c378339d9 11 //static std::string config_network_pass = "<lora network key>";
mfiore 2:6e2c378339d9 12 //static uint8_t config_frequency_sub_band = 1;
mfiore 0:09250cd371d2 13
mfiore 0:09250cd371d2 14 int main() {
mfiore 0:09250cd371d2 15 int32_t ret;
mfiore 0:09250cd371d2 16 mDot* dot;
mfiore 0:09250cd371d2 17 std::vector<uint8_t> data;
mfiore 4:36e214ebfa56 18 std::string data_str = "hello!";
mfiore 2:6e2c378339d9 19
mfiore 0:09250cd371d2 20 // get a mDot handle
mfiore 0:09250cd371d2 21 dot = mDot::getInstance();
mfiore 2:6e2c378339d9 22
mfiore 2:6e2c378339d9 23 // print library version information
mfiore 2:6e2c378339d9 24 logInfo("version: %s", dot->getId().c_str());
mfiore 0:09250cd371d2 25
mfiore 2:6e2c378339d9 26 //*******************************************
mfiore 2:6e2c378339d9 27 // configuration
mfiore 2:6e2c378339d9 28 //*******************************************
mfiore 0:09250cd371d2 29 // reset to default config so we know what state we're in
mfiore 0:09250cd371d2 30 dot->resetConfig();
mfiore 0:09250cd371d2 31
mfiore 4:36e214ebfa56 32 dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
mfiore 0:09250cd371d2 33
mfiore 2:6e2c378339d9 34 // set up the mDot with our network information: frequency sub band, network name, and network password
mfiore 2:6e2c378339d9 35 // these can all be saved in NVM so they don't need to be set every time - see mDot::saveConfig()
mfiore 4:36e214ebfa56 36
mfiore 4:36e214ebfa56 37 // frequency sub band is only applicable in the 915 (US) frequency band
mfiore 4:36e214ebfa56 38 // if using a MultiTech Conduit gateway, use the same sub band as your Conduit (1-8) - the mDot will use the 8 channels in that sub band
mfiore 4:36e214ebfa56 39 // if using a gateway that supports all 64 channels, use sub band 0 - the mDot will use all 64 channels
mfiore 2:6e2c378339d9 40 logInfo("setting frequency sub band");
mfiore 0:09250cd371d2 41 if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 42 logError("failed to set frequency sub band %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 2:6e2c378339d9 43 }
mfiore 4:36e214ebfa56 44
mfiore 2:6e2c378339d9 45 logInfo("setting network name");
mfiore 2:6e2c378339d9 46 if ((ret = dot->setNetworkName(config_network_name)) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 47 logError("failed to set network name %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:09250cd371d2 48 }
mfiore 4:36e214ebfa56 49
mfiore 2:6e2c378339d9 50 logInfo("setting network password");
mfiore 2:6e2c378339d9 51 if ((ret = dot->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 52 logError("failed to set network password %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:09250cd371d2 53 }
mfiore 4:36e214ebfa56 54
mfiore 4:36e214ebfa56 55 // a higher spreading factor allows for longer range but lower throughput
mfiore 4:36e214ebfa56 56 // in the 915 (US) frequency band, spreading factors 7 - 10 are available
mfiore 4:36e214ebfa56 57 // in the 868 (EU) frequency band, spreading factors 7 - 12 are available
mfiore 4:36e214ebfa56 58 logInfo("setting TX spreading factor");
mfiore 4:36e214ebfa56 59 if ((ret = dot->setTxDataRate(mDot::SF_10)) != mDot::MDOT_OK) {
mfiore 4:36e214ebfa56 60 logError("failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 61 }
mfiore 4:36e214ebfa56 62
mfiore 4:36e214ebfa56 63 // request receive confirmation of packets from the gateway
mfiore 4:36e214ebfa56 64 logInfo("enabling ACKs");
mfiore 4:36e214ebfa56 65 if ((ret = dot->setAck(1)) != mDot::MDOT_OK) {
mfiore 4:36e214ebfa56 66 logError("failed to enable ACKs %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 67 }
mfiore 4:36e214ebfa56 68
mfiore 4:36e214ebfa56 69 // save this configuration to the mDot's NVM
mfiore 2:6e2c378339d9 70 logInfo("saving config");
mfiore 2:6e2c378339d9 71 if (! dot->saveConfig()) {
mfiore 2:6e2c378339d9 72 logError("failed to save configuration");
mfiore 0:09250cd371d2 73 }
mfiore 2:6e2c378339d9 74 //*******************************************
mfiore 2:6e2c378339d9 75 // end of configuration
mfiore 2:6e2c378339d9 76 //*******************************************
mfiore 0:09250cd371d2 77
mfiore 0:09250cd371d2 78 // attempt to join the network
mfiore 2:6e2c378339d9 79 logInfo("joining network");
mfiore 0:09250cd371d2 80 while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 81 logError("failed to join network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 82 // in the 868 (EU) frequency band, we need to wait until another channel is available before transmitting again
mfiore 4:36e214ebfa56 83 osDelay(std::max((uint32_t)1000, (uint32_t)dot->getNextTxMs()));
mfiore 0:09250cd371d2 84 }
mfiore 0:09250cd371d2 85
mfiore 0:09250cd371d2 86 // format data for sending to the gateway
mfiore 0:09250cd371d2 87 for (std::string::iterator it = data_str.begin(); it != data_str.end(); it++)
mfiore 0:09250cd371d2 88 data.push_back((uint8_t) *it);
mfiore 0:09250cd371d2 89
mfiore 0:09250cd371d2 90 while (true) {
mfiore 4:36e214ebfa56 91 // send the data to the gateway
mfiore 0:09250cd371d2 92 if ((ret = dot->send(data)) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 93 logError("failed to send", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:09250cd371d2 94 } else {
mfiore 2:6e2c378339d9 95 logInfo("successfully sent data to gateway");
mfiore 0:09250cd371d2 96 }
mfiore 0:09250cd371d2 97
mfiore 4:36e214ebfa56 98 // in the 868 (EU) frequency band, we need to wait until another channel is available before transmitting again
mfiore 4:36e214ebfa56 99 osDelay(std::max((uint32_t)5000, (uint32_t)dot->getNextTxMs()));
mfiore 0:09250cd371d2 100 }
mfiore 0:09250cd371d2 101
mfiore 0:09250cd371d2 102 return 0;
mfiore 0:09250cd371d2 103 }