LoRa_Miun_Lib

Dependents:   Light

Fork of LoRa_Miun_lib by BIN WANG

Committer:
biwa1400
Date:
Mon Oct 02 16:09:14 2017 +0000
Revision:
3:48209baab102
20171002

Who changed what in which revision?

UserRevisionLine numberNew contents of line
biwa1400 3:48209baab102 1 #include "MIUN.LoRa.h"
biwa1400 3:48209baab102 2 #include "mbed.h"
biwa1400 3:48209baab102 3 #include "mDot.h"
biwa1400 3:48209baab102 4 #include "MacEvents.h"
biwa1400 3:48209baab102 5 #include "MTSLog.h"
biwa1400 3:48209baab102 6 #include "MTSText.h"
biwa1400 3:48209baab102 7 #include <vector>
biwa1400 3:48209baab102 8 #include <string>
biwa1400 3:48209baab102 9
biwa1400 3:48209baab102 10
biwa1400 3:48209baab102 11 MIUN::LoRa::LoRa():macCommandEvent(*this)
biwa1400 3:48209baab102 12 {
biwa1400 3:48209baab102 13
biwa1400 3:48209baab102 14 //1. Set dot
biwa1400 3:48209baab102 15 dot = mDot::getInstance();
biwa1400 3:48209baab102 16
biwa1400 3:48209baab102 17 //2. Register Event
biwa1400 3:48209baab102 18 dot->setEvents(&macCommandEvent);
biwa1400 3:48209baab102 19
biwa1400 3:48209baab102 20 //3. getDefaultSleepTime
biwa1400 3:48209baab102 21 //defaultSleepTime = readSleepTime();
biwa1400 3:48209baab102 22 defaultSleepTime = 30; //seconds
biwa1400 3:48209baab102 23
biwa1400 3:48209baab102 24 //4. set batteryLevel
biwa1400 3:48209baab102 25 batteryLevel = 255;
biwa1400 3:48209baab102 26
biwa1400 3:48209baab102 27 //5. Print Version
biwa1400 3:48209baab102 28 logInfo("Library Version: %s", dot->getId().c_str());
biwa1400 3:48209baab102 29
biwa1400 3:48209baab102 30
biwa1400 3:48209baab102 31 }
biwa1400 3:48209baab102 32
biwa1400 3:48209baab102 33 void MIUN::LoRa::reset()
biwa1400 3:48209baab102 34 {
biwa1400 3:48209baab102 35 // start from a well-known state
biwa1400 3:48209baab102 36 logInfo("defaulting Dot configuration");
biwa1400 3:48209baab102 37 dot->resetConfig();
biwa1400 3:48209baab102 38 dot->resetNetworkSession();
biwa1400 3:48209baab102 39 }
biwa1400 3:48209baab102 40
biwa1400 3:48209baab102 41
biwa1400 3:48209baab102 42 /*** public method ***/
biwa1400 3:48209baab102 43
biwa1400 3:48209baab102 44 std::string MIUN::LoRa::receive(int* port)
biwa1400 3:48209baab102 45 {
biwa1400 3:48209baab102 46 int32_t ret;
biwa1400 3:48209baab102 47 vector<uint8_t> receive_data;
biwa1400 3:48209baab102 48 if ((ret = dot->recv(receive_data)) != mDot::MDOT_OK)
biwa1400 3:48209baab102 49 {
biwa1400 3:48209baab102 50 logError("failed to recv: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str());
biwa1400 3:48209baab102 51 return "";
biwa1400 3:48209baab102 52 }
biwa1400 3:48209baab102 53 else
biwa1400 3:48209baab102 54 {
biwa1400 3:48209baab102 55 //1. Set Receive Payload
biwa1400 3:48209baab102 56 string str(receive_data.begin(),receive_data.end());
biwa1400 3:48209baab102 57 //2. Set Receive Port
biwa1400 3:48209baab102 58 *port = receivePort;
biwa1400 3:48209baab102 59 receivePort = -1;
biwa1400 3:48209baab102 60 return str;
biwa1400 3:48209baab102 61 }
biwa1400 3:48209baab102 62 }
biwa1400 3:48209baab102 63
biwa1400 3:48209baab102 64
biwa1400 3:48209baab102 65 bool MIUN::LoRa::send_basic(std::string input_data)
biwa1400 3:48209baab102 66 {
biwa1400 3:48209baab102 67 int32_t ret;
biwa1400 3:48209baab102 68 vector<uint8_t> sent_data;
biwa1400 3:48209baab102 69 logInfo("Send with %s", dot->getDateRateDetails(dot->getTxDataRate()).c_str());
biwa1400 3:48209baab102 70 for (std::string::iterator it = input_data.begin(); it != input_data.end(); it++)
biwa1400 3:48209baab102 71 {
biwa1400 3:48209baab102 72 sent_data.push_back((uint8_t) *it);
biwa1400 3:48209baab102 73 }
biwa1400 3:48209baab102 74 std::vector<uint8_t> sendData;
biwa1400 3:48209baab102 75 sendData.push_back(0x80);
biwa1400 3:48209baab102 76 /*
biwa1400 3:48209baab102 77 for (int i=0;i<commandLength;i++)
biwa1400 3:48209baab102 78 {
biwa1400 3:48209baab102 79 sendData.push_back(command[i]);
biwa1400 3:48209baab102 80 }
biwa1400 3:48209baab102 81 */
biwa1400 3:48209baab102 82 if (dot->injectMacCommand(sendData) != mDot::MDOT_OK)
biwa1400 3:48209baab102 83 {
biwa1400 3:48209baab102 84 logError("failed to injectMacCommand");
biwa1400 3:48209baab102 85 }
biwa1400 3:48209baab102 86 else
biwa1400 3:48209baab102 87 {
biwa1400 3:48209baab102 88 logInfo("injectMacCommand Successful");
biwa1400 3:48209baab102 89 }
biwa1400 3:48209baab102 90 if ((ret = dot->send(sent_data)) != mDot::MDOT_OK)
biwa1400 3:48209baab102 91 {
biwa1400 3:48209baab102 92 logError("failed to send", ret, mDot::getReturnCodeString(ret).c_str());
biwa1400 3:48209baab102 93 return false;
biwa1400 3:48209baab102 94 }
biwa1400 3:48209baab102 95 else
biwa1400 3:48209baab102 96 {
biwa1400 3:48209baab102 97 logInfo("successfully sent data to gateway");
biwa1400 3:48209baab102 98 return true;
biwa1400 3:48209baab102 99 }
biwa1400 3:48209baab102 100
biwa1400 3:48209baab102 101 }
biwa1400 3:48209baab102 102
biwa1400 3:48209baab102 103
biwa1400 3:48209baab102 104
biwa1400 3:48209baab102 105 void MIUN::LoRa::sleep(const uint32_t& interval_s)
biwa1400 3:48209baab102 106 {
biwa1400 3:48209baab102 107 uint32_t sleep_time = std::max(interval_s*1000, (uint32_t)dot->getNextTxMs()) / 1000;
biwa1400 3:48209baab102 108 logInfo("sleep %u seconds until next free channel",sleep_time);
biwa1400 3:48209baab102 109 dot->sleep(sleep_time, mDot::RTC_ALARM, true);
biwa1400 3:48209baab102 110 }
biwa1400 3:48209baab102 111
biwa1400 3:48209baab102 112 void MIUN::LoRa::sleepWaitingNextFreeChannel()
biwa1400 3:48209baab102 113 {
biwa1400 3:48209baab102 114 uint32_t sleep_time =std::max((uint32_t)10*1000, (uint32_t)dot->getNextTxMs()) / 1000;
biwa1400 3:48209baab102 115 logInfo("sleep %u seconds until next free channel",sleep_time);
biwa1400 3:48209baab102 116 dot->sleep(sleep_time, mDot::RTC_ALARM, false);
biwa1400 3:48209baab102 117 }
biwa1400 3:48209baab102 118
biwa1400 3:48209baab102 119 void MIUN::LoRa::sleep()
biwa1400 3:48209baab102 120 {
biwa1400 3:48209baab102 121 if(sleepTime!=0)
biwa1400 3:48209baab102 122 {
biwa1400 3:48209baab102 123 sleep(sleepTime);
biwa1400 3:48209baab102 124 }
biwa1400 3:48209baab102 125 }
biwa1400 3:48209baab102 126
biwa1400 3:48209baab102 127 bool MIUN::LoRa::joinNetwork ()
biwa1400 3:48209baab102 128 {
biwa1400 3:48209baab102 129 if (!dot->getNetworkJoinStatus())
biwa1400 3:48209baab102 130 {
biwa1400 3:48209baab102 131 //1. Try Connect
biwa1400 3:48209baab102 132 if(tryConnectNet() == false)
biwa1400 3:48209baab102 133 {
biwa1400 3:48209baab102 134 return false;
biwa1400 3:48209baab102 135 }
biwa1400 3:48209baab102 136 //2. reset SF
biwa1400 3:48209baab102 137 if(dot->getAdr() == true)
biwa1400 3:48209baab102 138 {
biwa1400 3:48209baab102 139 resetSF();
biwa1400 3:48209baab102 140 }
biwa1400 3:48209baab102 141 }
biwa1400 3:48209baab102 142 return true;
biwa1400 3:48209baab102 143 }
biwa1400 3:48209baab102 144
biwa1400 3:48209baab102 145
biwa1400 3:48209baab102 146
biwa1400 3:48209baab102 147
biwa1400 3:48209baab102 148
biwa1400 3:48209baab102 149 void MIUN::LoRa::networkConfig(std::string network_name,
biwa1400 3:48209baab102 150 std::string network_passphrase,
biwa1400 3:48209baab102 151 uint8_t retransTimes,
biwa1400 3:48209baab102 152 uint8_t joinDelay,
biwa1400 3:48209baab102 153 bool ADR,
biwa1400 3:48209baab102 154 uint8_t sf)
biwa1400 3:48209baab102 155 {
biwa1400 3:48209baab102 156 //1. Reset
biwa1400 3:48209baab102 157 reset();
biwa1400 3:48209baab102 158
biwa1400 3:48209baab102 159 //2. make sure library logging is turned on
biwa1400 3:48209baab102 160 dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
biwa1400 3:48209baab102 161
biwa1400 3:48209baab102 162 //3. Change mode to AUTO_OTA
biwa1400 3:48209baab102 163 changeModeToAUTO_OTA();
biwa1400 3:48209baab102 164
biwa1400 3:48209baab102 165
biwa1400 3:48209baab102 166 //4. Change network name
biwa1400 3:48209baab102 167 changeNetworkName(network_name);
biwa1400 3:48209baab102 168
biwa1400 3:48209baab102 169 //5. Change Password
biwa1400 3:48209baab102 170 changePassword(network_passphrase);
biwa1400 3:48209baab102 171
biwa1400 3:48209baab102 172 //6. Change Ack
biwa1400 3:48209baab102 173 changeAck(retransTimes);
biwa1400 3:48209baab102 174
biwa1400 3:48209baab102 175 //7. Public Network
biwa1400 3:48209baab102 176 changePublicNetwork(true);
biwa1400 3:48209baab102 177
biwa1400 3:48209baab102 178 //8. Change Join Delay
biwa1400 3:48209baab102 179 changeJoinDelay(joinDelay);
biwa1400 3:48209baab102 180
biwa1400 3:48209baab102 181 //9. Set Adapt Datarate
biwa1400 3:48209baab102 182 changeAdaptSF(ADR);
biwa1400 3:48209baab102 183
biwa1400 3:48209baab102 184 //9. Change sf
biwa1400 3:48209baab102 185 changeSF(ADR);
biwa1400 3:48209baab102 186
biwa1400 3:48209baab102 187 //10. Save Default Time
biwa1400 3:48209baab102 188 //saveSleepTime(defaultSleepTime);
biwa1400 3:48209baab102 189
biwa1400 3:48209baab102 190 //10. Save Setting
biwa1400 3:48209baab102 191 saveSetting();
biwa1400 3:48209baab102 192
biwa1400 3:48209baab102 193
biwa1400 3:48209baab102 194 }
biwa1400 3:48209baab102 195
biwa1400 3:48209baab102 196
biwa1400 3:48209baab102 197 /*
biwa1400 3:48209baab102 198 void MIUN::LoRa::saveSleepTime(uint32_t sleepTime)
biwa1400 3:48209baab102 199 {
biwa1400 3:48209baab102 200 dot->saveUserFile("sleepTm",(void*)&sleepTime,4);
biwa1400 3:48209baab102 201 }
biwa1400 3:48209baab102 202
biwa1400 3:48209baab102 203 uint32_t MIUN::LoRa::readSleepTime()
biwa1400 3:48209baab102 204 {
biwa1400 3:48209baab102 205 uint8_t intBuffer[4];
biwa1400 3:48209baab102 206 dot->readUserFile("sleepTm",intBuffer,4);
biwa1400 3:48209baab102 207 return sleepTime = (((uint32_t)intBuffer[3])<<24)+
biwa1400 3:48209baab102 208 (((uint32_t)intBuffer[2])<<16)+
biwa1400 3:48209baab102 209 (((uint32_t)intBuffer[1])<<8)+
biwa1400 3:48209baab102 210 intBuffer[0];
biwa1400 3:48209baab102 211 }
biwa1400 3:48209baab102 212 */
biwa1400 3:48209baab102 213
biwa1400 3:48209baab102 214 bool MIUN::LoRa::checkSleepTime(uint32_t sleepTime)
biwa1400 3:48209baab102 215 {
biwa1400 3:48209baab102 216 if(sleepTime<60*60*24)
biwa1400 3:48209baab102 217 {
biwa1400 3:48209baab102 218 return true;
biwa1400 3:48209baab102 219 }
biwa1400 3:48209baab102 220 logError("Wrong Sleep Time");
biwa1400 3:48209baab102 221 return false;
biwa1400 3:48209baab102 222 }
biwa1400 3:48209baab102 223
biwa1400 3:48209baab102 224
biwa1400 3:48209baab102 225
biwa1400 3:48209baab102 226 void MIUN::LoRa::setFPending(bool isPending)
biwa1400 3:48209baab102 227 {
biwa1400 3:48209baab102 228 uint8_t macArray[50]={'\0'};
biwa1400 3:48209baab102 229 memcpy(macArray,dot->_mote.GetMac(),50);
biwa1400 3:48209baab102 230 for(int i=0;i<50;i++)
biwa1400 3:48209baab102 231 {
biwa1400 3:48209baab102 232 logError("mac: %.2x", macArray[i]);
biwa1400 3:48209baab102 233
biwa1400 3:48209baab102 234 }
biwa1400 3:48209baab102 235
biwa1400 3:48209baab102 236 }
biwa1400 3:48209baab102 237
biwa1400 3:48209baab102 238 void MIUN::LoRa::setSleepTime(uint32_t inSleepTime)
biwa1400 3:48209baab102 239 {
biwa1400 3:48209baab102 240 if(checkSleepTime(inSleepTime)==true)
biwa1400 3:48209baab102 241 {
biwa1400 3:48209baab102 242 sleepTime = inSleepTime;
biwa1400 3:48209baab102 243 logInfo("SetSleepTimeTo: %u", inSleepTime);
biwa1400 3:48209baab102 244 }
biwa1400 3:48209baab102 245
biwa1400 3:48209baab102 246 }
biwa1400 3:48209baab102 247
biwa1400 3:48209baab102 248 void MIUN::LoRa::changeSF(const uint8_t& sf)
biwa1400 3:48209baab102 249 {
biwa1400 3:48209baab102 250 uint8_t current_SF = dot->getTxDataRate();
biwa1400 3:48209baab102 251 if (current_SF != sf)
biwa1400 3:48209baab102 252 {
biwa1400 3:48209baab102 253 logInfo("changing spreading factor from %s to %s", dot->getDateRateDetails(current_SF).c_str(), dot->getDateRateDetails(sf).c_str());
biwa1400 3:48209baab102 254 if (dot->setTxDataRate(sf)!= mDot::MDOT_OK) {
biwa1400 3:48209baab102 255 logError("failed to change SF to %s", dot->getDateRateDetails(sf).c_str());
biwa1400 3:48209baab102 256 }
biwa1400 3:48209baab102 257 }
biwa1400 3:48209baab102 258 }
biwa1400 3:48209baab102 259
biwa1400 3:48209baab102 260 void MIUN::LoRa::changeAdaptSF(bool adaptSF)
biwa1400 3:48209baab102 261 {
biwa1400 3:48209baab102 262 bool current_adaptSF = dot->getAdr();
biwa1400 3:48209baab102 263 if (current_adaptSF != adaptSF)
biwa1400 3:48209baab102 264 {
biwa1400 3:48209baab102 265 logInfo("changing AdaptSF from %s to %s", current_adaptSF ? "on" : "off", adaptSF ? "on" : "off");
biwa1400 3:48209baab102 266 if (dot->setAdr(adaptSF) != mDot::MDOT_OK) {
biwa1400 3:48209baab102 267 logError("failed to set AdaptSF to %s", adaptSF ? "on" : "off");
biwa1400 3:48209baab102 268 }
biwa1400 3:48209baab102 269 }
biwa1400 3:48209baab102 270 }
biwa1400 3:48209baab102 271
biwa1400 3:48209baab102 272 void MIUN::LoRa::changePublicNetwork(bool public_network)
biwa1400 3:48209baab102 273 {
biwa1400 3:48209baab102 274 bool current_public_network = dot->getPublicNetwork();
biwa1400 3:48209baab102 275 if (current_public_network != public_network)
biwa1400 3:48209baab102 276 {
biwa1400 3:48209baab102 277 logInfo("changing public network from %s to %s", current_public_network ? "on" : "off", public_network ? "on" : "off");
biwa1400 3:48209baab102 278 if (dot->setPublicNetwork(public_network) != mDot::MDOT_OK) {
biwa1400 3:48209baab102 279 logError("failed to set public network to %s", public_network ? "on" : "off");
biwa1400 3:48209baab102 280 }
biwa1400 3:48209baab102 281 }
biwa1400 3:48209baab102 282 }
biwa1400 3:48209baab102 283
biwa1400 3:48209baab102 284 void MIUN::LoRa::changeModeToAUTO_OTA()
biwa1400 3:48209baab102 285 {
biwa1400 3:48209baab102 286 if (dot->getJoinMode() != mDot::AUTO_OTA)
biwa1400 3:48209baab102 287 {
biwa1400 3:48209baab102 288 logInfo("changing network join mode to AUTO_OTA");
biwa1400 3:48209baab102 289 if (dot->setJoinMode(mDot::AUTO_OTA) != mDot::MDOT_OK)
biwa1400 3:48209baab102 290 {
biwa1400 3:48209baab102 291 logError("failed to set network join mode to AUTO_OTA");
biwa1400 3:48209baab102 292 }
biwa1400 3:48209baab102 293 }
biwa1400 3:48209baab102 294 }
biwa1400 3:48209baab102 295
biwa1400 3:48209baab102 296 void MIUN::LoRa::changePassword(const std::string& network_passphrase)
biwa1400 3:48209baab102 297 {
biwa1400 3:48209baab102 298 std::string current_network_passphrase = dot->getNetworkPassphrase();
biwa1400 3:48209baab102 299 if (current_network_passphrase != network_passphrase)
biwa1400 3:48209baab102 300 {
biwa1400 3:48209baab102 301 logInfo("changing network passphrase from \"%s\" to \"%s\"", current_network_passphrase.c_str(), network_passphrase.c_str());
biwa1400 3:48209baab102 302 if (dot->setNetworkPassphrase(network_passphrase) != mDot::MDOT_OK)
biwa1400 3:48209baab102 303 {
biwa1400 3:48209baab102 304 logError("failed to set network passphrase to \"%s\"", network_passphrase.c_str());
biwa1400 3:48209baab102 305 }
biwa1400 3:48209baab102 306 }
biwa1400 3:48209baab102 307 }
biwa1400 3:48209baab102 308
biwa1400 3:48209baab102 309 void MIUN::LoRa::changeNetworkName(const std::string& network_name)
biwa1400 3:48209baab102 310 {
biwa1400 3:48209baab102 311 std::string current_network_name = dot->getNetworkName();
biwa1400 3:48209baab102 312 if (current_network_name != network_name)
biwa1400 3:48209baab102 313 {
biwa1400 3:48209baab102 314 if (current_network_name != network_name)
biwa1400 3:48209baab102 315 {
biwa1400 3:48209baab102 316 logInfo("changing network name from \"%s\" to \"%s\"", current_network_name.c_str(), network_name.c_str());
biwa1400 3:48209baab102 317 if (dot->setNetworkName(network_name) != mDot::MDOT_OK) {
biwa1400 3:48209baab102 318 logError("failed to set network name to \"%s\"", network_name.c_str());
biwa1400 3:48209baab102 319 }
biwa1400 3:48209baab102 320 }
biwa1400 3:48209baab102 321 }
biwa1400 3:48209baab102 322 }
biwa1400 3:48209baab102 323
biwa1400 3:48209baab102 324 void MIUN::LoRa::changeJoinDelay(uint8_t joinDelay)
biwa1400 3:48209baab102 325 {
biwa1400 3:48209baab102 326 logInfo("changing join delay");
biwa1400 3:48209baab102 327 if (dot->setJoinDelay(joinDelay) != mDot::MDOT_OK)
biwa1400 3:48209baab102 328 {
biwa1400 3:48209baab102 329 logError("failed to set join delay to %u", joinDelay);
biwa1400 3:48209baab102 330 }
biwa1400 3:48209baab102 331 }
biwa1400 3:48209baab102 332
biwa1400 3:48209baab102 333 void MIUN::LoRa::changeAck(const uint8_t& retries)
biwa1400 3:48209baab102 334 {
biwa1400 3:48209baab102 335 logInfo("Set Ack to %u", retries);
biwa1400 3:48209baab102 336 if (dot->setAck(retries) != mDot::MDOT_OK) {
biwa1400 3:48209baab102 337 logError("failed to set Ack to %u", retries);
biwa1400 3:48209baab102 338 }
biwa1400 3:48209baab102 339 }
biwa1400 3:48209baab102 340
biwa1400 3:48209baab102 341
biwa1400 3:48209baab102 342
biwa1400 3:48209baab102 343 void MIUN::LoRa::saveSetting()
biwa1400 3:48209baab102 344 {
biwa1400 3:48209baab102 345 logInfo("saving configuration");
biwa1400 3:48209baab102 346 if (!dot->saveConfig())
biwa1400 3:48209baab102 347 {
biwa1400 3:48209baab102 348 logError("failed to save configuration");
biwa1400 3:48209baab102 349 }
biwa1400 3:48209baab102 350 }
biwa1400 3:48209baab102 351
biwa1400 3:48209baab102 352 void MIUN::LoRa::showInfo()
biwa1400 3:48209baab102 353 {
biwa1400 3:48209baab102 354 // display configuration and library version information
biwa1400 3:48209baab102 355 logInfo("=====================");
biwa1400 3:48209baab102 356 logInfo("general configuration");
biwa1400 3:48209baab102 357 logInfo("=====================");
biwa1400 3:48209baab102 358 logInfo("version ------------------ %s", dot->getId().c_str());
biwa1400 3:48209baab102 359 logInfo("device ID/EUI ------------ %s", mts::Text::bin2hexString(dot->getDeviceId()).c_str());
biwa1400 3:48209baab102 360 logInfo("frequency band ----------- %s", mDot::FrequencyBandStr(dot->getFrequencyBand()).c_str());
biwa1400 3:48209baab102 361 if (dot->getFrequencySubBand() != mDot::FB_EU868) {
biwa1400 3:48209baab102 362 logInfo("frequency sub band ------- %u", dot->getFrequencySubBand());
biwa1400 3:48209baab102 363 }
biwa1400 3:48209baab102 364 logInfo("public network ----------- %s", dot->getPublicNetwork() ? "on" : "off");
biwa1400 3:48209baab102 365 logInfo("=========================");
biwa1400 3:48209baab102 366 logInfo("credentials configuration");
biwa1400 3:48209baab102 367 logInfo("=========================");
biwa1400 3:48209baab102 368 logInfo("device class ------------- %s", dot->getClass().c_str());
biwa1400 3:48209baab102 369 logInfo("network join mode -------- %s", mDot::JoinModeStr(dot->getJoinMode()).c_str());
biwa1400 3:48209baab102 370 if (dot->getJoinMode() == mDot::MANUAL || dot->getJoinMode() == mDot::PEER_TO_PEER) {
biwa1400 3:48209baab102 371 logInfo("network address ---------- %s", mts::Text::bin2hexString(dot->getNetworkAddress()).c_str());
biwa1400 3:48209baab102 372 logInfo("network session key------- %s", mts::Text::bin2hexString(dot->getNetworkSessionKey()).c_str());
biwa1400 3:48209baab102 373 logInfo("data session key---------- %s", mts::Text::bin2hexString(dot->getDataSessionKey()).c_str());
biwa1400 3:48209baab102 374 } else {
biwa1400 3:48209baab102 375 logInfo("network name ------------- %s", dot->getNetworkName().c_str());
biwa1400 3:48209baab102 376 logInfo("network phrase ----------- %s", dot->getNetworkPassphrase().c_str());
biwa1400 3:48209baab102 377 logInfo("network EUI -------------- %s", mts::Text::bin2hexString(dot->getNetworkId()).c_str());
biwa1400 3:48209baab102 378 logInfo("network KEY -------------- %s", mts::Text::bin2hexString(dot->getNetworkKey()).c_str());
biwa1400 3:48209baab102 379
biwa1400 3:48209baab102 380 logInfo("session NWK KEY -------------- %s", mts::Text::bin2hexString(dot->getNetworkSessionKey()).c_str());
biwa1400 3:48209baab102 381 logInfo("session APP KEY -------------- %s", mts::Text::bin2hexString(dot->getDataSessionKey()).c_str());
biwa1400 3:48209baab102 382 }
biwa1400 3:48209baab102 383 logInfo("========================");
biwa1400 3:48209baab102 384 logInfo("communication parameters");
biwa1400 3:48209baab102 385 logInfo("========================");
biwa1400 3:48209baab102 386 if (dot->getJoinMode() == mDot::PEER_TO_PEER) {
biwa1400 3:48209baab102 387 logInfo("TX frequency ------------- %lu", dot->getTxFrequency());
biwa1400 3:48209baab102 388 } else {
biwa1400 3:48209baab102 389 logInfo("acks --------------------- %s, %u attempts", dot->getAck() > 0 ? "on" : "off", dot->getAck());
biwa1400 3:48209baab102 390 }
biwa1400 3:48209baab102 391 logInfo("TX datarate -------------- %s", mDot::DataRateStr(dot->getTxDataRate()).c_str());
biwa1400 3:48209baab102 392 logInfo("TX power ----------------- %lu dBm", dot->getTxPower());
biwa1400 3:48209baab102 393 logInfo("atnenna gain ------------- %u dBm", dot->getAntennaGain());
biwa1400 3:48209baab102 394 logInfo("channels -------------");
biwa1400 3:48209baab102 395 std::vector<uint32_t>::iterator channelItreator;
biwa1400 3:48209baab102 396 uint32_t i=0;
biwa1400 3:48209baab102 397 for(channelItreator = dot->getChannels().begin();channelItreator!=dot->getChannels().end();channelItreator++)
biwa1400 3:48209baab102 398 {
biwa1400 3:48209baab102 399 logInfo("channel(%u) ------------- %u Hz",i++,*channelItreator);
biwa1400 3:48209baab102 400 }
biwa1400 3:48209baab102 401 }
biwa1400 3:48209baab102 402
biwa1400 3:48209baab102 403
biwa1400 3:48209baab102 404
biwa1400 3:48209baab102 405
biwa1400 3:48209baab102 406
biwa1400 3:48209baab102 407 mDot& MIUN::LoRa::getHandler()
biwa1400 3:48209baab102 408 {
biwa1400 3:48209baab102 409 return *dot;
biwa1400 3:48209baab102 410 }
biwa1400 3:48209baab102 411
biwa1400 3:48209baab102 412 /*** private function ***/
biwa1400 3:48209baab102 413
biwa1400 3:48209baab102 414 bool MIUN::LoRa::tryConnectNet()
biwa1400 3:48209baab102 415 {
biwa1400 3:48209baab102 416 int32_t j_attempts = 0;
biwa1400 3:48209baab102 417 int32_t ret = mDot::MDOT_ERROR;
biwa1400 3:48209baab102 418
biwa1400 3:48209baab102 419 // attempt to join the network
biwa1400 3:48209baab102 420 while (ret != mDot::MDOT_OK)
biwa1400 3:48209baab102 421 {
biwa1400 3:48209baab102 422 logInfo("attempt %d to join network", ++j_attempts);
biwa1400 3:48209baab102 423 ret = dot->joinNetwork();
biwa1400 3:48209baab102 424 if (ret != mDot::MDOT_OK) {
biwa1400 3:48209baab102 425 logError("failed to join network %d:%s It will retry...", ret, mDot::getReturnCodeString(ret).c_str());
biwa1400 3:48209baab102 426 // in some frequency bands we need to wait until another channel is available before transmitting again
biwa1400 3:48209baab102 427 uint32_t delay_s = (dot->getNextTxMs() / 1000) + 1;
biwa1400 3:48209baab102 428 if (delay_s < 2)
biwa1400 3:48209baab102 429 {
biwa1400 3:48209baab102 430 logInfo("waiting %lu s until next free channel", delay_s);
biwa1400 3:48209baab102 431 wait(delay_s);
biwa1400 3:48209baab102 432 } else {
biwa1400 3:48209baab102 433 logInfo("sleeping %lu s until next free channel", delay_s);
biwa1400 3:48209baab102 434 sleep(delay_s);
biwa1400 3:48209baab102 435 }
biwa1400 3:48209baab102 436 }
biwa1400 3:48209baab102 437
biwa1400 3:48209baab102 438 if(j_attempts >3)
biwa1400 3:48209baab102 439 {
biwa1400 3:48209baab102 440 logError("failed to join network %d:%s, give up.", ret, mDot::getReturnCodeString(ret).c_str());
biwa1400 3:48209baab102 441 return false;
biwa1400 3:48209baab102 442 }
biwa1400 3:48209baab102 443 }
biwa1400 3:48209baab102 444 return true;
biwa1400 3:48209baab102 445 }
biwa1400 3:48209baab102 446
biwa1400 3:48209baab102 447
biwa1400 3:48209baab102 448
biwa1400 3:48209baab102 449 bool MIUN::LoRa::send(std::string input_data, int port)
biwa1400 3:48209baab102 450 {
biwa1400 3:48209baab102 451 //1. Set Port
biwa1400 3:48209baab102 452 dot->setAppPort(port);
biwa1400 3:48209baab102 453 //1. if it use ADR
biwa1400 3:48209baab102 454 if(dot->getAdr() == true)
biwa1400 3:48209baab102 455 {
biwa1400 3:48209baab102 456 int i=0;
biwa1400 3:48209baab102 457 while(!send_basic(input_data))
biwa1400 3:48209baab102 458 {
biwa1400 3:48209baab102 459 i++;
biwa1400 3:48209baab102 460 if(i>3)
biwa1400 3:48209baab102 461 {
biwa1400 3:48209baab102 462 // 1. increase SF
biwa1400 3:48209baab102 463 if(increaseSF()==false)
biwa1400 3:48209baab102 464 {
biwa1400 3:48209baab102 465 //1. Clean Network Session
biwa1400 3:48209baab102 466 dot->resetNetworkSession();
biwa1400 3:48209baab102 467 //2. Reset SF
biwa1400 3:48209baab102 468 resetSF();
biwa1400 3:48209baab102 469 tryConnectNet();
biwa1400 3:48209baab102 470 return false;
biwa1400 3:48209baab102 471 }
biwa1400 3:48209baab102 472 }
biwa1400 3:48209baab102 473 sleepWaitingNextFreeChannel();
biwa1400 3:48209baab102 474 }
biwa1400 3:48209baab102 475
biwa1400 3:48209baab102 476 }
biwa1400 3:48209baab102 477 else
biwa1400 3:48209baab102 478 {
biwa1400 3:48209baab102 479 return send_basic(input_data);
biwa1400 3:48209baab102 480 }
biwa1400 3:48209baab102 481 return true;
biwa1400 3:48209baab102 482 }
biwa1400 3:48209baab102 483
biwa1400 3:48209baab102 484
biwa1400 3:48209baab102 485 bool MIUN::LoRa::increaseSF()
biwa1400 3:48209baab102 486 {
biwa1400 3:48209baab102 487 uint8_t current_SF = dot->getTxDataRate();
biwa1400 3:48209baab102 488 if(current_SF>0)
biwa1400 3:48209baab102 489 {
biwa1400 3:48209baab102 490 changeSF(--current_SF);
biwa1400 3:48209baab102 491 return true;
biwa1400 3:48209baab102 492 }
biwa1400 3:48209baab102 493 return false;
biwa1400 3:48209baab102 494 }
biwa1400 3:48209baab102 495
biwa1400 3:48209baab102 496 bool MIUN::LoRa::decreaseSF()
biwa1400 3:48209baab102 497 {
biwa1400 3:48209baab102 498 uint8_t current_SF = dot->getTxDataRate();
biwa1400 3:48209baab102 499 if(current_SF<5)
biwa1400 3:48209baab102 500 {
biwa1400 3:48209baab102 501 changeSF(++current_SF);
biwa1400 3:48209baab102 502 return true;
biwa1400 3:48209baab102 503 }
biwa1400 3:48209baab102 504 return false;
biwa1400 3:48209baab102 505 }
biwa1400 3:48209baab102 506
biwa1400 3:48209baab102 507 void MIUN::LoRa::resetSF()
biwa1400 3:48209baab102 508 {
biwa1400 3:48209baab102 509 changeSF(5);
biwa1400 3:48209baab102 510 }
biwa1400 3:48209baab102 511
biwa1400 3:48209baab102 512
biwa1400 3:48209baab102 513 void MIUN::LoRa::setBatteryLevel(uint8_t batteryLevelValue)
biwa1400 3:48209baab102 514 {
biwa1400 3:48209baab102 515 batteryLevel = batteryLevelValue;
biwa1400 3:48209baab102 516 }
biwa1400 3:48209baab102 517
biwa1400 3:48209baab102 518
biwa1400 3:48209baab102 519
biwa1400 3:48209baab102 520
biwa1400 3:48209baab102 521
biwa1400 3:48209baab102 522
biwa1400 3:48209baab102 523
biwa1400 3:48209baab102 524
biwa1400 3:48209baab102 525 MIUN::MacCommandEvent::MacCommandEvent(LoRa& loraHandle):loraHandle(loraHandle)
biwa1400 3:48209baab102 526 {
biwa1400 3:48209baab102 527 }
biwa1400 3:48209baab102 528
biwa1400 3:48209baab102 529 void MIUN::MacCommandEvent::RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot)
biwa1400 3:48209baab102 530 {
biwa1400 3:48209baab102 531 /*
biwa1400 3:48209baab102 532 for(int i=0;i<20;i++)
biwa1400 3:48209baab102 533 {
biwa1400 3:48209baab102 534 logInfo("Payload %.2x", payload[i]);
biwa1400 3:48209baab102 535 }
biwa1400 3:48209baab102 536 */
biwa1400 3:48209baab102 537 if(payload[0] == 0xa0 || payload[0] == 0x60)
biwa1400 3:48209baab102 538 {
biwa1400 3:48209baab102 539 //1. Process Mac Command
biwa1400 3:48209baab102 540 int macCommandLength = payload[5] & 0x0f;
biwa1400 3:48209baab102 541 if(macCommandLength>0)
biwa1400 3:48209baab102 542 {
biwa1400 3:48209baab102 543 uint8_t macCommand[macCommandLength];
biwa1400 3:48209baab102 544 memcpy(macCommand,payload+8,macCommandLength);
biwa1400 3:48209baab102 545
biwa1400 3:48209baab102 546 for(int i=0;i<macCommandLength;i++)
biwa1400 3:48209baab102 547 {
biwa1400 3:48209baab102 548 logInfo("Mac Command: %.2x", macCommand[i]);
biwa1400 3:48209baab102 549 }
biwa1400 3:48209baab102 550
biwa1400 3:48209baab102 551 switch(macCommand[0])
biwa1400 3:48209baab102 552 {
biwa1400 3:48209baab102 553 case decreaseSF:
biwa1400 3:48209baab102 554 if(macCommandLength == decreaseSF_length)
biwa1400 3:48209baab102 555 {
biwa1400 3:48209baab102 556 processSFDecrease(macCommand);
biwa1400 3:48209baab102 557 }
biwa1400 3:48209baab102 558 break;
biwa1400 3:48209baab102 559
biwa1400 3:48209baab102 560 case increaseSF:
biwa1400 3:48209baab102 561 if(macCommandLength == increaseSF_length)
biwa1400 3:48209baab102 562 {
biwa1400 3:48209baab102 563 processSFIncrease(macCommand);
biwa1400 3:48209baab102 564 }
biwa1400 3:48209baab102 565 break;
biwa1400 3:48209baab102 566
biwa1400 3:48209baab102 567 case changeSleepTime:
biwa1400 3:48209baab102 568 if(macCommandLength == changeSleepTime_length)
biwa1400 3:48209baab102 569 {
biwa1400 3:48209baab102 570 processChangeSleepTm(macCommand);
biwa1400 3:48209baab102 571 }
biwa1400 3:48209baab102 572 break;
biwa1400 3:48209baab102 573
biwa1400 3:48209baab102 574 }
biwa1400 3:48209baab102 575 }
biwa1400 3:48209baab102 576
biwa1400 3:48209baab102 577 //2. Receive Port
biwa1400 3:48209baab102 578 if((size-12-macCommandLength)>0)
biwa1400 3:48209baab102 579 {
biwa1400 3:48209baab102 580 loraHandle.receivePort = payload[8+macCommandLength];
biwa1400 3:48209baab102 581 }
biwa1400 3:48209baab102 582 else
biwa1400 3:48209baab102 583 {
biwa1400 3:48209baab102 584 loraHandle.receivePort = -1;
biwa1400 3:48209baab102 585 }
biwa1400 3:48209baab102 586 }
biwa1400 3:48209baab102 587 }
biwa1400 3:48209baab102 588
biwa1400 3:48209baab102 589 void MIUN::MacCommandEvent::processChangeSleepTm(uint8_t *macCommand)
biwa1400 3:48209baab102 590 {
biwa1400 3:48209baab102 591
biwa1400 3:48209baab102 592 uint32_t sleepTime_s = (((uint32_t)macCommand[4])<<24)+
biwa1400 3:48209baab102 593 (((uint32_t)macCommand[3])<<16)+
biwa1400 3:48209baab102 594 (((uint32_t)macCommand[2])<<8)+
biwa1400 3:48209baab102 595 macCommand[1];
biwa1400 3:48209baab102 596 logInfo("Change Sleep Time: %u", sleepTime_s);
biwa1400 3:48209baab102 597 loraHandle.setSleepTime(sleepTime_s);
biwa1400 3:48209baab102 598
biwa1400 3:48209baab102 599 }
biwa1400 3:48209baab102 600
biwa1400 3:48209baab102 601 void MIUN::MacCommandEvent::processSFDecrease(uint8_t *payload)
biwa1400 3:48209baab102 602 {
biwa1400 3:48209baab102 603 loraHandle.decreaseSF();
biwa1400 3:48209baab102 604 }
biwa1400 3:48209baab102 605
biwa1400 3:48209baab102 606 void MIUN::MacCommandEvent::processSFIncrease(uint8_t *payload)
biwa1400 3:48209baab102 607 {
biwa1400 3:48209baab102 608 loraHandle.increaseSF();
biwa1400 3:48209baab102 609 }
biwa1400 3:48209baab102 610
biwa1400 3:48209baab102 611 uint8_t MIUN::MacCommandEvent::MeasureBattery()
biwa1400 3:48209baab102 612 {
biwa1400 3:48209baab102 613 return loraHandle.batteryLevel;
biwa1400 3:48209baab102 614 }
biwa1400 3:48209baab102 615
biwa1400 3:48209baab102 616