I recently bought a fanstel blg840 device, and I have programmed At client firmware in nrf91 and custom code into nrf52, but the problem is nrf52 is sending at comments to the nrf9160, but it doesn't reply back? Do you have any idea of this? this is my code
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <nrf.h>
#include <nrfx_uart.h>
#include <core_cm4.h>
#include "SEGGER_RTT.h"
#define UART_TX_PIN 6
#define UART_RX_PIN 8
#define UART_BAUD_RATE NRF_UART_BAUDRATE_115200
#define MAX_RETRIES 3
#define RETRY_DELAY_MS 2000
#define SERVER_URL "example.com"
#define SERVER_PORT 443
#define HTTPS 1
#define API_PATH "/api/telemetry"
static const nrfx_uart_t uart = NRFX_UART_INSTANCE(0);
static nrfx_uart_config_t uart_config = NRFX_UART_DEFAULT_CONFIG;
void uart_init(void);
bool uart_send_command(const char *cmd, char *response, size_t response_size);
bool check_sim_status(void);
bool connect_network(void);
bool send_telemetry(void);
void manage_connection(void);
void delay_ms(int ms);
void reset_modem(void);
void disconnect_network(void);
// ========== UART Init ==========
void uart_init(void) {
SEGGER_RTT_WriteString(0, "Initializing UART...\n");
uart_config.pseltxd = UART_TX_PIN;
uart_config.pselrxd = UART_RX_PIN;
uart_config.hwfc = NRF_UART_HWFC_DISABLED;
uart_config.parity = NRF_UART_PARITY_EXCLUDED;
uart_config.baudrate = UART_BAUD_RATE;
uart_config.interrupt_priority = APP_IRQ_PRIORITY_LOW;
nrfx_uart_init(&uart, &uart_config, NULL);
SEGGER_RTT_WriteString(0, "UART Initialized.\n");
}
// ========== UART Send Command ==========
bool uart_send_command(const char *cmd, char *response, size_t response_size) {
SEGGER_RTT_printf(0, "Sending command: %s\n", cmd);
nrfx_uart_tx(&uart, (const uint8_t*)cmd, strlen(cmd));
nrfx_uart_tx(&uart, (const uint8_t*)"\r\n", 2);
int i = 0;
while (i < (int)response_size - 1) {
if (nrfx_uart_rx(&uart, (uint8_t*)&response[i], 1) == NRFX_SUCCESS) {
if (response[i] == '\n') break;
i++;
}
}
response[i] = '\0';
SEGGER_RTT_printf(0, "Received response: %s\n", response);
return true;
}
// ========== SIM Status ==========
bool check_sim_status(void) {
char response[256];
SEGGER_RTT_WriteString(0, "Checking SIM status...\n");
uart_send_command("AT+CPIN?", response, sizeof(response));
bool ready = strstr(response, "READY") != NULL;
SEGGER_RTT_printf(0, "SIM status: %s\n", ready ? "READY" : "NOT READY");
return ready;
}
// ========== Connect Network ==========
bool connect_network(void) {
char response[256];
SEGGER_RTT_WriteString(0, "Connecting to network...\n");
if (!check_sim_status()) {
SEGGER_RTT_WriteString(0, "SIM not ready, cannot connect.\n");
return false;
}
uart_send_command("AT+CFUN=1", response, sizeof(response));
delay_ms(1000);
uart_send_command("AT+COPS=0", response, sizeof(response));
delay_ms(1000);
uart_send_command("AT+CGATT=1", response, sizeof(response));
delay_ms(1000);
uart_send_command("AT+CGATT?", response, sizeof(response));
bool connected = strstr(response, ": 1") != NULL;
SEGGER_RTT_printf(0, "Network attach status: %s\n", connected ? "Attached" : "Not attached");
return connected;
}
// ========== Disconnect Network ==========
void disconnect_network(void) {
char response[256];
SEGGER_RTT_WriteString(0, "Disconnecting network...\n");
uart_send_command("AT+CGATT=0", response, sizeof(response));
uart_send_command("AT+CFUN=0", response, sizeof(response));
SEGGER_RTT_WriteString(0, "Network disconnected.\n");
}
// ========== Reset Modem ==========
void reset_modem(void) {
SEGGER_RTT_WriteString(0, "Resetting modem...\n");
disconnect_network();
delay_ms(3000); // Simulate power cycle delay
SEGGER_RTT_WriteString(0, "Modem reset done.\n");
}
// ========== Send Telemetry ==========
bool send_telemetry(void) {
char response[256];
char cmd[256];
const char *body = "{\"count\":60}";
int body_len = strlen(body);
SEGGER_RTT_WriteString(0, "Opening HTTP connection...\n");
snprintf(cmd, sizeof(cmd), "AT#XHTTPCCON=\"%s\",%d,%d", SERVER_URL, SERVER_PORT, HTTPS);
uart_send_command(cmd, response, sizeof(response));
if (strstr(response, "OK") == NULL) {
SEGGER_RTT_WriteString(0, "Failed to open HTTP connection.\n");
return false;
}
SEGGER_RTT_WriteString(0, "Sending HTTP POST...\n");
snprintf(cmd, sizeof(cmd), "AT#XHTTPCREQ=0,\"POST\",\"%s\",\"Content-Type: application/json\",%d", API_PATH, body_len);
uart_send_command(cmd, response, sizeof(response));
uart_send_command(body, response, sizeof(response));
if (strstr(response, "200 OK") == NULL) {
SEGGER_RTT_WriteString(0, "HTTP POST failed or no 200 OK.\n");
return false;
}
uart_send_command("AT#XHTTPDIS", response, sizeof(response));
SEGGER_RTT_WriteString(0, "HTTP session closed.\n");
return true;
}
// ========== Reconnection Strategy ==========
void manage_connection(void) {
int retries = 0;
SEGGER_RTT_WriteString(0, "Managing connection...\n");
while (retries < MAX_RETRIES) {
if (connect_network()) {
SEGGER_RTT_WriteString(0, "Connected to network successfully.\n");
return;
}
retries++;
SEGGER_RTT_printf(0, "Connection attempt %d failed. Retrying...\n", retries);
delay_ms(RETRY_DELAY_MS);
}
SEGGER_RTT_WriteString(0, "Max retries reached. Resetting modem...\n");
reset_modem();
retries = 0;
while (retries < MAX_RETRIES) {
if (connect_network()) {
SEGGER_RTT_WriteString(0, "Connected after modem reset.\n");
return;
}
retries++;
SEGGER_RTT_printf(0, "Retry after reset attempt %d failed.\n", retries);
delay_ms(RETRY_DELAY_MS);
}
SEGGER_RTT_WriteString(0, "Final escalation: MCU Reset!\n");
NVIC_SystemReset();
}
// ========== Delay ==========
void delay_ms(int ms) {
for (int i = 0; i < ms * 1000; i++) __NOP();
}
// ========== Main ==========
int main(void) {
SEGGER_RTT_WriteString(0, "Starting application...\n");
uart_init();
manage_connection();
while (1) {
if (!send_telemetry()) {
SEGGER_RTT_WriteString(0, "Telemetry send failed. Re-managing connection...\n");
manage_connection();
}
delay_ms(10000); // 10 sec delay between telemetry posts
}
return 0;
}