From b9081c6e245fcff80a4150f484a091e652139e7b Mon Sep 17 00:00:00 2001 From: kutayboz Date: Mon, 12 Jun 2023 22:49:07 +0300 Subject: Finished network info publish routine --- include/bg96.h | 24 ++--- src/bg96.c | 318 +++++++++++++++++++++++++++++++++++++++++++++------------ src/main.c | 28 ++--- 3 files changed, 271 insertions(+), 99 deletions(-) diff --git a/include/bg96.h b/include/bg96.h index d6715f3..e6faebd 100644 --- a/include/bg96.h +++ b/include/bg96.h @@ -1,19 +1,17 @@ #ifndef __INCLUDE_BG96__ #define __INCLUDE_BG96__ -struct networkData { - char *operatorName; - char *currentTech; - char *networkRegStat; - char *trkAreaCode; - char *cellID; - char *rssi; - char *ber; -}; +#include -int initNetworkData(struct networkData *nD); +typedef struct networkDataTag { + char *operatorName, *networkName, *networkRegStat, *trkAreaCode, *cellID, + *tech, *band, *channel, *rssi, *rsrp, *sinr, *rsrq, *ber; + struct tm netTime; +} networkData; -int freeNetworkData(struct networkData *nD); +int initNetworkData(networkData *nD); + +int freeNetworkData(networkData *nD); int powerOn(char *pathToPort, char *pathToChip, int statusPin, int pwrKeyPin); @@ -28,8 +26,8 @@ int mqttDisc(char *pathToPort); int mqttConn(char *pathToPort, char *hostURL, int hostPort, char *username, char *password); -int mqttPub(char *pathToPort, char *topic, char *msg); +int mqttPubNetData(char *pathToPort, networkData nD); -int gatherData(struct networkData *output, char *pathToPort); +int gatherData(networkData *output, char *pathToPort); #endif diff --git a/src/bg96.c b/src/bg96.c index 70fb211..46d3345 100644 --- a/src/bg96.c +++ b/src/bg96.c @@ -9,24 +9,36 @@ #include #include -int initNetworkData(struct networkData *nD) { - nD->operatorName = malloc(sizeof(char)); - nD->currentTech = malloc(sizeof(char)); - nD->networkRegStat = malloc(sizeof(char)); - nD->trkAreaCode = malloc(sizeof(char)); - nD->cellID = malloc(sizeof(char)); - nD->rssi = malloc(sizeof(char)); - nD->ber = malloc(sizeof(char)); +int initNetworkData(networkData *nD) { + nD->operatorName = calloc(1, sizeof(char)); + nD->networkName = calloc(1, sizeof(char)); + nD->tech = calloc(1, sizeof(char)); + nD->band = calloc(1, sizeof(char)); + nD->channel = calloc(1, sizeof(char)); + nD->networkRegStat = calloc(1, sizeof(char)); + nD->trkAreaCode = calloc(1, sizeof(char)); + nD->cellID = calloc(1, sizeof(char)); + nD->rssi = calloc(1, sizeof(char)); + nD->rsrp = calloc(1, sizeof(char)); + nD->sinr = calloc(1, sizeof(char)); + nD->rsrq = calloc(1, sizeof(char)); + nD->ber = calloc(1, sizeof(char)); return 0; } -int freeNetworkData(struct networkData *nD) { +int freeNetworkData(networkData *nD) { free(nD->operatorName); - free(nD->currentTech); + free(nD->networkName); + free(nD->tech); + free(nD->band); + free(nD->channel); free(nD->networkRegStat); free(nD->trkAreaCode); free(nD->cellID); free(nD->rssi); + free(nD->rsrp); + free(nD->sinr); + free(nD->rsrq); free(nD->ber); return 0; } @@ -103,9 +115,6 @@ int powerOff(char *pathToPort, char *pathToChip, int statusPin, int pwrKeyPin) { if (0 != querySerialPort(&response, serialPort, "AT+QPOWD", 20, "POWERED DOWN")) { printf("Error querying serial port\n"); - free(response); - close(serialPort); - return 1; } free(response); close(serialPort); @@ -391,9 +400,31 @@ mqttConnError3: return 1; } -int mqttPub(char *pathToPort, char *topic, char *msg) { +int mqttPubNetData(char *pathToPort, networkData nD) { int serialPort, cmdStrLen, msgID, msgSize; - char *response = malloc(sizeof(char)), *command; + char *response = malloc(sizeof(char)), *command = malloc(sizeof(char)), + *msg = malloc(sizeof(char)); + + 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) + + 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, + nD.networkName, nD.networkRegStat, nD.trkAreaCode, nD.cellID, + nD.tech, nD.band, nD.channel, asctime(&nD.netTime)); serialPort = openSerialPort(pathToPort); if (0 > serialPort) { @@ -401,13 +432,102 @@ int mqttPub(char *pathToPort, char *topic, char *msg) { goto mqttPubError2; } - msgSize = sizeof(char) * strlen(msg); msgID = rand() % 65536; cmdStrLen = strlen("AT+QMTPUB=0") + (int)ceil(log10(msgID)) + 1 + 1 + - strlen(topic) + (int)ceil(log10(msgSize)) + 8; - command = malloc(sizeof(char) * (cmdStrLen + 1)); - snprintf(command, cmdStrLen + 1, "AT+QMTPUB=0,%d,1,0,\"%s\",%d", msgID, topic, - msgSize); + strlen("kboz/feeds/textInfo") + (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/textInfo", 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; + } + + msgSize = sizeof(char) * (strlen(nD.rssi) + 1); + msg = realloc(msg, msgSize); + strncpy(msg, nD.rssi, msgSize / sizeof(char)); + msgID = rand() % 65536; + cmdStrLen = strlen("AT+QMTPUB=0") + (int)ceil(log10(msgID)) + 1 + 1 + + strlen("kboz/feeds/rssi") + (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/rssi", 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; + } + + msgSize = sizeof(char) * (strlen(nD.rsrp) + 1); + msg = realloc(msg, msgSize); + strncpy(msg, nD.rsrp, msgSize / sizeof(char)); + msgID = rand() % 65536; + cmdStrLen = strlen("AT+QMTPUB=0") + (int)ceil(log10(msgID)) + 1 + 1 + + strlen("kboz/feeds/rsrp") + (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/rsrp", 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; + } + + msgSize = sizeof(char) * (strlen(nD.sinr) + 1); + msg = realloc(msg, msgSize); + strncpy(msg, nD.sinr, msgSize / sizeof(char)); + msgID = rand() % 65536; + cmdStrLen = strlen("AT+QMTPUB=0") + (int)ceil(log10(msgID)) + 1 + 1 + + strlen("kboz/feeds/sinr") + (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/sinr", 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; + } + + msgSize = sizeof(char) * (strlen(nD.rsrq) + 1); + msg = realloc(msg, msgSize); + strncpy(msg, nD.rsrq, msgSize / sizeof(char)); + msgID = rand() % 65536; + cmdStrLen = strlen("AT+QMTPUB=0") + (int)ceil(log10(msgID)) + 1 + 1 + + strlen("kboz/feeds/rsrq") + (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/rsrq", 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; + } + + msgSize = sizeof(char) * (strlen(nD.ber) + 1); + msg = realloc(msg, msgSize); + strncpy(msg, nD.ber, msgSize / sizeof(char)); + msgID = rand() % 65536; + cmdStrLen = strlen("AT+QMTPUB=0") + (int)ceil(log10(msgID)) + 1 + 1 + + strlen("kboz/feeds/ber") + (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/ber", msgSize); if (0 != querySerialPort(&response, serialPort, command, 15, (char *)-1)) { printf("Error querying publish command: %s\n", command); goto mqttPubError1; @@ -419,28 +539,22 @@ int mqttPub(char *pathToPort, char *topic, char *msg) { free(command); free(response); + free(msg); close(serialPort); return 0; mqttPubError1: + close(serialPort); +mqttPubError2: free(command); free(response); -mqttPubError2: - close(serialPort); + free(msg); return 1; } -int gatherData(struct networkData *output, char *pathToPort) { +int gatherData(networkData *output, char *pathToPort) { int serialPort, strLen, tmpNum; - char *response = malloc(sizeof(char)), *varPtr; - /* char *commandList[] = {"AT+COPS?", - "AT+CEREG?", - "AT+CSQ", - "AT+QLTS=1", - "AT+QNWINFO", - "AT+QCSQ", - "AT+QSPN", - "AT+CCLK?"}; */ + char *response = malloc(sizeof(char)), *varPtr, *qcsqSystemMode; serialPort = openSerialPort(pathToPort); if (0 > serialPort) { @@ -461,26 +575,6 @@ int gatherData(struct networkData *output, char *pathToPort) { strLen = strlen(varPtr) + 1; output->operatorName = realloc(output->operatorName, sizeof(char) * strLen); strncpy(output->operatorName, varPtr, strLen); - varPtr = strtok(NULL, "\",\r"); - switch (*varPtr) { - case '0': - strLen = strlen("GSM") + 1; - output->currentTech = realloc(output->currentTech, sizeof(char) * strLen); - strncpy(output->currentTech, "GSM", strLen); - break; - - case '8': - strLen = strlen("LTE Cat M1") + 1; - output->currentTech = realloc(output->currentTech, sizeof(char) * strLen); - strncpy(output->currentTech, "LTE Cat M1", strLen); - break; - - case '9': - strLen = strlen("LTE Cat NB1") + 1; - output->currentTech = realloc(output->currentTech, sizeof(char) * strLen); - strncpy(output->currentTech, "LTE Cat NB1", strLen); - break; - } if (0 != querySerialPort(&response, serialPort, "AT+CEREG?", 1, NULL)) { printf("Error querying AT+CEREG?\n"); @@ -524,21 +618,11 @@ int gatherData(struct networkData *output, char *pathToPort) { varPtr = strtok(NULL, " ,\r"); } varPtr = strtok(NULL, " ,\r"); - if (0 == strcmp(varPtr, "99")) { - strLen = strlen("unknown") + 1; - output->rssi = realloc(output->rssi, sizeof(char) * strLen); - strncpy(output->rssi, "unknown", strLen); - } else { - tmpNum = (2 * strtoimax(varPtr, NULL, 10) - 113); - strLen = 5; - output->rssi = realloc(output->rssi, sizeof(char) * strLen); - snprintf(output->rssi, strLen * sizeof(char), "%d", tmpNum); - } varPtr = strtok(NULL, " ,\r"); if (0 == strcmp(varPtr, "99")) { - strLen = strlen("unknown") + 1; + strLen = strlen("NULL") + 1; output->ber = realloc(output->ber, sizeof(char) * strLen); - strncpy(output->ber, "unknown", strLen); + strncpy(output->ber, "NULL", strLen); } else { tmpNum = exp2(strtoimax(varPtr, NULL, 10)); strLen = 7; @@ -546,6 +630,112 @@ int gatherData(struct networkData *output, char *pathToPort) { snprintf(output->ber, strLen * sizeof(char), "%f.2%%", 0.14 * tmpNum); } + if (0 != querySerialPort(&response, serialPort, "AT+QLTS=1", 1, NULL)) { + printf("Error querying AT+QLTS=1\n"); + goto gatherDataError1; + } + varPtr = strtok(response, " ,\r"); + while (strstr(varPtr, "\n+QLTS:") == NULL) { + varPtr = strtok(NULL, " ,\r"); + } + varPtr = strtok(NULL, " \"/:+-,\r"); + output->netTime.tm_year = strtoimax(varPtr, NULL, 10) - 1900; + varPtr = strtok(NULL, " \"/:+-,\r"); + output->netTime.tm_mon = strtoimax(varPtr, NULL, 10) - 1; + varPtr = strtok(NULL, " \"/:+-,\r"); + output->netTime.tm_mday = strtoimax(varPtr, NULL, 10); + varPtr = strtok(NULL, " \"/:+-,\r"); + output->netTime.tm_hour = strtoimax(varPtr, NULL, 10); + varPtr = strtok(NULL, " \"/:+-,\r"); + output->netTime.tm_min = strtoimax(varPtr, NULL, 10); + varPtr = strtok(NULL, " \"/:+-,\r"); + output->netTime.tm_sec = strtoimax(varPtr, NULL, 10); + varPtr = strtok(NULL, " \"/:+-,\r"); + varPtr = strtok(NULL, " \"/:+-,\r"); + output->netTime.tm_isdst = strtoimax(varPtr, NULL, 2); + output->netTime.tm_wday = 0; + output->netTime.tm_yday = 0; + output->netTime.tm_gmtoff = 0; + if (-1 == mktime(&output->netTime)) { + printf("Error parsing network time\n"); + goto gatherDataError1; + } + output->netTime.tm_gmtoff = 0; + output->netTime.tm_zone = NULL; + + if (0 != querySerialPort(&response, serialPort, "AT+QNWINFO", 1, NULL)) { + printf("Error querying AT+QNWINFO\n"); + goto gatherDataError1; + } + varPtr = strtok(response, "\",\r"); + while (strstr(varPtr, "\n+QNWINFO:") == NULL) { + varPtr = strtok(NULL, " \",\r"); + } + varPtr = strtok(NULL, "\",\r"); + strLen = strlen(varPtr) + 1; + output->tech = realloc(output->tech, sizeof(char) * strLen); + strncpy(output->tech, varPtr, strLen); + varPtr = strtok(NULL, "\",\r"); + varPtr = strtok(NULL, "\",\r"); + strLen = strlen(varPtr) + 1; + output->band = realloc(output->band, sizeof(char) * strLen); + strncpy(output->band, varPtr, strLen); + varPtr = strtok(NULL, "\",\r"); + strLen = strlen(varPtr) + 1; + output->channel = realloc(output->channel, sizeof(char) * strLen); + strncpy(output->channel, varPtr, strLen); + + if (0 != querySerialPort(&response, serialPort, "AT+QSPN", 1, NULL)) { + printf("Error querying AT+QSPN\n"); + goto gatherDataError1; + } + varPtr = strtok(response, "\",\r"); + while (strstr(varPtr, "\n+QSPN:") == NULL) { + varPtr = strtok(NULL, " \",\r"); + } + varPtr = strtok(NULL, "\",\r"); + strLen = strlen(varPtr) + 1; + output->networkName = realloc(output->networkName, sizeof(char) * strLen); + strncpy(output->networkName, varPtr, strLen); + + if (0 != querySerialPort(&response, serialPort, "AT+QCSQ", 1, NULL)) { + printf("Error querying AT+QCSQ\n"); + goto gatherDataError1; + } + varPtr = strtok(response, " \",\r"); + while (strstr(varPtr, "\n+QCSQ:") == NULL) { + varPtr = strtok(NULL, " \",\r"); + } + qcsqSystemMode = varPtr = strtok(NULL, " \",\r"); + if (0 != strcmp(qcsqSystemMode, "NOSERVICE")) { + varPtr = strtok(NULL, " \",\r"); + strLen = strlen(varPtr) + 1; + output->rssi = realloc(output->rssi, sizeof(char) * strLen); + strncpy(output->rssi, varPtr, strLen); + if (0 != strcmp(qcsqSystemMode, "GSM")) { + varPtr = strtok(NULL, " \",\r"); + strLen = strlen(varPtr) + 1; + output->rsrp = realloc(output->rsrp, sizeof(char) * strLen); + strncpy(output->rsrp, varPtr, strLen); + varPtr = strtok(NULL, " \",\r"); + strLen = strlen(varPtr) + 1; + output->sinr = realloc(output->sinr, sizeof(char) * strLen); + strncpy(output->sinr, varPtr, strLen); + varPtr = strtok(NULL, " \",\r"); + strLen = strlen(varPtr) + 1; + output->rsrq = realloc(output->rsrq, sizeof(char) * strLen); + strncpy(output->rsrq, varPtr, strLen); + } else { + strLen = strlen("NULL") + 1; + output->rsrp = realloc(output->rsrp, sizeof(char) * strLen); + output->sinr = realloc(output->sinr, sizeof(char) * strLen); + output->rsrq = realloc(output->rsrq, sizeof(char) * strLen); + strncpy(output->rsrp, "NULL", strLen); + strncpy(output->sinr, "NULL", strLen); + strncpy(output->rsrq, "NULL", strLen); + } + } + close(serialPort); free(response); return 0; diff --git a/src/main.c b/src/main.c index f1115df..caaf2f3 100644 --- a/src/main.c +++ b/src/main.c @@ -12,19 +12,7 @@ #define PIN_NUM_STATUS 27 int main(int argc, char **argv) { - /* char *commandList[] = {"AT", - "ATI", - "AT+QCFG=\"nwscanmode\"", - "AT+QCFG=\"iotopmode\"", - "AT+COPS?", - "AT+CREG?", - "AT+CSQ", - "AT+QLTS=1", - "AT+QNWINFO", - "AT+QCSQ", - "AT+QSPN", - "AT+CCLK?"}, - *cmdList5GTNCfg[] = {"AT+QCFG=\"servicedomain\",1", + /* char *cmdList5GTNCfg[] = {"AT+QCFG=\"servicedomain\",1", "AT+QCFG=\"iotopmode\",1", "AT+QCFG=\"nwscanmode\",3", "AT+QCFG=\"band\",0,8000000,8000000,1", @@ -79,13 +67,11 @@ int main(int argc, char **argv) { return 0; } - else if (0 == strcmp(argv[1], "--mqttTest")) { - struct networkData *nD = malloc(sizeof(struct networkData)); + else if (0 == strcmp(argv[1], "--netinfo-pub")) { + networkData *nD = malloc(sizeof(networkData)); initNetworkData(nD); gatherData(nD, PATH_TO_SERIAL_PORT); - freeNetworkData(nD); - free(nD); if (0 != mqttConn(PATH_TO_SERIAL_PORT, "io.adafruit.com", 8883, "kboz", "aio_lvhz87FJ0rIlidH8g30V5mQ7FK7s")) { @@ -100,11 +86,7 @@ int main(int argc, char **argv) { return 1; } */ - if (0 != - mqttPub( - PATH_TO_SERIAL_PORT, "kboz/feeds/numdata", - "{\"value\": {\"sensor-1\":22.587,\"sensor-2\":13.182},\"lat\": " - "38.1123,\"lon\": -91.2325,\"ele\": 112}")) { + if (0 != mqttPubNetData(PATH_TO_SERIAL_PORT, *nD)) { printf("Error publishing to MQTT server\n"); return 1; } @@ -114,6 +96,8 @@ int main(int argc, char **argv) { return 1; } + freeNetworkData(nD); + free(nD); return 0; } -- cgit v1.3