diff options
| author | kutayboz <kutayboz@gmail.com> | 2023-06-13 01:17:59 +0300 |
|---|---|---|
| committer | kutayboz <kutayboz@gmail.com> | 2023-06-13 01:17:59 +0300 |
| commit | fbd07ec5acaed65b892e0a1c144eb779d6d95ddc (patch) | |
| tree | bf64c93d06e0a9de2d594f99e8b943f6672bf8a5 /src/bg96.c | |
| parent | 0cf6be4cd144b01f91049891388c3cd063f43c9f (diff) | |
| download | celnetmon-fbd07ec5acaed65b892e0a1c144eb779d6d95ddc.tar.gz | |
Added GNSS functionality
Diffstat (limited to 'src/bg96.c')
| -rw-r--r-- | src/bg96.c | 167 |
1 files changed, 154 insertions, 13 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; +} |
