• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
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  * Description: HiLink BLE file实现源文件(此文件为DEMO,需集成方适配修改)
15  */
16 
17 #include <stdbool.h>
18 #include <string.h>
19 #include <stdlib.h>
20 
21 #include "osal_list.h"
22 #include "securec.h"
23 #include "test_suite_uart.h"
24 #include "bts_le_gap.h"
25 #include "bts_gatt_client.h"
26 #include "bts_gatt_server.h"
27 #include "cmsis_os2.h"
28 
29 #include "ohos_bt_gatt.h"
30 #include "ohos_bt_def.h"
31 #include "ohos_bt_gatt_server.h"
32 
33 static uint8_t g_chara_val[] = {0x11, 0x22, 0x33, 0x44};
34 static uint8_t g_desc_val[]  = {0x55, 0x66, 0x77, 0x88};
35 #define UUID16_LEN 2
36 #define UUID32_LEN 4
37 #define UUID128_LEN 16
38 #define BLE_MAX_SERVICES_NUMS 16
39 #define BLE_HILINK_SERVER_LOG "[BLE_HILINK_SERVER]"
40 #define BLE_ADV_HANDLE_DEFAULT 1
41 #define INVALID_SERVER_ID 0
42 #define EXT_ADV_OR_SCAN_RSP_DATA_LEN 251
43 #define MAX_READ_REQ_LEN 200
44 
45 static BtGattCallbacks *g_ble_gap_cb = NULL;
46 static BtGattServerCallbacks *g_ble_gatts_cb = NULL;
47 
48 static uint16_t g_services_handle[BLE_MAX_SERVICES_NUMS] = {0};
49 static uint16_t g_server_request_id = 0;
50 static uint16_t g_srvc_handle = 0;
51 static uint16_t g_cb_chara_handle = 0;
52 static uint16_t g_cb_desc_handle = 0;
53 static uint16_t g_indicate_handle = 17;
54 static uint8_t g_adv_status = 0;
55 static uint8_t g_io_cap_mode = 0;
56 static uint8_t g_sc_mode = 0;
57 static uint8_t g_gatt_write_flag = 0;   /* 0:write 1:read */
58 static uint8_t g_service_flag = 0;      /* 0:enable 1:disable start service */
59 static uint8_t g_server_id = INVALID_SERVER_ID;  /* gatt server ID */
60 
61 
62 typedef struct {
63     int conn_id;
64     int attr_handle;  /* The handle of the attribute to be read */
65     BleGattServiceRead read;
66     BleGattServiceWrite write;
67     BleGattServiceIndicate indicate;
68 } hilink_ble_gatt_func;
69 
70 hilink_ble_gatt_func g_charas_func[10] = {{0}};     /* 设置最大Service数量10 */
71 static uint8_t g_chara_cnt = 0;
72 
reverse_uuid(uint8_t * input,char * output,int len)73 static void reverse_uuid(uint8_t *input, char *output, int len)
74 {
75     for (int i = 0; i < len; i++) {
76         output[i] = input[len - i - 1];
77     }
78 }
79 
get_chara_read_func(int conn_id,int attr_handle)80 BleGattServiceRead get_chara_read_func(int conn_id, int attr_handle)
81 {
82     for (int i = 0; i < g_chara_cnt; i++) {
83         if ((g_charas_func[i].attr_handle == attr_handle)) {
84             return g_charas_func[i].read;
85         }
86     }
87     printf("get_chara_read_func Not Found! \n");
88     return NULL;
89 }
90 
get_chara_write_func(int conn_id,int attr_handle)91 BleGattServiceWrite get_chara_write_func(int conn_id, int attr_handle)
92 {
93     for (int i = 0; i < g_chara_cnt; i++) {
94         if (g_charas_func[i].attr_handle == attr_handle) {
95             return g_charas_func[i].write;
96         }
97     }
98     printf("get_chara_write_func Not Found! \n");
99     return NULL;
100 }
101 
get_chara_ind_func(int conn_id,int attr_handle)102 BleGattServiceIndicate get_chara_ind_func(int conn_id, int attr_handle)
103 {
104     for (int i = 0; i < g_chara_cnt; i++) {
105         if (g_charas_func[i].attr_handle == attr_handle) {
106             return g_charas_func[i].write;
107         }
108     }
109     printf("get_chara_ind_func Not Found! \n");
110     return NULL;
111 }
112 
perm_bt_to_bluez(uint32_t permissions)113 static uint32_t perm_bt_to_bluez(uint32_t permissions)
114 {
115     uint32_t perm = 0;
116     if (permissions & OHOS_GATT_PERMISSION_READ) {
117         perm |= GATT_ATTRIBUTE_PERMISSION_READ;
118     }
119     if (permissions & OHOS_GATT_PERMISSION_READ_ENCRYPTED) {
120         perm |= (GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_ENCRYPTION_NEED);
121     }
122     if (permissions & OHOS_GATT_PERMISSION_READ_ENCRYPTED_MITM) {
123         perm |= (GATT_ATTRIBUTE_PERMISSION_READ |
124             GATT_ATTRIBUTE_PERMISSION_ENCRYPTION_NEED | GATT_ATTRIBUTE_PERMISSION_MITM_NEED);
125     }
126     if (permissions & OHOS_GATT_PERMISSION_WRITE) {
127         perm |= GATT_ATTRIBUTE_PERMISSION_WRITE;
128     }
129     if (permissions & OHOS_GATT_PERMISSION_WRITE_ENCRYPTED) {
130         perm |= (GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_ENCRYPTION_NEED);
131     }
132     if (permissions & OHOS_GATT_PERMISSION_WRITE_ENCRYPTED_MITM) {
133         perm |= (GATT_ATTRIBUTE_PERMISSION_WRITE |
134             GATT_ATTRIBUTE_PERMISSION_ENCRYPTION_NEED | GATT_ATTRIBUTE_PERMISSION_MITM_NEED);
135     }
136     printf("convert %04x to %04x.\n", permissions, perm);
137     return perm;
138 }
139 
EnableBle(void)140 bool EnableBle(void)
141 {
142     return 0;
143 }
144 
DisableBle(void)145 bool DisableBle(void)
146 {
147     return 0;
148 }
149 
EnableBt(void)150 bool EnableBt(void)
151 {
152     return 0;
153 }
154 
DisableBt(void)155 bool DisableBt(void)
156 {
157     return 0;
158 }
159 
160 /**
161  *  @brief Get local host bluetooth address
162  *  @return @c Local host bluetooth address
163  */
GetLocalAddress(void)164 BdAddr* GetLocalAddress(void)
165 {
166     printf("%s GetLocalAddress enter.\n", BLE_HILINK_SERVER_LOG);
167     return NULL;
168 }
169 
170 /**
171  *  @brief Get local host bluetooth name
172  *  @param localName actual receiving device name
173            length - localName length, initail set length to zero, and call this func to set real length
174  *  @return Local host bluetooth name
175  */
GetLocalName(unsigned char * localName,unsigned char * length)176 bool GetLocalName(unsigned char *localName, unsigned char *length)
177 {
178     printf("%s GetLocalName enter.\n", BLE_HILINK_SERVER_LOG);
179     return 0;
180 }
181 
182 /**
183  * @brief Set local device name.
184  * @param localName Device name.
185           length device name length
186  * @return Returns <b>true</b> if the operation is successful;
187  *         returns <b>false</b> if the operation fails.
188  */
SetLocalName(unsigned char * localName,unsigned char length)189 bool SetLocalName(unsigned char *localName, unsigned char length)
190 {
191     printf("%s SetLocalName enter.\n", BLE_HILINK_SERVER_LOG);
192     return 0;
193 }
194 
195 /**
196  * @brief Factory reset bluetooth service.
197  * @return Returns <b>true</b> if the operation is successful;
198  *         returns <b>false</b> if the operation fails.
199  */
BluetoothFactoryReset(void)200 bool BluetoothFactoryReset(void)
201 {
202     return 0;
203 }
204 
205 /**
206  * @brief Set device scan mode.
207  * @param mode Scan mode.
208  * @param duration Scan time, see details {@link GapBtScanMode}
209  * @return special mode
210  */
GetBtScanMode(void)211 int GetBtScanMode(void)
212 {
213     return 0;
214 }
215 
216 /**
217  * @brief Set device scan mode.
218  * @param mode Scan mode, see details {@link GapBtScanMode}.
219  * @param duration Scan time.
220  * @return Returns <b>true</b> if the operation is successful;
221  *         returns <b>false</b> if the operation fails.
222  */
SetBtScanMode(int mode,int duration)223 bool SetBtScanMode(int mode, int duration)
224 {
225     return 0;
226 }
227 
228 /*
229  * @brief read bt mac address
230  * @param[in] <mac> mac addr
231  * @param[in] <len> addr length
232  * @return 0-success, other-fail
233  */
ReadBtMacAddr(unsigned char * mac,unsigned int len)234 int ReadBtMacAddr(unsigned char *mac, unsigned int len)
235 {
236     printf("%s ReadBtMacAddr enter.\n", BLE_HILINK_SERVER_LOG);
237     return 0;
238 }
239 
240 /*
241  * @brief Get paired devices.
242  * @param pairList - 按照maxPairNums申请的设备列表数组
243           maxPairNums - 指定需要获取的设备列表最大个数
244           realPairNums - 实际的配对设备列表个数
245  * @return Returns <b>true</b> if the operation is successful;
246  *         returns <b>false</b> if the operation fails.
247  */
GetPariedDevicesNum(unsigned int * number)248 bool GetPariedDevicesNum(unsigned int *number)
249 {
250     printf("%s GetPariedDevicesNum enter.\n", BLE_HILINK_SERVER_LOG);
251     return 0;
252 }
253 
254 /**
255  * @brief Get device pair state.
256  * @param device Remote device.
257  * @return Returns device pair state. see detail {@link GapBtPairedState}
258  */
GetPairState(void)259 int GetPairState(void)
260 {
261     printf("%s GetPairState enter.\n", BLE_HILINK_SERVER_LOG);
262     return 0;
263 }
264 
265 /**
266  * @brief Remove pair.
267  * @param BdAddr Remote device address.
268  * @return Returns <b>true</b> if the operation is successful;
269  *         returns <b>false</b> if the operation fails.
270  */
RemovePair(const BdAddr addr)271 bool RemovePair(const BdAddr addr)
272 {
273     printf("%s RemovePair enter.\n", BLE_HILINK_SERVER_LOG);
274     return 0;
275 }
276 
277 /**
278  * @brief Remove all pairs.
279  * @return Returns <b>true</b> if the operation is successful;
280  *         returns <b>false</b> if the operation fails.
281  */
RemoveAllPairs(void)282 bool RemoveAllPairs(void)
283 {
284     printf("%s RemoveAllPairs enter.\n", BLE_HILINK_SERVER_LOG);
285     return 0;
286 }
287 
288 /**
289  * @brief Read remote device rssi value.
290  *
291  * @param bdAddr device address.
292  * @param transport Transport type, details see {@link BtTransportId}
293  * @return Returns <b>true</b> if the operation is successful;
294  *         returns <b>false</b> if the operation fails.
295  */
ReadRemoteRssiValue(const BdAddr * bdAddr,int transport)296 bool ReadRemoteRssiValue(const BdAddr *bdAddr, int transport)
297 {
298     printf("%s ReadRemoteRssiValue enter.\n", BLE_HILINK_SERVER_LOG);
299     return 0;
300 }
301 
302 /**
303  * @brief Check if device acl connected.
304  * @param addr device address.
305  * @return Returns <b>true</b> if device acl connected;
306  *         returns <b>false</b> if device does not acl connect.
307  */
IsAclConnected(BdAddr * addr)308 bool IsAclConnected(BdAddr *addr)
309 {
310     printf("%s IsAclConnected enter.\n", BLE_HILINK_SERVER_LOG);
311     return 0;
312 }
313 
314 /**
315  * @brief disconnect remote device all profile.
316  * @param addr device address.
317  * @return Returns <b>true</b> if device acl connected;
318  *         returns <b>false</b> if device does not acl connect.
319  */
DisconnectRemoteDevice(BdAddr * addr)320 bool DisconnectRemoteDevice(BdAddr *addr)
321 {
322     printf("%s DisconnectRemoteDevice enter.\n", BLE_HILINK_SERVER_LOG);
323     return 0;
324 }
325 
326 /*
327  * @brief connect remote device acl profile.
328  * @param: remote device address
329  * @return Returns <b>true</b> if device acl connected;
330  *         returns <b>false</b> if device does not acl connect.
331  */
ConnectRemoteDevice(BdAddr * addr)332 bool ConnectRemoteDevice(BdAddr *addr)
333 {
334     printf("%s ConnectRemoteDevice enter.\n", BLE_HILINK_SERVER_LOG);
335     return 0;
336 }
337 
338 /*
339  * @brief Initialize the Bluetooth protocol stack
340  * @param[in] void
341  * @return 0-success, other-fail
342  */
InitBtStack(void)343 int InitBtStack(void)
344 {
345     printf("%s InitBtStack enter.\n", BLE_HILINK_SERVER_LOG);
346     return 0;
347 }
348 
349 /*
350  * @brief Bluetooth protocol stack enable
351  * @param[in] void
352  * @return 0-success, other-fail
353  */
EnableBtStack(void)354 int EnableBtStack(void)
355 {
356     printf("%s EnableBtStack enter.\n", BLE_HILINK_SERVER_LOG);
357     errcode_t ret = ERRCODE_BT_SUCCESS;
358     ret |= enable_ble();
359     if (ret != ERRCODE_BT_SUCCESS) {
360         printf("%s EnableBtStack fail, ret:%d.\n", BLE_HILINK_SERVER_LOG, ret);
361         return -1;
362     }
363     return 0;
364 }
365 
366 /*
367  * @brief Bluetooth protocol stack disable
368  * @param[in] void
369  * @return 0-success, other-fail
370  */
DisableBtStack(void)371 int DisableBtStack(void)
372 {
373     printf("%s DisableBtStack enter.\n", BLE_HILINK_SERVER_LOG);
374     errcode_t ret = ERRCODE_BT_SUCCESS;
375     ret |= disable_ble();
376     if (ret != ERRCODE_BT_SUCCESS) {
377         printf("%s DisableBtStack fail, ret:%d.\n", BLE_HILINK_SERVER_LOG, ret);
378         return -1;
379     }
380     return 0;
381 }
382 
383 /*
384  * @brief set this device's name for friendly
385  * @param[in] <name> device name
386  * @param[in] <len> length
387  * @return 0-success, other-fail
388  */
SetDeviceName(const char * name,unsigned int len)389 int SetDeviceName(const char *name, unsigned int len)
390 {
391     printf("%s SetDeviceName enter.\n", BLE_HILINK_SERVER_LOG);
392     return 0;
393 }
394 
395 /*
396  * @brief set advertising data
397  * @param[in] <advId> specified by upper layer
398  * @param[in] <data> adv data or scan response
399  * @return 0-success, other-fail
400  */
BleSetAdvData(int advId,const BleConfigAdvData * data)401 int BleSetAdvData(int advId, const BleConfigAdvData *data)
402 {
403     printf("%s BleSetAdvData enter.\n", BLE_HILINK_SERVER_LOG);
404     return 0;
405 }
406 
407 /*
408  * @brief start ble advertising
409  * @param[in] <advId> specified by upper layer
410  * @param[in] <param> ble advertising param list
411  * @return 0-success, other-fail
412  */
BleStartAdv(int advId,const BleAdvParams * param)413 int BleStartAdv(int advId, const BleAdvParams *param)
414 {
415     printf("%s BleStartAdv enter.\n", BLE_HILINK_SERVER_LOG);
416     return 0;
417 }
418 
419 /*
420  * @brief stop ble advertising
421  * @param[in] <advId> specified by upper layer
422  * @return 0-success, other-fail
423  */
BleStopAdv(int advId)424 int BleStopAdv(int advId)
425 {
426     printf("%s BleStopAdv enter.\n", BLE_HILINK_SERVER_LOG);
427 
428     errcode_t ret = gap_ble_stop_adv(BLE_ADV_HANDLE_DEFAULT);
429     if (ret != ERRCODE_BT_SUCCESS) {
430         printf("%s BleStopAdv gap_ble_stop_adv error.\n", BLE_HILINK_SERVER_LOG);
431         return ERRCODE_BT_FAIL;
432     }
433 
434     return 0;
435 }
436 
437 /*
438  * @Update the parameters as per spec, user manual specified values and restart multi ADV
439  * @param[in] <advId> specified by upper layer
440  * @param[in] <param> ble advertising param list
441  * @return 0-success, other-fail
442  */
BleUpdateAdv(int advId,const BleAdvParams * param)443 int BleUpdateAdv(int advId, const BleAdvParams *param)
444 {
445     printf("%s BleUpdateAdv enter.\n", BLE_HILINK_SERVER_LOG);
446     return 0;
447 }
448 
449 /*
450  * @brief set security IO capability
451  * @param[in] <mode> BleIoCapMode
452  * @return 0-success, other-fail
453  */
BleSetSecurityIoCap(BleIoCapMode mode)454 int BleSetSecurityIoCap(BleIoCapMode mode)
455 {
456     printf("%s BleSetSecurityIoCap enter, io_mod:%d.\n", BLE_HILINK_SERVER_LOG, mode);
457     g_io_cap_mode = mode;
458     return 0;
459 }
460 
461 /*
462  * @brief set security authority
463  * @param[in] <mode> BleAuthReqMode
464  * @return 0-success, other-fail
465  */
BleSetSecurityAuthReq(BleAuthReqMode mode)466 int BleSetSecurityAuthReq(BleAuthReqMode mode)
467 {
468     printf("%s BleSetSecurityAuthReq enter sc_mode:%d.\n", BLE_HILINK_SERVER_LOG, mode);
469     g_sc_mode = mode;
470     return 0;
471 }
472 
473 /*
474  * @brief The device accept or reject the connection initiator.
475  * @param[in] <bdAddr> initiator's address
476  * @param[in] <accept> 0-reject, 1-accept
477  * @return 0-success, other-fail
478  */
BleGattSecurityRsp(BdAddr bdAddr,bool accept)479 int BleGattSecurityRsp(BdAddr bdAddr, bool accept)
480 {
481     printf("%s BleGattSecurityRsp enter.\n", BLE_HILINK_SERVER_LOG);
482     return 0;
483 }
484 
485 /*
486  * @brief Setup scan filter params
487  * @param[in] <param> BleAdvScanFilterParam
488  * @return 0-success, other-fail
489  */
BleScanFilterParamSetup(BleAdvScanFilterParam * param)490 int BleScanFilterParamSetup(BleAdvScanFilterParam *param)
491 {
492     printf("%s BleScanFilterParamSetup enter.\n", BLE_HILINK_SERVER_LOG);
493     return 0;
494 }
495 
496 /*
497  * @brief Configure a scan filter condition
498  * @param[in] <param> BleAdvScanFilterCondition
499  * @return 0-success, other-fail
500  */
BleScanFilterAddRemove(BleAdvScanFilterCondition * param)501 int BleScanFilterAddRemove(BleAdvScanFilterCondition *param)
502 {
503     printf("%s BleScanFilterAddRemove enter.\n", BLE_HILINK_SERVER_LOG);
504     return 0;
505 }
506 
507 /*
508  * @brief Clear all scan filter conditions for specific filter index
509  * @param[in] <clientId> client Id
510  * @param[in] <filterIndex> filter index
511  * @return 0-success, other-fail
512  */
BleScanFilterClear(int clientId,int filterIndex)513 int BleScanFilterClear(int clientId, int filterIndex)
514 {
515     printf("%s BleScanFilterClear enter.\n", BLE_HILINK_SERVER_LOG);
516     return 0;
517 }
518 
519 /*
520  * @brief Enable / disable scan filter feature
521  * @param[in] <clientId> client Id
522  * @param[in] <enable> 0-disable, 1-enable
523  * @return 0-success, other-fail
524  */
BleScanFilterEnable(int clientId,bool enable)525 int BleScanFilterEnable(int clientId, bool enable)
526 {
527     printf("%s BleScanFilterEnable enter.\n", BLE_HILINK_SERVER_LOG);
528     return 0;
529 }
530 
531 /*
532  * @brief Set BLE scan parameters
533  * @param[in] <clientId> client Id
534  * @param[in] <param> BleScanParams, include scanInterval,scanWindow and so on.
535  * @return 0-success, other-fail
536  */
BleSetScanParameters(int clientId,BleScanParams * param)537 int BleSetScanParameters(int clientId, BleScanParams *param)
538 {
539     printf("%s BleSetScanParameters enter.\n", BLE_HILINK_SERVER_LOG);
540     return 0;
541 }
542 
543 /*
544  * @brief Start Ble scan
545  * @return 0-success, other-fail
546  */
BleStartScan(void)547 int BleStartScan(void)
548 {
549     printf("%s BleStartScan enter.\n", BLE_HILINK_SERVER_LOG);
550     return 0;
551 }
552 
553 /*
554  * @brief Stop Ble scan
555  * @return 0-success, other-fail
556  */
BleStopScan(void)557 int BleStopScan(void)
558 {
559     printf("%s BleStopScan enter.\n", BLE_HILINK_SERVER_LOG);
560     return 0;
561 }
562 
ble_enable_cb_adapt(errcode_t status)563 static void ble_enable_cb_adapt(errcode_t status)
564 {
565     printf("%s ble_enable_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
566     return;
567 }
568 
ble_disable_cb_adapt(errcode_t status)569 static void ble_disable_cb_adapt(errcode_t status)
570 {
571     printf("%s ble_disenable_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
572     return;
573 }
574 
set_adv_data_cb_adapt(uint8_t adv_id,errcode_t status)575 static void set_adv_data_cb_adapt(uint8_t adv_id, errcode_t status)
576 {
577     printf("%s set_adv_data_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
578     return;
579 }
580 
set_adv_param_cb_adapt(uint8_t adv_id,errcode_t status)581 static void set_adv_param_cb_adapt(uint8_t adv_id, errcode_t status)
582 {
583     printf("%s set_adv_param_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
584     return;
585 }
586 
set_scan_param_cb_adapt(errcode_t status)587 static void set_scan_param_cb_adapt(errcode_t status)
588 {
589     printf("%s set_scan_param_cb_adapt status: %d.\n", BLE_HILINK_SERVER_LOG, status);
590     return;
591 }
592 
start_adv_cb_adapt(uint8_t adv_id,adv_status_t status)593 static void start_adv_cb_adapt(uint8_t adv_id, adv_status_t status)
594 {
595     printf("%s start_adv_cb_adapt enter adv_id:%d, status: %d.\n", BLE_HILINK_SERVER_LOG, adv_id, status);
596     g_ble_gap_cb->advEnableCb(adv_id, 0);
597     return;
598 }
599 
stop_adv_cb_adapt(uint8_t adv_id,adv_status_t status)600 static void stop_adv_cb_adapt(uint8_t adv_id, adv_status_t status)
601 {
602     printf("%s stop_adv_cb_adapt enter status: %d.\n", BLE_HILINK_SERVER_LOG, status);
603     g_ble_gap_cb->advDisableCb(adv_id, 0);
604     return;
605 }
606 
scan_result_cb_adapt(gap_scan_result_data_t * scan_result_data)607 static void scan_result_cb_adapt(gap_scan_result_data_t *scan_result_data)
608 {
609     printf("%s scan_result_cb_adapt enter.\n", BLE_HILINK_SERVER_LOG);
610     return;
611 }
612 
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)613 static void conn_state_change_cb_adapt(uint16_t conn_id, bd_addr_t *addr,
614     gap_ble_conn_state_t conn_state, gap_ble_pair_state_t pair_state, gap_ble_disc_reason_t disc_reason)
615 {
616     printf("%s connect state change conn_id: %d, status: %d, pair_status:%d, disc_reason %x\n",
617         BLE_HILINK_SERVER_LOG, conn_id, conn_state, pair_state, disc_reason);
618 
619     BdAddr bd_addr = {0};
620     if (conn_state == GAP_BLE_STATE_CONNECTED) {
621         printf("%s conn_state_change_cb_adapt conn succ.\n", BLE_HILINK_SERVER_LOG);
622         (void)memcpy_s(bd_addr.addr, BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);
623         if (g_ble_gatts_cb->connectServerCb) {
624             g_ble_gatts_cb->connectServerCb(conn_id, g_server_id, &bd_addr);
625         }
626     } else if (conn_state == GAP_BLE_STATE_DISCONNECTED) {
627         printf("%s conn_state_change_cb_adapt disconnect.\n", BLE_HILINK_SERVER_LOG);
628         errcode_t ret = gap_ble_start_adv(BLE_ADV_HANDLE_DEFAULT);
629         if (ret != ERRCODE_BT_SUCCESS) {
630             printf("%s conn_state_change_cb_adapt gap_ble_start_adv error.\n", BLE_HILINK_SERVER_LOG);
631             return;
632         }
633         g_adv_status = 1;
634     }
635 }
636 
637 gap_ble_callbacks_t g_gap_callback = {
638     .ble_enable_cb          = ble_enable_cb_adapt,
639     .ble_disable_cb         = ble_disable_cb_adapt,
640     .set_adv_data_cb        = set_adv_data_cb_adapt,
641     .set_adv_param_cb       = set_adv_param_cb_adapt,
642     .set_scan_param_cb      = set_scan_param_cb_adapt,
643     .start_adv_cb           = start_adv_cb_adapt,
644     .stop_adv_cb            = stop_adv_cb_adapt,
645     .scan_result_cb         = scan_result_cb_adapt,
646     .conn_state_change_cb   = conn_state_change_cb_adapt
647 };
648 
649 /*
650  * @brief Callback invoked for gatt common function
651  * @param[in] <BtGattCallbacks> Callback funcs
652  * @return 0-success, other-fail
653  */
BleGattRegisterCallbacks(BtGattCallbacks * func)654 int BleGattRegisterCallbacks(BtGattCallbacks *func)
655 {
656     printf("%s BleGattRegisterCallbacks enter.\n", BLE_HILINK_SERVER_LOG);
657     errcode_t ret = ERRCODE_BT_FAIL;
658     if (func != NULL) {
659         g_ble_gap_cb = func;
660         ret = gap_ble_register_callbacks(&g_gap_callback);
661         if (ret != ERRCODE_BT_SUCCESS) {
662             printf("%s gap_ble_register_callbacks fail.\n", BLE_HILINK_SERVER_LOG);
663             return ERRCODE_BT_FAIL;
664         }
665     }
666 
667     return 0;
668 }
669 
670 /*
671  * @brief Start advertising include set adv data.
672  * This API will not described in the development manual, only for Hilink.
673  * @return 0-success, other-fail
674  */
BleStartAdvEx(int * advId,const StartAdvRawData rawData,BleAdvParams advParam)675 int BleStartAdvEx(int *advId, const StartAdvRawData rawData, BleAdvParams advParam)
676 {
677     printf("%s BleStartAdvEx enter.\n", BLE_HILINK_SERVER_LOG);
678     errcode_t ret = ERRCODE_BT_FAIL;
679     gap_ble_adv_params_t cfg_adv_params = {0};
680 
681     if (g_adv_status == 0) {
682         *advId = BLE_ADV_HANDLE_DEFAULT;
683         cfg_adv_params.min_interval         = advParam.minInterval;
684         cfg_adv_params.max_interval         = advParam.maxInterval;
685         cfg_adv_params.duration             = advParam.duration;
686         cfg_adv_params.channel_map          = advParam.channelMap;   /* 广播通道选择bitMap, 可参考BleAdvChannelMap */
687         cfg_adv_params.adv_type             = advParam.advType;
688         cfg_adv_params.adv_filter_policy    = advParam.advFilterPolicy;
689         cfg_adv_params.peer_addr.type       = advParam.peerAddrType;
690         cfg_adv_params.own_addr.type        = advParam.ownAddrType;
691         cfg_adv_params.tx_power             = advParam.txPower;
692         (void)memcpy_s(&cfg_adv_params.peer_addr.addr, BD_ADDR_LEN, advParam.peerAddr.addr, BD_ADDR_LEN);
693         (void)memset_s(&cfg_adv_params.own_addr.addr, BD_ADDR_LEN, 0, BD_ADDR_LEN);
694         ret = gap_ble_set_adv_param(BLE_ADV_HANDLE_DEFAULT, &cfg_adv_params);
695         if (ret != ERRCODE_BT_SUCCESS) {
696             printf("%s BleStartAdvEx gap_ble_set_adv_param error.\n", BLE_HILINK_SERVER_LOG);
697             return -1;
698         }
699 
700         gap_ble_config_adv_data_t cfg_adv_data = {0};
701         cfg_adv_data.adv_length         = rawData.advDataLen;
702         cfg_adv_data.adv_data           = rawData.advData;        /* set adv data */
703         cfg_adv_data.scan_rsp_length    = rawData.rspDataLen;
704         cfg_adv_data.scan_rsp_data      = rawData.rspData;      /* set scan response data */
705         ret = gap_ble_set_adv_data(BLE_ADV_HANDLE_DEFAULT, &cfg_adv_data);
706         if (ret != ERRCODE_BT_SUCCESS) {
707             printf("%s BleStartAdvEx gap_ble_set_adv_data error.\n", BLE_HILINK_SERVER_LOG);
708             return -1;
709         }
710 
711         ret = gap_ble_start_adv(BLE_ADV_HANDLE_DEFAULT);
712         if (ret != ERRCODE_BT_SUCCESS) {
713             printf("%s BleStartAdvEx gap_ble_start_adv error.\n", BLE_HILINK_SERVER_LOG);
714             return -1;
715         }
716         g_adv_status = 1;
717     } else {
718         printf("%s BleStartAdvEx already adv.\n", BLE_HILINK_SERVER_LOG);
719         return -1;
720     }
721     return 0;
722 }
723 
724 /*
725  * @brief gatt server application register, callback return serverId
726  * @param[in] <appUuid> specified by upper layer
727  * @return 0-success, other-fail
728  */
BleGattsRegister(BtUuid appUuid)729 int BleGattsRegister(BtUuid appUuid)
730 {
731     printf("%s BleGattsRegister enter.\n", BLE_HILINK_SERVER_LOG);
732     bt_uuid_t app_uuid = {0};
733     app_uuid.uuid_len = appUuid.uuidLen;
734     if (memcpy_s(app_uuid.uuid, app_uuid.uuid_len, appUuid.uuid, appUuid.uuidLen) != EOK) {
735         return ERRCODE_BT_FAIL;
736     }
737     gatts_register_server(&app_uuid, &g_server_id);
738     return ERRCODE_BT_SUCCESS;
739 }
740 
741 /*
742  * @brief gatt server deregister
743  * @param[in] <clientId> server interface Id
744  * @return 0-success, other-fail
745  */
BleGattsUnRegister(int serverId)746 int BleGattsUnRegister(int serverId)
747 {
748     printf("%s BleGattsUnRegister enter.\n", BLE_HILINK_SERVER_LOG);
749     return 0;
750 }
751 
752 /*
753  * @brief Cancel connection with remote device
754  * @param[in] <serverId> server interface id
755  * @param[in] <bdAddr>   remote address
756  * @param[in] <connId>   connection index.
757  * @return 0-success, other-fail
758  */
BleGattsDisconnect(int serverId,BdAddr bdAddr,int connId)759 int BleGattsDisconnect(int serverId, BdAddr bdAddr, int connId)
760 {
761     printf("%s BleGattsDisconnect enter.\n", BLE_HILINK_SERVER_LOG);
762     bd_addr_t bd_addr = { 0 };
763     bd_addr.type = BT_ADDRESS_TYPE_PUBLIC_DEVICE_ADDRESS;
764     memcpy_s(bd_addr.addr, BD_ADDR_LEN, bdAddr.addr, BD_ADDR_LEN);
765     return gap_ble_disconnect_remote_device(&bd_addr);
766 }
767 
768 /*
769  * @brief add service
770  * @param[in] <serverId>  server interface id
771  * @param[in] <srvcUuid>  service uuid and uuid length
772  * @param[in] <isPrimary> is primary or secondary service.
773  * @param[in] <number>    service characther attribute number.
774  * @return 0-success, other-fail
775  */
BleGattsAddService(int serverId,BtUuid srvcUuid,bool isPrimary,int number)776 int BleGattsAddService(int serverId, BtUuid srvcUuid, bool isPrimary, int number)
777 {
778     printf("%s BleGattsAddService enter.\n", BLE_HILINK_SERVER_LOG);
779     errcode_t ret = 0;
780     bt_uuid_t service_uuid = {0};
781     uint16_t service_handle = 0;
782     service_uuid.uuid_len = srvcUuid.uuidLen;
783     (void)memcpy_s(service_uuid.uuid, srvcUuid.uuidLen, (uint8_t *)srvcUuid.uuid, srvcUuid.uuidLen);
784 
785     while (1) {
786         osDelay(10);  /* 等待10 tick */
787         /* APP 调用StartService为异步接口 无法保证Add Service时 前一个Service已完成Start */
788         if (g_service_flag == 0) {
789             ret = gatts_add_service_sync(g_server_id, &service_uuid, 1, &service_handle);
790             g_service_flag = 1;
791             if (ret != ERRCODE_BT_SUCCESS) {
792                 printf("%s BleGattsStartServiceEx Add Service Fail, ret:%x !!!\n", BLE_HILINK_SERVER_LOG, ret);
793             }
794             break;
795         }
796     }
797     g_srvc_handle = service_handle;
798     printf("%s BleGattsAddService end, srvcHandle:%d.\n", BLE_HILINK_SERVER_LOG, g_srvc_handle);
799 
800     return ret;
801 }
802 
803 /*
804  * @brief add characteristic
805  * @param[in] <serverId>    server interface id
806  * @param[in] <srvcHandle>  service handle
807  * @param[in] <characUuid>  characteristic uuid and uuid length
808  * @param[in] <properties>  e.g. (OHOS_GATT_CHARACTER_PROPERTY_BIT_BROADCAST | OHOS_GATT_CHARACTER_PROPERTY_BIT_READ)
809  * @param[in] <permissions> e.g. (OHOS_GATT_PERMISSION_READ | OHOS_GATT_PERMISSION_WRITE)
810  * @return 0-success, other-fail
811  */
BleGattsAddCharacteristic(int serverId,int srvcHandle,BtUuid characUuid,int properties,int permissions)812 int BleGattsAddCharacteristic(int serverId, int srvcHandle, BtUuid characUuid,
813                               int properties, int permissions)
814 {
815     printf("%s BleGattsAddCharacteristic enter, srvcHandle:%d.\n", BLE_HILINK_SERVER_LOG, srvcHandle);
816     bt_uuid_t chara_uuid = {0};
817     gatts_add_chara_info_t chara_info = {0};
818     gatts_add_character_result_t chara_result = {0};
819     chara_uuid.uuid_len = characUuid.uuidLen;
820     (void)memcpy_s(chara_uuid.uuid, characUuid.uuidLen, (uint8_t *)characUuid.uuid, characUuid.uuidLen);
821 
822     chara_info.chara_uuid   = chara_uuid;
823     chara_info.properties   = properties;
824     chara_info.permissions  = perm_bt_to_bluez(permissions);
825     chara_info.value_len    = sizeof(g_chara_val);
826     chara_info.value        = g_chara_val;
827     int ret = gatts_add_characteristic_sync(g_server_id, srvcHandle, &chara_info, &chara_result);
828     printf("%s BleGattsAddCharacteristic ret:%d handle:%d, value_handle:%d.\n",
829         BLE_HILINK_SERVER_LOG, ret, chara_result.handle, chara_result.value_handle);
830 
831     g_cb_chara_handle = chara_result.value_handle;
832     return ret;
833 }
834 
835 /*
836  * @brief add descriptor
837  * @param[in] <serverId>    server interface id
838  * @param[in] <srvcHandle>  service handle
839  * @param[in] <descUuid>    descriptor uuid and uuid length
840  * @param[in] <permissions> e.g. (OHOS_GATT_PERMISSION_READ | OHOS_GATT_PERMISSION_WRITE)
841  * @return 0-success, other-fail
842  */
BleGattsAddDescriptor(int serverId,int srvcHandle,BtUuid descUuid,int permissions)843 int BleGattsAddDescriptor(int serverId, int srvcHandle, BtUuid descUuid, int permissions)
844 {
845     printf("%s BleGattsAddDescriptor enter.\n", BLE_HILINK_SERVER_LOG);
846     bt_uuid_t desc_uuid = {0};
847     gatts_add_desc_info_t descriptor = {0};
848     uint16_t desc_handle = 0;
849 
850     desc_uuid.uuid_len = descUuid.uuidLen;
851     (void)memcpy_s(desc_uuid.uuid, descUuid.uuidLen, (uint8_t *)descUuid.uuid, descUuid.uuidLen);
852 
853     descriptor.desc_uuid    = desc_uuid;
854     descriptor.permissions  = perm_bt_to_bluez(permissions);
855     descriptor.value_len    = sizeof(g_desc_val);
856     descriptor.value        = g_desc_val;
857 
858     int ret = gatts_add_descriptor_sync(g_server_id, srvcHandle, &descriptor, &desc_handle);
859     g_cb_desc_handle = desc_handle;
860     printf("%s BleGattsAddDescriptor ret:%d desc_handle:%d.\n", BLE_HILINK_SERVER_LOG, ret, desc_handle);
861     return ret;
862 }
863 
864 /*
865  * @brief start service
866  * @param[in] <serverId>    server interface id
867  * @param[in] <srvcHandle>  service handle
868  * @return 0-success, other-fail
869  */
BleGattsStartService(int serverId,int srvcHandle)870 int BleGattsStartService(int serverId, int srvcHandle)
871 {
872     printf("%s BleGattsStartService enter.\n", BLE_HILINK_SERVER_LOG);
873     return 0;
874 }
875 
876 /*
877  * @brief start service
878  * @param[in] <serverId>    server interface id
879  * @param[in] <srvcHandle>  service handle
880  * @return 0-success, other-fail
881  */
BleGattsStopService(int serverId,int srvcHandle)882 int BleGattsStopService(int serverId, int srvcHandle)
883 {
884     printf("%s BleGattsStopService enter.\n", BLE_HILINK_SERVER_LOG);
885     return 0;
886 }
887 
888 /*
889  * @brief remove a service from the list of provided services
890  * @param[in] <serverId>   server interface id
891  * @param[in] <srvcHandle>  service handle
892  * @return 0-success, other-fail
893  */
BleGattsDeleteService(int serverId,int srvcHandle)894 int BleGattsDeleteService(int serverId, int srvcHandle)
895 {
896     printf("%s BleGattsDeleteService enter.\n", BLE_HILINK_SERVER_LOG);
897     return 0;
898 }
899 
900 /*
901  * @brief remove all services from the list of provided services
902  * @param[in] <serverId>   server interface id
903  * @return 0-success, other-fail
904  */
BleGattsClearServices(int serverId)905 int BleGattsClearServices(int serverId)
906 {
907     printf("%s BleGattsClearServices enter.\n", BLE_HILINK_SERVER_LOG);
908     return 0;
909 }
910 
911 /*
912  * @brief Send a response to a read or write request to a remote device.
913  * @param[in] <serverId> server interface id
914  * @param[in] <GattsSendRspParam> response param
915  * @return 0-success, other-fail
916  */
BleGattsSendResponse(int serverId,GattsSendRspParam * param)917 int BleGattsSendResponse(int serverId, GattsSendRspParam *param)
918 {
919     printf("%s BleGattsSendResponse enter, handle:%d.\n", BLE_HILINK_SERVER_LOG, param->attrHandle);
920     int ret = 0;
921     gatts_send_rsp_t rsp_param = {0};
922     rsp_param.request_id = g_server_request_id;
923     rsp_param.status = 0;
924     rsp_param.offset = 0;
925     rsp_param.value_len = param->valueLen;
926     rsp_param.value = (uint8_t *)param->value;
927 
928     if (g_gatt_write_flag) {
929         ret = gatts_send_response(g_server_id, param->connectId, &rsp_param);
930         printf("%s BleGattsSendResponse send write resp, ret:%x.\n", BLE_HILINK_SERVER_LOG, ret);
931     } else {
932         ret = gatts_send_response(g_server_id, param->connectId, &rsp_param);
933         printf("%s BleGattsSendResponse send read resp, ret:%x.\n", BLE_HILINK_SERVER_LOG, ret);
934     }
935 
936     return ret;
937 }
938 
939 /*
940  * @brief Send a notification or indication that a local characteristic has been updated
941  * @param[in] <serverId> server interface id
942  * @param[in] <GattsSendIndParam> indication param
943  * @return 0-success, other-fail
944  */
BleGattsSendIndication(int serverId,GattsSendIndParam * param)945 int BleGattsSendIndication(int serverId, GattsSendIndParam *param)
946 {
947     printf("%s BleGattsSendIndication enter, handle:%d.\n", BLE_HILINK_SERVER_LOG, param->attrHandle);
948 
949     int ret = 0;
950     gatts_ntf_ind_t ntf_param = {0};
951     ntf_param.attr_handle   = g_indicate_handle;
952     ntf_param.value_len     = param->valueLen;
953     ntf_param.value         = (uint8_t *)param->value;
954     ret = gatts_notify_indicate(g_server_id, param->connectId, &ntf_param);
955     if (ret != 0) {
956         printf("%s gatts_notify_indicate fail, ret:%x.\n", BLE_HILINK_SERVER_LOG, ret);
957     }
958 
959     int yet = ret ? 0 : -1;
960     if (g_ble_gatts_cb->indicationSentCb != NULL) {
961         printf("%s indicationSentCb form Hilink.\n", BLE_HILINK_SERVER_LOG);
962         g_ble_gatts_cb->indicationSentCb(param->connectId, yet);
963     }
964 
965     BleGattServiceIndicate indicate_func = get_chara_ind_func(param->connectId, g_indicate_handle);
966     if (indicate_func != NULL) {
967         ret = indicate_func(ntf_param.value, ntf_param.value_len);
968         if (ret != 0) {
969             printf("indicateFunc fail %d.\n", ret);
970         }
971     }
972     return ret;
973 }
974 
975 /*
976  * @brief Set the encryption level of the data transmission channel during connection
977  * @param[in] <bdAddr> remote address
978  * @param[in] <secAct> BleSecAct
979  * @return 0-success, other-fail
980  */
BleGattsSetEncryption(BdAddr bdAddr,BleSecAct secAct)981 int BleGattsSetEncryption(BdAddr bdAddr, BleSecAct secAct)
982 {
983     printf("%s BleGattsSetEncryption enter, secAct:%d.\n", BLE_HILINK_SERVER_LOG, secAct);
984 
985     gap_ble_sec_params_t sec_params = {0};
986     sec_params.bondable = 1;
987     sec_params.io_capability = g_io_cap_mode;
988     sec_params.sc_enable = 0;
989     sec_params.sc_mode = secAct;
990     int ret = gap_ble_set_sec_param(&sec_params);
991     if (ret != 0) {
992         printf("%s gap_ble_set_sec_param fail, ret:%d.\n", BLE_HILINK_SERVER_LOG, ret);
993     }
994     return 0;
995 }
996 
add_service_cb_adapt(uint8_t server_id,bt_uuid_t * uuid,uint16_t handle,errcode_t status)997 void add_service_cb_adapt(uint8_t server_id, bt_uuid_t *uuid, uint16_t handle, errcode_t status)
998 {
999     printf("%s add_service_cb server_id:%d, handle:%d, status:%d.\n", BLE_HILINK_SERVER_LOG, server_id, handle, status);
1000     return;
1001 }
1002 
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)1003 void add_characteristic_cb_adapt(uint8_t server_id, bt_uuid_t *uuid, uint16_t service_handle,
1004     gatts_add_character_result_t *result, errcode_t status)
1005 {
1006     printf("%s add_characteristic_cb server: %d srvc_hdl: %d char_hdl: %d char_val_hdl: %d uuid_len: %d \n",
1007         BLE_HILINK_SERVER_LOG, server_id, service_handle, result->handle, result->value_handle, uuid->uuid_len);
1008     return;
1009 }
1010 
add_descriptor_cb_adapt(uint8_t server_id,bt_uuid_t * uuid,uint16_t service_handle,uint16_t handle,errcode_t status)1011 void add_descriptor_cb_adapt(uint8_t server_id, bt_uuid_t *uuid, uint16_t service_handle,
1012     uint16_t handle, errcode_t status)
1013 {
1014     printf("%s add_descriptor_cb server: %d srv_hdl: %d desc_hdl: %d uuid_len:%d.\n",
1015         BLE_HILINK_SERVER_LOG, server_id, service_handle, handle, uuid->uuid_len);
1016     return;
1017 }
1018 
start_service_cb_adapt(uint8_t server_id,uint16_t handle,errcode_t status)1019 void start_service_cb_adapt(uint8_t server_id, uint16_t handle, errcode_t status)
1020 {
1021     printf("%s start_service_cb server: %d srv_hdl: %d status: %d\n", BLE_HILINK_SERVER_LOG, server_id, handle, status);
1022 
1023     g_service_flag = 0;
1024     if (g_ble_gatts_cb->serviceStartCb) {
1025         g_ble_gatts_cb->serviceStartCb(status, server_id, handle);
1026     }
1027     return;
1028 }
1029 
stop_service_cb_adapt(uint8_t server_id,uint16_t handle,errcode_t status)1030 void stop_service_cb_adapt(uint8_t server_id, uint16_t handle, errcode_t status)
1031 {
1032     printf("%s stop_service_cb server: %d srv_hdl: %d status: %d\n",
1033         BLE_HILINK_SERVER_LOG, server_id, handle, status);
1034     if (g_ble_gatts_cb->serviceStopCb) {
1035         g_ble_gatts_cb->serviceStopCb(status, server_id, handle);
1036     }
1037     return;
1038 }
1039 
delete_service_cb_adapt(uint8_t server_id,errcode_t status)1040 void delete_service_cb_adapt(uint8_t server_id, errcode_t status)
1041 {
1042     printf("%s stop_service_cb server: %d srv_hdl: %d status: %d\n",
1043         BLE_HILINK_SERVER_LOG, server_id, status);
1044     return;
1045 }
1046 
read_request_cb_adapt(uint8_t server_id,uint16_t conn_id,gatts_req_read_cb_t * read_cb_para,errcode_t status)1047 void read_request_cb_adapt(uint8_t server_id, uint16_t conn_id, gatts_req_read_cb_t *read_cb_para,
1048     errcode_t status)
1049 {
1050     printf("%s read_request_cb_adapt--server_id:%d conn_id:%d status:%d\n",
1051         BLE_HILINK_SERVER_LOG, server_id, conn_id, status);
1052 
1053     char buff[MAX_READ_REQ_LEN] = {0};
1054     unsigned int length = MAX_READ_REQ_LEN;
1055     int ret = 0;
1056 
1057     BleGattServiceRead read_func = get_chara_read_func(conn_id, read_cb_para->handle);
1058     if (read_func != NULL) {
1059         ret = read_func((uint8_t *)buff, &length);
1060         if (ret != ERRCODE_BT_SUCCESS) {
1061             printf("read_func fail %d.\n", ret);
1062             length = 0;
1063         }
1064     }
1065 
1066     GattsSendRspParam rsp = {0};
1067     rsp.connectId       = conn_id;
1068     rsp.status          = OHOS_GATT_SUCCESS;
1069     rsp.attrHandle      = read_cb_para->handle;
1070 
1071     if (length > read_cb_para->offset) {
1072         rsp.valueLen    = length - read_cb_para->offset;
1073         rsp.value       = buff   + read_cb_para->offset;
1074     } else {
1075         rsp.valueLen    = 0;
1076         rsp.value       = buff;
1077     }
1078 
1079     BleGattsSendResponse(g_server_id, &rsp);
1080 
1081     g_gatt_write_flag = 0;
1082     g_server_request_id = read_cb_para->request_id;
1083 }
1084 
write_request_cb_adapt(uint8_t server_id,uint16_t conn_id,gatts_req_write_cb_t * write_cb_para,errcode_t status)1085 void write_request_cb_adapt(uint8_t server_id, uint16_t conn_id, gatts_req_write_cb_t *write_cb_para,
1086     errcode_t status)
1087 {
1088     printf("%s write_request_cb_adapt--request_id:%d att_handle:%d data_len:%d\n",
1089         BLE_HILINK_SERVER_LOG, write_cb_para->request_id, write_cb_para->handle, write_cb_para->length);
1090 
1091     BleGattServiceWrite write_func = get_chara_write_func(conn_id, write_cb_para->handle);
1092     if (write_func != NULL) {
1093         int ret = write_func(write_cb_para->value, write_cb_para->length);
1094         if (ret != 0) {
1095             printf("write_func fail %d.\n", ret);
1096         }
1097     }
1098 
1099     g_server_request_id = write_cb_para->request_id;
1100     g_gatt_write_flag = 1;
1101 
1102     if (write_cb_para->is_prep) {
1103         GattsSendRspParam rsp = {0};
1104         char one_byte_rsp = 0;
1105         rsp.connectId   = conn_id;
1106         rsp.status      = OHOS_GATT_SUCCESS;
1107         rsp.attrHandle  = write_cb_para->handle;
1108         rsp.valueLen    = sizeof(one_byte_rsp);
1109         rsp.value       = &one_byte_rsp;
1110 
1111         int ret = BleGattsSendResponse(g_server_id, &rsp);
1112         if (ret != ERRCODE_BT_SUCCESS) {
1113             printf("BleGattsSendResponse fail %d.\n", ret);
1114         }
1115     }
1116 }
1117 
mtu_changed_cb_adapt(uint8_t server_id,uint16_t conn_id,uint16_t mtu_size,errcode_t status)1118 void mtu_changed_cb_adapt(uint8_t server_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)
1119 {
1120     printf("%s mtu_changed_cb server_id:%d conn_id:%d mtu_size: %d status: %d\n",
1121         BLE_HILINK_SERVER_LOG, server_id, conn_id, mtu_size, status);
1122 
1123     g_ble_gatts_cb->mtuChangeCb(conn_id, mtu_size);
1124 }
1125 
1126 gatts_callbacks_t g_gatt_callback = {
1127     .add_service_cb          = add_service_cb_adapt,
1128     .add_characteristic_cb   = add_characteristic_cb_adapt,
1129     .add_descriptor_cb       = add_descriptor_cb_adapt,
1130     .start_service_cb        = start_service_cb_adapt,
1131     .stop_service_cb         = stop_service_cb_adapt,
1132     .delete_service_cb       = delete_service_cb_adapt,
1133     .read_request_cb         = read_request_cb_adapt,
1134     .write_request_cb        = write_request_cb_adapt,
1135     .mtu_changed_cb          = mtu_changed_cb_adapt
1136 };
1137 
1138 /*
1139  * @brief Callback invoked for gatt server function
1140  * @param[in] <BtGattServerCallbacks> Callback funcs
1141  * @return 0-success, other-fail
1142  */
BleGattsRegisterCallbacks(BtGattServerCallbacks * func)1143 int BleGattsRegisterCallbacks(BtGattServerCallbacks *func)
1144 {
1145     printf("%s BleGattsRegisterCallbacks enter.\n", BLE_HILINK_SERVER_LOG);
1146     errcode_t ret = ERRCODE_BT_FAIL;
1147     if (func != NULL) {
1148         g_ble_gatts_cb = func;
1149         ret = gatts_register_callbacks(&g_gatt_callback);
1150         if (ret != ERRCODE_BT_SUCCESS) {
1151             printf("%s gatts_register_callbacks fail, ret:%d.\n", BLE_HILINK_SERVER_LOG, ret);
1152             return ERRCODE_BT_FAIL;
1153         }
1154     }
1155 
1156     return 0;
1157 }
1158 
ble_uuid_server_init(void)1159 static errcode_t ble_uuid_server_init(void)
1160 {
1161     errcode_t ret = ERRCODE_BT_SUCCESS;
1162     bt_uuid_t app_uuid = {0};
1163     char uuid[] = {0x12, 0x34};
1164     app_uuid.uuid_len = sizeof(uuid);
1165     ret |= memcpy_s(app_uuid.uuid, app_uuid.uuid_len, uuid, sizeof(uuid));
1166     if (ret != 0) {
1167         return -1;
1168     }
1169     ret |= gatts_register_server(&app_uuid, &g_server_id);
1170     if (ret != ERRCODE_BT_SUCCESS) {
1171         printf("%s gatts_register_server fail.\n", BLE_HILINK_SERVER_LOG);
1172         return -1;
1173     }
1174     return ret;
1175 }
1176 
1177 /*
1178  * @brief Start sevice include add service/characteristic/Descriptor option.
1179  * This API will not described in the development manual, only for Hilink.
1180  * @return 0-success, other-fail
1181  */
1182 
1183 
1184 static uint8_t g_hilink_group_cnt = 0;
1185 #define HILINK_SERVICE_NUM 3
1186 #define HILINK_CHARA_NUM 4
1187 static char g_hilink_group_uuid[HILINK_SERVICE_NUM + HILINK_CHARA_NUM][OHOS_BLE_UUID_MAX_LEN] = {
1188     {0x15, 0xF1, 0xE4, 0x00, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1189     {0x15, 0xF1, 0xE4, 0x01, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1190     {0x15, 0xF1, 0xE5, 0x00, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1191     {0x15, 0xF1, 0xE5, 0x01, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1192     {0x15, 0xF1, 0xE6, 0x00, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1193     {0x15, 0xF1, 0xE6, 0x02, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00},
1194     {0x15, 0xF1, 0xE6, 0x01, 0xA2, 0x77, 0x43, 0xFC, 0xA4, 0x84, 0xDD, 0x39, 0xEF, 0x8A, 0x91, 0x00}
1195 };
1196 static char g_hilink_cccd_uuid[UUID16_LEN] = {0x29, 0x02};
1197 
hilnk_group_add(void)1198 static void hilnk_group_add(void)
1199 {
1200     g_hilink_group_cnt++;
1201 }
1202 
convert_uuid(uint8_t * uuid_input,UuidType type,BtUuid * uuid_output)1203 static void convert_uuid(uint8_t *uuid_input, UuidType type, BtUuid *uuid_output)
1204 {
1205     uint8_t temp_uuid[OHOS_BLE_UUID_MAX_LEN] = {0};
1206     int ret = 0;
1207 
1208     switch (type) {
1209         case OHOS_UUID_TYPE_16_BIT:
1210             uuid_output->uuidLen = UUID16_LEN;
1211             break;
1212         case OHOS_UUID_TYPE_32_BIT:
1213             uuid_output->uuidLen = UUID32_LEN;
1214             break;
1215         case OHOS_UUID_TYPE_128_BIT:
1216             uuid_output->uuidLen = UUID128_LEN;
1217             break;
1218         default:
1219             uuid_output->uuidLen = 0;
1220             break;
1221     }
1222 
1223     uuid_output->uuid = (char *)uuid_input;
1224     ret = memcpy_s(temp_uuid, OHOS_BLE_UUID_MAX_LEN, g_hilink_group_uuid[g_hilink_group_cnt], OHOS_BLE_UUID_MAX_LEN);
1225     if (ret != 0) {
1226         printf("%s convert_uuid memcpy_s fail.\n", BLE_HILINK_SERVER_LOG);
1227         return;
1228     }
1229     reverse_uuid(temp_uuid, uuid_output->uuid, uuid_output->uuidLen);
1230     return;
1231 }
1232 
set_chara_func(BleGattAttr * attr,uint8_t is_indicate)1233 static void set_chara_func(BleGattAttr *attr, uint8_t is_indicate)
1234 {
1235     g_charas_func[g_chara_cnt].conn_id = 0;
1236     if (is_indicate == 0) {
1237         if (attr->attrType == OHOS_BLE_ATTRIB_TYPE_CHAR) {
1238             g_charas_func[g_chara_cnt].attr_handle = g_cb_chara_handle;
1239         } else {
1240             g_charas_func[g_chara_cnt].attr_handle = g_cb_desc_handle;
1241         }
1242         g_charas_func[g_chara_cnt].read       = attr->func.read;
1243         g_charas_func[g_chara_cnt].write      = attr->func.write;
1244         g_charas_func[g_chara_cnt].indicate   = attr->func.indicate;
1245     } else {
1246         g_charas_func[g_chara_cnt].attr_handle = g_cb_desc_handle;
1247     }
1248     g_chara_cnt++;
1249 }
1250 
BleGattsStartServiceEx(int * srvcHandle,BleGattService * srvcInfo)1251 int BleGattsStartServiceEx(int *srvcHandle, BleGattService *srvcInfo)
1252 {
1253     printf("%s BleGattsStartServiceEx enter srvHandle:%d.\n", BLE_HILINK_SERVER_LOG, *srvcHandle);
1254     errcode_t ret = ERRCODE_BT_SUCCESS;
1255     uint8_t is_indicate = 0;
1256     BtUuid ble_uuid = {0};
1257     uint16_t service_handle = 0;
1258 
1259     if (g_server_id == INVALID_SERVER_ID) {
1260         if (ble_uuid_server_init() != ERRCODE_BT_SUCCESS) {
1261             printf("%s gatts_register_server fail.\n", BLE_HILINK_SERVER_LOG);
1262             return -1;
1263         }
1264     }
1265 
1266     for (unsigned int i = 0; i < srvcInfo->attrNum; i++) {
1267         BleGattAttr *attr = &(srvcInfo->attrList[i]);
1268         convert_uuid(attr->uuid, attr->uuidType, &ble_uuid);
1269 
1270         switch (attr->attrType) {
1271             case OHOS_BLE_ATTRIB_TYPE_SERVICE:
1272                 ret = BleGattsAddService(g_server_id, ble_uuid, 1, srvcInfo->attrNum);
1273                 if (ret != ERRCODE_BT_SUCCESS) {
1274                     printf("%s BleGattsAddService failed, ret:0x%x\r\n", BLE_HILINK_SERVER_LOG, ret);
1275                 }
1276                 hilnk_group_add();
1277                 break;
1278             case OHOS_BLE_ATTRIB_TYPE_CHAR:
1279                 ret = BleGattsAddCharacteristic(g_server_id, g_srvc_handle,
1280                     ble_uuid, attr->properties, attr->permission);
1281                 if (ret != ERRCODE_BT_SUCCESS) {
1282                     printf("%s BleGattsAddCharacteristic failed, ret:0x%x\r\n", BLE_HILINK_SERVER_LOG, ret);
1283                 }
1284                 hilnk_group_add();
1285                 break;
1286             case OHOS_BLE_ATTRIB_TYPE_CHAR_VALUE:
1287                 break;
1288             case OHOS_BLE_ATTRIB_TYPE_CHAR_CLIENT_CONFIG:
1289                 break;
1290             case OHOS_BLE_ATTRIB_TYPE_CHAR_USER_DESCR:
1291                 ret = BleGattsAddDescriptor(g_server_id, g_srvc_handle, ble_uuid, attr->permission);
1292                 if (ret != ERRCODE_BT_SUCCESS) {
1293                     printf("%s BleGattsAddDescriptor failed:%x.\n", BLE_HILINK_SERVER_LOG, ret);
1294                 }
1295                 hilnk_group_add();
1296                 break;
1297             default:
1298                 printf("Unknown\n");
1299         }
1300 
1301         if ((attr->attrType == OHOS_BLE_ATTRIB_TYPE_CHAR_USER_DESCR) || (attr->attrType == OHOS_BLE_ATTRIB_TYPE_CHAR)) {
1302             set_chara_func(attr, 0);
1303         }
1304 
1305         if ((attr->properties & OHOS_GATT_CHARACTER_PROPERTY_BIT_INDICATE) ||
1306             (attr->properties & OHOS_GATT_CHARACTER_PROPERTY_BIT_NOTIFY)) {
1307             is_indicate = 1;
1308             g_indicate_handle = g_cb_chara_handle;
1309         }
1310     }
1311 
1312     if (is_indicate) {
1313         ble_uuid.uuid = g_hilink_cccd_uuid;
1314         ble_uuid.uuidLen = sizeof(g_hilink_cccd_uuid);
1315         ret = BleGattsAddDescriptor(g_server_id, g_srvc_handle,
1316             ble_uuid, OHOS_GATT_PERMISSION_READ | OHOS_GATT_PERMISSION_WRITE);
1317         if (ret == ERRCODE_BT_SUCCESS) {
1318             set_chara_func(NULL, is_indicate);
1319         }
1320     }
1321 
1322     if (g_srvc_handle != 0) {
1323         ret = gatts_start_service(g_server_id, g_srvc_handle);
1324         *srvcHandle = g_srvc_handle;
1325     }
1326 
1327     return 0;
1328 }
1329 
1330 /*
1331  * @brief Stop service.
1332  * This API will not described in the development manual, only for Hilink.
1333  * @return 0-success, other-fail
1334  */
BleGattsStopServiceEx(int srvcHandle)1335 int BleGattsStopServiceEx(int srvcHandle)
1336 {
1337     printf("%s BleGattsStopServiceEx enter.\n", BLE_HILINK_SERVER_LOG);
1338     return 0;
1339 }
1340