#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_CH5_Check(void) { uint16_t timeout_cnt = 0, dma_recv_cnt; uint32_t dma_mar_reg_read = DMA_CHxMAR_Read(DMA_CH9); 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_CH9)) { dma_mar_reg_read = DMA_CHxMAR_Read(DMA_CH9); 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_CH5); DMA_CHxCR_ChxEN_Setable(DMA_CH5, DISABLE); // ͨµÀʧÄÜ DMA_CHxMAR_Write(DMA_CH5, (uint32)gprs_module_para_g.gprs_recv_buf); DMA_CHxCR_ChxEN_Setable(DMA_CH5, 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; }