예제 #1
0
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;
}
예제 #2
0
파일: tasks.c 프로젝트: barriquello/uFSM_OS
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			
			


	}
}