#include "gprs_module_api.h"
|
#include "uart.h"
|
#include "string.h"
|
#include "stdlib.h"
|
#include "gprs.h"
|
|
GPRS_MODULE_PARA_T __attribute__((aligned(4))) gprs_module_para_g = {.gprs_recv_flag = RESET};
|
uint8_t gprs_resend_data_flag_g = 0;
|
|
/*Ô¶´«DMA½ÓÊպ˲é*/
|
ErrorStatus_STM32 Gprs_Uart1_Rx_DMA_CH3_Check(void)
|
{
|
uint16_t timeout_cnt = 0, dma_recv_cnt;
|
uint32_t dma_mar_reg_read = DMA_CHxMAR_Read(DMA_CH3);
|
|
if (dma_mar_reg_read != (uint32)gprs_module_para_g.gprs_recv_buf)
|
{
|
delay_ms(2);
|
while (dma_mar_reg_read != DMA_CHxMAR_Read(DMA_CH3))
|
{
|
dma_mar_reg_read = DMA_CHxMAR_Read(DMA_CH3);
|
delay_ms(2);
|
if (timeout_cnt++ > 100)
|
break;
|
}
|
}
|
else
|
return ERROR_1;
|
|
dma_recv_cnt = dma_mar_reg_read - (uint32)gprs_module_para_g.gprs_recv_buf;
|
if (dma_recv_cnt)
|
{
|
gprs_module_para_g.gprs_recv_length = dma_recv_cnt;
|
// ½ÓÊÕRAMµØÖ·ÖØÔØ
|
DMA_ISR_DMACHFT_Clr(DMA_CH3);
|
DMA_CHxCR_ChxEN_Setable(DMA_CH3, DISABLE); // ͨµÀʧÄÜ
|
|
DMA_CHxMAR_Write(DMA_CH3, (uint32)gprs_module_para_g.gprs_recv_buf);
|
|
DMA_CHxCR_ChxEN_Setable(DMA_CH3, ENABLE); // ͨµÀʹÄÜ
|
gprs_module_para_g.gprs_recv_flag = SET; // ½ÓÊÕÍê³É
|
return SUCCESS_0;
|
// DMA_GCR_DMAEN_Setable(DISABLE);//DMA×ÜʹÄÜ
|
}
|
return ERROR_1;
|
}
|
|
/*GPRS·¢ËÍÖ¸Áî*/
|
void Gprs_Send_ATcmd(char *pAT_cmd)
|
{
|
uint8_t str_len = 0, temp[1] = {0x0D};
|
str_len = strlen(pAT_cmd);
|
GPRS_SEND_NORMAL((uint8_t *)pAT_cmd, str_len);
|
GPRS_SEND_NORMAL(temp, 1);
|
#ifdef RS232_PRINTF
|
printf("Ö¸ÁîΪ%s\r\n", pAT_cmd);
|
#endif
|
}
|
|
/*GPRS·¢Ë͵Ǽ*/
|
void Gprs_Module_SendLogin(GPRS_AT_CMD module_state, uint8_t used_ip[4], uint16_t used_port)
|
{
|
uint8_t temp_buffer[50] = {0};
|
#if APN_SET_FLAG
|
char *APN = "CMNET";
|
char *UserName = "user_test";
|
char *PassWord = "abc";
|
#endif
|
#if IP_OR_YUMING_FLAG
|
char *DomainName = "582v44s426.goho.co";
|
#else
|
#endif
|
switch (module_state)
|
{
|
#if NB_OR_4G_FLAG
|
case LOGIN_CMD_CMEE_NB: /*NB±¨¸æÒƶ¯ÖÕ¶Ë´íÎó*/
|
Gprs_Send_ATcmd(AT_CMEE);
|
break;
|
case LOGIN_CMD_ICCID_NB: /*NB²éѯiccid*/
|
Gprs_Send_ATcmd(AT_NCCID_NB);
|
break;
|
case LOGIN_CMD_IMEI_NB: /*NB²éѯimei*/
|
Gprs_Send_ATcmd(AT_CGSN_NB);
|
break;
|
case LOGIN_CMD_CSQ_NB: /*NB²éѯÐźÅÇ¿¶È*/
|
Gprs_Send_ATcmd(AT_CSQ_NB);
|
break;
|
case LOGIN_CMD_SOPEN_NB: /*NBÁ¬½Ó·þÎñÆ÷*/
|
#if IP_OR_YUMING_FLAG
|
sprintf((char *)temp_buffer, "%s,%s,%d", AT_SOPEN_NB,
|
DomainName, 13665);
|
#else
|
// sprintf((char *)temp_buffer, "%s,%d.%d.%d.%d,%d", AT_SOPEN_NB,
|
// 39, 108, 81, 105, 0xAA << 8 | 0x26);
|
sprintf((char *)temp_buffer, "%s,%d.%d.%d.%d,%d", AT_SOPEN_NB,
|
used_ip[0], used_ip[1], used_ip[2], used_ip[3], used_port);
|
#endif
|
Gprs_Send_ATcmd((char *)temp_buffer);
|
break;
|
case LOGIN_CMD_DTMODE_NB: /*NBÊý¾ÝģʽÉèÖÃ*/
|
Gprs_Send_ATcmd(AT_DTMODE_NB);
|
break;
|
case LOGIN_CMD_ZRST_NB: /*NBÉ豸ÈíÖØÆô*/
|
Gprs_Send_ATcmd(AT_ZRST_NB);
|
break;
|
#else
|
case LOGIN_CMD_CMEE:
|
Gprs_Send_ATcmd(AT_CMEE);
|
break;
|
case LOGIN_CMD_ICCID: // ²éѯICCID
|
Gprs_Send_ATcmd(AT_CCID);
|
break;
|
case LOGIN_CMD_IMEI: // ²éѯIMEI
|
Gprs_Send_ATcmd(AT_GSN);
|
break;
|
#if APN_SET_FLAG
|
case LOGIN_CMD_ZIPCFG: // ÉèÖÃAPN
|
sprintf((char *)temp_buffer, "%s%s,%s,%s", AT_ZIPCFG, APN, UserName, PassWord);
|
Gprs_Send_ATcmd((char *)temp_buffer);
|
break;
|
#endif
|
case LOGIN_CMD_CSQ: // ²éѯÐźÅÇ¿¶È
|
Gprs_Send_ATcmd(AT_CSQ);
|
break;
|
case LOGIN_CMD_ZIPCALL: // ½¨Á¢Á¬½Óǰ½øÐÐÊý¾Ý²¦ºÅ
|
Gprs_Send_ATcmd(AT_ZIPCALL);
|
break;
|
case LOGIN_CMD_ZIPOPEN: // ½¨Á¢·þÎñÆ÷Á¬½Ó
|
#if IP_OR_YUMING_FLAG
|
|
sprintf((char *)temp_buffer, "%s,%s,%d", AT_ZIPOPEN,
|
DomainName, 13665);
|
#else
|
sprintf((char *)temp_buffer, "%s,%d.%d.%d.%d,%d", AT_ZIPOPEN,
|
used_ip[0], used_ip[1], used_ip[2], used_ip[3],
|
used_port);
|
#endif
|
Gprs_Send_ATcmd((char *)temp_buffer);
|
break;
|
case LOGIN_CMD_ZRST:
|
Gprs_Send_ATcmd(AT_ZRST);
|
break;
|
#endif
|
default:
|
break;
|
}
|
}
|
char sim_imei_g[15] = {0};
|
/*GPRS½ÓÊյǼ*/
|
void Gprs_Module_RecvLogin(GPRS_MODULE_PARA_T *gprs_module_para_p, GPRS_PROTOCOL_NORMAL_DATA_HEAD_T *gprs_protocol_normal_data_head_p)
|
{
|
char *rec_ptr = NULL, *next_ptr = NULL;
|
|
uint8_t signal_percent;
|
if (gprs_module_para_p->gprs_recv_flag)
|
{
|
gprs_module_para_p->gprs_recv_flag = RESET;
|
switch (gprs_module_para_p->gprs_module_state)
|
{
|
#if NB_OR_4G_FLAG
|
/*NB±¨¸æÒƶ¯ÖÕ¶Ë´íÎó*/
|
case LOGIN_CMD_CMEE_NB:
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "OK");
|
if (rec_ptr != NULL)
|
{
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ICCID_NB;
|
}
|
break;
|
/*NB²éѯiccid*/
|
case LOGIN_CMD_ICCID_NB:
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "+NCCID:");
|
if (rec_ptr != NULL)
|
{
|
rec_ptr += 7;
|
for (uint8_t i = 0; i < 20; i++)
|
gprs_protocol_normal_data_head_p->iccid[i] = rec_ptr[i] - '0'; // ×Ö·û´®Êý×ÖתΪÆÕͨÊý×Ö
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_IMEI_NB;
|
}
|
break;
|
/*NB²éѯimei*/
|
case LOGIN_CMD_IMEI_NB:
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "+CGSN:");
|
if (rec_ptr != NULL)
|
{
|
rec_ptr += 6;
|
for (uint8_t i = 0; i < 15; i++)
|
sim_imei[i] = rec_ptr[i] - '0'; // ×Ö·û´®Êý×Öת»¯ÎªÆÕͨÊý×Ö
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_CSQ_NB;
|
}
|
break;
|
/*NB²éѯÐźÅÇ¿¶È*/
|
case LOGIN_CMD_CSQ_NB:
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "OK");
|
if (rec_ptr != NULL)
|
{
|
rec_ptr += 2;
|
if (rec_ptr[0] == 0x0D && rec_ptr[1] == 0x0A && rec_ptr[2] == 0x3A)
|
{
|
rec_ptr += 3;
|
gprs_protocol_normal_data_head_p->signal_intensity = signal_percent = 0; // ÐźÅÇ¿¶ÈºÍ°Ù·Ö±ÈÏÈΪ0
|
gprs_protocol_normal_data_head_p->signal_intensity = atoi(rec_ptr);
|
if (gprs_protocol_normal_data_head_p->signal_intensity != 0 && gprs_protocol_normal_data_head_p->signal_intensity != 99)
|
{
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_SOPEN_NB;
|
break;
|
}
|
}
|
}
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "+CSQ:");
|
if (rec_ptr != NULL)
|
{
|
rec_ptr += 5;
|
gprs_protocol_normal_data_head_p->signal_intensity = signal_percent = 0; // ÐźÅÇ¿¶ÈºÍ°Ù·Ö±ÈÏÈΪ0
|
gprs_protocol_normal_data_head_p->signal_intensity = atoi(rec_ptr);
|
if (gprs_protocol_normal_data_head_p->signal_intensity != 0 && gprs_protocol_normal_data_head_p->signal_intensity != 99)
|
{
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_SOPEN_NB;
|
break;
|
}
|
}
|
break;
|
/*NBÁ¬½Ó·þÎñÆ÷*/
|
case LOGIN_CMD_SOPEN_NB:
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "+SSTATE:");
|
next_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "+CME ERROR:");
|
if (rec_ptr != NULL)
|
{
|
rec_ptr = strchr((char *)gprs_module_para_p->gprs_recv_buf, ',');
|
rec_ptr++;
|
if (rec_ptr != NULL && rec_ptr[0] == '1')
|
{
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_DTMODE_NB;
|
}
|
}
|
else
|
{
|
if (next_ptr != NULL)
|
{
|
next_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "8001"); // ATÃüÁî¸ñʽ´íÎó
|
if (next_ptr != NULL)
|
{
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ZRST_NB;
|
}
|
|
next_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "8009");
|
if (next_ptr != NULL)
|
{
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ZRST_NB;
|
}
|
else
|
{
|
}
|
}
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 2);
|
}
|
break;
|
/*NBÊý¾ÝģʽÉèÖÃ*/
|
case LOGIN_CMD_DTMODE_NB:
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "OK");
|
if (rec_ptr != NULL)
|
{
|
gprs_module_para_p->gprs_module_state = SEND_CMD_ZIPSENDRAW;
|
}
|
break;
|
/*NBÉ豸ÈíÖØÆô*/
|
case LOGIN_CMD_ZRST_NB:
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_CMEE_NB;
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 2);
|
break;
|
#else
|
case LOGIN_CMD_CMEE:
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "OK");
|
if (rec_ptr != NULL)
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ICCID;
|
break;
|
case LOGIN_CMD_ICCID: // ²éѯICCID
|
rec_ptr = strchr((char *)gprs_module_para_p->gprs_recv_buf, ':');
|
if (rec_ptr != NULL)
|
{
|
rec_ptr += 2;
|
for (uint8_t i = 0; i < 20; i++)
|
gprs_protocol_normal_data_head_p->iccid[i] = rec_ptr[i]; // ×Ö·û´®Êý×Ö
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_IMEI;
|
// gprs_test_g.gprs_iccid_cnt++;
|
}
|
break;
|
case LOGIN_CMD_IMEI: // ²éѯIMEI
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, CRLF);
|
if (rec_ptr != NULL)
|
{
|
rec_ptr += 2;
|
for (uint8_t i = 0; i < 15; i++)
|
sim_imei_g[i] = rec_ptr[i];
|
#if APN_SET_FLAG
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ZIPCFG;
|
#else
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_CSQ;
|
#endif
|
// gprs_test_g.gprs_imei_cnt++;
|
}
|
break;
|
#if APN_SET_FLAG
|
case LOGIN_CMD_ZIPCFG: // ÉèÖÃAPN
|
rec_ptr = strstr((char *)gprs_module_para_p->gprs_recv_buf, "OK");
|
if (rec_ptr != NULL)
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_CSQ;
|
break;
|
#endif
|
case LOGIN_CMD_CSQ: // ²éѯÐźÅÇ¿¶È
|
rec_ptr = strchr((char *)gprs_module_para_p->gprs_recv_buf, ':');
|
if (rec_ptr != NULL)
|
{
|
rec_ptr += 2;
|
gprs_protocol_normal_data_head_p->signal_intensity = signal_percent = 0; // ÐźÅÇ¿¶ÈºÍ°Ù·Ö±ÈÏÈΪ0
|
gprs_protocol_normal_data_head_p->signal_intensity = atoi(rec_ptr);
|
if (gprs_protocol_normal_data_head_p->signal_intensity > GMS_BEST)
|
gprs_protocol_normal_data_head_p->signal_intensity_level = 1; // ÐźÅÇ¿¶ÈµÈ¼¶
|
else if (gprs_protocol_normal_data_head_p->signal_intensity > GMS_POOR)
|
gprs_protocol_normal_data_head_p->signal_intensity_level = 2;
|
else
|
gprs_protocol_normal_data_head_p->signal_intensity_level = 3;
|
if (gprs_protocol_normal_data_head_p->signal_intensity != 0 && gprs_protocol_normal_data_head_p->signal_intensity != 99)
|
{
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ZIPCALL;
|
// gprs_test_g.gprs_csq_cnt++;
|
}
|
}
|
break;
|
case LOGIN_CMD_ZIPCALL: // ½¨Á¢Á¬½Óǰ½øÐÐÊý¾Ý²¦ºÅ
|
rec_ptr = strchr((char *)gprs_module_para_p->gprs_recv_buf, ':');
|
if (rec_ptr != NULL)
|
{
|
rec_ptr += 2;
|
if (rec_ptr[0] == '1')
|
{
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ZIPOPEN;
|
// gprs_test_g.gprs_call_cnt++;
|
}
|
}
|
break;
|
case LOGIN_CMD_ZIPOPEN: // ½¨Á¢·þÎñÆ÷Á¬½Ó
|
rec_ptr = strchr((char *)gprs_module_para_p->gprs_recv_buf, ',');
|
if (rec_ptr != NULL)
|
{
|
rec_ptr++;
|
if (rec_ptr[0] == '1')
|
{
|
gprs_module_para_p->gprs_module_state = SEND_CMD_ZIPSENDRAW;
|
// gprs_test_g.gprs_tcp_cnt++;
|
}
|
else
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ZRST;
|
}
|
else
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_ZRST;
|
break;
|
case LOGIN_CMD_ZRST:
|
gprs_module_para_p->gprs_module_state = LOGIN_CMD_CMEE;
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 2);
|
break;
|
#endif
|
default:
|
break;
|
}
|
memset(gprs_module_para_p->gprs_recv_buf, 0, sizeof(gprs_module_para_p->gprs_recv_buf));
|
}
|
}
|
|
/*
|
recv_valid_length £º½ÓÊÕµÄÓÐЧÊý¾Ý³¤¶È
|
**pAddr £º Ë«ÖØÖ¸Õë·µ»ØµØÖ·
|
*/
|
uint8_t Gprs_Module_RecvDataProcess(uint16_t *recv_valid_length, uint8_t **pAddr, GPRS_MODULE_PARA_T *gprs_module_para_p)
|
{
|
uint8_t success_flag = 0;
|
uint8_t *valid_data_leng_ptr = NULL;
|
if (gprs_module_para_p->gprs_recv_flag)
|
{
|
gprs_module_para_p->gprs_recv_flag = RESET;
|
#if NB_OR_4G_FLAG
|
/*ÕÒµ½Ä£×é½ÓÊÕÃüÁî¹Ø¼ü×Ö*/
|
*pAddr = (uint8_t *)strstr((char *)gprs_module_para_p->gprs_recv_buf, "+SRECV:");
|
if (*pAddr != NULL)
|
{
|
*pAddr = (uint8_t *)strchr((char *)gprs_module_para_p->gprs_recv_buf, ',');
|
if (*pAddr != NULL)
|
{
|
valid_data_leng_ptr = *pAddr + 1;
|
*pAddr = (uint8_t *)strchr((char *)(*pAddr + 1), ',');
|
if (*pAddr != NULL && valid_data_leng_ptr != NULL)
|
{
|
*pAddr += 1;
|
if (*(*pAddr) == 0x36 && *(*pAddr + 1) == 0x38)
|
{
|
*recv_valid_length = atoi((char *)valid_data_leng_ptr);
|
success_flag = 1;
|
}
|
}
|
}
|
}
|
else
|
{
|
*pAddr = (uint8_t *)strstr((char *)gprs_module_para_p->gprs_recv_buf, "ERROR:");
|
if (*pAddr != NULL)
|
{
|
*pAddr = (uint8_t *)strstr((char *)(*pAddr + 1), "8003");
|
if (*pAddr != NULL)
|
{
|
*recv_valid_length = 0;
|
success_flag = 3;
|
}
|
}
|
}
|
#else
|
/*ÕÒµ½Ä£×é½ÓÊÕÃüÁî¹Ø¼ü×Ö*/
|
*pAddr = (uint8_t *)strstr((char *)gprs_module_para_p->gprs_recv_buf, AT_ZIPRECV);
|
if (*pAddr != NULL)
|
{
|
*pAddr = (uint8_t *)strchr((char *)(*pAddr + 1), ',');
|
if (*pAddr != NULL)
|
{
|
*pAddr = (uint8_t *)strchr((char *)(*pAddr + 1), ',');
|
if (*pAddr != NULL)
|
{
|
*pAddr = (uint8_t *)strchr((char *)(*pAddr + 1), ','); // µÚÈý¸ö¶ººÅºóÃæ½Ó¡°Êý¾Ý³¤¶È¡±
|
if (*pAddr != NULL)
|
{
|
valid_data_leng_ptr = *pAddr + 1;
|
*recv_valid_length = atoi((char *)valid_data_leng_ptr);
|
*pAddr = (uint8_t *)strchr((char *)(*pAddr + 1), ','); // µÚËĸö¶ººÅºó½Ó¡°Êý¾Ý¡±
|
if (*pAddr != NULL && valid_data_leng_ptr != NULL)
|
{
|
*pAddr += 1;
|
success_flag = 1;
|
}
|
// *pAddr = (uint8_t *)strchr((char *)(*pAddr + 1), PROTOCOL_START_CODE);
|
// if (*pAddr != NULL && valid_data_leng_ptr != NULL)
|
// success_flag = 1;
|
}
|
}
|
}
|
}
|
else
|
{
|
*pAddr = (uint8_t *)strstr((char *)gprs_module_para_p->gprs_recv_buf, "CONNECT");
|
if (*pAddr != NULL)
|
{
|
valid_data_leng_ptr = 0;
|
success_flag = 3;
|
gprs_resend_data_flag_g = 1;
|
// gprs_test_g.gprs_len_cnt++;
|
}
|
}
|
#endif
|
}
|
return success_flag;
|
}
|