XFusion API v1.3.0
载入中...
搜索中...
未找到
examples/wireless/ble/sample_gatt_client/main/xf_main.c

xf_wal ble gatt 客户端 示例。

/* ==================== [Includes] ========================================== */
#include "xf_hal.h"
#include "xf_ble_gap.h"
#include "string.h"
#include "xf_task.h"
/* ==================== [Defines] =========================================== */
#define TAG "sample_gattc"
/* ==================== [Typedefs] ========================================== */
/* Ble scan interval */
#define DEFAULT_BLE_GAP_SCAN_INTERVAL 0x48
#define DEFAULT_BLE_GAP_SCAN_WINDOW 0x48
#define TASK_PRIORITY 5
#define TASK_DELAY_MS 500
#define DEFAULT_SERVICE_INDEX (1)
#define DEFAULT_CHARA_READ_INDEX (0)
#define DEFAULT_CHARA_WRITE_INDEX (1)
/* ==================== [Static Prototypes] ================================= */
/* ==================== [Static Variables] ================================== */
/* 目标 ble device name,用于过滤扫描到的广播
最后仅会连接该 device name 设备
*/
static uint8_t target_gatts_device_name[] = "XF_GATTS";
static uint8_t write_req_data[] = "I M GATTC";
.len_type = XF_BLE_UUID_TYPE_16,
.uuid16 = 0x0000
};
static uint8_t s_app_id = 0;
static uint8_t s_conn_id = 0;
static bool is_need_discovery = false;
static bool is_discovery_cmpl = false;
static bool is_read_cmpl = false;
static xf_ble_addr_t peer_addr = {0};
/* ==================== [Macros] ============================================ */
/* ==================== [Global Functions] ================================== */
void xf_main(void)
{
XF_LOGI(TAG, "xf ble gatt client sample");
xf_err_t ret = XF_OK;
// 使能 ble
// 注册 gattc 事件回调
"REGISTER event cb failed:%#X", ret);
// 注册 gattc app_profile
"REGISTER app profile failed:%#X app_id:%d", ret, s_app_id);
// 设置扫描参数
"SET scan param failed:%#X", ret);
XF_LOGI(TAG, "SET scan param CMPL");
// 开启扫描
"STAR scan failed:%#X", ret);
XF_LOGI(TAG, "STAR scan CMPL");
// 创建发现任务
// 创建读写任务
}
/* ==================== [Static Functions] ================================== */
{
UNUSED(param);
xf_err_t ret = XF_OK;
switch (event) {
} break;
XF_LOGI(TAG, "EV:connect:s_conn_id:%d,addr_type:%u,addr:"
} break;
if (param.read_cmpl.chara_value_len != 0) {
XF_LOGI(TAG, "EV:read CMPL:handle:%d", param.read_cmpl.chara_handle);
is_read_cmpl = true;
}
} break;
XF_LOGI(TAG, "EV:write CMPL:handle:%d,it will disconnect",
param.write.handle);
} break;
if (param.read_cmpl.chara_value_len != 0) {
XF_LOGI(TAG, "EV:read ntf/ind:chara_handle:%d", param.notify.handle);
param.notify.value_len);
}
} break;
default:
break;
}
return ret;
}
{
xf_ble_gap_scan_param_t scan_param = {
.scan_phy = XF_BLE_GAP_PHY_1M,
.scan_filter_policy = XF_BLE_GAP_SCAN_FILTER_ACCEPT_ALL,
};
return xf_ble_gap_set_scan_param(&scan_param);
}
{
xf_err_t ret = XF_OK;
XF_LOGD(TAG, "EV:scan_result:ADV:addr_type:%d,addr:" XF_BLE_ADDR_PRINT_FMT
",RSSI:%d,adv_data_len:%u",
);
uint8_t *adv_data_all = param->scan_result.adv_data;
uint16_t adv_size_all = param->scan_result.adv_data_len;
uint8_t *ptr_current = adv_data_all;
uint8_t *ptr_end = adv_data_all + adv_size_all;
/* 解析广播数据,当包含指定设备名的广播时,进行连接 */
while (ptr_current <= ptr_end) {
uint8_t struct_data_len = ptr_current[0];
xf_ble_gap_adv_struct_type_t ad_type = ptr_current[1];
XF_LOGD(TAG, "EV:scan_result:struct_data_len:%d ad_type:%#2X",
struct_data_len, ad_type);
switch (ad_type) {
uint8_t *local_name = &ptr_current[2];
uint8_t local_namez_size = struct_data_len - XF_BLE_GAP_ADV_STRUCT_AD_TYPE_FIELD_SIZE;
if (strncmp((char *)target_gatts_device_name, (char *)local_name, local_namez_size) == 0) {
XF_LOGI(TAG, "EV:scan_result:target local name:%s", local_name);
XF_CHECK(ret != XF_OK, ret, TAG, "gap stop scan failed:%#X", ret);
XF_CHECK(ret != XF_OK, ret, TAG, "gap connect failed:%#X", ret);
}
} break;
default: {
XF_LOGD(TAG, "EV:scan_result:uncaring ad_type:%#2X", ad_type);
} break;
}
ptr_current += (struct_data_len + XF_BLE_GAP_ADV_STRUCT_LEN_FIELD_SIZE);
}
return XF_OK;
}
{
/* 检测是否需要执行发现操作(服务、特征、特征描述符(暂时未支持)) -> 尝试进行连接 */
if (is_need_discovery == true) {
xf_err_t ret = XF_OK;
/* 尝试发现服务 */
XF_LOGI(TAG, "discover service:%p %p", &service_found_set, service_found_set);
XF_CHECK(ret != XF_OK, XF_RETURN_VOID, TAG, "discover service failed:%#X app_id:%d",
ret, s_app_id);
XF_LOGI(TAG, "discover chara:service_found_set cnt:%u", service_found_set->cnt);
uint16_t cnt_service = service_found_set->cnt;
while (cnt_service-- > 0) {
/* 尝试发现服务下的特征 */
// XF_LOGI(TAG, ">> service[%d]", cnt_service);
service->chara_set_info = NULL;
service->start_hdl, service->end_hdl, NULL, &service->chara_set_info);
"discover chara failed:%#X app_id:%d", ret, s_app_id);
uint16_t cnt_chara = service->chara_set_info->cnt;
while (cnt_chara-- > 0) {
/* 打印服务及其下特征信息 */
xf_ble_gattc_chara_found_t *chara = &service->chara_set_info->set[cnt_chara];
XF_LOGI(TAG, "service[%u]:uuid(16):[%#X],handle[%u,%u],chara[%u]:%#X",
cnt_service, service->uuid.uuid16,
service->start_hdl, service->end_hdl,
cnt_chara, chara->uuid.uuid16);
// /* 尝试发现服务下的特征下的特征描述符 */
// chara->desc_set_info = NULL;
// ret = xf_ble_gattc_discover_desc_by_chara_handle(s_app_id, s_conn_id,
// service->start_hdl, service->end_hdl, NULL, service->chara_set_info);
// XF_CHECK(ret != XF_OK, ret, TAG, "xf_ble_gattc_discover_chara failed:%#X app_id:%d",
// ret, s_app_id);
}
}
}
}
{
/* 发现(服务、特征、特征能描述符)完成 -> 进行读写测试 */
if (is_discovery_cmpl == true) {
xf_err_t ret = XF_OK;
XF_LOGI(TAG, "REQ READ(uuid) and WRITE(handle):"
"s_app_id:%d,s_conn_id:%d"
"service_uuid(16):%#X,chara_uuid(16):%#X,",
service->uuid.uuid16,
);
/* 向对端服务端发送 读请求 第1次 */
is_read_cmpl = false;
if (ret != XF_OK) {
XF_LOGE(TAG, "REQ READ:failed:%#X", ret);
}
/* 向对端服务端发送 读请求 第2次 */
is_read_cmpl = false;
if (ret != XF_OK) {
XF_LOGE(TAG, "REQ READ:failed:%#X", ret);
}
}
if (is_read_cmpl == true) {
/* 向对端服务端发送 写请求 */
if (ret != XF_OK) {
XF_LOGE(TAG, "REQ WRITE:failed:%#X", ret);
}
is_read_cmpl = false;
}
}
void xf_main(void)
Definition xf_main.c:28
static xf_task_t xf_ttask_create_loop(xf_task_func_t func, void *func_arg, uint16_t priority, uint32_t delay_ms)
在默认的任务管理下,创建 ttask 循环任务。
Definition xf_task.h:162
#define XF_RETURN_VOID
Definition xf_check.h:47
#define XF_CHECK(condition, retval, tag, format,...)
xfusion 检查宏(条件 成立 时则输出日志后返回)。
Definition xf_check.h:112
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_OK
Definition xf_err.h:43
#define XF_LOG_BUFFER_HEXDUMP(buffer, buffer_len)
以十六进制输出 buffer 的内容,同时输出可见的 ascii 码。
xf_err_t xf_ble_gap_disconnect(const xf_ble_addr_t *addr)
BLE GAP 断开连接
xf_err_t xf_ble_gap_set_scan_param(const xf_ble_gap_scan_param_t *param)
BLE GAP 设置扫描参数
xf_err_t xf_ble_gap_connect(const xf_ble_addr_t *addr)
BLE GAP 发起连接
xf_err_t xf_ble_gap_start_scan(void)
BLE GAP 扫描开启
xf_err_t xf_ble_gap_stop_scan(void)
BLE GAP 扫描停止
#define XF_BLE_GAP_ADV_STRUCT_AD_TYPE_FIELD_SIZE
BLE GAP 广播数据单元类型 (AD_TYPE) 字段的大小
xf_ble_gap_adv_struct_type_t
BLE 广播数据单元 ( AD Structure ) 类型,完全遵循蓝牙标准进行定义
#define XF_BLE_GAP_ADV_STRUCT_LEN_FIELD_SIZE
BLE GAP 广播数据单元数据长度 (LEN) 字段的大小
xf_err_t xf_ble_enable(void)
BLE 功能开启
@ XF_BLE_GAP_PHY_1M
@ XF_BLE_GAP_SCAN_TYPE_PASSIVE
@ XF_BLE_GAP_SCAN_FILTER_ACCEPT_ALL
@ XF_BLE_ADV_STRUCT_TYPE_LOCAL_NAME_ALL
xf_err_t xf_ble_gattc_request_read_by_handle(uint8_t app_id, uint16_t conn_id, uint16_t handle)
BLE GATTC 通过句柄发起读请求
xf_err_t xf_ble_gattc_app_register(xf_ble_uuid_info_t *app_uuid, uint8_t *app_id)
BLE GATTC 客户端注册
xf_err_t xf_ble_gattc_request_write(uint8_t app_id, uint16_t conn_id, uint16_t handle, uint8_t *value, uint16_t value_len, xf_ble_gattc_write_type_t write_type)
BLE GATTC 发起写请求
xf_err_t xf_ble_gattc_discover_chara(uint8_t app_id, uint16_t conn_id, uint16_t start_handle, uint16_t end_handle, xf_ble_uuid_info_t *chara_uuid, xf_ble_gattc_chara_found_set_t **out_chara_set)
BLE GATTC 搜寻特征(指定 UUID 或 尝试搜寻所有特征)
xf_err_t xf_ble_gattc_discover_service(uint8_t app_id, uint16_t conn_id, xf_ble_uuid_info_t *service_uuid, xf_ble_gattc_service_found_set_t **service_set_info)
BLE GATTC 搜寻服务(指定 UUID 或 尝试搜寻所有服务)
xf_err_t xf_ble_gattc_event_cb_register(xf_ble_gattc_event_cb_t evt_cb, xf_ble_gattc_event_t events)
BLE GATTC 事件回调注册
@ XF_BLE_GATT_WRITE_TYPE_WITH_RSP
xf_ble_gattc_event_t
BLE GATTC 事件
#define XF_BLE_ADDR_PRINT_FMT
BLE 地址打印格式
#define XF_BLE_ADDR_EXPAND_TO_ARG(addr)
BLE 地址展开为参数
struct __packed _xf_ble_uuid_info_t xf_ble_uuid_info_t
BLE UUID 信息 (多种长度类型通用)
@ XF_BLE_GATTC_EVT_WRITE_COMPLETE
@ XF_BLE_GATTC_EVT_RECV_NOTIFICATION_OR_INDICATION
@ XF_BLE_GATTC_EVT_READ_COMPLETE
@ XF_BLE_UUID_TYPE_16
@ XF_BLE_GAP_EVT_CONNECT
@ XF_BLE_GAP_EVT_SCAN_RESULT
xf_osal_event_t event
Definition xf_main.c:35
#define TAG
Definition xf_main.c:24
#define TASK_DELAY_MS
Definition xf_main.c:27
#define TASK_PRIORITY
Definition xf_main.c:26
BLE 地址信息
uint8_t addr[XF_BLE_ADDR_LEN]
xf_ble_addr_type_t type
BLE GAP 扫描参数
xf_ble_gattc_chara_found_t * set
BLE GATTC 搜寻到的特征
BLE GATTC 搜寻到的服务集合信息
xf_ble_gattc_service_found_t * set
BLE GATTC 搜寻到的服务
xf_ble_gattc_chara_found_set_t * chara_set_info
static void task(xf_task_t task)
Definition xf_main.c:45
BLE GATTC 客户端事件回调参数
xf_ble_evt_param_scan_result_t scan_result
xf_ble_evt_param_connect_t connect
xf_ble_evt_param_gattc_notify_t notify
xf_ble_evt_param_gattc_read_cmpl_t read_cmpl
xf_ble_evt_param_gattc_write_t write
static xf_ble_uuid_info_t app_uuid
Definition xf_main.c:46
static uint8_t s_app_id
Definition xf_main.c:50
#define DEFAULT_CHARA_WRITE_INDEX
Definition xf_main.c:29
static xf_ble_gattc_service_found_set_t * service_found_set
Definition xf_main.c:55
#define DEFAULT_BLE_GAP_SCAN_INTERVAL
Definition xf_main.c:21
static void discovery_task(xf_task_t task)
Definition xf_main.c:201
#define DEFAULT_CHARA_READ_INDEX
Definition xf_main.c:28
static uint8_t s_conn_id
Definition xf_main.c:51
static uint8_t write_req_data[]
Definition xf_main.c:45
static bool is_read_cmpl
Definition xf_main.c:54
static xf_err_t gattc_event_scan_result_cb(xf_ble_gattc_evt_cb_param_t *param)
Definition xf_main.c:161
static xf_err_t sample_ble_set_scan_param(void)
Definition xf_main.c:149
#define DEFAULT_SERVICE_INDEX
Definition xf_main.c:27
static uint8_t target_gatts_device_name[]
Definition xf_main.c:44
static void read_write_task(xf_task_t task)
Definition xf_main.c:247
static bool is_need_discovery
Definition xf_main.c:52
static xf_err_t sample_ble_gattc_event_cb(xf_ble_gattc_event_t event, xf_ble_gattc_evt_cb_param_t param)
Definition xf_main.c:102
static bool is_discovery_cmpl
Definition xf_main.c:53
static xf_ble_addr_t peer_addr
Definition xf_main.c:56
#define DEFAULT_BLE_GAP_SCAN_WINDOW
Definition xf_main.c:22
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)
#define XF_LOGD(tag, format,...)
void * xf_task_t
任务句柄。
#define UNUSED(_x)