* working with the real modem and wakaama lib
This commit is contained in:
parent
e0f54a37cd
commit
1584e835cb
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
@ -197,18 +198,13 @@ ResponseTypes Sodaq_nbIOT::readResponse(char* buffer, size_t size,
|
|||||||
// TODO handle socket URC
|
// TODO handle socket URC
|
||||||
int param1, param2;
|
int param1, param2;
|
||||||
if (sscanf(buffer, "+NSONMI: %d,%d", ¶m1, ¶m2) == 2) {
|
if (sscanf(buffer, "+NSONMI: %d,%d", ¶m1, ¶m2) == 2) {
|
||||||
uint16_t socket_nr = param1;
|
uint16_t socket_nr = param1;
|
||||||
uint16_t nr_bytes = param2;
|
uint16_t nr_bytes = param2;
|
||||||
debugPrint("Unsolicited: Socket ");
|
if (socket_nr < ARRAY_SIZE(_socketPendingBytes)) {
|
||||||
debugPrint(socket_nr);
|
_socketPendingBytes[socket_nr] = nr_bytes;
|
||||||
debugPrint(": ");
|
|
||||||
debugPrint(param2);
|
|
||||||
debugPrintLn(" bytes pending");
|
|
||||||
if (socket_nr < ARRAY_SIZE(_socketPendingBytes)) {
|
|
||||||
_socketPendingBytes[socket_nr] = nr_bytes;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//int param1, param2;
|
//int param1, param2;
|
||||||
//if (sscanf(buffer, "+UUSORD: %d,%d", ¶m1, ¶m2) == 2) {
|
//if (sscanf(buffer, "+UUSORD: %d,%d", ¶m1, ¶m2) == 2) {
|
||||||
// uint16_t socket_nr = param1;
|
// uint16_t socket_nr = param1;
|
||||||
@ -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, ®istered, 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, ®istered, 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];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user