我有一个非常简单的蓝牙RFCOMM客户端应用程序,它试图从一个蓝牙设备,这是一个UART蓝牙转换器维护蓝牙stream。 我希望的行为是,当蓝牙发射器重新启动(它可以在不到2秒的时间内),我可以很快回到它。 目前感谢SO_RCVTIMEO我断开很快,但试图重新连接结果在几秒钟…
connect: Device or resource busy Not connected connect: Device or resource busy Not connected connect: Device or resource busy
…消息。 这是不pipe我是否重新启动我的过程。 你可以想象,如果我想经常closures我的蓝牙发射器(重新编程),这是不切实际的。 有任何套接字选项或其他蓝牙设置,我可以改变来解决这种行为?
#include <sys/types.h> #include <sys/socket.h> #include <bluetooth/bluetooth.h> #include <bluetooth/rfcomm.h> #include <unistd.h> #include <errno.h> int connect_to_bluetooth( char const* btaddr ) { int sock = socket( AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM ); if(sock < 0) { perror("socket"); return -1; } bdaddr_t ba; struct sockaddr_rc addr; str2ba( btaddr, &ba ); memset( &addr, 0, sizeof(addr) ); addr.rc_family = AF_BLUETOOTH; memcpy( &(addr.rc_bdaddr), &ba, sizeof(ba) ); addr.rc_channel = 1; int result = connect( sock, (struct sockaddr *)&addr, sizeof(addr ) ); if(result == 0) { struct timeval tv; tv.tv_sec = 2; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval)); setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO,(struct timeval *)&tv,sizeof(struct timeval)); printf("Connected to %s\n", btaddr); return sock; } close(sock); printf("Not connected\n"); perror("connect"); return -1; } int main(int argc, char** argv) { printf("Connect to bluetooth device\n"); int sock; if(argc < 2) return 1; while( (sock = connect_to_bluetooth(argv[1])) == -1) usleep(500000); while(1) { char buf[128]; ssize_t r = read(sock,buf, 128); if(r > 0) { write(0, buf, r); // write to stdout } else { perror("read"); printf("Errno is %i\n", errno); close(sock); while( (sock = connect_to_bluetooth(argv[1])) == -1) { usleep(500000); } } } return 0; }