我正在 Linux Ubuntu 上运行服务器软件,代码如下:
int serverSocket, clientSocket;
struct sockaddr_rc serverAddr = {0}, clientAddr={0};
socklen_t clientAddrSize = sizeof(sockaddr_rc);
// Create Bluetooth socket
serverSocket=socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
if (serverSocket<0)
{
perror("socket creation failed: ");
return false;
}
bdaddr_t bdaddr_any={{0,0,0,0,0,0}};
// Bind the socket to any local Bluetooth adapter
serverAddr.rc_family = AF_BLUETOOTH;
serverAddr.rc_bdaddr = bdaddr_any; // bind to any local Bluetooth adapter
serverAddr.rc_channel = 20;
if (bind(serverSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr))<0)
{
perror("Bind failed");
close(serverSocket);
exit(EXIT_FAILURE);
}
// listen for incoming connections
if (listen(serverSocket,1) <0)
{
perror("Listen failed");
close(serverSocket);
exit(EXIT_FAILURE);
};
wxPrintf("Listening bluetooth\n");
while (true)
{
wxPrintf("Waiting for incoming Bluetooth connections...\n");
// Accept incoming connection
clientSocket = accept(serverSocket, (struct sockaddr*) &clientAddr,&clientAddrSize);
if (clientSocket<0)
{
perror("accept failed");
continue;
}
我在Windows 10上运行客户端软件,代码如下:
// Create a Bluetooth socket
m_serverSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
SOCKADDR_BTH serverAddr = { 0 };
if (m_serverSocket == INVALID_SOCKET) {
IB_P_APP->IbLogOutputMessageAdd("Failed to create socket: error %d", WSAGetLastError());
return false;
}
// Set the address of the remote Bluetooth device to connect to
serverAddr.addressFamily = AF_BTH;
serverAddr.btAddr = *reinterpret_cast<BTH_ADDR*>(&m_Server.Address.ullLong); // this is the addres found by function BluetoothFindFirstDevice()
serverAddr.serviceClassId = RFCOMM_PROTOCOL_UUID;
serverAddr.port = 20; // Replace with the RFCOMM channel number to use
// Connect to the remote Bluetooth device
if (connect(m_serverSocket, reinterpret_cast<SOCKADDR*>(&serverAddr), sizeof(serverAddr)) == SOCKET_ERROR) {
IB_P_APP->IbLogOutputMessageAdd("Failed to connect to %s: error %d", m_bt_devices[index].szName, WSAGetLastError());
return false;
}
type here
服务器正在侦听端口 25,而客户端尝试在同一端口上进行连接。 客户端首先搜索服务器,找到它并使用服务器的地址进行连接。 然后客户端上的连接失败,错误代码为 10051(有时为 10060) 在 Windows 10 上运行相同的服务器软件运行良好,客户端连接到服务器。
在 Linux 上没有安装防火墙,使用 bluetoothclt 我看到它已注册且可配对。 蓝牙适配器插入 USB 端口,显示为 USB2.0-BT。 我尝试了不同的端口但没有成功。
非常感谢任何帮助! 此致, 彼得
我将服务器代码移植到Windows,效果很好,因此客户端和服务器都在Windows平台上运行。 我将其重新编程为以太网通信,这也工作正常。
似乎是一个持续存在的问题——这个C代码在bluez下失败。官方的解决方案是使用 DBus 访问 bluez - 如果从头开始使用 DBus 则非常困难。 这个 C 和 Python 库中有一个非 bluez 解决方案。
https://github.com/petzval/btferret
这是经典服务器的代码。它在通道 1 上通告串行 RFCOMM 连接。如果提示输入 PIN,请在两台设备上输入 0000。将换行符 (10) 设置为客户端上的行结束标记。
#include <stdio.h>
#include <stdlib.h>
#include "btlib.h"
int callback(int node,unsigned char *data,int len);
int main()
{
if(init_blue("devices.txt") == 0)
return(0);
classic_server(ANY_DEVICE,callback,10,KEY_ON | PASSKEY_LOCAL);
close_all();
}
int callback(int node,unsigned char *data,int len)
{
printf("Received: %s",data);
write_node(node,"OK\n",3); // reply
if(data[0] == 'x') // send x to exit server
return(SERVER_EXIT);
return(SERVER_CONTINUE);
}