使用Linux套接字API快速重新连接到RFCOMM蓝牙设备

时间:2012-04-26 21:36:16

标签: c linux sockets bluetooth rfcomm

我有一个非常简单的蓝牙RFCOMM客户端应用程序尝试 从蓝牙设备维护蓝牙流,这是一个UART到蓝牙转换器。我希望的行为是当蓝牙发射器重新启动时(它可以在不到2秒的时间内完成)我可以很快恢复它。目前,由于SO_RCVTIMEO,我很快断开连接,但试图在几秒钟内重新连接结果......

connect: Device or resource busy
Not connected
connect: Device or resource busy
Not connected
connect: Device or resource busy

...消息。无论我是否重启我的进程,都是如此。如果我想频繁关闭我的蓝牙发射器(重新编程),你可以想象这有点不切实际。我可以更改任何套接字选项或其他蓝牙设置来修复此行为吗?

#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;
}

0 个答案:

没有答案