#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» и переходит в режим прослушивания.
Большое спасибо, Асма