* working with the real modem and wakaama lib

This commit is contained in:
Dávid Danyi 2018-02-27 14:05:57 +01:00
parent e0f54a37cd
commit 1584e835cb
3 changed files with 52 additions and 41 deletions

View File

@ -1,10 +1,10 @@
cmake_minimum_required(VERSION 3.8) cmake_minimum_required(VERSION 3.8)
project(src) project(Sodaq_nbIOT)
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD 11)
set(ARDUINO_BASE_LIBDIR /opt/arduino-1.8.5) 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_USER_LIBDIR $ENV{HOME}/Arduino/libraries)
set(ARDUINO_INCLUDE_DIRS set(ARDUINO_INCLUDE_DIRS

View File

@ -20,6 +20,7 @@
#include "Sodaq_nbIOT.h" #include "Sodaq_nbIOT.h"
#include <Sodaq_wdt.h> #include <Sodaq_wdt.h>
#include <Dhcp.h>
#define DEBUG #define DEBUG
#define AT_CMD_SLEEP_TIME 10 #define AT_CMD_SLEEP_TIME 10
@ -199,11 +200,6 @@ ResponseTypes Sodaq_nbIOT::readResponse(char* buffer, size_t size,
if (sscanf(buffer, "+NSONMI: %d,%d", &param1, &param2) == 2) { if (sscanf(buffer, "+NSONMI: %d,%d", &param1, &param2) == 2) {
uint16_t socket_nr = param1; uint16_t socket_nr = param1;
uint16_t nr_bytes = param2; uint16_t nr_bytes = param2;
debugPrint("Unsolicited: Socket ");
debugPrint(socket_nr);
debugPrint(": ");
debugPrint(param2);
debugPrintLn(" bytes pending");
if (socket_nr < ARRAY_SIZE(_socketPendingBytes)) { if (socket_nr < ARRAY_SIZE(_socketPendingBytes)) {
_socketPendingBytes[socket_nr] = nr_bytes; _socketPendingBytes[socket_nr] = nr_bytes;
} }
@ -443,7 +439,7 @@ ResponseTypes Sodaq_nbIOT::_nconfigParser(ResponseTypes& response, const char* b
char name[32]; char name[32];
char value[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++) for (uint8_t i = 0; i < nConfigCount; i++)
{ {
if (strcmp(nConfig[i].Name, name) == 0) { if (strcmp(nConfig[i].Name, name) == 0) {
@ -523,28 +519,39 @@ bool Sodaq_nbIOT::connectSocket()
return false; return false;
} }
println("AT+COPS=1,2,\"21630\""); println(R"(AT+COPS=1,2,"21630")");
readResponse(); readResponse();
bool registered = false; while (!isRegistered()) {
while (!registered) {
debugPrint("Checking registration state ... ");
println("AT+CEREG?");
sodaq_wdt_safe_delay(AT_CMD_SLEEP_TIME);
if (readResponse<bool, uint8_t>(_registeredParser, &registered, NULL) != ResponseOK) {
debugPrintLn(" ... REG ERROR");
return false;
}
debugPrintLn(" ... WAITING");
sodaq_wdt_safe_delay(3000); sodaq_wdt_safe_delay(3000);
} }
debugPrintLn("REGISTRATION DONE"); 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<bool, uint8_t>(_registeredParser, &registered, NULL) != ResponseOK) {
return false; return false;
} }
debugPrintLn(registered ? F("OK") : F("WAITING"))
return registered; return registered;
} }
@ -562,7 +569,7 @@ ResponseTypes Sodaq_nbIOT::_registeredParser(ResponseTypes &response, const char
} }
int Sodaq_nbIOT::createSocket(uint16_t localPort) { int Sodaq_nbIOT::createSocket(uint16_t localPort) {
print("AT+NSOCR=\"DGRAM\",17,"); print(R"(AT+NSOCR="DGRAM",17,)");
print(localPort); print(localPort);
println(",1"); // enable incoming message URC (NSONMI) println(",1"); // enable incoming message URC (NSONMI)
delay(500); delay(500);
@ -593,7 +600,7 @@ ResponseTypes Sodaq_nbIOT::_createSocketParser(ResponseTypes &response, const ch
return ResponseError; 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("AT+NSOST=");
print(socket); print(socket);
print(",\""); print(",\"");
@ -627,7 +634,6 @@ ResponseTypes Sodaq_nbIOT::_sendSocketParser(ResponseTypes &response, const char
*sent = value; *sent = value;
return ResponseEmpty; return ResponseEmpty;
} }
SerialUSB.println(F(__FILE__"sockparserr"));
return ResponseError; return ResponseError;
} }
@ -637,22 +643,20 @@ size_t Sodaq_nbIOT::socketReceive(uint8_t socket, char *buffer, size_t size) {
print(socket); print(socket);
print(","); print(",");
println(size); println(size);
debugPrintLn(F(__FILE__": socketReceive() sent")); debugPrintLn(F(__FILE__": socketReceive() CMD"));
uint8_t size_read = 0;
if (readResponse<uint8_t, char>(_socketReceiveParser, &socket, buffer, &size) == ResponseOK) { if (readResponse<char, uint8_t>(_socketReceiveParser, buffer, &size_read, &size) == ResponseOK) {
debugPrintLn(__FILE__": socketReceive() OK"); debugPrintLn(__FILE__": socketReceive() OK");
_socketPendingBytes[socket] -= size; _socketPendingBytes[socket] -= size_read;
return size; return size_read;
} }
debugPrintLn(__FILE__": socketReceive() ERR"); debugPrintLn(__FILE__": socketReceive() ERR");
return 0; return 0;
} }
ResponseTypes Sodaq_nbIOT::_socketReceiveParser(ResponseTypes &response, const char *buffer, size_t size, ResponseTypes Sodaq_nbIOT::_socketReceiveParser(ResponseTypes &response, const char *buffer, size_t size,
uint8_t *socket, char *parsedBuffer) { char *parsedBuffer, uint8_t *size_read) {
if (!socket) {
return ResponseError;
}
int length = 0; int length = 0;
auto * resultBuffer = static_cast<char*>(malloc(250)); auto * resultBuffer = static_cast<char*>(malloc(250));
@ -666,11 +670,14 @@ ResponseTypes Sodaq_nbIOT::_socketReceiveParser(ResponseTypes &response, const c
* we probably only need half of this (+1) * we probably only need half of this (+1)
*/ */
if (sscanf(buffer, R"(%*d,"%*[^"]",%*d,%d,"%[^"]",%*d)", &length, resultBuffer) == 2) { 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++) { for(int i=0; i < length;i++) {
parsedBuffer[i] = HEX_PAIR_TO_BYTE(resultBuffer[i*2], resultBuffer[i*2+1]); parsedBuffer[i] = HEX_PAIR_TO_BYTE(resultBuffer[i*2], resultBuffer[i*2+1]);
} }
free(resultBuffer); free(resultBuffer);
SerialUSB.println(__FILE__": _socketReceiveParser() OK"); SerialUSB.println(__FILE__": _socketReceiveParser() OK");
*size_read = length;
return ResponseEmpty; return ResponseEmpty;
} }
@ -680,6 +687,7 @@ ResponseTypes Sodaq_nbIOT::_socketReceiveParser(ResponseTypes &response, const c
} }
size_t Sodaq_nbIOT::socketBytesPending(uint8_t socket) { size_t Sodaq_nbIOT::socketBytesPending(uint8_t socket) {
readResponse(NULL, 250);
return _socketPendingBytes[socket]; return _socketPendingBytes[socket];
} }

View File

@ -46,6 +46,9 @@ class Sodaq_nbIOT: public Sodaq_AT_Device
// Returns true if the modem replies to "AT" commands without timing out. // Returns true if the modem replies to "AT" commands without timing out.
bool isAlive(); bool isAlive();
// returns true if modem is registered on the network
bool isRegistered();
bool reconnectSocket();
// Returns the default baud rate of the modem. // Returns the default baud rate of the modem.
// To be used when initializing the modem stream for the first time. // 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); int createSocket(uint16_t localPort = 0);
bool connectSocket(); 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 socketReceive(uint8_t socket, char* buffer, size_t size);
size_t socketBytesPending(uint8_t socket); size_t socketBytesPending(uint8_t socket);
bool closeSocket(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, static ResponseTypes _sendSocketParser(ResponseTypes &response, const char *buffer, size_t size,
uint8_t *socket, uint8_t *sent); uint8_t *socket, uint8_t *sent);
static ResponseTypes _socketReceiveParser(ResponseTypes& response, const char* buffer, size_t size, 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 _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 _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); static ResponseTypes _nconfigParser(ResponseTypes& response, const char* buffer, size_t size, bool* nconfigEqualsArray, uint8_t* dummy);