static int modem_probe_caps(int fd, glong timeout_ms) { const char *gcap_responses[] = { GCAP_TAG, NULL }; const char *terminators[] = { "OK", "ERROR", "ERR", "+CME ERROR", NULL }; char *reply = NULL; int idx = -1, term_idx = -1, ret = 0; gboolean try_ati = FALSE; GTimeVal start, end; gboolean send_success; /* If a delay was specified, start a bit later */ if (timeout_ms > 500) { g_usleep (500000); timeout_ms -= 500; } /* Standard response timeout case */ timeout_ms += 3000; while (timeout_ms > 0) { GTimeVal diff; gulong sleep_time = 100000; g_get_current_time (&start); idx = term_idx = 0; send_success = modem_send_command (fd, "AT+GCAP\r\n"); if (send_success) idx = modem_wait_reply (fd, 2, gcap_responses, terminators, &term_idx, &reply); else sleep_time = 300000; g_get_current_time (&end); g_timeval_subtract (&diff, &end, &start); timeout_ms -= (diff.tv_sec * 1000) + (diff.tv_usec / 1000); if (send_success) { if (0 == term_idx && 0 == idx) { /* Success */ verbose ("GCAP response: %s", reply); ret = parse_gcap (reply); break; } else if (0 == term_idx && -1 == idx) { /* Just returned "OK" but no GCAP (Sierra) */ try_ati = TRUE; break; } else if (3 == term_idx && -1 == idx) { /* No SIM (Huawei) */ try_ati = TRUE; break; } else if (1 == term_idx || 2 == term_idx) { try_ati = TRUE; } else verbose ("timed out waiting for GCAP reply (idx %d, term_idx %d)", idx, term_idx); g_free (reply); reply = NULL; } g_usleep (sleep_time); timeout_ms -= sleep_time / 1000; } if (!ret && try_ati) { const char *ati_responses[] = { GCAP_TAG, NULL }; /* Many cards (ex Sierra 860 & 875) won't accept AT+GCAP but * accept ATI when the SIM is missing. Often the GCAP info is * in the ATI response too. */ g_free (reply); reply = NULL; verbose ("GCAP failed, trying ATI...%s", ""); if (modem_send_command (fd, "ATI\r\n")) { idx = modem_wait_reply (fd, 3, ati_responses, terminators, &term_idx, &reply); if (0 == term_idx && 0 == idx) { verbose ("ATI response: %s", reply); ret = parse_gcap (reply); } } } g_free (reply); reply = NULL; /* Try an alternate method on some hardware (ex BUSlink SCWi275u) */ if ((idx != -2) && !(ret & MODEM_CAP_GSM) && !(ret & MODEM_CAP_IS707_A)) { const char *gmm_responses[] = { GMM_TAG, NULL }; if (modem_send_command (fd, "AT+GMM\r\n")) { idx = modem_wait_reply (fd, 5, gmm_responses, terminators, &term_idx, &reply); if (0 == term_idx && 0 == idx) { verbose ("GMM response: %s", reply); ret |= parse_gmm (reply); } g_free (reply); } } return ret; }
void Tarefa_GPRS(void) { /* task setup */ /* Tarefa do Logger para comunicacao com modem na UART2 a 9600 bps */ #define SEND_STRING0 "AT+CIPSENDI=0,\"GET node/set.json?nodeid=10&data=" #define SEND_STRING1 "}&apikey=90a004390f3530d0ba10199ac2b1ac3d HTTP/1.1\\r\\nHost: emon-gpsnetcms.rhcloud.com\\r\\n\\r\\n\\r\\n\"" #define SEND_STRING2 "AT+CIPSENDI=0,\"GET /input/post.json?json={pow:" //#define SEND_STRING3 ("}&" API_KEY " HTTP/1.1\r\nHost: " ESP_TCP_SERVER_NAME "\r\n\r\n\r\n") #define SEND_STRING3 "}&apikey=90a004390f3530d0ba10199ac2b1ac3d HTTP/1.1\\r\\nHost: emon-gpsnetcms.rhcloud.com\\r\\n\\r\\n\\r\\n\"" const char resp_200_OK[] = "HTTP/1.1 200 OK"; #define REPLY_LENGTH (sizeof(resp_200_OK) + 2) char valor[] = "01"; INT8U cnt = 1; volatile char c; static char resp_serv[REPLY_LENGTH]; static INT8U resp_cnt = 0; INT16U tentativas = 0; /* init ESP_UART */ uart_init(ESP_UART,ESP_BAUD,ESP_UART_BUFSIZE,ESP_UART_PINS,ESP_MUTEX,ESP_MUTEX_PRIO); /* init modem */ modem_send("AT\r\n"); modem_wait_reply(); modem_send("AT+CWMODE=3\r\n"); modem_wait_reply(); modem_send(("AT+CWJAP=\"" ESP_AP "\",\"" ESP_PWD "\"\r\n")); modem_wait_reply(); modem_send("AT+CIPCREATE=\"TCP\",10201,2048\r\n"); modem_wait_reply(); modem_send("AT+CIPCONNECT=0,\"54.160.189.224\",80\r\n"); modem_wait_reply(); /* task main loop */ for (;;) { DelayTask(5000); /* delay de 5s */ /* Comando de envio GET /input/post.json?json={campo:valor}&apikey=90a004390f3530d0ba10199ac2b1ac3d HTTP/1.1 Host:emon-gpsnetcms.rhcloud.com GET /node/set.json?nodeid=10&data=20,20,20,20&apikey=90a004390f3530d0ba10199ac2b1ac3d HTTP/1.1 Host:emon-gpsnetcms.rhcloud.com */ tentativas++; modem_send(SEND_STRING2); sprintf(valor,"%d", cnt); modem_send(valor); modem_send(SEND_STRING3); NEWLINE(); //modem_wait_reply(); INT8U keep_data = 0; DelayTask(1000); /* delay de 1s */ resp_cnt = 0; while((c=modem_receive()) != (CHAR8)-1) { putchar_usb(c); if (keep_data < 2){ if (c=='+') { keep_data++; } }else{ resp_server_ok[resp_cnt++]=c; if(resp_cnt == 9) { if(c=='1'){ resp_cnt = 0; break; } } } } while((c=modem_receive()) != (CHAR8)-1) { putchar_usb(c); } modem_send("AT+CIPRD=0\r\n"); DelayTask(10); /* delay de 10ms */ /* resposta: HTTP/1.1 200 OK .Date: Wed, 03 Dec 2014 18:43:17 GMT .Server: Apache/2.2.15 (Red Hat) .Content-Length: 2 .Content-Type: application/json .Vary: Accept-Encoding .Accept-Ranges: none . .ok */ while((c=modem_receive()) != (CHAR8)-1) { putchar_usb(c); } cnt++; /* TODO: timeout */ #if 0 while(1){ c=modem_receive(); if ((c != '\r') && (c != '\n') && ((resp_cnt < sizeof(resp_serv)-2))){ resp_serv[resp_cnt++]=c; }else{ resp_serv[resp_cnt++]='\0'; if(strcmp (resp_serv,resp_200_OK) == 0){ cnt = (++cnt)%100; } resp_cnt = 0; break; } } #endif } }