1 /*
2 # Copyright (C) 2024 HiHope Open Source Organization .
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 */
15
16 #include <stdbool.h>
17 #include <string.h>
18 #include <stdlib.h>
19
20 #include "osal_list.h"
21 #include "securec.h"
22 #include "bts_le_gap.h"
23 #include "bts_gatt_client.h"
24 #include "bts_gatt_server.h"
25 #include "cmsis_os2.h"
26
27 #include "ohos_bt_gap.h"
28 #include "ohos_bt_gatt.h"
29 #include "ohos_bt_def.h"
30 #include "ohos_bt_gatt_server.h"
31 #include "ohos_bt_gatt_client.h"
32
33
34 static uint8_t g_chara_val[] = {0x11, 0x22, 0x33, 0x44};
35 static uint8_t g_desc_val[] = {0x55, 0x66, 0x77, 0x88};
36 #define UUID16_LEN 2
37 #define UUID32_LEN 4
38 #define UUID128_LEN 16
39 #define BLE_MAX_SERVICES_NUMS 16
40 #define BLE_HILINK_SERVER_LOG "[BLE_OH_LOG]"
41 #define BLE_ADV_HANDLE_DEFAULT 1
42 #define INVALID_SERVER_ID 0
43 #define EXT_ADV_OR_SCAN_RSP_DATA_LEN 251
44 #define MAX_READ_REQ_LEN 200
45
46 static BtGapCallBacks *g_ble_gap_cb = NULL;
47 static BtGattServerCallbacks *g_ble_gatts_cb = NULL;
48 static BtGattCallbacks *g_ble_gatt_cb = NULL;
49 static BleScanCallbacks *g_ble_scan_cb = NULL;
50 static BtGattClientCallbacks *g_ble_gattc_cb = NULL;
51
52 static uint16_t g_services_handle[BLE_MAX_SERVICES_NUMS] = {0};
53 static uint16_t g_server_request_id = 0;
54 static uint16_t g_srvc_handle = 0;
55 static uint16_t g_cb_chara_handle = 0;
56 static uint16_t g_cb_desc_handle = 0;
57 static uint16_t g_indicate_handle = 17;
58 static uint8_t g_adv_status = 0;
59 static uint8_t g_io_cap_mode = 0;
60 static uint8_t g_sc_mode = 0;
61 static uint8_t g_gatt_write_flag = 0; /* 0:write 1:read */
62 static uint8_t g_service_flag = 0; /* 0:enable 1:disable start service */
63 static uint8_t g_server_id = INVALID_SERVER_ID; /* gatt server ID */
64 static uint8_t g_client_uuid = {0x00,0x01};
65 static bt_uuid_t bt_uuid;
66
67 typedef struct {
68 int conn_id;
69 int attr_handle; /* The handle of the attribute to be read */
70 BleGattServiceRead read;
71 BleGattServiceWrite write;
72 BleGattServiceIndicate indicate;
73 } hilink_ble_gatt_func;
74
75 hilink_ble_gatt_func g_charas_func[10] = {{0}}; /* 设置最大Service数量10 */
76 static uint8_t g_chara_cnt = 0;
77 static uint16_t g_conn_id = 0;
78 static uint32_t scannerId = 0;
79
80
81
reverse_uuid(uint8_t * input,char * output,int len)82 static void reverse_uuid(uint8_t *input, char *output, int len)
83 {
84 for (int i = 0; i < len; i++) {
85 output[i] = input[len - i - 1];
86 }
87 }
88
get_chara_read_func(int conn_id,int attr_handle)89 BleGattServiceRead get_chara_read_func(int conn_id, int attr_handle)
90 {
91 for (int i = 0; i < g_chara_cnt; i++) {
92 if ((g_charas_func[i].attr_handle == attr_handle)) {
93 return g_charas_func[i].read;
94 }
95 }
96 printf("get_chara_read_func Not Found! \n");
97 return NULL;
98 }
99
get_chara_write_func(int conn_id,int attr_handle)100 BleGattServiceWrite get_chara_write_func(int conn_id, int attr_handle)
101 {
102 for (int i = 0; i < g_chara_cnt; i++) {
103 if (g_charas_func[i].attr_handle == attr_handle) {
104 return g_charas_func[i].write;
105 }
106 }
107 printf("get_chara_write_func Not Found! \n");
108 return NULL;
109 }
110
get_chara_ind_func(int conn_id,int attr_handle)111 BleGattServiceIndicate get_chara_ind_func(int conn_id, int attr_handle)
112 {
113 for (int i = 0; i < g_chara_cnt; i++) {
114 if (g_charas_func[i].attr_handle == attr_handle) {
115 return g_charas_func[i].write;
116 }
117 }
118 printf("get_chara_ind_func Not Found! \n");
119 return NULL;
120 }
121
perm_bt_to_bluez(uint32_t permissions)122 static uint32_t perm_bt_to_bluez(uint32_t permissions)
123 {
124 uint32_t perm = 0;
125 if (permissions & OHOS_GATT_PERMISSION_READ) {
126 perm |= GATT_ATTRIBUTE_PERMISSION_READ;
127 }
128 if (permissions & OHOS_GATT_PERMISSION_READ_ENCRYPTED) {
129 perm |= (GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_ENCRYPTION_NEED);
130 }
131 if (permissions & OHOS_GATT_PERMISSION_READ_ENCRYPTED_MITM) {
132 perm |= (GATT_ATTRIBUTE_PERMISSION_READ |
133 GATT_ATTRIBUTE_PERMISSION_ENCRYPTION_NEED | GATT_ATTRIBUTE_PERMISSION_MITM_NEED);
134 }
135 if (permissions & OHOS_GATT_PERMISSION_WRITE) {
136 perm |= GATT_ATTRIBUTE_PERMISSION_WRITE;
137 }
138 if (permissions & OHOS_GATT_PERMISSION_WRITE_ENCRYPTED) {
139 perm |= (GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_ENCRYPTION_NEED);
140 }
141 if (permissions & OHOS_GATT_PERMISSION_WRITE_ENCRYPTED_MITM) {
142 perm |= (GATT_ATTRIBUTE_PERMISSION_WRITE |
143 GATT_ATTRIBUTE_PERMISSION_ENCRYPTION_NEED | GATT_ATTRIBUTE_PERMISSION_MITM_NEED);
144 }
145 printf("convert %04x to %04x.\n", permissions, perm);
146 return perm;
147 }
148
EnableBle(void)149 bool EnableBle(void)
150 {
151 int errcode = enable_ble();
152
153 if(errcode == 0){
154 return 1;
155 }else {
156 printf("%s EnableBle_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
157 return 0;
158 }
159 }
160
DisableBle(void)161 bool DisableBle(void)
162 {
163 int errcode = disable_ble();
164
165 if(errcode == 0){
166 return 1;
167 }else{
168 printf("%s DisableBle_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
169 return 0;
170 }
171 }
172
EnableBt(void)173 bool EnableBt(void)
174 {
175 int errcode = enable_ble();
176
177 if(errcode == 0){
178 return 1;
179 }else{
180 printf("%s EnableBle_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
181 return 0;
182 }
183
184 }
185
DisableBt(void)186 bool DisableBt(void)
187 {
188 int errcode = disable_ble();
189
190 if(errcode == 0){
191 return 1;
192 }else {
193 printf("%s DisableBle_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
194 return 0;
195 }
196 }
197
198
199
200 /**
201 * @brief Get local host bluetooth address.
202 *
203 * @return Returns <b>true</b> if the operation is accepted;
204 * returns <b>false</b> if the operation is rejected.
205 */
GetLocalAddr(unsigned char * mac,unsigned int len)206 bool GetLocalAddr(unsigned char *mac, unsigned int len){
207 bd_addr_t *bd_addr = (bd_addr_t *)malloc(sizeof(bd_addr_t));
208 int errcode = gap_ble_get_local_addr(bd_addr);
209 memcpy_s(mac,BD_ADDR_LEN,bd_addr->addr,len);
210 free(bd_addr);
211
212 if(errcode != 0){
213
214 printf("%s GetLocalAddress_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
215 return 0;
216 }else{
217 return 1;
218 }
219 }
220
221
222 /**
223 * @brief Set local device name.
224 * @param localName Device name.
225 length device name length
226 * @return Returns <b>true</b> if the operation is successful;
227 * returns <b>false</b> if the operation fails.
228 */
SetLocalName(unsigned char * localName,unsigned char length)229 bool SetLocalName(unsigned char *localName, unsigned char length)
230 {
231 int errcode = gap_ble_set_local_name(localName,length);
232
233 if(errcode == 0){
234 return true;
235 }else{
236 printf("%s SetLocalName_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
237 return false;
238 }
239 }
240
241
242
243
244
245 /*
246 * @brief read bt mac address
247 * @param[in] <mac> mac addr
248 * @param[in] <len> addr length
249 * @return 0-success, other-fail
250 */
ReadBtMacAddr(unsigned char * mac,unsigned int len)251 int ReadBtMacAddr(unsigned char *mac, unsigned int len)
252 {
253 bd_addr_t *addr;
254 int errcode = gap_ble_get_local_addr(addr);
255
256 len = sizeof(sizeof(addr->addr));
257 memcpy(mac,addr->addr,len);
258 if(errcode == 0){
259 return 0;
260 }else{
261 printf("%s ReadBtMacAddr_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
262 return 1;
263 }
264 }
265
266
267 /**
268 * @brief Read remote device rssi value.
269 *
270 * @param bdAddr device address.
271 * @param transport Transport type, details see {@link BtTransportId}
272 * @return Returns <b>true</b> if the operation is successful;
273 * returns <b>false</b> if the operation fails.
274 */
ReadRemoteRssiValue(void)275 bool ReadRemoteRssiValue(void)
276 {
277 int errcode = gap_ble_read_remote_device_rssi(g_conn_id);
278
279 if(errcode == 0){
280 return 1;
281 }else{
282 printf("%s ReadRemoteRssiValue_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
283 return 0;
284 }
285 }
286
287
288
289 /**
290 * @brief disconnect remote device all profile.
291 * @param addr device address.
292 * @return Returns <b>true</b> if device acl connected;
293 * returns <b>false</b> if device does not acl connect.
294 */
DisconnectRemoteDevice(BdAddr * addr)295 bool DisconnectRemoteDevice(BdAddr *addr)
296 {
297 bd_addr_t *bd_addr = (bd_addr_t *)malloc(sizeof(bd_addr_t));
298 bd_addr->type = 0;
299 memcpy_s(bd_addr->addr,BD_ADDR_LEN,addr->addr,OHOS_BD_ADDR_LEN);
300 int errcode = gap_ble_disconnect_remote_device(bd_addr);
301
302 free(bd_addr);
303 bd_addr = NULL;
304 if(errcode == 0){
305 return true;
306 }else {
307 printf("%s DisconnectRemoteDevice_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
308 return false;
309 }
310
311 }
312
313 /*
314 * @brief connect remote device acl profile.
315 * @param: remote device address
316 * @return Returns <b>true</b> if device acl connected;
317 * returns <b>false</b> if device does not acl connect.
318 */
ConnectRemoteDevice(BdAddr * addr)319 bool ConnectRemoteDevice(BdAddr *addr)
320 {
321 bd_addr_t *bd_addr = (bd_addr_t *)malloc(sizeof(bd_addr_t));
322 bd_addr->type = 0;
323 memcpy_s(bd_addr->addr,BD_ADDR_LEN,addr->addr,OHOS_BD_ADDR_LEN);
324 int errcode = gap_ble_connect_remote_device(bd_addr);
325
326 free(bd_addr);
327 bd_addr = NULL;
328 if(errcode == 0){
329 return true;
330 }else {
331 printf("%s ConnectRemoteDevice_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
332 return false;
333 }
334 }
335
336 /*
337 * @brief Initialize the Bluetooth protocol stack
338 * @param[in] void
339 * @return 0-success, other-fail
340 */
InitBtStack(void)341 int InitBtStack(void)
342 {
343 int errcode = enable_ble();
344
345 if(errcode == 0){
346 return 0;
347 }else {
348 printf("%s EnableBle_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
349 return 1;
350 }
351 }
352
353 /*
354 * @brief Bluetooth protocol stack enable
355 * @param[in] void
356 * @return 0-success, other-fail
357 */
EnableBtStack(void)358 int EnableBtStack(void)
359 {
360 int errcode = enable_ble();
361
362 if(errcode == 0){
363 return 0;
364 }else {
365 printf("%s EnableBle_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
366 return 1;
367 }
368 }
369
370 /*
371 * @brief Bluetooth protocol stack disable
372 * @param[in] void
373 * @return 0-success, other-fail
374 */
DisableBtStack(void)375 int DisableBtStack(void)
376 {
377 int errcode = disable_ble();
378
379 if(errcode == 0){
380 return 0;
381 }else {
382 printf("%s DisableBle_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
383 return 1;
384 }
385 }
386
387 /*
388 * @brief set this device's name for friendly
389 * @param[in] <name> device name
390 * @param[in] <len> length
391 * @return 0-success, other-fail
392 */
SetDeviceName(const char * name,unsigned int len)393 int SetDeviceName(const char *name, unsigned int len)
394 {
395 int errcode = gap_ble_set_local_name(name,len);
396
397 if(errcode == 0){
398 return 0;
399 }else{
400 printf("%s SetLocalName_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
401 return 1;
402 }
403 }
404
405 /*
406 * @brief set advertising data
407 * @param[in] <advId> specified by upper layer
408 * @param[in] <data> adv data or scan response
409 * @return 0-success, other-fail
410 */
BleSetAdvData(int advId,StartAdvRawData data)411 int BleSetAdvData(int advId, StartAdvRawData data)
412 {
413 gap_ble_config_adv_data_t *ble_adv_data = (gap_ble_config_adv_data_t *)malloc(sizeof(gap_ble_config_adv_data_t));
414 ble_adv_data->adv_length = data.advDataLen;
415 ble_adv_data->adv_data = data.advData;
416 ble_adv_data->scan_rsp_length = data.rspDataLen;
417 ble_adv_data->scan_rsp_data = data.rspData;
418 int errcode = gap_ble_set_adv_data(advId, ble_adv_data);
419
420 free(ble_adv_data);
421 ble_adv_data = NULL;
422 if(errcode == 0){
423 return 0;
424 }else {
425 printf("%s BleSetAdvData_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
426 return 1;
427 }
428
429 }
430
431 /**
432 * @brief Starts advertising.
433 *
434 * @param advId Indicates the advertisement ID, which is allocated by the upper layer of the advertiser.
435 * @param param Indicates the pointer to the advertising parameters. For details, see {@link BleAdvParams}.
436 * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if advertising is started;
437 * returns an error code defined in {@link BtStatus} otherwise.
438 * @since 6
439 */
BleStartAdv(int advId,const BleAdvParams * param)440 int BleStartAdv(int advId, const BleAdvParams *param)
441 {
442 (void)param;
443 int errcode = gap_ble_start_adv(advId);
444
445 if(errcode == 0){
446 return 0;
447 }else{
448 printf("%s BleStartAdv_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
449 return 1;
450 }
451 }
452
453 /*
454 * @brief stop ble advertising
455 * @param[in] <advId> specified by upper layer
456 * @return 0-success, other-fail
457 */
BleStopAdv(int advId)458 int BleStopAdv(int advId)
459 {
460 int errcode = gap_ble_stop_adv(advId);
461
462 if(errcode == 0){
463 return 0;
464 }else {
465 printf("%s BleStopAdv_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
466 return 1;
467 }
468 }
469
470 /*
471 * @Update the parameters as per spec, user manual specified values and restart multi ADV
472 * @param[in] <advId> specified by upper layer
473 * @param[in] <param> ble advertising param list
474 * @return 0-success, other-fail
475 */
BleUpdateAdv(int advId,const BleAdvParams * param)476 int BleUpdateAdv(int advId, const BleAdvParams *param)
477 {
478
479 gap_ble_adv_params_t *ble_adv_param = (gap_ble_adv_params_t *)malloc(sizeof(gap_ble_adv_params_t));
480 ble_adv_param->min_interval = param->minInterval;
481 ble_adv_param->max_interval = param->maxInterval;
482 ble_adv_param->adv_type = param->advType;
483 ble_adv_param->peer_addr.type = 0;
484 memcpy_s(ble_adv_param->peer_addr.addr,BD_ADDR_LEN,param->peerAddr.addr,OHOS_BD_ADDR_LEN);
485 ble_adv_param->channel_map = param->channelMap;
486 ble_adv_param->adv_filter_policy = param->advFilterPolicy;
487 ble_adv_param->tx_power = param->txPower;
488 ble_adv_param->duration = param->duration;
489 int errcode = gap_ble_set_adv_param(advId, ble_adv_param);
490
491 free(ble_adv_param);
492 ble_adv_param = NULL;
493 if(errcode == 0){
494 return 0;
495 }else {
496 printf("%s BleUpdateAdv_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
497 return 1;
498 }
499 }
500
501
502 /**
503 * @brief Sets scan parameters.
504 *
505 * @param clientId Indicates the client ID, which is obtained during client registration.
506 * @param param Indicates the pointer to the scan parameters. For details, see {@link BleScanParams}.
507 * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the scan parameters are set;
508 * returns an error code defined in {@link BtStatus} otherwise.
509 * @since 6
510 */
BleSetScanParameters(int clientId,BleScanParams * param)511 int BleSetScanParameters(int clientId, BleScanParams *param){
512 (void)clientId;
513 gap_ble_scan_params_t *ble_scan_param = (gap_ble_scan_params_t *)malloc(sizeof(gap_ble_scan_params_t));
514 ble_scan_param->scan_interval = param->scanInterval;
515 ble_scan_param->scan_window = param->scanWindow;
516 ble_scan_param->scan_type = param->scanType;
517 ble_scan_param->scan_phy = param->scanPhy;
518 ble_scan_param->scan_filter_policy = param->scanFilterPolicy;
519 int errcode = gap_ble_set_scan_parameters(ble_scan_param);
520
521 free(ble_scan_param);
522 ble_scan_param = NULL;
523 if(errcode == 0){
524 return 0;
525 }else {
526 printf("%s BleSetScanParameters_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
527 return 1;
528 }
529 }
530
531
532 /*
533 * @brief Start Ble scan
534 * @return 0-success, other-fail
535 */
BleStartScan(void)536 int BleStartScan(void)
537 {
538 int errcode = gap_ble_start_scan();
539
540 if(errcode == 0){
541 return 0;
542 }else{
543 printf("%s BleStartScan_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
544 return 1;
545 }
546 }
547
548 /*
549 * @brief Stop Ble scan
550 * @return 0-success, other-fail
551 */
BleStopScan(int32_t scannerId)552 int BleStopScan(int32_t scannerId)
553 {
554 (void)scannerId;
555 int errcode = gap_ble_stop_scan();
556
557 if(errcode == 0){
558 return 0;
559 }else{
560 printf("%s BleStopScan_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
561 return 1;
562 }
563 }
ble_enable_cb_adapt(errcode_t status)564 static void ble_enable_cb_adapt(errcode_t status)
565 {
566 printf("%s ble_enable_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
567 return;
568 }
569
ble_disable_cb_adapt(errcode_t status)570 static void ble_disable_cb_adapt(errcode_t status)
571 {
572 printf("%s ble_disenable_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
573 return;
574 }
575
set_adv_data_cb_adapt(uint8_t adv_id,errcode_t status)576 static void set_adv_data_cb_adapt(uint8_t adv_id, errcode_t status)
577 {
578 printf("%s set_adv_data_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
579 if( g_ble_gatt_cb->advDataCb){
580 g_ble_gatt_cb->advDataCb(adv_id,status);
581 }
582 return;
583 }
584
set_adv_param_cb_adapt(uint8_t adv_id,errcode_t status)585 static void set_adv_param_cb_adapt(uint8_t adv_id, errcode_t status)
586 {
587 printf("%s set_adv_param_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
588 if(g_ble_gatt_cb->advUpdateCb){
589 g_ble_gatt_cb->advUpdateCb(adv_id,status);
590 }
591 return;
592 }
593
set_scan_param_cb_adapt(errcode_t status)594 static void set_scan_param_cb_adapt(errcode_t status)
595 {
596 printf("%s set_scan_param_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
597 return;
598 }
599
start_adv_cb_adapt(uint8_t adv_id,adv_status_t status)600 static void start_adv_cb_adapt(uint8_t adv_id, adv_status_t status)
601 {
602 printf("%s start_adv_cb_adapt enter adv_id:%d, status: %d.\n", BLE_HILINK_SERVER_LOG, adv_id, status);
603 if(g_ble_gatt_cb->advEnableCb){
604 g_ble_gatt_cb->advEnableCb(adv_id, status);
605 }
606 return;
607 }
608
stop_adv_cb_adapt(uint8_t adv_id,adv_status_t status)609 static void stop_adv_cb_adapt(uint8_t adv_id, adv_status_t status)
610 {
611 printf("%s stop_adv_cb_adapt enter status: %d.\n", BLE_HILINK_SERVER_LOG, status);
612 if(g_ble_gatt_cb->advDisableCb){
613 g_ble_gatt_cb->advDisableCb(adv_id, status);
614 }
615 return;
616 }
617
618
scan_result_cb_adapt(gap_scan_result_data_t * scan_result_data)619 static void scan_result_cb_adapt(gap_scan_result_data_t *scan_result_data)
620 {
621 printf("%s scan_result_cb_adapt enter.\n", BLE_HILINK_SERVER_LOG);
622 BtScanResultData bt_scan_result_data = {0};
623 bt_scan_result_data.eventType = scan_result_data->event_type;
624 bt_scan_result_data.dataStatus = scan_result_data->data_status;
625 bt_scan_result_data.addrType = scan_result_data->addr.type;
626 (void)memcpy_s(bt_scan_result_data.addr.addr, BD_ADDR_LEN,scan_result_data->addr.addr, BD_ADDR_LEN);
627 bt_scan_result_data.primaryPhy = scan_result_data->primary_phy;
628 bt_scan_result_data.secondaryPhy = scan_result_data->secondary_phy;
629 bt_scan_result_data.advSid = scan_result_data->adv_sid;
630 bt_scan_result_data.txPower = scan_result_data->tx_power;
631 bt_scan_result_data.rssi = scan_result_data->rssi;
632 bt_scan_result_data.periodicAdvInterval = scan_result_data->periodic_adv_interval;
633 bt_scan_result_data.directAddrType = scan_result_data->direct_addr.type;
634 (void)memcpy_s(bt_scan_result_data.directAddr.addr, BD_ADDR_LEN,scan_result_data->direct_addr.addr, BD_ADDR_LEN);
635 bt_scan_result_data.advLen = scan_result_data->adv_len;
636 bt_scan_result_data.advData = scan_result_data->adv_data;
637 if(g_ble_scan_cb->scanResultCb){
638 g_ble_scan_cb->scanResultCb(&bt_scan_result_data);
639 }
640
641 }
642
conn_state_change_cb_adapt(uint16_t conn_id,bd_addr_t * addr,gap_ble_conn_state_t conn_state,gap_ble_pair_state_t pair_state,gap_ble_disc_reason_t disc_reason)643 static void conn_state_change_cb_adapt(uint16_t conn_id, bd_addr_t *addr,
644 gap_ble_conn_state_t conn_state, gap_ble_pair_state_t pair_state, gap_ble_disc_reason_t disc_reason)
645 {
646 printf("%s connect state change conn_id: %d, status: %d, pair_status:%d, disc_reason %x\n",
647 BLE_HILINK_SERVER_LOG, conn_id, conn_state, pair_state, disc_reason);
648
649 BdAddr remote_addr = {0};
650 (void)memcpy_s(remote_addr.addr, BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);
651 if(g_ble_gap_cb->aclStateChangedCallbak){
652 g_ble_gap_cb->aclStateChangedCallbak(&remote_addr,conn_state,disc_reason);
653 }
654
655
656 }
657
pair_result_cb_adapt(uint16_t conn_id,const bd_addr_t * addr,errcode_t status)658 static void pair_result_cb_adapt(uint16_t conn_id, const bd_addr_t *addr, errcode_t status){
659 BdAddr bd_addr = {0};
660 (void)memcpy_s(bd_addr.addr, BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);
661 if(g_ble_gap_cb->pairStatusChangedCallback){
662 g_ble_gap_cb->pairStatusChangedCallback(&bd_addr,status);
663 }
664
665 }
666
667
read_rssi_cb_adapt(uint16_t conn_id,int8_t rssi,errcode_t status)668 static void read_rssi_cb_adapt(uint16_t conn_id, int8_t rssi, errcode_t status){
669
670 }
671
672
673
terminate_adv_cb_adapt(uint8_t adv_id,adv_status_t status)674 static void terminate_adv_cb_adapt(uint8_t adv_id, adv_status_t status){
675
676
677
678 }
679
auth_complete_cb_adapt(uint16_t conn_id,const bd_addr_t * addr,errcode_t status,const ble_auth_info_evt_t * evt)680 static void auth_complete_cb_adapt(uint16_t conn_id, const bd_addr_t *addr, errcode_t status,
681 const ble_auth_info_evt_t* evt){
682
683
684 }
685
conn_param_update_cb_adapt(uint16_t conn_id,errcode_t status,const gap_ble_conn_param_update_t * param)686 static void conn_param_update_cb_adapt(uint16_t conn_id, errcode_t status,
687 const gap_ble_conn_param_update_t *param){
688
689 }
690
691
692 gap_ble_callbacks_t g_gap_callback = {
693 .ble_enable_cb = ble_enable_cb_adapt,
694 .ble_disable_cb = ble_disable_cb_adapt,
695 .set_adv_data_cb = set_adv_data_cb_adapt,
696 .set_adv_param_cb = set_adv_param_cb_adapt,
697 .set_scan_param_cb = set_scan_param_cb_adapt,
698 .start_adv_cb = start_adv_cb_adapt,
699 .stop_adv_cb = stop_adv_cb_adapt,
700 .scan_result_cb = scan_result_cb_adapt,
701 .conn_state_change_cb = conn_state_change_cb_adapt,
702 .pair_result_cb = pair_result_cb_adapt,
703 .read_rssi_cb = read_rssi_cb_adapt,
704 .terminate_adv_cb = terminate_adv_cb_adapt,
705 .auth_complete_cb = auth_complete_cb_adapt,
706 .conn_param_update_cb = conn_param_update_cb_adapt,
707 };
708
709
GapRegisterCallbacks(BtGapCallBacks * func)710 int GapRegisterCallbacks(BtGapCallBacks *func)
711 {
712 printf("%s BtGapCallBacks enter.\n", BLE_HILINK_SERVER_LOG);
713 errcode_t ret = ERRCODE_BT_FAIL;
714 if (func != NULL) {
715 g_ble_gap_cb = func;
716 ret = gap_ble_register_callbacks(&g_gap_callback);
717 if (ret != ERRCODE_BT_SUCCESS) {
718 printf("%s gap_ble_register_callbacks fail.\n", BLE_HILINK_SERVER_LOG);
719 return ERRCODE_BT_FAIL;
720 }
721 }
722
723 return 0;
724 }
725
726
727 /*
728 * @brief Callback invoked for gatt common function
729 * @param[in] <BtGattCallbacks> Callback funcs
730 * @return 0-success, other-fail
731 */
BleGattRegisterCallbacks(BtGattCallbacks * func)732 int BleGattRegisterCallbacks(BtGattCallbacks *func)
733 {
734 printf("%s BleGattRegisterCallbacks enter.\n", BLE_HILINK_SERVER_LOG);
735 errcode_t ret = ERRCODE_BT_FAIL;
736 if (func != NULL) {
737 g_ble_gatt_cb = func;
738 ret = gap_ble_register_callbacks(&g_gap_callback);
739 if (ret != ERRCODE_BT_SUCCESS) {
740 printf("%s gap_ble_register_callbacks fail.\n", BLE_HILINK_SERVER_LOG);
741 return ERRCODE_BT_FAIL;
742 }
743 }
744
745 return 0;
746 }
747
BleRegisterScanCallbacks(BleScanCallbacks * func,int32_t * scannerId)748 int BleRegisterScanCallbacks(BleScanCallbacks *func, int32_t *scannerId)
749 {
750 printf("%s BleRegisterScanCallbacks enter.\n", BLE_HILINK_SERVER_LOG);
751 errcode_t ret = ERRCODE_BT_FAIL;
752 if (func != NULL) {
753 g_ble_scan_cb = func;
754 ret = gap_ble_register_callbacks(&g_gap_callback);
755 if (ret != ERRCODE_BT_SUCCESS) {
756 printf("%s gap_ble_register_callbacks fail.\n", BLE_HILINK_SERVER_LOG);
757 return ERRCODE_BT_FAIL;
758 }
759 }
760
761 return 0;
762 }
763
764 /*
765 * @brief Start advertising include set adv data.
766 * This API will not described in the development manual, only for Hilink.
767 * @return 0-success, other-fail
768 */
BleStartAdvEx(int * advId,const StartAdvRawData rawData,BleAdvParams advParam)769 int BleStartAdvEx(int *advId, const StartAdvRawData rawData, BleAdvParams advParam)
770 {
771 printf("%s BleStartAdvEx enter.\n", BLE_HILINK_SERVER_LOG);
772 errcode_t ret = ERRCODE_BT_FAIL;
773 gap_ble_adv_params_t cfg_adv_params = {0};
774
775 if (g_adv_status == 0) {
776 *advId = BLE_ADV_HANDLE_DEFAULT;
777 cfg_adv_params.min_interval = advParam.minInterval;
778 cfg_adv_params.max_interval = advParam.maxInterval;
779 cfg_adv_params.duration = advParam.duration;
780 cfg_adv_params.channel_map = advParam.channelMap; /* 广播通道选择bitMap, 可参考BleAdvChannelMap */
781 cfg_adv_params.adv_type = advParam.advType;
782 cfg_adv_params.adv_filter_policy = advParam.advFilterPolicy;
783 cfg_adv_params.peer_addr.type = advParam.peerAddrType;
784 cfg_adv_params.own_addr.type = advParam.ownAddrType;
785 cfg_adv_params.tx_power = advParam.txPower;
786 (void)memcpy_s(&cfg_adv_params.peer_addr.addr, BD_ADDR_LEN, advParam.peerAddr.addr, BD_ADDR_LEN);
787 (void)memset_s(&cfg_adv_params.own_addr.addr, BD_ADDR_LEN, 0, BD_ADDR_LEN);
788 ret = gap_ble_set_adv_param(BLE_ADV_HANDLE_DEFAULT, &cfg_adv_params);
789 if (ret != ERRCODE_BT_SUCCESS) {
790 printf("%s BleStartAdvEx gap_ble_set_adv_param error.\n", BLE_HILINK_SERVER_LOG);
791 return -1;
792 }
793
794 gap_ble_config_adv_data_t cfg_adv_data = {0};
795 cfg_adv_data.adv_length = rawData.advDataLen;
796 cfg_adv_data.adv_data = rawData.advData; /* set adv data */
797 cfg_adv_data.scan_rsp_length = rawData.rspDataLen;
798 cfg_adv_data.scan_rsp_data = rawData.rspData; /* set scan response data */
799 ret = gap_ble_set_adv_data(BLE_ADV_HANDLE_DEFAULT, &cfg_adv_data);
800 if (ret != ERRCODE_BT_SUCCESS) {
801 printf("%s BleStartAdvEx gap_ble_set_adv_data error.\n", BLE_HILINK_SERVER_LOG);
802 return -1;
803 }
804
805 ret = gap_ble_start_adv(BLE_ADV_HANDLE_DEFAULT);
806 if (ret != ERRCODE_BT_SUCCESS) {
807 printf("%s BleStartAdvEx gap_ble_start_adv error.\n", BLE_HILINK_SERVER_LOG);
808 return -1;
809 }
810 g_adv_status = 1;
811 } else {
812 printf("%s BleStartAdvEx already adv.\n", BLE_HILINK_SERVER_LOG);
813 return -1;
814 }
815 return 0;
816 }
817
818 /*
819 * @brief gatt server application register, callback return serverId
820 * @param[in] <appUuid> specified by upper layer
821 * @return 0-success, other-fail
822 */
BleGattsRegister(BtUuid appUuid)823 int BleGattsRegister(BtUuid appUuid)
824 {
825 bt_uuid_t app_uuid = {0};
826 app_uuid.uuid_len = appUuid.uuidLen;
827 if (memcpy_s(app_uuid.uuid, app_uuid.uuid_len, appUuid.uuid, appUuid.uuidLen) != EOK) {
828 return ERRCODE_BT_FAIL;
829 }
830 int errcode = gatts_register_server(&app_uuid, &g_server_id);
831 printf("%s BleGattsRegister_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
832 if(errcode == 0){
833 return ERRCODE_BT_SUCCESS;
834 }else return ERRCODE_BT_FAIL;
835
836 }
837
838 /**
839 * @brief Set device pairing confirmation.
840 *
841 * @param bdAddr device address.
842 * @param transport Transport type, details see {@link BtTransportId}
843 * @param accept Set gap accept flag.
844 * @return Returns <b>true</b> if the operation is successful;
845 * returns <b>false</b> if the operation fails.
846 */
SetDevicePairingConfirmation(const BdAddr * bdAddr,int transport,bool accept)847 bool SetDevicePairingConfirmation(const BdAddr *bdAddr, int transport, bool accept){
848 (void) transport;
849 (void) accept;
850 bd_addr_t bd_addr = { 0 };
851 bd_addr.type = BT_ADDRESS_TYPE_PUBLIC_DEVICE_ADDRESS;
852 memcpy_s(bd_addr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
853 int errcode = gap_ble_pair_remote_device(&bd_addr);
854 if(errcode == 0){
855 return 0;
856 }else {
857 printf("%s SetDevicePairingConfirmation_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
858 return 1;
859 }
860
861 }
862
863 /*
864 * @brief gatt server deregister
865 * @param[in] <clientId> server interface Id
866 * @return 0-success, other-fail
867 */
BleGattsUnRegister(int serverId)868 int BleGattsUnRegister(int serverId)
869 {
870 int errcode = gatts_unregister_server(serverId);
871
872 if(errcode == 0){
873 return ERRCODE_BT_SUCCESS;
874 }else{
875 printf("%s BleGattsUnRegister_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
876 return ERRCODE_BT_FAIL;
877 }
878 }
879
880
881
882
883
BleGattcSearchServices(int clientId)884 int BleGattcSearchServices(int clientId){
885
886 (void)memcpy_s(bt_uuid.uuid, 2,g_client_uuid, 2);
887 int ret = gattc_discovery_service(clientId, g_conn_id, &bt_uuid);
888 if(ret == 0){
889 return 0;
890 }else return 1;
891 }
892
893
discovery_svc_cb_adapt(uint8_t client_id,uint16_t conn_id,gattc_discovery_service_result_t * service,errcode_t status)894 static void discovery_svc_cb_adapt(uint8_t client_id, uint16_t conn_id,
895 gattc_discovery_service_result_t *service, errcode_t status){
896
897
898 }
899
discovery_svc_cmp_adapt(uint8_t client_id,uint16_t conn_id,bt_uuid_t * uuid,errcode_t status)900 static void discovery_svc_cmp_adapt(uint8_t client_id, uint16_t conn_id,
901 bt_uuid_t *uuid, errcode_t status){
902 if(g_ble_gattc_cb->searchServiceCompleteCb){
903 g_ble_gattc_cb->searchServiceCompleteCb(client_id,status);
904 }
905
906 }
907
discovery_chara_cb_adapt(uint8_t client_id,uint16_t conn_id,gattc_discovery_character_result_t * character,errcode_t status)908 static void discovery_chara_cb_adapt(uint8_t client_id, uint16_t conn_id,
909 gattc_discovery_character_result_t *character, errcode_t status){
910
911
912 }
913
discovery_chara_cmp_cb_adapt(uint8_t client_id,uint16_t conn_id,gattc_discovery_character_param_t * param,errcode_t status)914 static void discovery_chara_cmp_cb_adapt(uint8_t client_id, uint16_t conn_id,
915 gattc_discovery_character_param_t *param, errcode_t status){
916
917
918 }
919
discovery_desc_cmp_cb_adapt(uint8_t client_id,uint16_t conn_id,uint16_t character_handle,errcode_t status)920 static void discovery_desc_cmp_cb_adapt(uint8_t client_id, uint16_t conn_id,
921 uint16_t character_handle, errcode_t status){
922
923
924 }
925
discovery_desc_cb_adapt(uint8_t client_id,uint16_t conn_id,gattc_discovery_descriptor_result_t * descriptor,errcode_t status)926 static void discovery_desc_cb_adapt(uint8_t client_id, uint16_t conn_id,
927 gattc_discovery_descriptor_result_t *descriptor, errcode_t status){
928
929
930 }
931
read_cb_adapt(uint8_t client_id,uint16_t conn_id,gattc_handle_value_t * read_result,gatt_status_t status)932 static void read_cb_adapt(uint8_t client_id, uint16_t conn_id, gattc_handle_value_t *read_result,
933 gatt_status_t status){
934
935
936 }
937
read_cmp_cb_adapt(uint8_t client_id,uint16_t conn_id,gattc_read_req_by_uuid_param_t * param,errcode_t status)938 static void read_cmp_cb_adapt(uint8_t client_id, uint16_t conn_id,
939 gattc_read_req_by_uuid_param_t *param, errcode_t status){
940
941
942 }
943
write_cb_adapt(uint8_t client_id,uint16_t conn_id,uint16_t handle,gatt_status_t status)944 static void write_cb_adapt(uint8_t client_id, uint16_t conn_id, uint16_t handle, gatt_status_t status){
945
946
947 }
948
client_mtu_changed_cb_adapt(uint8_t client_id,uint16_t conn_id,uint16_t mtu_size,errcode_t status)949 static void client_mtu_changed_cb_adapt(uint8_t client_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status){
950
951
952 }
953
notification_cb_adapt(uint8_t client_id,uint16_t conn_id,gattc_handle_value_t * data,errcode_t status)954 static void notification_cb_adapt(uint8_t client_id, uint16_t conn_id, gattc_handle_value_t *data,
955 errcode_t status){
956
957 }
958
indication_cb_adapt(uint8_t client_id,uint16_t conn_id,gattc_handle_value_t * data,errcode_t status)959 static void indication_cb_adapt(uint8_t client_id, uint16_t conn_id, gattc_handle_value_t *data,
960 errcode_t status){
961 BtGattReadData bt_gatt_read_data = {0};
962 bt_gatt_read_data.dataLen = data->data_len;
963 memcpy(bt_gatt_read_data.data,data->data,data->data_len);
964 if(g_ble_gattc_cb->notificationCb){
965 g_ble_gattc_cb->notificationCb(client_id,&bt_gatt_read_data,status);
966 }
967 }
968
969 gattc_callbacks_t g_gatt_client_callback = {
970 .discovery_svc_cb = discovery_svc_cb_adapt,
971 .discovery_svc_cmp_cb = discovery_svc_cmp_adapt,
972 .discovery_chara_cb = discovery_chara_cb_adapt,
973 .discovery_chara_cmp_cb = discovery_chara_cmp_cb_adapt,
974 .discovery_desc_cmp_cb = discovery_desc_cmp_cb_adapt,
975 .discovery_desc_cb = discovery_desc_cb_adapt,
976 .read_cb = read_cb_adapt,
977 .read_cmp_cb = read_cmp_cb_adapt,
978 .write_cb = write_cb_adapt,
979 .mtu_changed_cb = client_mtu_changed_cb_adapt,
980 .notification_cb = notification_cb_adapt,
981 .indication_cb = indication_cb_adapt,
982
983 };
984
BleGattcRegisterCallbacks(BtGattClientCallbacks * func)985 int BleGattcRegisterCallbacks(BtGattClientCallbacks *func)
986 {
987 printf("%s BleGattcRegisterCallbackc enter.\n", BLE_HILINK_SERVER_LOG);
988 errcode_t ret = ERRCODE_BT_FAIL;
989 if (func != NULL) {
990 g_ble_gattc_cb = func;
991 ret = gattc_register_callbacks(&g_gatt_client_callback);
992 if (ret != ERRCODE_BT_SUCCESS) {
993 printf("%s gatts_register_callbacks fail, ret:%d.\n", BLE_HILINK_SERVER_LOG, ret);
994 return ERRCODE_BT_FAIL;
995 }
996 }
997
998 return 0;
999 }
1000 /**
1001 * @brief Create a Gatt connection to a remote device.
1002 *
1003 * @param clientId Indicates the ID of the GATT client.
1004 * @param bdAddr Indicates the remote device's address.
1005 * @param isAutoConnect Indicates whether it is a direct connection(false) or a background connection(true).
1006 * @param transport Indicates the transport of Gatt client {@link BtTransportType}.
1007 * @return Returns the operation result status {@link BtStatus}.
1008 */
BleGattcConnect(int clientId,BtGattClientCallbacks * func,const BdAddr * bdAddr,bool isAutoConnect,BtTransportType transport)1009 int BleGattcConnect(int clientId, BtGattClientCallbacks *func, const BdAddr *bdAddr,
1010 bool isAutoConnect, BtTransportType transport){
1011 (void)clientId;
1012 (void)isAutoConnect;
1013 (void)transport;
1014 bd_addr_t bd_addr = { 0 };
1015 bd_addr.type = BT_ADDRESS_TYPE_PUBLIC_DEVICE_ADDRESS;
1016 memcpy_s(bd_addr.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
1017 BleGattcRegisterCallbacks(func);
1018 int errcode = gap_ble_connect_remote_device(&bd_addr);
1019
1020 if(errcode == 0){
1021 return 0;
1022 }else {
1023 printf("%s BleGattsConnect_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
1024 return 1;
1025 }
1026
1027 }
1028
1029
1030
BleGattsConnect(int serverId,BdAddr bdAddr)1031 int BleGattsConnect(int serverId, BdAddr bdAddr){
1032 (void)serverId;
1033 bd_addr_t bd_addr = { 0 };
1034 bd_addr.type = BT_ADDRESS_TYPE_PUBLIC_DEVICE_ADDRESS;
1035 memcpy_s(bd_addr.addr, BD_ADDR_LEN, bdAddr.addr, BD_ADDR_LEN);
1036 int errcode = gap_ble_connect_remote_device(&bd_addr);
1037
1038 if(errcode == 0){
1039 return 0;
1040 }else {
1041 printf("%s BleGattsConnect_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
1042 return 1;
1043 }
1044 }
1045
1046 /*
1047 * @brief Cancel connection with remote device
1048 * @param[in] <serverId> server interface id
1049 * @param[in] <bdAddr> remote address
1050 * @param[in] <connId> connection index.
1051 * @return 0-success, other-fail
1052 */
BleGattsDisconnect(int serverId,BdAddr bdAddr,int connId)1053 int BleGattsDisconnect(int serverId, BdAddr bdAddr, int connId)
1054 {
1055 (void)serverId;
1056 (void)connId;
1057 bd_addr_t bd_addr = { 0 };
1058 bd_addr.type = BT_ADDRESS_TYPE_PUBLIC_DEVICE_ADDRESS;
1059 memcpy_s(bd_addr.addr, BD_ADDR_LEN, bdAddr.addr, BD_ADDR_LEN);
1060 int errcode = gap_ble_disconnect_remote_device(&bd_addr);
1061
1062 if(errcode == 0){
1063 return 0;
1064 }else{
1065 printf("%s BleGattsDisconnect_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
1066 return 1;
1067 }
1068 }
1069
1070 /*
1071 * @brief add service
1072 * @param[in] <serverId> server interface id
1073 * @param[in] <srvcUuid> service uuid and uuid length
1074 * @param[in] <isPrimary> is primary or secondary service.
1075 * @param[in] <number> service characther attribute number.
1076 * @return 0-success, other-fail
1077 */
BleGattsAddService(int serverId,BtUuid srvcUuid,bool isPrimary,int number)1078 int BleGattsAddService(int serverId, BtUuid srvcUuid, bool isPrimary, int number)
1079 {
1080 printf("%s BleGattsAddService enter.\n", BLE_HILINK_SERVER_LOG);
1081 errcode_t ret = 0;
1082 bt_uuid_t service_uuid = {0};
1083 uint16_t service_handle = 0;
1084 service_uuid.uuid_len = srvcUuid.uuidLen;
1085 (void)memcpy_s(service_uuid.uuid, srvcUuid.uuidLen, (uint8_t *)srvcUuid.uuid, srvcUuid.uuidLen);
1086
1087 while (1) {
1088 osDelay(10); /* 等待10 tick */
1089 /* APP 调用StartService为异步接口 无法保证Add Service时 前一个Service已完成Start */
1090 if (g_service_flag == 0) {
1091 ret = gatts_add_service_sync(g_server_id, &service_uuid, 1, &service_handle);
1092 g_service_flag = 1;
1093 if (ret != ERRCODE_BT_SUCCESS) {
1094 printf("%s BleGattsStartServiceEx Add Service Fail, ret:%x !!!\n", BLE_HILINK_SERVER_LOG, ret);
1095 }
1096 break;
1097 }
1098 }
1099 g_srvc_handle = service_handle;
1100 printf("%s BleGattsAddService end, srvcHandle:%d.\n", BLE_HILINK_SERVER_LOG, g_srvc_handle);
1101
1102 return ret;
1103 }
1104
1105 /*
1106 * @brief add characteristic
1107 * @param[in] <serverId> server interface id
1108 * @param[in] <srvcHandle> service handle
1109 * @param[in] <characUuid> characteristic uuid and uuid length
1110 * @param[in] <properties> e.g. (OHOS_GATT_CHARACTER_PROPERTY_BIT_BROADCAST | OHOS_GATT_CHARACTER_PROPERTY_BIT_READ)
1111 * @param[in] <permissions> e.g. (OHOS_GATT_PERMISSION_READ | OHOS_GATT_PERMISSION_WRITE)
1112 * @return 0-success, other-fail
1113 */
BleGattsAddCharacteristic(int serverId,int srvcHandle,BtUuid characUuid,int properties,int permissions)1114 int BleGattsAddCharacteristic(int serverId, int srvcHandle, BtUuid characUuid,
1115 int properties, int permissions)
1116 {
1117 printf("%s BleGattsAddCharacteristic enter, srvcHandle:%d.\n", BLE_HILINK_SERVER_LOG, srvcHandle);
1118 bt_uuid_t chara_uuid = {0};
1119 gatts_add_chara_info_t chara_info = {0};
1120 gatts_add_character_result_t chara_result = {0};
1121 chara_uuid.uuid_len = characUuid.uuidLen;
1122 (void)memcpy_s(chara_uuid.uuid, characUuid.uuidLen, (uint8_t *)characUuid.uuid, characUuid.uuidLen);
1123
1124 chara_info.chara_uuid = chara_uuid;
1125 chara_info.properties = properties;
1126 chara_info.permissions = perm_bt_to_bluez(permissions);
1127 chara_info.value_len = sizeof(g_chara_val);
1128 chara_info.value = g_chara_val;
1129 int ret = gatts_add_characteristic_sync(g_server_id, srvcHandle, &chara_info, &chara_result);
1130 printf("%s BleGattsAddCharacteristic ret:%d handle:%d, value_handle:%d.\n",
1131 BLE_HILINK_SERVER_LOG, ret, chara_result.handle, chara_result.value_handle);
1132
1133 g_cb_chara_handle = chara_result.value_handle;
1134 return ret;
1135 }
1136
1137 /*
1138 * @brief add descriptor
1139 * @param[in] <serverId> server interface id
1140 * @param[in] <srvcHandle> service handle
1141 * @param[in] <descUuid> descriptor uuid and uuid length
1142 * @param[in] <permissions> e.g. (OHOS_GATT_PERMISSION_READ | OHOS_GATT_PERMISSION_WRITE)
1143 * @return 0-success, other-fail
1144 */
BleGattsAddDescriptor(int serverId,int srvcHandle,BtUuid descUuid,int permissions)1145 int BleGattsAddDescriptor(int serverId, int srvcHandle, BtUuid descUuid, int permissions)
1146 {
1147 printf("%s BleGattsAddDescriptor enter.\n", BLE_HILINK_SERVER_LOG);
1148 bt_uuid_t desc_uuid = {0};
1149 gatts_add_desc_info_t descriptor = {0};
1150 uint16_t desc_handle = 0;
1151
1152 desc_uuid.uuid_len = descUuid.uuidLen;
1153 (void)memcpy_s(desc_uuid.uuid, descUuid.uuidLen, (uint8_t *)descUuid.uuid, descUuid.uuidLen);
1154
1155 descriptor.desc_uuid = desc_uuid;
1156 descriptor.permissions = perm_bt_to_bluez(permissions);
1157 descriptor.value_len = sizeof(g_desc_val);
1158 descriptor.value = g_desc_val;
1159
1160 int ret = gatts_add_descriptor_sync(g_server_id, srvcHandle, &descriptor, &desc_handle);
1161 g_cb_desc_handle = desc_handle;
1162 printf("%s BleGattsAddDescriptor ret:%d desc_handle:%d.\n", BLE_HILINK_SERVER_LOG, ret, desc_handle);
1163 return ret;
1164 }
1165
1166 /*
1167 * @brief start service
1168 * @param[in] <serverId> server interface id
1169 * @param[in] <srvcHandle> service handle
1170 * @return 0-success, other-fail
1171 */
BleGattsStartService(int serverId,int srvcHandle)1172 int BleGattsStartService(int serverId, int srvcHandle)
1173 {
1174 int errcode = gatts_start_service(serverId,srvcHandle);
1175
1176 if(errcode == 0){
1177 return 0;
1178 }else{
1179 printf("%s BleGattsStartService_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
1180 return 1;
1181 }
1182 }
1183
1184 /*
1185 * @brief start service
1186 * @param[in] <serverId> server interface id
1187 * @param[in] <srvcHandle> service handle
1188 * @return 0-success, other-fail
1189 */
BleGattsStopService(int serverId,int srvcHandle)1190 int BleGattsStopService(int serverId, int srvcHandle)
1191 {
1192 int errcode = gatts_stop_service(serverId,srvcHandle);
1193
1194 if(errcode == 0){
1195 return 0;
1196 }else {
1197 printf("%s BleGattsStopService_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
1198 return 1;
1199 }
1200 }
1201
1202 /*
1203 * @brief remove a service from the list of provided services
1204 * @param[in] <serverId> server interface id
1205 * @param[in] <srvcHandle> service handle
1206 * @return 0-success, other-fail
1207 */
BleGattsDeleteService(int serverId,int srvcHandle)1208 int BleGattsDeleteService(int serverId, int srvcHandle)
1209 {
1210
1211 int errcode = gatts_delete_service(serverId,srvcHandle);
1212
1213 if(errcode == 0){
1214 return 0;
1215 }else {
1216 printf("%s BleGattsDeleteService_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
1217 return 1;
1218 }
1219 }
1220
1221 /*
1222 * @brief remove all services from the list of provided services
1223 * @param[in] <serverId> server interface id
1224 * @return 0-success, other-fail
1225 */
BleGattsClearServices(int serverId)1226 int BleGattsClearServices(int serverId)
1227 {
1228 int errcode = gatts_delete_all_services(serverId);
1229
1230 if(errcode == 0){
1231 return 0;
1232 }else {
1233 printf("%s BleGattsClearServices_Errcode:%d\r\n", BLE_HILINK_SERVER_LOG,errcode);
1234 return 1;
1235 }
1236 }
1237
1238 /*
1239 * @brief Send a response to a read or write request to a remote device.
1240 * @param[in] <serverId> server interface id
1241 * @param[in] <GattsSendRspParam> response param
1242 * @return 0-success, other-fail
1243 */
BleGattsSendResponse(int serverId,GattsSendRspParam * param)1244 int BleGattsSendResponse(int serverId, GattsSendRspParam *param)
1245 {
1246 printf("%s BleGattsSendResponse enter, handle:%d.\n", BLE_HILINK_SERVER_LOG, param->attrHandle);
1247 int ret = 0;
1248 gatts_send_rsp_t rsp_param = {0};
1249 rsp_param.request_id = g_server_request_id;
1250 rsp_param.status = 0;
1251 rsp_param.offset = 0;
1252 rsp_param.value_len = param->valueLen;
1253 rsp_param.value = (uint8_t *)param->value;
1254
1255 if (g_gatt_write_flag) {
1256 ret = gatts_send_response(g_server_id, param->connectId, &rsp_param);
1257 printf("%s BleGattsSendResponse send write resp, ret:%x.\n", BLE_HILINK_SERVER_LOG, ret);
1258 } else {
1259 ret = gatts_send_response(g_server_id, param->connectId, &rsp_param);
1260 printf("%s BleGattsSendResponse send read resp, ret:%x.\n", BLE_HILINK_SERVER_LOG, ret);
1261 }
1262
1263 return ret;
1264 }
1265
1266 /*
1267 * @brief Send a notification or indication that a local characteristic has been updated
1268 * @param[in] <serverId> server interface id
1269 * @param[in] <GattsSendIndParam> indication param
1270 * @return 0-success, other-fail
1271 */
BleGattsSendIndication(int serverId,GattsSendIndParam * param)1272 int BleGattsSendIndication(int serverId, GattsSendIndParam *param)
1273 {
1274 printf("%s BleGattsSendIndication enter, handle:%d.\n", BLE_HILINK_SERVER_LOG, param->attrHandle);
1275
1276 int ret = 0;
1277 gatts_ntf_ind_t ntf_param = {0};
1278 ntf_param.attr_handle = g_indicate_handle;
1279 ntf_param.value_len = param->valueLen;
1280 ntf_param.value = (uint8_t *)param->value;
1281 ret = gatts_notify_indicate(g_server_id, param->connectId, &ntf_param);
1282 if (ret != 0) {
1283 printf("%s gatts_notify_indicate fail, ret:%x.\n", BLE_HILINK_SERVER_LOG, ret);
1284 }
1285
1286 osDelay(20); /* 等待20 tick */
1287 int yet = ret ? 0 : -1;
1288 if (g_ble_gatts_cb->indicationSentCb != NULL) {
1289 printf("%s indicationSentCb form Hilink.\n", BLE_HILINK_SERVER_LOG);
1290 g_ble_gatts_cb->indicationSentCb(param->connectId, yet);
1291 }
1292
1293 osDelay(20); /* 等待20 tick */
1294 BleGattServiceIndicate indicate_func = get_chara_ind_func(param->connectId, g_indicate_handle);
1295 if (indicate_func != NULL) {
1296 ret = indicate_func(ntf_param.value, ntf_param.value_len);
1297 if (ret != 0) {
1298 printf("indicateFunc fail %d.\n", ret);
1299 }
1300 }
1301 return ret;
1302 }
1303
1304 /*
1305 * @brief Set the encryption level of the data transmission channel during connection
1306 * @param[in] <bdAddr> remote address
1307 * @param[in] <secAct> BleSecAct
1308 * @return 0-success, other-fail
1309 */
BleGattsSetEncryption(BdAddr bdAddr,BleSecAct secAct)1310 int BleGattsSetEncryption(BdAddr bdAddr, BleSecAct secAct)
1311 {
1312 printf("%s BleGattsSetEncryption enter, secAct:%d.\n", BLE_HILINK_SERVER_LOG, secAct);
1313
1314 gap_ble_sec_params_t sec_params = {0};
1315 sec_params.bondable = 1;
1316 sec_params.io_capability = g_io_cap_mode;
1317 sec_params.sc_enable = 0;
1318 sec_params.sc_mode = secAct;
1319 int ret = gap_ble_set_sec_param(&sec_params);
1320 if (ret != 0) {
1321 printf("%s gap_ble_set_sec_param fail, ret:%d.\n", BLE_HILINK_SERVER_LOG, ret);
1322 }
1323 return 0;
1324 }
1325
add_service_cb_adapt(uint8_t server_id,bt_uuid_t * uuid,uint16_t handle,errcode_t status)1326 void add_service_cb_adapt(uint8_t server_id, bt_uuid_t *uuid, uint16_t handle, errcode_t status)
1327 {
1328 printf("%s add_service_cb server_id:%d, handle:%d, status:%d.\n", BLE_HILINK_SERVER_LOG, server_id, handle, status);
1329 BtUuid bt_uuid = {0};
1330 memcpy_s(bt_uuid.uuid, bt_uuid.uuidLen, uuid, sizeof(uuid));
1331 if (g_ble_gatts_cb->serviceAddCb) {
1332
1333 g_ble_gatts_cb->serviceAddCb( server_id, &bt_uuid,handle,status);
1334 }
1335 return;
1336 }
1337
add_characteristic_cb_adapt(uint8_t server_id,bt_uuid_t * uuid,uint16_t service_handle,gatts_add_character_result_t * result,errcode_t status)1338 void add_characteristic_cb_adapt(uint8_t server_id, bt_uuid_t *uuid, uint16_t service_handle,
1339 gatts_add_character_result_t *result, errcode_t status)
1340 {
1341 printf("%s add_characteristic_cb server: %d srvc_hdl: %d char_hdl: %d char_val_hdl: %d uuid_len: %d \n",
1342 BLE_HILINK_SERVER_LOG, server_id, service_handle, result->handle, result->value_handle, uuid->uuid_len);
1343 BtUuid bt_uuid = {0};
1344 memcpy_s(bt_uuid.uuid, bt_uuid.uuidLen, uuid, sizeof(uuid));
1345 if (g_ble_gatts_cb->characteristicAddCb) {
1346
1347 g_ble_gatts_cb->characteristicAddCb(status, server_id, &bt_uuid,service_handle, result->handle);
1348 }
1349 return;
1350 }
1351
add_descriptor_cb_adapt(uint8_t server_id,bt_uuid_t * uuid,uint16_t service_handle,uint16_t handle,errcode_t status)1352 void add_descriptor_cb_adapt(uint8_t server_id, bt_uuid_t *uuid, uint16_t service_handle,
1353 uint16_t handle, errcode_t status)
1354 {
1355 printf("%s add_descriptor_cb server: %d srv_hdl: %d desc_hdl: %d uuid_len:%d.\n",
1356 BLE_HILINK_SERVER_LOG, server_id, service_handle, handle, uuid->uuid_len);
1357 BtUuid bt_uuid = {0};
1358 memcpy_s(bt_uuid.uuid, bt_uuid.uuidLen, uuid, sizeof(uuid));
1359 if (g_ble_gatts_cb->descriptorAddCb) {
1360
1361 g_ble_gatts_cb->descriptorAddCb(server_id, &bt_uuid,service_handle, handle,status);
1362 }
1363 return;
1364 }
1365
start_service_cb_adapt(uint8_t server_id,uint16_t handle,errcode_t status)1366 void start_service_cb_adapt(uint8_t server_id, uint16_t handle, errcode_t status)
1367 {
1368 printf("%s start_service_cb server: %d srv_hdl: %d status: %d\n", BLE_HILINK_SERVER_LOG, server_id, handle, status);
1369
1370 g_service_flag = 0;
1371 if (g_ble_gatts_cb->serviceStartCb) {
1372 g_ble_gatts_cb->serviceStartCb(status, server_id, handle);
1373 }
1374 return;
1375 }
1376
stop_service_cb_adapt(uint8_t server_id,uint16_t handle,errcode_t status)1377 void stop_service_cb_adapt(uint8_t server_id, uint16_t handle, errcode_t status)
1378 {
1379 printf("%s stop_service_cb server: %d srv_hdl: %d status: %d\n",
1380 BLE_HILINK_SERVER_LOG, server_id, handle, status);
1381 if (g_ble_gatts_cb->serviceStopCb) {
1382 g_ble_gatts_cb->serviceStopCb(status, server_id, handle);
1383 }
1384 return;
1385 }
1386
delete_service_cb_adapt(uint8_t server_id,errcode_t status)1387 void delete_service_cb_adapt(uint8_t server_id, errcode_t status)
1388 {
1389 printf("%s stop_service_cb server: %d srv_hdl: %d status: %d\n",
1390 BLE_HILINK_SERVER_LOG, server_id, status);
1391 if (g_ble_gatts_cb->serviceDeleteCb) {
1392 g_ble_gatts_cb->serviceDeleteCb(status,server_id,1);
1393 }
1394 return;
1395 }
1396
read_request_cb_adapt(uint8_t server_id,uint16_t conn_id,gatts_req_read_cb_t * read_cb_para,errcode_t status)1397 void read_request_cb_adapt(uint8_t server_id, uint16_t conn_id, gatts_req_read_cb_t *read_cb_para,
1398 errcode_t status)
1399 {
1400 printf("%s read_request_cb_adapt--server_id:%d conn_id:%d status:%d\n",
1401 BLE_HILINK_SERVER_LOG, server_id, conn_id, status);
1402
1403 char buff[MAX_READ_REQ_LEN] = {0};
1404 unsigned int length = MAX_READ_REQ_LEN;
1405 int ret = 0;
1406
1407 BleGattServiceRead read_func = get_chara_read_func(conn_id, read_cb_para->handle);
1408 if (read_func != NULL) {
1409 ret = read_func((uint8_t *)buff, &length);
1410 if (ret != ERRCODE_BT_SUCCESS) {
1411 printf("read_func fail %d.\n", ret);
1412 length = 0;
1413 }
1414 }
1415
1416 GattsSendRspParam rsp = {0};
1417 rsp.connectId = conn_id;
1418 rsp.status = OHOS_GATT_SUCCESS;
1419 rsp.attrHandle = read_cb_para->handle;
1420
1421 if (length > read_cb_para->offset) {
1422 rsp.valueLen = length - read_cb_para->offset;
1423 rsp.value = buff + read_cb_para->offset;
1424 } else {
1425 rsp.valueLen = 0;
1426 rsp.value = buff;
1427 }
1428
1429 BleGattsSendResponse(g_server_id, &rsp);
1430
1431 g_gatt_write_flag = 0;
1432 g_server_request_id = read_cb_para->request_id;
1433 }
1434
write_request_cb_adapt(uint8_t server_id,uint16_t conn_id,gatts_req_write_cb_t * write_cb_para,errcode_t status)1435 void write_request_cb_adapt(uint8_t server_id, uint16_t conn_id, gatts_req_write_cb_t *write_cb_para,
1436 errcode_t status)
1437 {
1438 printf("%s write_request_cb_adapt--request_id:%d att_handle:%d data_len:%d\n",
1439 BLE_HILINK_SERVER_LOG, write_cb_para->request_id, write_cb_para->handle, write_cb_para->length);
1440
1441 BleGattServiceWrite write_func = get_chara_write_func(conn_id, write_cb_para->handle);
1442 if (write_func != NULL) {
1443 int ret = write_func(write_cb_para->value, write_cb_para->length);
1444 if (ret != 0) {
1445 printf("write_func fail %d.\n", ret);
1446 }
1447 }
1448
1449 g_server_request_id = write_cb_para->request_id;
1450 g_gatt_write_flag = 1;
1451
1452 if (write_cb_para->is_prep) {
1453 GattsSendRspParam rsp = {0};
1454 char one_byte_rsp = 0;
1455 rsp.connectId = conn_id;
1456 rsp.status = OHOS_GATT_SUCCESS;
1457 rsp.attrHandle = write_cb_para->handle;
1458 rsp.valueLen = sizeof(one_byte_rsp);
1459 rsp.value = &one_byte_rsp;
1460
1461 int ret = BleGattsSendResponse(g_server_id, &rsp);
1462 if (ret != ERRCODE_BT_SUCCESS) {
1463 printf("BleGattsSendResponse fail %d.\n", ret);
1464 }
1465 }
1466 }
1467
mtu_changed_cb_adapt(uint8_t server_id,uint16_t conn_id,uint16_t mtu_size,errcode_t status)1468 void mtu_changed_cb_adapt(uint8_t server_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)
1469 {
1470 printf("%s mtu_changed_cb server_id:%d conn_id:%d mtu_size: %d status: %d\n",
1471 BLE_HILINK_SERVER_LOG, server_id, conn_id, mtu_size, status);
1472
1473 g_ble_gatts_cb->mtuChangeCb(conn_id, mtu_size);
1474 }
1475
1476 gatts_callbacks_t g_gatt_callback = {
1477 .add_service_cb = add_service_cb_adapt,
1478 .add_characteristic_cb = add_characteristic_cb_adapt,
1479 .add_descriptor_cb = add_descriptor_cb_adapt,
1480 .start_service_cb = start_service_cb_adapt,
1481 .stop_service_cb = stop_service_cb_adapt,
1482 .delete_service_cb = delete_service_cb_adapt,
1483 .read_request_cb = read_request_cb_adapt,
1484 .write_request_cb = write_request_cb_adapt,
1485 .mtu_changed_cb = mtu_changed_cb_adapt
1486 };
1487
1488 /*
1489 * @brief Callback invoked for gatt server function
1490 * @param[in] <BtGattServerCallbacks> Callback funcs
1491 * @return 0-success, other-fail
1492 */
BleGattsRegisterCallbacks(BtGattServerCallbacks * func)1493 int BleGattsRegisterCallbacks(BtGattServerCallbacks *func)
1494 {
1495 printf("%s BleGattsRegisterCallbacks enter.\n", BLE_HILINK_SERVER_LOG);
1496 errcode_t ret = ERRCODE_BT_FAIL;
1497 if (func != NULL) {
1498 g_ble_gatts_cb = func;
1499 ret = gatts_register_callbacks(&g_gatt_callback);
1500 if (ret != ERRCODE_BT_SUCCESS) {
1501 printf("%s gatts_register_callbacks fail, ret:%d.\n", BLE_HILINK_SERVER_LOG, ret);
1502 return ERRCODE_BT_FAIL;
1503 }
1504 }
1505
1506 return 0;
1507 }
1508
ble_uuid_server_init(void)1509 static errcode_t ble_uuid_server_init(void)
1510 {
1511 errcode_t ret = ERRCODE_BT_SUCCESS;
1512 bt_uuid_t app_uuid = {0};
1513 char uuid[] = {0x12, 0x34};
1514 app_uuid.uuid_len = sizeof(uuid);
1515 ret |= memcpy_s(app_uuid.uuid, app_uuid.uuid_len, uuid, sizeof(uuid));
1516 if (ret != 0) {
1517 return -1;
1518 }
1519 ret |= gatts_register_server(&app_uuid, &g_server_id);
1520 if (ret != ERRCODE_BT_SUCCESS) {
1521 printf("%s gatts_register_server fail.\n", BLE_HILINK_SERVER_LOG);
1522 return -1;
1523 }
1524 return ret;
1525 }
1526
1527 /*
1528 * @brief Start sevice include add service/characteristic/Descriptor option.
1529 * This API will not described in the development manual, only for Hilink.
1530 * @return 0-success, other-fail
1531 */
1532
1533
1534 static uint8_t g_hilink_group_cnt = 0;
1535 #define HILINK_SERVICE_NUM 3
1536 #define HILINK_CHARA_NUM 4
1537 static char g_hilink_group_uuid[HILINK_SERVICE_NUM + HILINK_CHARA_NUM][OHOS_BLE_UUID_MAX_LEN] = {
1538 {0x15, 0xF1, 0xE4, 0x00, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1539 {0x15, 0xF1, 0xE4, 0x01, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1540 {0x15, 0xF1, 0xE5, 0x00, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1541 {0x15, 0xF1, 0xE5, 0x01, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1542 {0x15, 0xF1, 0xE6, 0x00, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1543 {0x15, 0xF1, 0xE6, 0x02, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1544 {0x15, 0xF1, 0xE6, 0x01, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00}
1545 };
1546 static char g_hilink_cccd_uuid[UUID16_LEN] = {0x29, 0x02};
1547
hilnk_group_add(void)1548 static void hilnk_group_add(void)
1549 {
1550 g_hilink_group_cnt++;
1551 }
1552
convert_uuid(uint8_t * uuid_input,UuidType type,BtUuid * uuid_output)1553 static void convert_uuid(uint8_t *uuid_input, UuidType type, BtUuid *uuid_output)
1554 {
1555 uint8_t temp_uuid[OHOS_BLE_UUID_MAX_LEN] = {0};
1556 int ret = 0;
1557
1558 switch (type) {
1559 case OHOS_UUID_TYPE_16_BIT:
1560 uuid_output->uuidLen = UUID16_LEN;
1561 break;
1562 case OHOS_UUID_TYPE_32_BIT:
1563 uuid_output->uuidLen = UUID32_LEN;
1564 break;
1565 case OHOS_UUID_TYPE_128_BIT:
1566 uuid_output->uuidLen = UUID128_LEN;
1567 break;
1568 default:
1569 uuid_output->uuidLen = 0;
1570 break;
1571 }
1572
1573 uuid_output->uuid = (char *)uuid_input;
1574 ret = memcpy_s(temp_uuid, OHOS_BLE_UUID_MAX_LEN, g_hilink_group_uuid[g_hilink_group_cnt], OHOS_BLE_UUID_MAX_LEN);
1575 if (ret != 0) {
1576 printf("%s convert_uuid memcpy_s fail.\n", BLE_HILINK_SERVER_LOG);
1577 return;
1578 }
1579 reverse_uuid(temp_uuid, uuid_output->uuid, uuid_output->uuidLen);
1580 return;
1581 }
1582
set_chara_func(BleGattAttr * attr,uint8_t is_indicate)1583 static void set_chara_func(BleGattAttr *attr, uint8_t is_indicate)
1584 {
1585 g_charas_func[g_chara_cnt].conn_id = 0;
1586 if (is_indicate == 0) {
1587 if (attr->attrType == OHOS_BLE_ATTRIB_TYPE_CHAR) {
1588 g_charas_func[g_chara_cnt].attr_handle = g_cb_chara_handle;
1589 } else {
1590 g_charas_func[g_chara_cnt].attr_handle = g_cb_desc_handle;
1591 }
1592 g_charas_func[g_chara_cnt].read = attr->func.read;
1593 g_charas_func[g_chara_cnt].write = attr->func.write;
1594 g_charas_func[g_chara_cnt].indicate = attr->func.indicate;
1595 } else {
1596 g_charas_func[g_chara_cnt].attr_handle = g_cb_desc_handle;
1597 }
1598 g_chara_cnt++;
1599 }
1600
1601
1602
1603
BleGattsStartServiceEx(int * srvcHandle,BleGattService * srvcInfo)1604 int BleGattsStartServiceEx(int *srvcHandle, BleGattService *srvcInfo)
1605 {
1606 printf("%s BleGattsStartServiceEx enter srvHandle:%d.\n", BLE_HILINK_SERVER_LOG, *srvcHandle);
1607 errcode_t ret = ERRCODE_BT_SUCCESS;
1608 uint8_t is_indicate = 0;
1609 BtUuid ble_uuid = {0};
1610 uint16_t service_handle = 0;
1611
1612 if (g_server_id == INVALID_SERVER_ID) {
1613 if (ble_uuid_server_init() != ERRCODE_BT_SUCCESS) {
1614 printf("%s gatts_register_server fail.\n", BLE_HILINK_SERVER_LOG);
1615 return -1;
1616 }
1617 }
1618
1619 for (unsigned int i = 0; i < srvcInfo->attrNum; i++) {
1620 BleGattAttr *attr = &(srvcInfo->attrList[i]);
1621 convert_uuid(attr->uuid, attr->uuidType, &ble_uuid);
1622
1623 switch (attr->attrType) {
1624 case OHOS_BLE_ATTRIB_TYPE_SERVICE:
1625 ret = BleGattsAddService(g_server_id, ble_uuid, 1, srvcInfo->attrNum);
1626 if (ret != ERRCODE_BT_SUCCESS) {
1627 printf("%s BleGattsAddService failed, ret:0x%x\r\n", BLE_HILINK_SERVER_LOG, ret);
1628 }
1629 hilnk_group_add();
1630 break;
1631 case OHOS_BLE_ATTRIB_TYPE_CHAR:
1632 ret = BleGattsAddCharacteristic(g_server_id, g_srvc_handle,
1633 ble_uuid, attr->properties, attr->permission);
1634 if (ret != ERRCODE_BT_SUCCESS) {
1635 printf("%s BleGattsAddCharacteristic failed, ret:0x%x\r\n", BLE_HILINK_SERVER_LOG, ret);
1636 }
1637 hilnk_group_add();
1638 break;
1639 case OHOS_BLE_ATTRIB_TYPE_CHAR_VALUE:
1640 break;
1641 case OHOS_BLE_ATTRIB_TYPE_CHAR_CLIENT_CONFIG:
1642 break;
1643 case OHOS_BLE_ATTRIB_TYPE_CHAR_USER_DESCR:
1644 ret = BleGattsAddDescriptor(g_server_id, g_srvc_handle, ble_uuid, attr->permission);
1645 if (ret != ERRCODE_BT_SUCCESS) {
1646 printf("%s BleGattsAddDescriptor failed:%x.\n", BLE_HILINK_SERVER_LOG, ret);
1647 }
1648 hilnk_group_add();
1649 break;
1650 default:
1651 printf("Unknown\n");
1652 }
1653
1654 if ((attr->attrType == OHOS_BLE_ATTRIB_TYPE_CHAR_USER_DESCR) || (attr->attrType == OHOS_BLE_ATTRIB_TYPE_CHAR)) {
1655 set_chara_func(attr, 0);
1656 }
1657
1658 if ((attr->properties & OHOS_GATT_CHARACTER_PROPERTY_BIT_INDICATE) ||
1659 (attr->properties & OHOS_GATT_CHARACTER_PROPERTY_BIT_NOTIFY)) {
1660 is_indicate = 1;
1661 g_indicate_handle = g_cb_chara_handle;
1662 }
1663 }
1664
1665 if (is_indicate) {
1666 ble_uuid.uuid = g_hilink_cccd_uuid;
1667 ble_uuid.uuidLen = sizeof(g_hilink_cccd_uuid);
1668 ret = BleGattsAddDescriptor(g_server_id, g_srvc_handle,
1669 ble_uuid, OHOS_GATT_PERMISSION_READ | OHOS_GATT_PERMISSION_WRITE);
1670 if (ret == ERRCODE_BT_SUCCESS) {
1671 set_chara_func(NULL, is_indicate);
1672 }
1673 }
1674
1675 if (g_srvc_handle != 0) {
1676 ret = gatts_start_service(g_server_id, g_srvc_handle);
1677 *srvcHandle = g_srvc_handle;
1678 }
1679
1680 return 0;
1681 }
1682
1683 /*
1684 * @brief Stop service.
1685 * This API will not described in the development manual, only for Hilink.
1686 * @return 0-success, other-fail
1687 */
BleGattsStopServiceEx(int srvcHandle)1688 int BleGattsStopServiceEx(int srvcHandle)
1689 {
1690 printf("%s BleGattsStopServiceEx enter.\n", BLE_HILINK_SERVER_LOG);
1691 return 0;
1692 }
1693