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; } }
void gsm_dial(char *number) { char buf[30]; sprintf(buf, "ATD%s;\r\n", number); gsm_send(buf, NULL); }
/*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状态,可以拨号,连接*/ }
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 }
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; } }
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 }
/*关于链路维护,只维护一个,多链路由上层处理*/ 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 ); }
/*控制登网,还是断网*/ 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 ); }