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:
jreiss
Date:
Mon Apr 04 18:44:38 2016 +0000
Revision:
5:e9d78a9bafc5
Parent:
4:36e214ebfa56
Child:
6:f0b6fea36e28
update libmDot

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
jreiss 5:e9d78a9bafc5 10 static std::string config_network_name = "<lora network id>";
jreiss 5:e9d78a9bafc5 11 static std::string config_network_pass = "<lora network key>";
jreiss 5:e9d78a9bafc5 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
jreiss 5:e9d78a9bafc5 40
jreiss 5:e9d78a9bafc5 41 if ((ret = dot->setPublicNetwork(true)) != mDot::MDOT_OK) {
jreiss 5:e9d78a9bafc5 42 logError("failed to set public network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
jreiss 5:e9d78a9bafc5 43 }
jreiss 5:e9d78a9bafc5 44
jreiss 5:e9d78a9bafc5 45 logInfo("setting frequency sub band");
mfiore 0:09250cd371d2 46 if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 47 logError("failed to set frequency sub band %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 2:6e2c378339d9 48 }
mfiore 4:36e214ebfa56 49
mfiore 2:6e2c378339d9 50 logInfo("setting network name");
mfiore 2:6e2c378339d9 51 if ((ret = dot->setNetworkName(config_network_name)) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 52 logError("failed to set network name %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:09250cd371d2 53 }
mfiore 4:36e214ebfa56 54
mfiore 2:6e2c378339d9 55 logInfo("setting network password");
mfiore 2:6e2c378339d9 56 if ((ret = dot->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 57 logError("failed to set network password %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:09250cd371d2 58 }
mfiore 4:36e214ebfa56 59
mfiore 4:36e214ebfa56 60 // a higher spreading factor allows for longer range but lower throughput
mfiore 4:36e214ebfa56 61 // in the 915 (US) frequency band, spreading factors 7 - 10 are available
mfiore 4:36e214ebfa56 62 // in the 868 (EU) frequency band, spreading factors 7 - 12 are available
mfiore 4:36e214ebfa56 63 logInfo("setting TX spreading factor");
mfiore 4:36e214ebfa56 64 if ((ret = dot->setTxDataRate(mDot::SF_10)) != mDot::MDOT_OK) {
mfiore 4:36e214ebfa56 65 logError("failed to set TX datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 66 }
mfiore 4:36e214ebfa56 67
mfiore 4:36e214ebfa56 68 // request receive confirmation of packets from the gateway
mfiore 4:36e214ebfa56 69 logInfo("enabling ACKs");
mfiore 4:36e214ebfa56 70 if ((ret = dot->setAck(1)) != mDot::MDOT_OK) {
mfiore 4:36e214ebfa56 71 logError("failed to enable ACKs %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 72 }
mfiore 4:36e214ebfa56 73
mfiore 4:36e214ebfa56 74 // save this configuration to the mDot's NVM
mfiore 2:6e2c378339d9 75 logInfo("saving config");
mfiore 2:6e2c378339d9 76 if (! dot->saveConfig()) {
mfiore 2:6e2c378339d9 77 logError("failed to save configuration");
mfiore 0:09250cd371d2 78 }
mfiore 2:6e2c378339d9 79 //*******************************************
mfiore 2:6e2c378339d9 80 // end of configuration
mfiore 2:6e2c378339d9 81 //*******************************************
mfiore 0:09250cd371d2 82
mfiore 0:09250cd371d2 83 // attempt to join the network
mfiore 2:6e2c378339d9 84 logInfo("joining network");
mfiore 0:09250cd371d2 85 while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 86 logError("failed to join network %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 4:36e214ebfa56 87 // in the 868 (EU) frequency band, we need to wait until another channel is available before transmitting again
mfiore 4:36e214ebfa56 88 osDelay(std::max((uint32_t)1000, (uint32_t)dot->getNextTxMs()));
mfiore 0:09250cd371d2 89 }
mfiore 0:09250cd371d2 90
mfiore 0:09250cd371d2 91 // format data for sending to the gateway
mfiore 0:09250cd371d2 92 for (std::string::iterator it = data_str.begin(); it != data_str.end(); it++)
mfiore 0:09250cd371d2 93 data.push_back((uint8_t) *it);
mfiore 0:09250cd371d2 94
mfiore 0:09250cd371d2 95 while (true) {
mfiore 4:36e214ebfa56 96 // send the data to the gateway
mfiore 0:09250cd371d2 97 if ((ret = dot->send(data)) != mDot::MDOT_OK) {
mfiore 2:6e2c378339d9 98 logError("failed to send", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:09250cd371d2 99 } else {
mfiore 2:6e2c378339d9 100 logInfo("successfully sent data to gateway");
mfiore 0:09250cd371d2 101 }
mfiore 0:09250cd371d2 102
mfiore 4:36e214ebfa56 103 // in the 868 (EU) frequency band, we need to wait until another channel is available before transmitting again
mfiore 4:36e214ebfa56 104 osDelay(std::max((uint32_t)5000, (uint32_t)dot->getNextTxMs()));
mfiore 0:09250cd371d2 105 }
mfiore 0:09250cd371d2 106
mfiore 0:09250cd371d2 107 return 0;
mfiore 0:09250cd371d2 108 }