From 1584e835cb5f91985b542e9f64b5e97203591be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Danyi?= Date: Tue, 27 Feb 2018 14:05:57 +0100 Subject: [PATCH] * working with the real modem and wakaama lib --- src/CMakeLists.txt | 4 +-- src/Sodaq_nbIOT.cpp | 82 +++++++++++++++++++++++++-------------------- src/Sodaq_nbIOT.h | 7 ++-- 3 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9cea89b..1df1a78 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.8) -project(src) +project(Sodaq_nbIOT) set(CMAKE_CXX_STANDARD 11) set(ARDUINO_BASE_LIBDIR /opt/arduino-1.8.5) -set(ARDUINO_SAMD_DIR $ENV{HOME}/.arduino15/packages/arduino/hardware/samd/1.6.16) +set(ARDUINO_SAMD_DIR $ENV{HOME}/.arduino15/packages/arduino/hardware/samd/1.6.17) set(ARDUINO_USER_LIBDIR $ENV{HOME}/Arduino/libraries) set(ARDUINO_INCLUDE_DIRS diff --git a/src/Sodaq_nbIOT.cpp b/src/Sodaq_nbIOT.cpp index df08249..100d155 100644 --- a/src/Sodaq_nbIOT.cpp +++ b/src/Sodaq_nbIOT.cpp @@ -20,6 +20,7 @@ #include "Sodaq_nbIOT.h" #include +#include #define DEBUG #define AT_CMD_SLEEP_TIME 10 @@ -197,18 +198,13 @@ ResponseTypes Sodaq_nbIOT::readResponse(char* buffer, size_t size, // TODO handle socket URC int param1, param2; if (sscanf(buffer, "+NSONMI: %d,%d", ¶m1, ¶m2) == 2) { - uint16_t socket_nr = param1; - uint16_t nr_bytes = param2; - debugPrint("Unsolicited: Socket "); - debugPrint(socket_nr); - debugPrint(": "); - debugPrint(param2); - debugPrintLn(" bytes pending"); - if (socket_nr < ARRAY_SIZE(_socketPendingBytes)) { - _socketPendingBytes[socket_nr] = nr_bytes; - } - continue; + uint16_t socket_nr = param1; + uint16_t nr_bytes = param2; + if (socket_nr < ARRAY_SIZE(_socketPendingBytes)) { + _socketPendingBytes[socket_nr] = nr_bytes; } + continue; + } //int param1, param2; //if (sscanf(buffer, "+UUSORD: %d,%d", ¶m1, ¶m2) == 2) { // uint16_t socket_nr = param1; @@ -443,7 +439,7 @@ ResponseTypes Sodaq_nbIOT::_nconfigParser(ResponseTypes& response, const char* b char name[32]; char value[32]; - if (sscanf(buffer, "+NCONFIG: \"%[^\"]\",\"%[^\"]\"", name, value) == 2) { + if (sscanf(buffer, R"(+NCONFIG: "%[^"]","%[^"]")", name, value) == 2) { for (uint8_t i = 0; i < nConfigCount; i++) { if (strcmp(nConfig[i].Name, name) == 0) { @@ -523,28 +519,39 @@ bool Sodaq_nbIOT::connectSocket() return false; } - println("AT+COPS=1,2,\"21630\""); + println(R"(AT+COPS=1,2,"21630")"); readResponse(); - bool registered = false; - while (!registered) { - debugPrint("Checking registration state ... "); - println("AT+CEREG?"); - sodaq_wdt_safe_delay(AT_CMD_SLEEP_TIME); - - if (readResponse(_registeredParser, ®istered, NULL) != ResponseOK) { - debugPrintLn(" ... REG ERROR"); - return false; - } - debugPrintLn(" ... WAITING"); + while (!isRegistered()) { sodaq_wdt_safe_delay(3000); } debugPrintLn("REGISTRATION DONE"); - if (!waitForSignalQuality()) { + return waitForSignalQuality(); +} + +bool Sodaq_nbIOT::reconnectSocket() { + println(R"(AT+COPS=1,2,"21630")"); + readResponse(); + + while (!isRegistered()) { + sodaq_wdt_safe_delay(3000); + } + debugPrintLn("REGISTRATION DONE"); + + return waitForSignalQuality(); +} + +bool Sodaq_nbIOT::isRegistered() { + bool registered = false; + debugPrintLn("Checking registration state ... "); + println("AT+CEREG?"); + sodaq_wdt_safe_delay(AT_CMD_SLEEP_TIME); + + if (readResponse(_registeredParser, ®istered, NULL) != ResponseOK) { return false; } - + debugPrintLn(registered ? F("OK") : F("WAITING")) return registered; } @@ -562,7 +569,7 @@ ResponseTypes Sodaq_nbIOT::_registeredParser(ResponseTypes &response, const char } int Sodaq_nbIOT::createSocket(uint16_t localPort) { - print("AT+NSOCR=\"DGRAM\",17,"); + print(R"(AT+NSOCR="DGRAM",17,)"); print(localPort); println(",1"); // enable incoming message URC (NSONMI) delay(500); @@ -593,7 +600,7 @@ ResponseTypes Sodaq_nbIOT::_createSocketParser(ResponseTypes &response, const ch return ResponseError; } -bool Sodaq_nbIOT::sendSocket(uint8_t socket, const char *host, uint16_t port, const char *buffer, size_t size) { +bool Sodaq_nbIOT::sendSocket(uint8_t socket, const char *host, uint16_t port, uint8_t *buffer, size_t size) { print("AT+NSOST="); print(socket); print(",\""); @@ -627,7 +634,6 @@ ResponseTypes Sodaq_nbIOT::_sendSocketParser(ResponseTypes &response, const char *sent = value; return ResponseEmpty; } - SerialUSB.println(F(__FILE__"sockparserr")); return ResponseError; } @@ -637,22 +643,20 @@ size_t Sodaq_nbIOT::socketReceive(uint8_t socket, char *buffer, size_t size) { print(socket); print(","); println(size); - debugPrintLn(F(__FILE__": socketReceive() sent")); + debugPrintLn(F(__FILE__": socketReceive() CMD")); + uint8_t size_read = 0; - if (readResponse(_socketReceiveParser, &socket, buffer, &size) == ResponseOK) { + if (readResponse(_socketReceiveParser, buffer, &size_read, &size) == ResponseOK) { debugPrintLn(__FILE__": socketReceive() OK"); - _socketPendingBytes[socket] -= size; - return size; + _socketPendingBytes[socket] -= size_read; + return size_read; } debugPrintLn(__FILE__": socketReceive() ERR"); return 0; } ResponseTypes Sodaq_nbIOT::_socketReceiveParser(ResponseTypes &response, const char *buffer, size_t size, - uint8_t *socket, char *parsedBuffer) { - if (!socket) { - return ResponseError; - } + char *parsedBuffer, uint8_t *size_read) { int length = 0; auto * resultBuffer = static_cast(malloc(250)); @@ -666,11 +670,14 @@ ResponseTypes Sodaq_nbIOT::_socketReceiveParser(ResponseTypes &response, const c * we probably only need half of this (+1) */ if (sscanf(buffer, R"(%*d,"%*[^"]",%*d,%d,"%[^"]",%*d)", &length, resultBuffer) == 2) { + SerialUSB.print(__FILE__": length "); + SerialUSB.println(length); for(int i=0; i < length;i++) { parsedBuffer[i] = HEX_PAIR_TO_BYTE(resultBuffer[i*2], resultBuffer[i*2+1]); } free(resultBuffer); SerialUSB.println(__FILE__": _socketReceiveParser() OK"); + *size_read = length; return ResponseEmpty; } @@ -680,6 +687,7 @@ ResponseTypes Sodaq_nbIOT::_socketReceiveParser(ResponseTypes &response, const c } size_t Sodaq_nbIOT::socketBytesPending(uint8_t socket) { + readResponse(NULL, 250); return _socketPendingBytes[socket]; } diff --git a/src/Sodaq_nbIOT.h b/src/Sodaq_nbIOT.h index 412ede2..6c77259 100644 --- a/src/Sodaq_nbIOT.h +++ b/src/Sodaq_nbIOT.h @@ -46,6 +46,9 @@ class Sodaq_nbIOT: public Sodaq_AT_Device // Returns true if the modem replies to "AT" commands without timing out. bool isAlive(); + // returns true if modem is registered on the network + bool isRegistered(); + bool reconnectSocket(); // Returns the default baud rate of the modem. // To be used when initializing the modem stream for the first time. @@ -77,7 +80,7 @@ class Sodaq_nbIOT: public Sodaq_AT_Device int createSocket(uint16_t localPort = 0); bool connectSocket(); - bool sendSocket(uint8_t socket, const char *host, uint16_t port, const char *buffer, size_t size); + bool sendSocket(uint8_t socket, const char *host, uint16_t port, uint8_t *buffer, size_t size); size_t socketReceive(uint8_t socket, char* buffer, size_t size); size_t socketBytesPending(uint8_t socket); bool closeSocket(uint8_t socket); @@ -160,7 +163,7 @@ class Sodaq_nbIOT: public Sodaq_AT_Device static ResponseTypes _sendSocketParser(ResponseTypes &response, const char *buffer, size_t size, uint8_t *socket, uint8_t *sent); static ResponseTypes _socketReceiveParser(ResponseTypes& response, const char* buffer, size_t size, - uint8_t* socket, char* parsedBuffer); + char* parsedBuffer, uint8_t *size_read); static ResponseTypes _nqmgsParser(ResponseTypes& response, const char* buffer, size_t size, uint16_t* pendingCount, uint16_t* errorCount); static ResponseTypes _cgattParser(ResponseTypes& response, const char* buffer, size_t size, uint8_t* result, uint8_t* dummy); static ResponseTypes _nconfigParser(ResponseTypes& response, const char* buffer, size_t size, bool* nconfigEqualsArray, uint8_t* dummy);