* 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)
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

View File

@ -20,6 +20,7 @@
#include "Sodaq_nbIOT.h"
#include <Sodaq_wdt.h>
#include <Dhcp.h>
#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", &param1, &param2) == 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", &param1, &param2) == 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<bool, uint8_t>(_registeredParser, &registered, 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<bool, uint8_t>(_registeredParser, &registered, 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<uint8_t, char>(_socketReceiveParser, &socket, buffer, &size) == ResponseOK) {
if (readResponse<char, uint8_t>(_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<char*>(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];
}

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.
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);