hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#ifndef __BT_BASE_H__
#define __BT_BASE_H__
 
#include <stdbool.h>
#include <stdlib.h>
#include <stdint.h>
 
#ifdef __cplusplus
extern "C" {
#endif
 
#define MXA_ADV_DATA_LEN 32
#define DEVICE_ADDR_LEN  6
 
#define BT_ATT_DEFAULT_LE_MTU    23
#define BT_ATT_MAX_LE_MTU        517
#define BT_ATT_MAX_VALUE_LEN     512
#define BT_ATT_HEADER_LEN        3
 
#define RK_BT_TRANSPORT_UNKNOWN   0
#define RK_BT_TRANSPORT_BR_EDR    1
#define RK_BT_TRANSPORT_LE        2
 
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
 
typedef struct {
#define UUID_16     2
#define UUID_32     4
#define UUID_128    16
 
   uint16_t len; //byte
   const char *uuid;
} Ble_Uuid_Type_t;
 
enum {
   BLE_ADVDATA_TYPE_USER = 0,
   BLE_ADVDATA_TYPE_SYSTEM
};
 
typedef enum {
   PLAYROLE_TYPE_UNKNOWN,
   PLAYROLE_TYPE_SOURCE,
   PLAYROLE_TYPE_SINK,
} RK_BT_PLAYROLE_TYPE;
 
/*BT state*/
typedef enum {
   RK_BT_STATE_OFF,
   RK_BT_STATE_ON,
   RK_BT_STATE_TURNING_ON,
   RK_BT_STATE_TURNING_OFF,
} RK_BT_STATE;
 
typedef enum {
   RK_BT_BOND_STATE_NONE,
   RK_BT_BOND_STATE_BONDING,
   RK_BT_BOND_STATE_BONDED,
} RK_BT_BOND_STATE;
 
typedef enum {
   SCAN_TYPE_AUTO, //LE, BR/EDR, or both
   SCAN_TYPE_BREDR,
   SCAN_TYPE_LE,
   SCAN_TYPE_PAN,
   SCAN_TYPE_SPP
} RK_BT_SCAN_TYPE;
 
/*BT discovery state*/
typedef enum {
   RK_BT_DISC_STARTED,
   RK_BT_DISC_START_FAILED,
   RK_BT_DISC_STOPPED_AUTO,
   RK_BT_DISC_STOPPED_BY_USER,
} RK_BT_DISCOVERY_STATE;
 
typedef enum {
   RK_BT_DEV_PLATFORM_UNKNOWN = 0, /* unknown platform */
   RK_BT_DEV_PLATFORM_IOS,         /* Apple iOS */
} RK_BT_DEV_PLATFORM_TYPE;
 
typedef struct {
   Ble_Uuid_Type_t server_uuid;
   Ble_Uuid_Type_t chr_uuid[12];
   uint8_t chr_cnt;
   const char *ble_name;
   uint8_t ble_addr[DEVICE_ADDR_LEN];
   uint8_t advData[MXA_ADV_DATA_LEN];
   uint8_t advDataLen;
   uint8_t respData[MXA_ADV_DATA_LEN];
   uint8_t respDataLen;
   uint8_t advDataType;
   /* recevice data */
   void (*cb_ble_recv_fun)(const char *uuid, char *data, int len);
   /* full data */
   void (*cb_ble_request_data)(const char *uuid);
} RkBleContent;
 
typedef struct {
   RkBleContent ble_content;
   const char *bt_name;
   const char *bt_addr;
} RkBtContent;
 
typedef struct scaned_dev {
   char *remote_address;
   char *remote_name;
   unsigned int cod; //class of device
   bool is_connected;
   struct scaned_dev *next;
} RkBtScanedDevice;
 
typedef void (*RK_BT_STATE_CALLBACK)(RK_BT_STATE state);
typedef void (*RK_BT_BOND_CALLBACK)(const char *bd_addr, const char *name, RK_BT_BOND_STATE state);
typedef void (*RK_BT_DISCOVERY_CALLBACK)(RK_BT_DISCOVERY_STATE state);
typedef void (*RK_BT_DEV_FOUND_CALLBACK)(const char *address, const char *name, unsigned int bt_class, int rssi);
typedef void (*RK_BT_NAME_CHANGE_CALLBACK)(const char *bd_addr, const char *name);
typedef void (*RK_BT_MTU_CALLBACK)(const char *bd_addr, unsigned int mtu);
 
void rk_bt_register_state_callback(RK_BT_STATE_CALLBACK cb);
void rk_bt_register_bond_callback(RK_BT_BOND_CALLBACK cb);
void rk_bt_register_discovery_callback(RK_BT_DISCOVERY_CALLBACK cb);
void rk_bt_register_dev_found_callback(RK_BT_DEV_FOUND_CALLBACK cb);
void rk_bt_register_name_change_callback(RK_BT_NAME_CHANGE_CALLBACK cb);
int rk_bt_init(RkBtContent *p_bt_content);
int rk_bt_deinit(void);
int rk_bt_is_connected(void);
int rk_bt_set_class(int value);
int rk_bt_set_sleep_mode(void);
int rk_bt_enable_reconnect(int value);
int rk_bt_start_discovery(unsigned int mseconds, RK_BT_SCAN_TYPE scan_type);
int rk_bt_cancel_discovery();
bool rk_bt_is_discovering();
int rk_bt_get_scaned_devices(RkBtScanedDevice **dev_list, int *count);
int rk_bt_free_scaned_devices(RkBtScanedDevice *dev_list);
void rk_bt_display_devices();
int rk_bt_pair_by_addr(char *addr);
int rk_bt_unpair_by_addr(char *addr);
int rk_bt_set_device_name(char *name);
int rk_bt_get_device_name(char *name, int len);
int rk_bt_get_device_addr(char *addr, int len);
int rk_bt_get_paired_devices(RkBtScanedDevice **dev_list, int *count);
int rk_bt_free_paired_devices(RkBtScanedDevice *dev_list);
void rk_bt_display_paired_devices();
int rk_bt_set_visibility(const int visiable, const int connectable);
bool rk_bt_get_connected_properties(char *addr);
RK_BT_PLAYROLE_TYPE rk_bt_get_playrole_by_addr(char *addr);
RK_BT_DEV_PLATFORM_TYPE rk_bt_get_dev_platform(char *addr);
int rk_bt_get_eir_data(char *address, char *eir_data, int len);
 
//for bsa, default /usr/bin/bsa_server.sh
void rk_bt_set_bsa_server_path(char *path);
 
//for bsa, bluez don't support
//0: TRANSPORT_UNKNOWN, 1: TRANSPORT_BR_EDR, 2: TRANSPORT_LE
int rk_bt_read_remote_device_name(char *addr, int transport);
 
#ifdef __cplusplus
}
#endif
 
#endif /* __BT_BASE_H__ */