EBIKE-FreeRTOS/Source/EC800M_4G.c

386 lines
10 KiB
C
Raw Normal View History

2024-04-14 18:38:39 +08:00
#include "EC800M_GPS.h"
#include "EC800M_4G.h"
#include "common.h"
2024-04-14 18:38:39 +08:00
int _r = 0;
int _timeout = 1;
// 存放4G数据
char _4G_DATA[_4G_DATA_LENGTH];
int _4G_DATA_LEN;
// 重置4G数据缓冲区
void _4g_reset_data()
{
memset(_4G_DATA, 0, _4G_DATA_LENGTH);
_4G_DATA_LEN = 0;
}
void uart_send_string(const char *str)
{
size_t len = strlen(str);
uart_write_blocking(EC800M_4G_UART, (const uint8_t *)str, len);
return;
}
int _4G_uart_read_string(char *_4G_DATA, int *_4G_DATA_LEN)
{
int _time = 0;
int timeout = 3000; // 设置超时时间为3秒单位为毫秒
while (1) {
// 检查是否超时
if (_time >= timeout) {
printf("EC800M _4G_uart_read_string() 读取超时\n");
return -1;
}
if (uart_is_readable(EC800M_4G_UART)) {
if (*_4G_DATA_LEN < _4G_DATA_LENGTH - 1) {
char c = uart_getc(EC800M_4G_UART);
_4G_DATA[(*_4G_DATA_LEN)++] = c;
_4G_DATA[*_4G_DATA_LEN] = '\0';
}
} else {
break;
}
sleep_ms(1); // 稍微延迟一下,等待下一个循环
_time++;
}
return 0;
}
int _4G_uart_read_string_until_response(char *DATA, int *DATA_LEN, const char *expected_response)
{
int timeout = 10000; // 设置超时时间为10秒单位为毫秒
*DATA_LEN = 0;
int _time = 0;
while (1) {
while (uart_is_readable(EC800M_4G_UART)) {
if (*DATA_LEN < _4G_DATA_LENGTH) {
char c = uart_getc(EC800M_4G_UART);
DATA[(*DATA_LEN)++] = c;
DATA[*DATA_LEN] = '\0'; // 添加字符串结束符
}
if (strstr(DATA, expected_response) != NULL) {
return 0; // 找到了预期的响应,退出循环
} else {
//printf("%s\n", DATA);
}
}
_time++;
sleep_ms(1); // 等待一小段时间再继续读取
if (_time >= timeout) {
_time = 0;
printf("EC800M _4G_uart_read_string_until_response() 读取超时\n");
return -1;
}
}
}
int EC800M_4G_INIT(char *IP, int PORT)
2024-04-14 18:38:39 +08:00
{
// AT+CFUN=1,1
//uart_send_string("AT+CFUN=1,1\r\n");
// AT+CGREG=2
uart_send_string("AT+CGREG=2\r\n");
sleep_ms(10);
if (-1 == _4G_uart_read_string_until_response(_4G_DATA, &_4G_DATA_LEN, "OK")) {
printf("EC800M Module 4G AT+QIACT? Timeout!\n");
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
// AT+CGATT=1
uart_send_string("AT+CGATT=1\r\n");
sleep_ms(10);
if (-1 == _4G_uart_read_string_until_response(_4G_DATA, &_4G_DATA_LEN, "OK")) {
printf("EC800M Module 4G AT+CGATT=1 Timeout!\n");
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
// AT+CEREG=2
uart_send_string("AT+CEREG=2\r\n");
sleep_ms(10);
if (-1 == _4G_uart_read_string_until_response(_4G_DATA, &_4G_DATA_LEN, "OK")) {
printf("EC800M Module 4G AT+CEREG=2 Timeout!\n");
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
// AT+QICSGP=1
uart_send_string("AT+QICSGP=1\r\n");
//sleep_ms(10);
if (-1 == _4G_uart_read_string_until_response(_4G_DATA, &_4G_DATA_LEN, "OK")) {
printf("EC800M Module 4G AT+QICSGP=1 Timeout!\n");
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
// AT+QIACT=1
uart_send_string("AT+QIACT=1\r\n");
sleep_ms(10);
if (-1 == _4G_uart_read_string(_4G_DATA, &_4G_DATA_LEN)) {
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
// AT+QIACT?
uart_send_string("AT+QIACT?\r\n");
if (-1 == _4G_uart_read_string_until_response(_4G_DATA, &_4G_DATA_LEN, "OK")) {
printf("EC800M Module 4G AT+QIACT? Timeout!\n");
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
// AT+QIDEACT=1
uart_send_string("AT+QIDEACT=1\r\n");
if (-1 == _4G_uart_read_string_until_response(_4G_DATA, &_4G_DATA_LEN, "OK")) {
printf("EC800M Module 4G AT+QIDEACT=1 Timeout!\n");
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
// AT+QIOPEN=1,0,"TCP","47.240.75.93",8009,0,1
char QIOPEN[270] = { 0 };
sprintf(QIOPEN, _QIOPEN, IP, PORT);
uart_send_string(QIOPEN);
2024-04-14 18:38:39 +08:00
if (-1 == _4G_uart_read_string_until_response(_4G_DATA, &_4G_DATA_LEN, "0,0")) {
printf("EC800M Module 4G AT+QIOPEN Timeout!\n");
2024-04-14 18:38:39 +08:00
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
/*
// AT+QISTATE=1,0
uart_send_string("AT+QISTATE=1,0\r\n");
if (-1 == _4G_uart_read_string(_4G_DATA, &_4G_DATA_LEN)) {
printf("EC800M Module 4G AT+QISTATE=1,0 Timeout!\n");
return -1;
}
printf("%s %d\n", _4G_DATA, _4G_DATA_LEN);
*/
return 1;
}
int receive_data(char *input_string)
{
char temp_buffer[270] = { 0 };
char received_data[270] = { 0 };
int received_data_length = 0;
int step = 1;
char *token = NULL;
char *start = NULL;
char *end = NULL;
size_t temp_length = 0;
// 在指针不为NULL时才进行后续操作
start = strstr(input_string, "QIURC");
if (start == NULL) {
printf("Error: 'QIURC' not found\n");
return -1; // 返回错误代码
}
end = strstr(start, "\r\n");
if (end == NULL) {
printf("Error: '\\r\\n' not found\n");
return -1; // 返回错误代码
}
temp_length = end - start; // 计算子字符串的长度
if (temp_length >= sizeof(temp_buffer)) {
printf("Error: Substring length exceeds buffer size\n");
return -1; // 返回错误代码
}
// 复制子字符串到 TEMP 中
memcpy(temp_buffer, start, temp_length);
temp_buffer[temp_length] = '\0'; // 添加字符串结束标志
// 使用 strtok 解析 TEMP 字符串
token = strtok(temp_buffer, ",");
while (token != NULL) {
if (step == 3) {
received_data_length = atoi(token);
}
token = strtok(NULL, ",");
step++;
}
// 检查 received_data_length 是否为有效值
if (received_data_length <= 0 || received_data_length >= (int)sizeof(received_data)) {
printf("Error: Invalid received_data_length value\n");
return -1; // 返回错误代码
}
// 复制数据到 received_data 中
memcpy(received_data, end + 2, received_data_length);
received_data[received_data_length] = '\0'; // 添加字符串结束标志
printf("%s", received_data);
return 0; // 返回成功代码
}
// 查询Socket状态
int CHECK_TCP_STATUS()
{
char RECV[270] = { 0 };
int RECV_LEN = 0;
int step = 1;
int socket_state = 0;
printf("Query Socket status!!!\n");
uart_send_string("AT+QISTATE=1,0\r\n");
if (-1 == _4G_uart_read_string_until_response(RECV, &RECV_LEN, "OK")) {
printf("EC800M Module 4G AT+QISTATE=1,0 Timeout!\n");
return -1;
}
printf("%s %d\n", RECV, RECV_LEN);
char *token = strtok(RECV, ",");
while (token != NULL) {
if (step == 7) {
socket_state = atoi(token);
}
token = strtok(NULL, ",");
step++;
}
printf("socket_state: %d\n", socket_state);
return socket_state;
}
// 重新连接TCP
int TCP_RESTART()
{
char RECV[270] = { 0 };
int RECV_LEN = 0;
printf("Re-establish TCP!!!\n");
uart_send_string("AT+QICLOSE=0\r\n");
if (-1 == _4G_uart_read_string_until_response(RECV, &RECV_LEN, "OK")) {
printf("EC800M Module 4G AT+QICLOSE=0 Timeout!\n");
return -1;
}
printf("%s %d\n", RECV, RECV_LEN);
uart_send_string("AT+QIOPEN=1,0,\"TCP\",\"123.60.29.178\",8009,0,1\r\n");
if (-1 == _4G_uart_read_string_until_response(RECV, &RECV_LEN, "0,0")) {
printf("EC800M Module 4G AT+QICLOSE=0 Timeout!\n");
return -1;
}
printf("%s %d\n", RECV, RECV_LEN);
sleep_ms(3000);
return 0;
}
#include <stdbool.h>
// 全局变量表示TCP连接是否已经成功建立过
bool tcp_connection_established = false;
int establish_tcp_connection()
{
// 如果TCP连接已经成功建立过则直接返回成功
if (tcp_connection_established) {
printf("TCP connection already established.\n");
return 0;
}
int _r = EC800M_4G_INIT(SERVER_HOST, SERVER_POER); // 第一次建立TCP
2024-04-14 18:38:39 +08:00
int retry_count = 0; // 重试计数器
while (_r == -1 && retry_count < TCP_MAX_RETRY) {
printf("TCP establishment failed! Retrying...\n");
_r = EC800M_4G_INIT(SERVER_HOST, SERVER_POER); // 重新建立TCP连接
2024-04-14 18:38:39 +08:00
retry_count++;
sleep_ms(9000); // 等待一段时间后重试
}
if (_r == -1) {
printf("Failed to establish TCP connection after %d retries.\n", TCP_MAX_RETRY);
return -1; // 返回连接失败
} else {
printf("TCP connection established successfully.\n");
// 标记TCP连接已经成功建立过
tcp_connection_established = true;
return 0; // 返回连接成功
}
}
int EC800M_4G_RECV(char *string)
{
char RECV[1024] = { 0 };
int RECV_LEN = 0;
uint8_t CTRLZ[1];
uart_send_string("AT+QISEND=0\r\n");
sleep_ms(100);
uart_send_string(string);
CTRLZ[0] = 0X1A;
uart_write_blocking(EC800M_4G_UART, CTRLZ, 1);
if (-1 == _4G_uart_read_string_until_response(RECV, &RECV_LEN, "SEND OK")) {
printf("EC800M Module 4G AT+QISEND=0 Timeout!\n");
_timeout++;
if (2 != CHECK_TCP_STATUS()) {
if (-1 == TCP_RESTART()) {
printf("TCP RESTART ERROR!\n");
}
}
} else {
receive_data(RECV);
if (2 != CHECK_TCP_STATUS()) {
if (-1 == TCP_RESTART()) {
printf("TCP RESTART ERROR!\n");
}
}
}
sleep_ms(3000);
return 0;
}
void EC800M_4G(void *p)
{
//_printTaskStackHighWaterMark();
2024-04-14 18:38:39 +08:00
(void)p;
EC800M_UART_INIT();
while (1) {
printf("EC800M Module 4G\n");
int result = establish_tcp_connection();
if (result == 0) {
;
}
EC800M_4G_RECV("abcd\r\n");
EC800M_4G_RECV("aixiao.me\r\n");
// GPS Module
2024-04-14 18:38:39 +08:00
EC800M_GPS(NULL);
//_printTaskStackHighWaterMark();
2024-04-14 18:38:39 +08:00
vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时
}
return;
}