2024-04-14 18:38:39 +08:00
|
|
|
|
#include "EC800M_GPS.h"
|
|
|
|
|
#include "EC800M_4G.h"
|
2024-04-15 15:32:58 +08:00
|
|
|
|
#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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-14 22:41:42 +08:00
|
|
|
|
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
|
2024-04-14 22:41:42 +08:00
|
|
|
|
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")) {
|
2024-04-14 22:41:42 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-14 22:41:42 +08:00
|
|
|
|
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");
|
2024-04-14 22:41:42 +08:00
|
|
|
|
_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)
|
|
|
|
|
{
|
2024-04-15 15:32:58 +08:00
|
|
|
|
//_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");
|
|
|
|
|
|
|
|
|
|
|
2024-04-14 22:41:42 +08:00
|
|
|
|
// GPS Module
|
2024-04-14 18:38:39 +08:00
|
|
|
|
EC800M_GPS(NULL);
|
|
|
|
|
|
2024-04-15 15:32:58 +08:00
|
|
|
|
//_printTaskStackHighWaterMark();
|
2024-04-14 18:38:39 +08:00
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|