Server 使用两个适配器在一台机器上运行两个蓝牙程序 新职位

Server 使用两个适配器在一台机器上运行两个蓝牙程序 新职位,server,bluetooth,client,adapter,rfcomm,Server,Bluetooth,Client,Adapter,Rfcomm,我现在对我的问题有了更好的理解,我将更新这个线程,而不是创建一个新线程 因此,使用hci\u open\u dev是错误的,因为它只打开本地BT适配器的套接字。它不能帮助我建立到远程设备的连接 总而言之,我的笔记本电脑里有一个内置的BT适配器,我买了一个USB BT适配器,我把它插到了同一台笔记本电脑上。现在我想在这台机器上运行两个可以通信的程序。为此,他们需要使用不同的适配器 bind的第二个参数是一个struct sockaddr*,我只是将上一个struct sockaddr\u rc*转

我现在对我的问题有了更好的理解,我将更新这个线程,而不是创建一个新线程

因此,使用
hci\u open\u dev
是错误的,因为它只打开本地BT适配器的套接字。它不能帮助我建立到远程设备的连接

总而言之,我的笔记本电脑里有一个内置的BT适配器,我买了一个USB BT适配器,我把它插到了同一台笔记本电脑上。现在我想在这台机器上运行两个可以通信的程序。为此,他们需要使用不同的适配器

bind
的第二个参数是一个
struct sockaddr*
,我只是将上一个
struct sockaddr\u rc*
转换为它。侦听套接字的
struct sockaddr
bdaddr\u t
字段指定要使用哪个BT适配器,允许我执行以下操作:

struct sockaddr\u rc loc\u addr={0},rem\u addr={0};
//我的机器上内置BT适配器的地址
const char*adapter=“60:F2:62:1B:9C:74”;
//将其转换为bdaddr\t*
bdaddr_t*适配器bdad=strotba(适配器);
//分配套接字
int s=插座(AF_蓝牙、SOCK_流、BTPROTO_RFCOMM);
//将套接字绑定到端口1
loc_addr.rc_family=AF_蓝牙;
loc_addr.rc_bdaddr=*适配器数据;
loc_addr.rc_channel=(uint8_t)1;
绑定(结构sockaddr*)和loc_addr,大小(loc_addr));
//将套接字设置为侦听模式
听(s,1);
//接受一个连接
client=accept(s,(struct sockaddr*)和rem_addr,&opt);
//将bdaddr转换为char*(假设buf在别处定义)
ba2str(和rem_addr.rc_bdaddr,buf);
fprintf(stderr,“已接受来自%s的连接”,buf);
//免费套接字资源
关闭(客户);
关闭(s);;
但是,对于传出连接,我不确定如何指定要使用哪个适配器。代码大致如下所示:

struct sockaddr\u rc addr={0};
//这与上面的监听程序应该使用的地址相同
char dest[18]=“60:F2:62:1B:9C:74”;
//分配套接字
int s=插座(AF_蓝牙、SOCK_流、BTPROTO_RFCOMM);
//设置连接参数。要连接到收听程序吗
//并通过端口1连接。如果我将两个程序都更改为使用端口0 I
//从此程序中获取无效参数错误。
addr.rc_family=AF_蓝牙;
addr.rc_channel=(uint8_t)1;
str2ba(目的地和地址);
//连接到收听节目
int status=connect(s,(struct sockaddr*)和addr,sizeof(addr));
//这个程序永远不会超过这一点
如果(状态==0){
printf(“已成功连接\n”);
}否则{
perror(“错误连接”);
}
关闭(s);;
如上所述,我只能指定连接到哪个设备,使用哪个设备。当我首先启动监听程序,然后启动客户端时,连接从未建立。运行
hciconfig
的输出如下所示:

hci1:类型:主总线:USB
BD地址:60:F2:62:1B:9C:74 ACL MTU:1021:4 SCO MTU:96:6
正在运行
接收字节:16967 acl:0 sco:0事件:2751错误:0
发送字节:678007 acl:0 sco:0命令:2749错误:0
hci0:类型:主总线:USB
BD地址:5C:F3:70:9D:BC:07 ACL MTU:1021:8 SCO MTU:64:1
正在运行
接收字节:1016 acl:0 sco:0事件:57错误:0
发送字节:3679 acl:0 sco:0命令:57错误:0
我不是英国电信专家,但我在这里没有看到任何让我吃惊的东西。还有其他人吗如果有人能告诉我为什么这两个节目不能互相交谈,我将非常感激


旧职位 我正在我的笔记本电脑上开发一些蓝牙(BT)(普通蓝牙,而不是蓝牙低能耗)软件,为了在一台机器上测试它们,我买了第二个BT适配器(Asus USB-BT400)。插入后,我可以使用
hciconfig
立即看到它

我试图调整我的程序以使用合适的适配器,但它没有工作,我不知道为什么。我对BT编程很陌生,所以我可能误解了什么。为了让程序A使用地址为addr1的适配器,我运行了

int dev_id=hci_devid(“60:F2:62:1B:9C:74”);
int err=hci\u open\u dev(dev\u id);
如果(误差<0){
printf(“打开适配器设备时出错\n”);
}
其中
“60:F2:62:1B:9C:74”
addr1
。伴生程序执行相同的操作,但使用了其他适配器地址

当我运行这两个程序时,错误不会被打印出来(意味着适配器被成功选择了?),但程序什么也不做。过了一会儿,客户端程序打印出
Uh-Oh!主机已关闭
如果有人能解释我在选择适配器时做错了什么,我将非常感激。我还试着在一台笔记本电脑上运行服务器,在另一台笔记本电脑上运行客户端,但也没有发生任何事情。在这种情况下,我没有明确选择BT适配器,因为我希望它默认为唯一可用的适配器。我没有考虑到示例代码可能是错误的,但是如果有人看到任何错误,请指出它们

完整的代码可以在下面看到。我试图运行一个简单的示例,在服务器和客户端之间使用RFCOMM连接。这个例子是从Albert S.Huang和Larry Rudolph的《程序员蓝牙基本要素》一书中借来的,之后我尝试对其进行修改


服务器程序

#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
结构sockaddr_rc loc_addr={0},rem_addr={0};
char buf[1024]={0};
int s,客户端,字节\读取;
socklen_t opt=sizeof(rem_addr);
int dev_id=hci_devid(“60:F2:62:1B:9C:74”);
int err=hci\u open\u dev(dev\u id);
如果(误差<0){
printf(“打开笔记本电脑设备时出错\n”);
}
//分配套接字
s=插座(AF_蓝牙、SOCK_流、BTPROTO_RFCOMM);
//将套接字绑定到第一个端口的端口1