Moderadores: 51, guest2003, Renie, gpenga
/**
* Efetua a conexão com o endereço MAC fornecido
* @param enderecoMac string contendo o endereço MAC do dispositivo
* @return stream de conexão ou -1 em caso de falha.
**/
int bluetoothConnect(char *enderecoMac){
struct sockaddr_rc addr;
int s, status;
int sock_flags;
TAddr address;
pthread_t th;
memset(&addr, 0, sizeof(addr));
gboolean finalizado;
if (enderecoMac == NULL) return -1;
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
if (s < 0)
return s;
addr.rc_family = AF_BLUETOOTH;
addr.rc_channel = 1;
str2ba( enderecoMac, &addr.rc_bdaddr );
sock_flags = fcntl( s, F_GETFL, 0 );
fcntl( s, F_SETFL, sock_flags | O_NONBLOCK );
address.addr = (struct sockaddr *) &addr;
address.size = sizeof(addr);
address.finalizado = FALSE;
address.status = -1;
address.soc = s;
status = pthread_create(&th,
NULL,
connect_w_to,
(void *)(&address));
if (status < 0){
g_usleep(1000);
logDebug("Erro criando thread de conexão\n");
}
status = 0;
//winShowAnimatedScreen("animatedBar.gif", "Aguarde, conectando...", &(address.finalizado), &finalizado);
if (finalizado) pthread_cancel(th);
//todo: verificar se foi finalizado pelo usuário.
while (!address.finalizado && !finalizado) {
//logDebug("Aguardando conexão %d\n", status++);
}
pthread_detach(th);
logDebug("Conexão com bluetooth: fd= %d, status= %d\n", s, address.status);
if (finalizado || address.status < 0) {
close(s);
s = -1;
}
return s;
}
//função em thread para conexão com timeout
void *connect_w_to(void *adr) {
int res;
fd_set myset;
struct timeval tv;
int valopt;
socklen_t lon;
TAddr *address = (TAddr *) adr;
// pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
// pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
res = connect(address->soc, address->addr, address->size);
if (res < 0) {
if (errno == EINPROGRESS) {
do {
tv.tv_sec = 15;
tv.tv_usec = 0;
FD_ZERO(&myset);
FD_SET(address->soc, &myset);
res = select(address->soc+1, NULL, &myset, NULL, &tv);
if (res < 0 && errno != EINTR) {
address->finalizado = TRUE;
} else {
address->finalizado = TRUE;
if (res > 0){
lon = sizeof(int);
if(getsockopt(address->soc,
SOL_SOCKET,
SO_ERROR,
(void*)(&valopt),
&lon) >= 0){
if (!valopt) {
address->status = res;
}
}
} else {//time out
address->status = -2;
}
}
} while (!address->finalizado);
} else { //erro iniciando o select
address->status = -3;
address->finalizado = TRUE;
}
}
return NULL;
}
Networking --->
<*> Bluetooth subsystem support --->
--- Bluetooth subsystem support
<*> L2CAP protocol support
<*> SCO links support
<*> RFCOMM protocol support
[*] RFCOMM TTY support
<*> BNEP protocol support
[*] Multicast filter support
[*] Protocol filter support
<M> HIDP protocol support
chipselect escreveu:
- Código: Selecionar todos
//winShowAnimatedScreen("animatedBar.gif", "Aguarde, conectando...", &(address.finalizado), &finalizado);
//winShowAnimatedScreen("animatedBar.gif", "Aguarde, conectando...", &(address.finalizado), &finalizado);
Voltar para Linux ( x86 ou x64 )
Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes