The program sends the current location over the cellular network.
Dependencies: aconno_I2C ublox-at-cellular-interface gnss ublox-cellular-base Lis2dh12 ublox-cellular-base-n2xx ublox-at-cellular-interface-n2xx low-power-sleep
Fork of example-gnss by
UBloxSara/uBloxSara.cpp
- Committer:
- jurica238814
- Date:
- 2018-11-30
- Revision:
- 8:2bf886335fd0
- Child:
- 9:f943c09d9173
File content as of revision 8:2bf886335fd0:
/**
* U-Blox SARA nb-iot module class
* Made by Jurica Resetar @ aconno
* More info @ aconno.de
*/
#include "mbed.h"
#include "uBloxSara.h"
#include "udp.h"
#include "onboard_modem_api.h"
UBloxSara::UBloxSara(ATCmdParser *at, Udp udp):
_at(at), _udp(udp)
{
}
bool UBloxSara::setup()
{
bool success = false;
/* Initialize GPIO lines */
onboard_modem_init();
/* Give modem a little time to settle down */
wait_ms(250);
printf("Powering up the modem...\r\n");
//onboard_modem_power_up();
wait_ms(5000);
sendCommand("AT+CFUN=1");
// Set AT parser timeout to 1sec for AT OK check
_at->set_timeout(1000);
return true;
printf("Checking for AT response from the modem\r\n");
for (int retry_count = 0; !success && (retry_count < 20); retry_count++)
{
printf("...wait\r\n");
// The modem tends to sends out some garbage during power up.
_at->flush();
// AT OK talk to the modem
if (_at->send("AT")) {
wait_ms(100);
if (_at->recv("OK")) {
success = true;
}
}
}
// Increase the parser time to 8 sec
_at->set_timeout(8000);
if (success)
{
printf("Configuring the modem...\r\n");
// Turn off modem echoing and turn on verbose responses
//success = _at->send("AT+CMEE=1");
}
return success;
}
void UBloxSara::sendCommand(char *command)
{
char buffer[505];
for (int i=0; i<505; i++)buffer[i]=0;
printf("Sending the following command:");
printf(command);
printf("\r\n");
if (!_at->send(command)) {
printf("Failed!\r\n");
return;
}
printf("Response:\r\n");
_at->read(buffer,500);
printf(buffer);
printf ("\r\n");
}
void UBloxSara::checkNetworkStatus(char *response)
{
char command[] = "AT+NUESTATS";
printf("Checking network status...");
if(!_at->send(command))
{
printf("Failed!\r\n");
return;
}
printf("Response:\r\n");
_at->read(response,500);
printf(response);
printf ("\r\n");
}
void UBloxSara::sendUdpMsg(char *msg, char *flags)
{
char myCommandbuffer[250];
int msgSize = strlen(msg);
char data[msgSize*2];
int flagsSize = strlen(flags);
char flagsHex[flagsSize*2];
// Create UDP socket on port 'port'
sprintf(myCommandbuffer,"AT+NSOCR=\"DGRAM\",17,%d",_udp._port);
sendCommand(myCommandbuffer);
// Prepaire data for transmition
for (int i=0, j=0; i<msgSize; i++, j+=2)
{
// Take i-th byte and make hex string out of it
sprintf((data+j),"%x", *(msg+i));
}
for(int i=0, j=0; i<flagsSize; i++, j+=2)
{
// Take i-th byte and make hex string out of it
sprintf((flagsHex+j), "%x", *(flags+i));
}
sprintf(myCommandbuffer,"AT+NSOST=0,\"%s\",%d,%d,\"%s\"",
_udp._ip, _udp._port, msgSize, data);
msgSize += strlen(flags);
sprintf(myCommandbuffer,"AT+NSOST=0,\"%s\",%d,%d,\"%s%s\"",
_udp._ip, _udp._port, msgSize, flagsHex, data);
sendCommand(myCommandbuffer);
}
uint8_t UBloxSara::connectNB()
{
sendCommand("at+NCONFIG=\"AUTOCONNECT\",\"FALSE\"");
sendCommand("at+NCONFIG=\"CR_0354_0338_SCRAMBLING\",\"TRUE\"");
sendCommand("at+NCONFIG=\"CR_0859_SI_AVOID\",\"TRUE\"");
sendCommand("at+NCONFIG?");
sendCommand("at+cfun=0");
sendCommand("AT+CGDCONT=1, \"IP\",\"nb.inetd.gdsp\"");
sendCommand("at+cfun=1");
sendCommand("at+cimi");
sendCommand("at+cgatt=1");
sendCommand("at+cops=1,2,\"26202\"");
wait_ms(5000);
sendCommand("at+cereg?");
wait_ms(5000);
sendCommand("AT+CSQ");
wait_ms(5000);
sendCommand("AT+COPS?");
sendCommand("AT+NBAND?");
sendCommand("AT+NBAND=20");
sendCommand("AT+NUESTATS");
sendCommand("AT+CGATT?");
wait_ms(5000);
sendCommand("AT+CGPADDR");
}
