From af27ef1f804259c3dba48c38886b522b4660a80b Mon Sep 17 00:00:00 2001 From: liurenxu Date: Thu, 14 Dec 2023 14:40:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=93=9D=E7=89=99=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=9A=84=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liurenxu --- .../hals/drivers/bluetooth_lite/BUILD.gn | 11 +- .../hals/drivers/bluetooth_lite/blegap.h | 4 +- .../drivers/bluetooth_lite/bluetooth_device.c | 2 +- .../bluetooth_lite/bluetooth_service.c | 269 ++++++++++++++++++ .../bluetooth_lite/bluetooth_service.h | 228 +++++++++++++++ 5 files changed, 507 insertions(+), 7 deletions(-) create mode 100755 niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_service.c create mode 100755 niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_service.h diff --git a/niobeu4/liteos_m/hals/drivers/bluetooth_lite/BUILD.gn b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/BUILD.gn index 3e74698..fe98fca 100755 --- a/niobeu4/liteos_m/hals/drivers/bluetooth_lite/BUILD.gn +++ b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/BUILD.gn @@ -17,17 +17,18 @@ module_name = get_path_info(rebase_path("."), "name") kernel_module(module_name) { sources = [ "bluetooth_device.c", + "bluetooth_service.c", ] - ESP_SDK_PATH="//device/soc/esp/esp32/components/" + ESP_SDK_PATH = "//device/soc/esp/esp32/components/" include_dirs = [ - ESP_SDK_PATH+"bt/include/esp32/include", + ESP_SDK_PATH + "bt/include/esp32/include", "//foundation/communication/bluetooth/interfaces/inner_api/include/c_header", - ESP_SDK_PATH+"bt/host/bluedroid/api/include/api", - ESP_SDK_PATH+"log/include", + ESP_SDK_PATH + "bt/host/bluedroid/api/include/api", + ESP_SDK_PATH + "log/include", ] } config("public") { - include_dirs = ["."] + include_dirs = [ "." ] } diff --git a/niobeu4/liteos_m/hals/drivers/bluetooth_lite/blegap.h b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/blegap.h index 77c3a82..e399b71 100755 --- a/niobeu4/liteos_m/hals/drivers/bluetooth_lite/blegap.h +++ b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/blegap.h @@ -25,6 +25,7 @@ #include "esp_gatt_common_api.h" #include "esp_log.h" #include "ohos_bt_def.h" +#include "esp_system.h" #define GattInterfaceType esp_gatt_if_t #define BleGapParam esp_ble_gap_cb_param_t @@ -178,7 +179,7 @@ BtError GetLocalAddr(unsigned char *mac, unsigned int len); BtError BleStartScan(void); -BtError BleStopScan(void); +BtError BleStopScan2(void); BtError BleGapUpdateConnParams(BleConnUpdateParams *params); @@ -187,4 +188,5 @@ BtError BleGatSetScanParams(BleScanParams *scan_params); BtError BleGapDisconnect(BdAddr remote_device); uint8_t *BleResolveAdvData(uint8_t *adv_data, uint8_t type, uint8_t *length); + #endif diff --git a/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_device.c b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_device.c index 68f9ff1..4a42c44 100755 --- a/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_device.c +++ b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_device.c @@ -92,7 +92,7 @@ BtError BleStartScan(void) return esp_ble_gap_start_scanning(ScanTime); } -BtError BleStopScan(void) +BtError BleStopScan2(void) { if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { return ESP_ERR_INVALID_STATE; diff --git a/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_service.c b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_service.c new file mode 100755 index 0000000..b1e5106 --- /dev/null +++ b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_service.c @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2022 Hunan OpenValley Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "bluetooth_service.h" +#include "ohos_run.h" +#include "blegap.h" +#define GATTS_TAG "BLUETOOTH_SERVICE" + +/** + * @brief Registers GATT server callbacks. + * + * @param func Indicates the pointer to the callbacks to register, as enumerated in {@link BtGattServerCallbacks}. + * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the callbacks are registered; + * returns an error code defined in {@link BtStatus} otherwise. + * @since 6 + */ +BtError BleGattsRegisterCallbacks(BtGattServerCallbacks func) +{ + esp_err_t ret; + ret = esp_ble_gatts_register_callback(func.gattsCallback); + if (ret) { + ESP_LOGE(GATTS_TAG, "gatts register error, error code = %x", ret); + return; + } + ret = esp_ble_gap_register_callback(func.gapCallback); + if (ret) { + ESP_LOGE(GATTS_TAG, "gap register error, error code = %x", ret); + return; + } + ret = esp_ble_gatts_app_register(func.profileAppId); + if (ret) { + ESP_LOGE(GATTS_TAG, "gatts app register error, error code = %x", ret); + return; + } + return ret; +} + +/** + * @brief Starts a service. + * + * @param serverId Indicates the ID of the GATT server. + * @param srvcHandle Indicates the handle ID of the service. + * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the service is started; + * returns an error code defined in {@link BtStatus} otherwise. + * @since 6 + */ +BtError BleGattsStartService(int serverId, int srvcHandle) +{ + return esp_ble_gatts_start_service(srvcHandle); +} + +/** + * @brief Stops a service. + * + * @param serverId Indicates the ID of the GATT server. + * @param srvcHandle Indicates the handle ID of the service. + * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the service is stopped; + * returns an error code defined in {@link BtStatus} otherwise. + * @since 6 + */ +BtError BleGattsStopService(int serverId, int srvcHandle) +{ + return esp_ble_gatts_stop_service(srvcHandle); +} + +/** + * @brief Sends an indication or notification to the client. + * + * The confirm field in param determines whether to send an indication or a notification. + * + * @param serverId Indicates the ID of the GATT server. + * @param param Indicates the pointer to the sending parameters. For details, see {@link GattsSendIndParam}. + * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the indication or notification is sent; + * returns an error code defined in {@link BtStatus} otherwise. + * @since 6 + */ +BtError BleGattsSendIndication(GattsSendParam *param) +{ + if (param == NULL && param->value == NULL) { + return BT_PARAMINPUT_ERROR; + } + return esp_ble_gatts_send_indicate(param->gattsIf, param->connId, param->attrHandle, param->valueLen, param->value, + param->needConfirm); +} + +/** + * @brief This function is called to start advertising. + * + * @param advParams: pointer to User defined advParams data structure. + + * @return + * - ESP_OK : success + * - other : failed + * + */ +BtError BleGattsStartAdvertising(BleAdvParams2 *advParams) +{ + if (advParams == NULL) { + BT_DEBUG("BleGattsStartAdvertising param is NULL! \n"); + return BT_PARAMINPUT_ERROR; + } + return esp_ble_gap_start_advertising(advParams); +} + +/** + * @brief This function is called to send a response to a request. + * + * @param[in] gattsIf: GATT server access interface + * @param[in] connId - connection identifier. + * @param[in] transId - transfer id + * @param[in] status - response status + * @param[in] rsp - response data. + * + * @return + * - ESP_OK : success + * - other : failed + * + */ +BtError BleGattsSendResponse(GattInterfaceType gattsIf, uint16_t connId, uint32_t transId, GattStatus status, + BleGattRsp *rsp) +{ + return esp_ble_gatts_send_response(gattsIf, connId, transId, status, rsp); +} + +/** + * @brief This function is called to override the BTA default ADV parameters. + * + * @param[in] advData: Pointer to User defined ADV data structure. This + * memory space can not be freed until callback of config_adv_data + * is received. + * + * @return + * - ESP_OK : success + * - other : failed + * + */ +BtError BleGapConfigAdvData(BleAdvData *advData) +{ + if (advData == NULL) { + BT_DEBUG("BleGapConfigAdvData param is NULL! \n"); + return BT_PARAMINPUT_ERROR; + } + return esp_ble_gap_config_adv_data(advData); +} + +/** + * @brief Create a service. When service creation is done, a callback + * event ESP_GATTS_CREATE_EVT is called to report status + * and service ID to the profile. The service ID obtained in + * the callback function needs to be used when adding included + * service and characteristics/descriptors into the service. + * + * @param[in] gattsIf: GATT server access interface + * @param[in] serviceId: service ID. + * @param[in] numHandle: number of handle requested for this service. + * + * @return + * - ESP_OK : success + * - other : failed + * + */ +BtError BleGattsCreateService(GattInterfaceType gattsIf, GattSrvcId *serviceId, uint16_t numHandle) +{ + if (serviceId == NULL) { + BT_DEBUG("BleGattsCreateService param is NULL! \n"); + return BT_PARAMINPUT_ERROR; + } + return esp_ble_gatts_create_service(gattsIf, serviceId, numHandle); +} + +/** + * @brief Retrieve attribute value + * + * @param[in] attrHandle: Attribute handle. + * @param[out] length: pointer to the attribute value length + * @param[out] value: Pointer to attribute value payload, the value cannot be modified by user + * + * @return + * - ESP_GATT_OK : success + * - other : failed + * + */ +BtError BleGattsGetAttrValue(uint16_t attrHandle, uint16_t *length, const uint8_t **value) +{ + if ((length == NULL) || (value == NULL)) { + BT_DEBUG("BleGattsGetAttrValue param is NULL! \n"); + return BT_PARAMINPUT_ERROR; + } + return esp_ble_gatts_get_attr_value(attrHandle, length, value); +} + +/** + * @brief This function is called to add characteristic descriptor. When + * it's done, a callback event ESP_GATTS_ADD_DESCR_EVT is called + * to report the status and an ID number for this descriptor. + * + * @param[in] serviceHandle: service handle to which this characteristic descriptor is to + * be added. + * @param[in] perm: descriptor access permission. + * @param[in] descrUuid: descriptor UUID. + * @param[in] charDescrVal : Characteristic descriptor value + * @param[in] control : attribute response control byte + * @return + * - ESP_OK : success + * - other : failed + * + */ +BtError BleGattsAddCharDescr(uint16_t serviceHandle, BtUuid *descrUuid, uint16_t perm, BleAttrValue *charDescrVal, + BleAttrControl *control) +{ + if (descrUuid == NULL) { + BT_DEBUG("BleGattsAddCharDescr param is NULL! \n"); + return BT_PARAMINPUT_ERROR; + } + return esp_ble_gatts_add_char_descr(serviceHandle, descrUuid, perm, charDescrVal, control); +} + +/** + * @brief This function is called to add a characteristic into a service. + * + * @param[in] serviceHandle: service handle to which this included service is to + * be added. + * @param[in] character : Characteristic. + * + * @return + * - ESP_OK : success + * - other : failed + * + */ +BtError BleGattsAddChar(uint16_t serviceHandle, GattsChar *character) +{ + if ((charUuid == NULL) || (character == NULL) || (character->charVal == NULL)) { + BT_DEBUG("BleGattsAddChar param is NULL! \n"); + return BT_PARAMINPUT_ERROR; + } + return esp_ble_gatts_add_char(serviceHandle, character->charUuid, character->perm, character->property, + character->charVal, character->control); +} + +/** + * @brief Update connection parameters, can only be used when connection is up. + * + * @param[in] params - connection update parameters + * + * @return + * - ESP_OK : success + * - other : failed + * + */ +BtError BleGapUpdateConnParams(BleConnUpdateParams *params) +{ + if (params == NULL) { + BT_DEBUG("BleGapUpdateConnParams param is NULL! \n"); + return BT_PARAMINPUT_ERROR; + } + return esp_ble_gap_update_conn_params(params); +} \ No newline at end of file diff --git a/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_service.h b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_service.h new file mode 100755 index 0000000..a246a1e --- /dev/null +++ b/niobeu4/liteos_m/hals/drivers/bluetooth_lite/bluetooth_service.h @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2022 Hunan OpenValley Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __BLUETOOTH_SERVICE_H__ +#define __BLUETOOTH_SERVICE_H__ +#include "securec.h" +#include "blegap.h" +#include "esp_gatts_api.h" + +typedef esp_ble_gatts_cb_param_t BleGattsParam; + +// Gap回调参数联合体 +typedef esp_ble_gap_cb_param_t BleGapParam; +// Gatt服务端回调参数联合体 +typedef esp_ble_gatts_cb_param_t BleGattsCbParam; +// Ble扫描参数 +typedef esp_ble_scan_params_t BleScanParams; +// 设置属性值类型 +typedef esp_attr_value_t BleAttrValue; +// 广播数据结构体 +typedef esp_ble_adv_data_t BleAdvData; +// 广播参数 +typedef esp_ble_adv_params_t BleAdvParams2; +// GATT远程读请求响应类型 +typedef esp_gatt_rsp_t BleGattRsp; +// Gatt服务ID +typedef esp_gatt_srvc_id_t GattSrvcId; +// 属性自动响应标志 +typedef esp_attr_control_t BleAttrControl; +// 蓝牙版本号 +#define BT_VERSION 1 + +/// GATT服务回调函数事件 +typedef enum { + OHOS_GATTS_REG_EVT = 0, /*!< When register application id, the event comes */ + OHOS_GATTS_READ_EVT = 1, /*!< When gatt client request read operation, the event comes */ + OHOS_GATTS_WRITE_EVT = 2, /*!< When gatt client request write operation, the event comes */ + OHOS_GATTS_EXEC_WRITE_EVT = 3, /*!< When gatt client request execute write, the event comes */ + OHOS_GATTS_MTU_EVT = 4, /*!< When set mtu complete, the event comes */ + OHOS_GATTS_CONF_EVT = 5, /*!< When receive confirm, the event comes */ + OHOS_GATTS_UNREG_EVT = 6, /*!< When unregister application id, the event comes */ + OHOS_GATTS_CREATE_EVT = 7, /*!< When create service complete, the event comes */ + OHOS_GATTS_ADD_INCL_SRVC_EVT = 8, /*!< When add included service complete, the event comes */ + OHOS_GATTS_ADD_CHAR_EVT = 9, /*!< When add characteristic complete, the event comes */ + OHOS_GATTS_ADD_CHAR_DESCR_EVT = 10, /*!< When add descriptor complete, the event comes */ + OHOS_GATTS_DELETE_EVT = 11, /*!< When delete service complete, the event comes */ + OHOS_GATTS_START_EVT = 12, /*!< When start service complete, the event comes */ + OHOS_GATTS_STOP_EVT = 13, /*!< When stop service complete, the event comes */ + OHOS_GATTS_CONNECT_EVT = 14, /*!< When gatt client connect, the event comes */ + OHOS_GATTS_DISCONNECT_EVT = 15, /*!< When gatt client disconnect, the event comes */ + OHOS_GATTS_OPEN_EVT = 16, /*!< When connect to peer, the event comes */ + OHOS_GATTS_CANCEL_OPEN_EVT = 17, /*!< When disconnect from peer, the event comes */ + OHOS_GATTS_CLOSE_EVT = 18, /*!< When gatt server close, the event comes */ + OHOS_GATTS_LISTEN_EVT = 19, /*!< When gatt listen to be connected the event comes */ + OHOS_GATTS_CONGEST_EVT = 20, /*!< When congest happen, the event comes */ + /* following is extra event */ + OHOS_GATTS_RESPONSE_EVT = 21, /*!< When gatt send response complete, the event comes */ + OHOS_GATTS_CREAT_ATTR_TAB_EVT = 22, /*!< When gatt create table complete, the event comes */ + OHOS_GATTS_SET_ATTR_VAL_EVT = 23, /*!< When gatt set attr value complete, the event comes */ + OHOS_GATTS_SEND_SERVICE_CHANGE_EVT = 24, /*!< When gatt send service change indication complete, the event comes */ +} GattsBleCallbackEvent; + +/** + * @brief GATT服务端回调函数类型 + * @param event : 事件类型 + * @param gattc_if : GATT客户端访问接口,不同的gattc_if对应不同的profile + * @param param : 指向回调参数指针,当前是联合类型 + */ +typedef void (*GattsBleCallback)(GattsBleCallbackEvent event, GattInterfaceType gattsIf, BleGattsParam *param); + +typedef struct { + GapBleCallback gapCallback; // gap回调函数 + GattsBleCallback gattsCallback; // gatts回调函数 + uint16_t profileAppId; // 应用程序标识(UUID),用于不同的应用程序,应用程序回调函数使用 +} BtGattServerCallbacks; + +typedef struct { + GattInterfaceType gattsIf; // GATT服务器访问接口 + uint16_t connId; // 连接id + uint16_t attrHandle; // 属性句柄 + uint16_t valueLen; // 值的长度 + uint8_t *value; // 值 + bool needConfirm; // 是否需要确认 +} GattsSendParam; + +typedef struct { + BtUuid *charUuid; // Characteristic UUID. + uint16_t perm; // Characteristic value declaration attribute permission. + uint8_t property; // Characteristic Properties + BleAttrValue *charVal; // Characteristic value + BleAttrControl *control; // attribute response control byte +} GattsChar; + +/** + * @brief 发现请求远程设备上的GATT服务 + * + * @param clientId 客户端ID + * @param connId 连接ID + * @param filterUuid 过滤服务UUID * + * @return BtResult 成功返回 BT_SUCCESS + */ +BtError BleGattcSearchServices(int clientId, int connId, BtUuid *filterUuid); + +/** + * @brief 注册Gatt服务端回调 + * + * @param func BtGattServerCallbacks结构体 + * @return BtResult 成功返回 BT_SUCCESS + */ +BtError BleGattsRegisterCallbacks(BtGattServerCallbacks func); + +/** + * @brief 启动Gatt服务 + * + * @param serverId Gatt服务id + * @param srvcHandl Gatt服务句柄 + * @return BtResult 成功返回 BT_SUCCESS + * @since 6 + */ +BtError BleGattsStartService(int serverId, int srvcHandle); + +/** + * @brief 停止Gatt服务 + * + * @param serverId Gatt服务id + * @param srvcHandl Gatt服务句柄 + * @return BtResult 成功返回 BT_SUCCESS + */ +BtError BleGattsStopService(int serverId, int srvcHandle); + +/** + * @brief 发送指示或通知GATT客户端 + * + * @param param: GATT服务器发送数据参数 + * @return BtResult 成功返回 BT_SUCCESS + */ +BtError BleGattsSendIndication(GattsSendParam* param); + +/** + * @brief 发送指示或通知GATT客户端 + * + * @param advParams: 广播参数 + * @return BtResult 成功返回 BT_SUCCESS + */ +BtError BleGattsStartAdvertising(BleAdvParams2 *advParams); + +/** + * @brief 向请求发送响应函数. + * + * @param gattsIf: GATT server access interface + * @param connId - connection identifier. + * @param transId - transfer id + * @param status - response status + * @param rsp - response data. + * @return BtResult 成功返回 BT_SUCCESS + * + */ +BtError BleGattsSendResponse(GattInterfaceType gattsIf, uint16_t connId, uint32_t transId, GattStatus status, + BleGattRsp *rsp); +/** + * @brief 覆盖BTA默认的ADV参数 + * + * @param[in] advData: Pointer to User defined ADV data structure. + * @return BtResult 成功返回 BT_SUCCESS + * + */ +BtError BleGapConfigAdvData(BleAdvData *advData); + +/** + * @brief 创建Gatt服务 + * + * @param gattsIf: GATT server access interface + * @param serviceId: service ID. + * @param numHandle: number of handle requested for this service. + * + * @return BtResult 成功返回 BT_SUCCESS + * + */ +BtError BleGattsCreateService(GattInterfaceType gattsIf, GattSrvcId *serviceId, uint16_t numHandle); + +/** + * @brief 获取属性值 + * + * @param attrHandle: Attribute handle. + * @param length: pointer to the attribute value length + * @param value: Pointer to attribute value payload, the value cannot be modified by user + * @return BtResult 成功返回 BT_SUCCESS + * + */ +BtError BleGattsGetAttrValue(uint16_t attrHandle, uint16_t *length, const uint8_t **value); + +/** + * @brief 添加特征描述符 + * + * @param serviceHandle: service handle to which this characteristic descriptor is to + * be added. + * @param perm: descriptor access permission. + * @param descrUuid: descriptor UUID. + * @param charDescrVal : Characteristic descriptor value + * @param control : attribute response control byte + * @return BtResult 成功返回 BT_SUCCESS + * + */ +BtError BleGattsAddCharDescr(uint16_t serviceHandle, BtUuid *descrUuid, uint16_t perm, BleAttrValue *charDescrVal, + BleAttrControl *control); + +/** + * @brief 将特征添加到服务中 + * + * @param serviceHandle: service handle to which this included service is to + * be added. + * @param character: 特征值参数 + * @return BtResult 成功返回 BT_SUCCESS + * + */ +BtError BleGattsAddChar(uint16_t serviceHandle, GattsChar* character); +#endif \ No newline at end of file