示例#1
0
void gsm_hangup()
{
    ElemType elem;
    char buf[30];
    char tmp[30];
    
    call_init_state = HOLD_STATE;
    
    strcpy(buf, "ATH\r\n");
    gsm_send(buf, NULL);

    //recv_gsm(NULL);
    if(cb_isempty(cb))
        return;

        cb_read(cb, &elem);
        //Serial.println(elem.data);
        
        memset(tmp, 0, sizeof(tmp));
        memcpy(tmp, elem.data, elem.len);
        tmp[elem.len+1] = '\n';

        if(strcmp(tmp, "OK") == 0){
            call_init_state = END_STATE;
            return;
        }

}
示例#2
0
void gsm_dial(char *number)
{
    char buf[30];

    sprintf(buf, "ATD%s;\r\n", number);
    gsm_send(buf, NULL);

}
示例#3
0
/*gsm供电的处理纤程*/
static void rt_thread_gsm_power_on( void* parameter )
{
	rt_err_t	ret;
	int			i;
	AT_CMD_RESP at_init[] =
	{
		{ "",			   RESP_TYPE_STR,		  RT_NULL,	  "OK",			  RT_TICK_PER_SECOND * 5, 1	 },
		{ "",			   RESP_TYPE_STR,		  RT_NULL,	  "OK",			  RT_TICK_PER_SECOND * 5, 1	 },
		{ "ATE0\r\n",	   RESP_TYPE_STR,		  RT_NULL,	  "OK",			  RT_TICK_PER_SECOND * 5, 1	 },
		{ "ATV1\r\n",	   RESP_TYPE_STR,		  RT_NULL,	  "OK",			  RT_TICK_PER_SECOND * 5, 1	 },
		{ "AT%TSIM\r\n",   RESP_TYPE_STR_WITHOK,  RT_NULL,	  "%TSIM 1",	  RT_TICK_PER_SECOND * 2, 5	 },


		{ "AT+CMGF=0\r\n", RESP_TYPE_STR,		  RT_NULL,	  "OK",			  RT_TICK_PER_SECOND * 3, 3	 },
		{ "AT+CNMI=1,2\r\n",RESP_TYPE_STR,		  RT_NULL,	  "OK",			  RT_TICK_PER_SECOND * 3, 3	 },

		
		{ "AT+CPIN?\r\n",  RESP_TYPE_STR_WITHOK,  RT_NULL,	  "+CPIN: READY", RT_TICK_PER_SECOND * 2, 30 },
		
		{ "AT+CIMI\r\n",   RESP_TYPE_FUNC_WITHOK, resp_CIMI,  RT_NULL,		  RT_TICK_PER_SECOND * 2, 10 },
		{ "AT+CLIP=1\r\n", RESP_TYPE_STR,		  RT_NULL,	  "OK",			  RT_TICK_PER_SECOND * 2, 10 },
		{ "AT+CREG?\r\n",  RESP_TYPE_FUNC_WITHOK, resp_CGREG, RT_NULL,		  RT_TICK_PER_SECOND * 2, 30 },
	};

lbl_poweron_start:
	rt_kprintf( "%08d gsm_power_on>start\r\n", rt_tick_get( ) );

	GPIO_ResetBits( GSM_PWR_PORT, GSM_PWR_PIN );
	GPIO_ResetBits( GSM_TERMON_PORT, GSM_TERMON_PIN );
	rt_thread_delay( RT_TICK_PER_SECOND / 10 );
	GPIO_SetBits( GSM_TERMON_PORT, GSM_TERMON_PIN );
	GPIO_SetBits( GSM_PWR_PORT, GSM_PWR_PIN );

	for( i = 0; i < sizeof( at_init ) / sizeof( AT_CMD_RESP ); i++ )
	{
		if( gsm_send( at_init[i].atcmd, \
		              at_init[i].resp, \
		              at_init[i].compare_str, \
		              at_init[i].type, \
		              at_init[i].timeout, \
		              at_init[i].retry ) != RT_EOK )
		{
			/*todo 错误计数,通知显示*/
			rt_kprintf( "%08d stage=%d\r\n", rt_tick_get( ), i );
			goto lbl_poweron_start;
		}
	}

	rt_kprintf( "%08d gsm_power_on>end\r\n", rt_tick_get( ) );

	gsm_state = GSM_AT; /*当前出于AT状态,可以拨号,连接*/
}
示例#4
0
void gsm_query_me_state()
{
    char buf[30];
    ElemType elem;
    int me_state = -1;
    char number[20];

    switch(get_me_state){
        case 0:
            if(try_lock()){
                gsm_send("AT+CPAS\r\n", NULL);
                get_me_state = 1;
            }
            break;
        case 1:
            if(!cb_isempty(cb)){
                cb_read(cb, &elem);
                if(strstr(elem.data, "+CPAS") == NULL)
                    goto FIN;
                // \r\n+CPAS: 0\r\nOK\r\n
                memset(buf, 0, sizeof(buf));
                memcpy(buf, elem.data+2, elem.len - 2 - 6);
                sscanf(buf, "+CPAS: %d", &me_state);
                //Serial.println(buf);
            }
FIN:
            unlock();
            get_me_state = 0;
            break;
        default:
            break;
    }
#if 1
    switch(me_state){
        case ME_READY:
            if(ring_flag)
                call_init_state = END_STATE;
            break;
        case ME_RING:
            call_init_state = CALL_STATE;
            break;
        case ME_CALL:
            call_init_state = CNT_STATE;
            break;
        case -1:
            break;
        default:
            break;
    }
#endif
}
示例#5
0
void gsm_query_call(char *income_number)
{
    char buf[30];
    ElemType elem;
    int idx,dir,stat,mode,mpty,ret;
    char number[20];

    if(!ring_flag)
        return;
    switch(get_income_state){
        case 0:
            if(try_lock()){
                gsm_send("AT+CLCC\r\n", NULL);
                get_income_state = 1;
            }
            break;
        case 1:
            if(!cb_isempty(cb)){
                cb_read(cb, &elem);
                if(strstr(elem.data, "+CLCC") == NULL)
                    goto FIN;
                // \r\n+CLCC: 1,1,4,0,0,"13720405960",161\r\nOK\r\n
                memset(buf, 0, sizeof(buf));
                memcpy(buf, elem.data+9, elem.len - 9 - 12);
                //Serial.println(buf);
#if 1
                sscanf(buf, "%d,%d,%d,%d,%d,%s\r\n", &idx,&dir,&stat,&mode,&mpty,&number);
                //Serial.println(number);
                strcpy(income_number, number);
                call_init_state = CALL_STATE;
#endif
            }
FIN:
            unlock();
            get_income_state = 0;
            break;
        default:
            break;
    }

}
示例#6
0
void gsm_call_answer()
{
    ElemType elem;
    char buf[30];
    char tmp[30];
    bool ring_flag = false;
    bool ans_flag = false;
    unsigned int ret = 0;
    
            strcpy(buf, "ATA\r\n");
            gsm_send(buf, NULL);
            ring_flag = false;
            ans_flag = true;
#if 1
        if(cb_isempty(cb) == 0 && ans_flag){
            memset(&elem, 0, sizeof(elem));
            cb_read(cb, &elem);
            memset(tmp, 0, sizeof(tmp));
            memcpy(tmp, elem.data, elem.len);
            tmp[elem.len + 1] = '\0';
            if(strcmp(tmp, "OK") == 0)
                call_init_state = CNT_STATE;
        }
#endif
#if 0 
        memset(tmp, 0, sizeof(tmp));
        memcpy(tmp, elem.data, elem.len);
        tmp[elem.len+1] = '\n';

        if(strcmp(tmp, "OK") == 0){
            call_init_state = END_STATE;
            return;
        }
#endif

}
示例#7
0
/*关于链路维护,只维护一个,多链路由上层处理*/
static void rt_thread_gsm_socket( void* parameter )
{
	char		buf[128];
	rt_err_t	err;
	int			i;
	AT_CMD_RESP at_cmd_resp;

	/*挂断连接*/
	if( curr_socket.state == SOCKET_CLOSE )
	{
		return;
	}

	/*建立连接*/
	if( curr_socket.state != SOCKET_START )
	{
		return;
	}

	if( is_ipaddr( curr_socket.ipstr ) ) /*是IP地址*/
	{
		strcpy( curr_socket.ip_addr, curr_socket.ipstr );
		curr_socket.state = SOCKET_CONNECT;
	}else
	{
		curr_socket.state = SOCKET_DNS;
	}

	if( curr_socket.state == SOCKET_DNS )
	{
		sprintf( buf, "AT%%DNSR=\"%s\"\r\n", curr_socket.ipstr );
		err = gsm_send( buf, resp_DNSR, RT_NULL, RESP_TYPE_FUNC_WITHOK, RT_TICK_PER_SECOND * 10, 1 );
		if( err != RT_EOK )
		{
			curr_socket.state = SOCKET_DNS_ERR;
			goto lbl_gsm_socket_end;
		}
		curr_socket.state = SOCKET_CONNECT;
	}

	if( curr_socket.state == SOCKET_CONNECT )
	{
		if( curr_socket.type == 'u' )
		{
			sprintf( buf, "AT%%IPOPENX=%d,\"UDP\",\"%s\",%d\r\n", curr_socket.linkno, curr_socket.ip_addr, curr_socket.port );
		}else
		{
			sprintf( buf, "AT%%IPOPENX=%d,\"TCP\",\"%s\",%d\r\n", curr_socket.linkno, curr_socket.ip_addr, curr_socket.port );
		}
		err = gsm_send( buf, RT_NULL, "CONNECT", RESP_TYPE_STR, RT_TICK_PER_SECOND * 10, 1 );
		if( err != RT_EOK )
		{
			curr_socket.state = SOCKET_CONNECT_ERR;
			goto lbl_gsm_socket_end;
		}
	}
	curr_socket.state = SOCKET_READY;
lbl_gsm_socket_end:
	gsm_state = GSM_TCPIP; /*socket过程处理完成,结果在state中*/
	rt_kprintf( "%08d gsm_socket>end socket.state=%d\r\n", rt_tick_get( ), curr_socket.state );
}
示例#8
0
/*控制登网,还是断网*/
static void rt_thread_gsm_gprs( void* parameter )
{
	char		buf[128];
	rt_err_t	err;

/*判断要执行怎样的动作*/

	if( dial_param.fconnect == 0 ) /*断网*/
	{
		err = gsm_send( "AT%IPCLOSE=1\r\n", RT_NULL, "OK", RESP_TYPE_STR, RT_TICK_PER_SECOND * 35, 1 );
		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}
		err = gsm_send( "AT%IPCLOSE=2\r\n", RT_NULL, "OK", RESP_TYPE_STR, RT_TICK_PER_SECOND * 35, 1 );

		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}
		err = gsm_send( "AT%IPCLOSE=3\r\n", RT_NULL, "OK", RESP_TYPE_STR, RT_TICK_PER_SECOND * 35, 1 );

		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}
		err = gsm_send( "AT%IPCLOSE=5\r\n", RT_NULL, "OK", RESP_TYPE_STR, RT_TICK_PER_SECOND * 35, 1 );
		err = gsm_send( "", RT_NULL, "%IPCLOSE:5", RESP_TYPE_STR, RT_TICK_PER_SECOND, 1 );
		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}
		gsm_state = GSM_AT;
		goto lbl_gsm_gprs_end;
	}

	if( dial_param.fconnect == 1 ) /*允许登网*/
	{
		err = gsm_send( "AT+CGATT?\r\n", RT_NULL, "+CGATT: 1", RESP_TYPE_STR_WITHOK, RT_TICK_PER_SECOND * 2, 50 );
		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}

		sprintf( buf, "AT+CGDCONT=1,\"IP\",\"%s\"\r\n", dial_param.apn );

		err = gsm_send( buf, RT_NULL, "OK", RESP_TYPE_STR, RT_TICK_PER_SECOND * 10, 2 );
		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}
		
		if( ( strlen( dial_param.user ) == 0 ) && ( strlen( dial_param.user ) == 0 ) )
		{
			err = gsm_send( "AT%ETCPIP\r\n", RT_NULL, "OK", RESP_TYPE_STR, RT_TICK_PER_SECOND * 151, 1 );
		}else
		{
			sprintf( buf, "AT%ETCPIP=\"%s\",\"%s\"\r\n", dial_param.user, dial_param.psw );
			err = gsm_send( buf, RT_NULL, "OK", RESP_TYPE_STR, RT_TICK_PER_SECOND * 151, 1 );
		}
		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}

		err = gsm_send( "AT%ETCPIP?\r\n", resp_ETCPIP, RT_NULL, RESP_TYPE_FUNC_WITHOK, RT_TICK_PER_SECOND * 10, 1 );
		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}

		err = gsm_send( "AT%IOMODE=1,2,1\r\n", RT_NULL, "OK", RESP_TYPE_STR, RT_TICK_PER_SECOND * 10, 1 );
		if( err != RT_EOK )
		{
			goto lbl_gsm_gprs_end_err;
		}

		gsm_state = GSM_TCPIP;
		goto lbl_gsm_gprs_end;
	}
lbl_gsm_gprs_end_err:
	gsm_state = GSM_ERR_GPRS;
lbl_gsm_gprs_end:
	rt_kprintf( "%08d gsm_gprs>end state=%d\r\n", rt_tick_get( ), gsm_state );
}