diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/bg96.c | 167 | ||||
| -rw-r--r-- | src/main.c | 41 |
2 files changed, 189 insertions, 19 deletions
@@ -23,6 +23,10 @@ int initNetworkData(networkData *nD) { nD->sinr = calloc(1, sizeof(char)); nD->rsrq = calloc(1, sizeof(char)); nD->ber = calloc(1, sizeof(char)); + nD->lat = calloc(1, sizeof(char)); + nD->longt = calloc(1, sizeof(char)); + nD->alt = calloc(1, sizeof(char)); + nD->gpsTime = calloc(1, sizeof(char)); return 0; } @@ -40,6 +44,10 @@ int freeNetworkData(networkData *nD) { free(nD->sinr); free(nD->rsrq); free(nD->ber); + free(nD->lat); + free(nD->longt); + free(nD->alt); + free(nD->gpsTime); return 0; } @@ -403,26 +411,31 @@ mqttConnError3: int mqttPubNetData(char *pathToPort, networkData nD) { int serialPort, cmdStrLen, msgID, msgSize; char *response = malloc(sizeof(char)), *command = malloc(sizeof(char)), - *msg = malloc(sizeof(char)); + *msg = malloc(sizeof(char)), + textDataTemplate[] = "Operator: %s\n" + "Network: %s\n" + "Reg Status: %s\n" + "Tracking Area Code: %s\n" + "Cell ID: %s\n" + "Technology: %s\n" + "Band: %s\n" + "Channel: %s\n" + "Network Time (GMT): %s", + jsonTemplate[] = "{\n" + "\t\"value\": %s,\n" + "\t\"lat\": %s,\n" + "\t\"lon\": %s,\n" + "\t\"ele\": %s\n" + "}"; - char template[] = "Operator: %s\n" - "Network: %s\n" - "Reg Status: %s\n" - "Tracking Area Code: %s\n" - "Cell ID: %s\n" - "Technology: %s\n" - "Band: %s\n" - "Channel: %s\n" - "Network Time (GMT): %s"; - - msgSize = sizeof(char) * (strlen(template) + strlen(nD.operatorName) + + msgSize = sizeof(char) * (strlen(textDataTemplate) + strlen(nD.operatorName) + strlen(nD.networkName) + strlen(nD.networkRegStat) + strlen(nD.trkAreaCode) + strlen(nD.cellID) + strlen(nD.tech) + strlen(nD.band) + strlen(nD.channel) + strlen(asctime(&nD.netTime)) + 1 - 9 * 2); /* REMOVE THE EXTRA %s FROM TEMPLATE */ msg = realloc(msg, msgSize); - snprintf(msg, msgSize / sizeof(char), template, nD.operatorName, + snprintf(msg, msgSize / sizeof(char), textDataTemplate, nD.operatorName, nD.networkName, nD.networkRegStat, nD.trkAreaCode, nD.cellID, nD.tech, nD.band, nD.channel, asctime(&nD.netTime)); @@ -537,6 +550,29 @@ int mqttPubNetData(char *pathToPort, networkData nD) { goto mqttPubError1; } + msgSize = + sizeof(char) * (strlen(jsonTemplate) + strlen(nD.lat) + strlen(nD.longt) + + strlen(nD.alt) + strlen(nD.gpsTime) + 1 - + 4 * 2); /* REMOVE THE EXTRA %s FROM TEMPLATE */ + msg = realloc(msg, msgSize); + snprintf(msg, msgSize / sizeof(char), jsonTemplate, nD.gpsTime, nD.lat, + nD.longt, nD.alt); + + msgID = rand() % 65536; + cmdStrLen = strlen("AT+QMTPUB=0") + (int)ceil(log10(msgID)) + 1 + 1 + + strlen("kboz/feeds/gpsdata/json") + (int)ceil(log10(msgSize)) + 8; + command = realloc(command, sizeof(char) * (cmdStrLen + 1)); + snprintf(command, cmdStrLen + 1, "AT+QMTPUB=0,%d,1,0,\"%s\",%d", msgID, + "kboz/feeds/gpsdata/json", msgSize); + if (0 != querySerialPort(&response, serialPort, command, 15, (char *)-1)) { + printf("Error querying publish command: %s\n", command); + goto mqttPubError1; + } else if (0 != + querySerialPort(&response, serialPort, msg, 15, "\r\n+QMTPUB:")) { + printf("Error querying publish message\n"); + goto mqttPubError1; + } + free(command); free(response); free(msg); @@ -736,6 +772,46 @@ int gatherData(networkData *output, char *pathToPort) { } } + if (0 != querySerialPort(&response, serialPort, "AT+QGPSLOC=2", 5, NULL)) { + printf("Error querying AT+QGPSLOC. Response:\n%s\n", response); + strLen = strlen("NULL") + 1; + output->lat = realloc(output->lat, sizeof(char) * strLen); + output->longt = realloc(output->longt, sizeof(char) * strLen); + output->alt = realloc(output->alt, sizeof(char) * strLen); + output->gpsTime = realloc(output->gpsTime, sizeof(char) * strLen); + strncpy(output->lat, "NULL", strLen); + strncpy(output->longt, "NULL", strLen); + strncpy(output->alt, "NULL", strLen); + strncpy(output->gpsTime, "NULL", strLen); + } else { + varPtr = strtok(response, " \",\r"); + while (strstr(varPtr, "\n+QGPSLOC:") == NULL) { + varPtr = strtok(NULL, " \",\r"); + } + varPtr = strtok(NULL, " \",\r"); + varPtr = strtok(NULL, " \",\r"); + strLen = strlen(varPtr) + 1; + output->lat = realloc(output->lat, sizeof(char) * strLen); + strncpy(output->lat, varPtr, strLen); + varPtr = strtok(NULL, " \",\r"); + strLen = strlen(varPtr) + 1; + output->longt = realloc(output->longt, sizeof(char) * strLen); + strncpy(output->longt, varPtr, strLen); + varPtr = strtok(NULL, " \",\r"); + varPtr = strtok(NULL, " \",\r"); + strLen = strlen(varPtr) + 1; + output->alt = realloc(output->alt, sizeof(char) * strLen); + strncpy(output->alt, varPtr, strLen); + varPtr = strtok(NULL, " \",\r"); + varPtr = strtok(NULL, " \",\r"); + varPtr = strtok(NULL, " \",\r"); + varPtr = strtok(NULL, " \",\r"); + varPtr = strtok(NULL, " \",\r"); + strLen = strlen(varPtr) + 1; + output->gpsTime = realloc(output->gpsTime, sizeof(char) * strLen); + strncpy(output->gpsTime, varPtr, strLen); + } + close(serialPort); free(response); return 0; @@ -746,3 +822,68 @@ gatherDataError2: free(response); return 1; } + +int initGNSS(char *pathToPort) { + char *response = malloc(sizeof(char)); + int serialPort; + + serialPort = openSerialPort(pathToPort); + if (0 > serialPort) { + printf("Error opening serial port %s\n", pathToPort); + goto initGNSSError2; + } + + if (0 != querySerialPort(&response, serialPort, + "AT+QGPSCFG=\"outport\",\"none\"", 1, NULL)) { + printf("Error querying AT+QGPSCFG\n"); + goto initGNSSError1; + } + + if (0 != querySerialPort(&response, serialPort, "AT+QGPSCFG=\"gnssconfig\",1", + 1, NULL)) { + printf("Error querying AT+QGPSCFG\n"); + goto initGNSSError1; + } + + if (0 != + querySerialPort(&response, serialPort, "AT+QGPS=1,30,50,0,1", 5, NULL)) { + printf("Error querying AT+QGPS\n"); + goto initGNSSError1; + } + + close(serialPort); + free(response); + return 0; + +initGNSSError1: + close(serialPort); +initGNSSError2: + free(response); + return 1; +} + +int stopGNSS(char *pathToPort) { + char *response = malloc(sizeof(char)); + int serialPort; + + serialPort = openSerialPort(pathToPort); + if (0 > serialPort) { + printf("Error opening serial port %s\n", pathToPort); + goto initGNSSError2; + } + + if (0 != querySerialPort(&response, serialPort, "AT+QGPSEND", 1, NULL)) { + printf("Error querying AT+QGPSEND\n"); + goto initGNSSError1; + } + + close(serialPort); + free(response); + return 0; + +initGNSSError1: + close(serialPort); +initGNSSError2: + free(response); + return 1; +} @@ -36,73 +36,102 @@ int main(int argc, char **argv) { else if (0 == strcmp(argv[1], "--init")) { + printf("Powering on\n"); if (0 != powerOn(PATH_TO_SERIAL_PORT, PATH_TO_GPIO_CHIP, PIN_NUM_STATUS, PIN_NUM_PWR_KEY)) { printf("Error powering the module on\n"); return 1; } + printf("Initiating GNSS\n"); + if (0 != initGNSS(PATH_TO_SERIAL_PORT)) { + printf("Error initiating GNSS\n"); + return 1; + } + + printf("Configuring the network settings for DNA public network\n"); if (0 != cfgPublicNetwork(PATH_TO_SERIAL_PORT)) { printf("Error setting public network configuration\n"); return 1; } + printf("Waiting for establishing network connection\n"); if (0 != waitForNetwork(PATH_TO_SERIAL_PORT, 120)) { printf("Error while waiting for network\n"); return 1; } + printf("Initialization complete\n"); return 0; } else if (0 == strcmp(argv[1], "--stop")) { + + printf("Stopping GNSS\n"); + if (0 != stopGNSS(PATH_TO_SERIAL_PORT)) { + printf("Error stopping GNSS\n"); + } + + printf("Disconnecting MQTT\n"); if (0 != mqttDisc(PATH_TO_SERIAL_PORT)) { printf("Could not disconnect MQTT\n"); } + + printf("Powering off\n"); if (0 != powerOff(PATH_TO_SERIAL_PORT, PATH_TO_GPIO_CHIP, PIN_NUM_STATUS, PIN_NUM_PWR_KEY)) { printf("Error powering the module off\n"); return 1; } + printf("Power off complete\n"); return 0; } else if (0 == strcmp(argv[1], "--netinfo-pub")) { networkData *nD = malloc(sizeof(networkData)); + printf("Obtaining network info\n"); initNetworkData(nD); - gatherData(nD, PATH_TO_SERIAL_PORT); + if (gatherData(nD, PATH_TO_SERIAL_PORT) != 0) { + printf("Failed to gather network info\n"); + goto netinfopubFail; + } printf("Connecting to the MQTT broker\n"); if (0 != mqttConn(PATH_TO_SERIAL_PORT, "io.adafruit.com", 8883, "kboz", "aio_lvhz87FJ0rIlidH8g30V5mQ7FK7s")) { printf("Error connecting MQTT\n"); - return 1; + goto netinfopubFail; } /* if (0 != mqttConn(PATH_TO_SERIAL_PORT, "29038f72a9d84f18940e0d44daffa687.s2.eu.hivemq.cloud", 8883, "rpi5gtn", "Raspi132.")) { printf("Error connecting MQTT\n"); - return 1; + goto netinfopubFail; } */ printf("Publishing network information\n"); if (0 != mqttPubNetData(PATH_TO_SERIAL_PORT, *nD)) { printf("Error publishing to MQTT server\n"); - return 1; + goto netinfopubFail; } printf("Disconnecting from the MQTT broker\n"); if (0 != mqttDisc(PATH_TO_SERIAL_PORT)) { printf("Could not disconnect MQTT\n"); - return 1; + goto netinfopubFail; } - printf("Done\n"); + printf("Network info published\n"); freeNetworkData(nD); free(nD); return 0; + + netinfopubFail: + freeNetworkData(nD); + free(nD); + return 1; } else { |
