Я пытаюсь установить простое соединение L2CAP Socket между IOS и ПК с Linux.
Мне удалось:
В этом примере IOS они используют некоторую рекламу PSM вЧтобы выбрать правильный PSM для канала L2CAP. При интеграции я установил фиксированный PSM с обеих сторон. Iphone подключается к Linux-машине с фиксированным PSM. Я пробовал несколько PSM (0x1001, 0x25).
Проблема в том, что я не могу подключиться и не могу получить никакой информации о том, что происходит в эфире.
У меня вопрос, нужно ли мне внедрять динамический / рекламный PSM наприложение для Linux? Нужно ли выбирать конкретный PSM? Удалось ли вам сделать эту работу? Есть ли у вас какие-либо предложения?
Заранее спасибо!
Код сервера:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>
#include "l2cap_socket.h"
int main(int argc, char **argv)
{
struct sockaddr_l2 loc_addr = { 0 }, rem_addr = { 0 };
char buf[1024] = { 0 };
int server_socket, client_socket, bytes_read;
unsigned int opt = sizeof(rem_addr);
printf("Start Bluetooth L2CAP server...\n");
/* allocate socket */
server_socket = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
/* bind socket to the local bluetooth adapter */
loc_addr.l2_family = AF_BLUETOOTH; /* Addressing family, always AF_BLUETOOTH */
bacpy(&loc_addr.l2_bdaddr, BDADDR_ANY); /* Bluetooth address of local bluetooth adapter */
loc_addr.l2_psm = htobs(L2CAP_SERVER_PORT_NUM); /* port number of local bluetooth adapter */
printf("binding\n");
if(bind(server_socket, (struct sockaddr *)&loc_addr, sizeof(loc_addr)) < 0) {
perror("failed to bind");
exit(1);
}
printf("listening\n");
/* put socket into listening mode */
listen(server_socket, 1);
/* accept one connection */
client_socket = accept(server_socket, (struct sockaddr *)&rem_addr, &opt); /* return new socket for connection with a client */
ba2str( &rem_addr.l2_bdaddr, buf );
printf("connected from %s\n", buf);
/* read data from the client */
memset(buf, 0, sizeof(buf));
bytes_read = recv(client_socket, buf, sizeof(buf), 0);
if( bytes_read > 0 ) {
printf("received [%s]\n", buf);
}
/* close connection */
close(client_socket);
close(server_socket);
return 0;
}
Клиент базируется on (от https://github.com/bluekitchen/CBL2CAPChannel-Demo).