Library to use A9G with AT commands in Arduino framework-based systems.
A9G is a quad-band module from Ai-Thinker based on RDA8955 SoC - [GSM/GPRS] + [GPS/BDS] (850/900/1800/1900MHz).
Official A9G repository: Ai-Thinker GPRS C SDK.
This library configures the A9G's GPS data output using the NMEA data specification. So to decode this NMEA packet this library incorporated Mikal Hart's amazing TinyGPSPlus library.
Big difference compared to other libraries: this one supports JSON as payload in MQTT mode! 💁
Minimal example code snippet:
#include "A9G.h"
A9G_Controller A9G(A9G_RESET_PIN, A9G_INIT_PIN);
GPS_Controller GPS(Serial1);
GPRS_Controller GPRS(Serial2);
void mqtt_callback(char* topic, char* payload, int length) {
Serial.printf("\r\nFrom MQTT subscription: topic: %s, payload: %s, length: %d\r\n\r\n", topic, payload, length);
// GPRS.mqtt_unsubscribe(MQTT_SUB_TOPIC, MQTT_SUB_QOS);
}
void setup() {
Serial.begin(115200);
while (!A9G.turn_on(MODEM_INIT_TIMEOUT_SECS)) {
Serial.println("\r\nA9G init fail. Retrying...\r\n");
A9G.turn_off();
}
A9G.echo(true);
GPRS.cellular_network_connect(NETWORK_APN);
GPS.enable(GPS_REFRESH_INTERVAL_SECS);
GPRS.mqtt_connect_broker(MQTT_BROKER_ADDR,
MQTT_BROKER_PORT,
MQTT_BROKER_AUTH_USER,
MQTT_BROKER_AUTH_PASSWORD,
MQTT_CLIENT_ID,
MQTT_CLIENT_KEEPALIVE_SECS);
GPRS.mqtt_subscribe(MQTT_SUB_TOPIC, MQTT_SUB_QOS, mqtt_callback);
GPRS.mqtt_publish(MQTT_PUB_TOPIC, MQTT_PUB_PAYLOAD, MQTT_PUB_QOS);
}
void loop() {
A9G.loop();
GPRS.mqtt_loop();
static uint32_t t0 = millis();
if (millis() - t0 > 1000) {
t0 = millis();
static char JSON_payload[100];
sprintf(JSON_payload, "{\"variable\":\"location\",\"value\":\"A9G\",\"location\":{\"lat\":%.8f,\"lng\":%.8f}}", GPS.location(LAT), GPS.location(LNG));
GPRS.mqtt_publish((char*)"GPS", JSON_payload, MQTT_PUB_QOS);
}
}