使用 BlueZ 和 C++ 在 Linux 上运行服务器和在 Windows 上运行客户端时出现蓝牙问题:错误 10051

问题描述 投票:0回答:1

我正在 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平台上运行。 我将其重新编程为以太网通信,这也工作正常。

linux windows ubuntu bluetooth connection
1个回答
0
投票

似乎是一个持续存在的问题——这个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);
  }


© www.soinside.com 2019 - 2024. All rights reserved.