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