• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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