* 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)
|
||||
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
|
||||
|
||||
@ -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", ¶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<bool, uint8_t>(_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<bool, uint8_t>(_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<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];
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user