Сервер Bluetooth SPP на C/C для устройств на базе Android

#android #c #bluetooth

Вопрос:

Я запускаю Android на imx7d от NXP с модулем Bluetooth Wifi 1 МВт.

Я хочу запустить сервер Bluetooth SPP на устройстве. Я реализовал программное обеспечение на C , в основном сокет RFCOMM. Я читал, что Android использовал Bluedroid вместо Bluez, как Linux. Но я понимаю, что метод создания сокета RFCOMM тот же(не уверен на 100%).

Я запускаю серверное программное обеспечение на основе C на устройстве imx7d, это не создает никаких проблем при создании SPP-порта RFCOMM. Он создает порт и переходит в режим прослушивания. Тем не менее, когда клиентское приложение Android Bluetooth, работающее на моем телефоне, пытается подключить его, это приводит к следующей ошибке в стеке Android bt моего устройства на основе imx7d.

[INFO:port_utils.cc(329)] port_find_mcb_dlci_port: Не удается найти выделенный порт приложения RFCOMM для DLCI 40 на 3c:28:6d:2a:b0:28, p_mcb=0x90367c24 PORT_ParNegInd dlci:40 mtu:990 2021-11-26 09:04:36.046 583-827/com.android.bluetooth E/bt_stack: [ERROR:port_rfc.cc(285)] PORT_ParNegInd: Отключите RFCOMM, порт не найден, dlci=40, p_mcb=0x90367c24, bd_addr=3c:28:6d:2a:b0:28

Я создал порт сервера на канале 20, но он не может его найти. Я не уверен, что именно идет не так, я застрял и не могу найти способ двигаться вперед. Вот фрагмент кода.

 #define BTPROTO_RFCOMM 3  /* BD Address */ typedef struct {  uint8_t b[6]; } __attribute__((packed)) bdaddr_t;  /* ---- RFCOMM sockets ---- */ struct sockaddr_rc {  sa_family_t rc_family;  bdaddr_t rc_bdaddr;  uint8_t rc_channel; };  #define BDADDR_ANY (amp;(bdaddr_t){{0, 0, 0, 0, 0, 0}})  /* server channel */ #define RFCOMM_SERVER_PORT_NUM 20  void BluetoothSerialPort::openConnection()  {  struct sockaddr_rc loc_addr;  bdaddr_t bdaddr_any = {0, 0, 0, 0, 0, 0};  ALOGE("Start Bluetooth SPP server...n");   /* allocate socket */  sockFd_ = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);  if (sockFd_ lt; 0)  {  ALOGE("Cannot start Bluetooth SPP servern");  }  memset(amp;loc_addr, 0, sizeof(loc_addr));  loc_addr.rc_family = AF_BLUETOOTH;  loc_addr.rc_bdaddr = bdaddr_any;  loc_addr.rc_channel = RFCOMM_SERVER_PORT_NUM;   if (bind(sockFd_, (struct sockaddr *)amp;loc_addr, sizeof(loc_addr)) lt; 0)  {  ALOGE("socket bind error %s", strerror(errno));  exit(EXIT_FAILURE);  }   ALOGE("Listen Bluetooth SPP server on %d...n", sockFd_);  if (listen(sockFd_, 2) lt; 0)  {  ALOGE("socket listen error %s", strerror(errno));  exit(EXIT_FAILURE);  }  }   // Runs the server.  void BluetoothSerialPort::run()  {  struct sockaddr_rc client_addr;  socklen_t opt = sizeof(client_addr);  openConnection();  ALOGE("Listening on Bluetooth SPP server = %d...n", sockFd_);  /* return new socket for connection with a client */  clientFd_ = accept(sockFd_, reinterpret_castlt;struct sockaddr *gt;(amp;client_addr), amp;opt);  ALOGE("connected from %sn", (char *)amp;client_addr.rc_bdaddr);  if (clientFd_ == -1)  {  ALOGE("error accepting incoming connection: %s", strerror(errno));  }  else  {   ALOGI("got new connection");  }   // Create a thread and transfer the new stream to it.  std::thread thr(std::bind(amp;BluetoothSerialPort::readHandler, this));  thr.detach();  }  

Может кто-нибудь, пожалуйста, помочь? Если в коде есть какая-либо ошибка, он выводит следующую строку «Прослушивание на сервере Bluetooth SPP» и переходит в режим прослушивания.

Большое спасибо, Асма