| Android Socket protocol for Bluetooth |
| ===================================== |
| |
| Since Android switched from BlueZ (where sockets where nicely implemented) to |
| Bluedroid user space stack there is a need to emulate bluetooth sockets. |
| |
| Android Bluetooth Socket Hardware Abstraction Layer (HAL) bt_sock.h has |
| only 2 functions: |
| |
| static btsock_interface_t sock_if = { |
| sizeof(sock_if), |
| sock_listen, |
| sock_connect |
| }; |
| |
| with following parameters: |
| |
| sock_listen(btsock_type_t type, const char *service_name, |
| const uint8_t *uuid, int chan, int *sock_fd, int flags) |
| sock_connect(const bt_bdaddr_t *bdaddr, btsock_type_t type, |
| const uint8_t *uuid, int chan, int *sock_fd, int flags) |
| |
| socket type RFCOMM is only supported at the moment. uuid and channel used |
| to decide where to connect. |
| |
| sockfd is used to return socket fd to Android framework. It is used to inform |
| framework when remote device is connected. |
| |
| listen() |
| ======== |
| |
| Listens on RFCOMM socket, socket channel is either found based on uuid or |
| channel parameter used directly. Returns sock_fd to Android framework. |
| |
| Through this sock_fd channel number as (int) needs to be written right after |
| listen() succeeds. |
| |
| When remote device is connected to this socket we shall send accept signal |
| through sock_fd |
| |
| connect() |
| ========= |
| |
| Connects to remote device specified in bd_addr parameter. Socket channel is |
| found by SDP search of remote device by supplied uuid. Returns sock_fd to |
| Android framework. |
| |
| Through this sock_fd channel number as (int) needs to be written right after |
| connects() succeeds. |
| |
| When remote device is connected to this socket we shall send connect signal |
| through sock_fd |
| |
| The format of connect/accept signal is shown below: |
| |
| struct hal_sock_connect_signal { |
| short size; |
| uint8_t bdaddr[6]; |
| int channel; |
| int status; |
| } __attribute__((packed)); |