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

xf_wal ble gatt 服务端 示例。

/* ==================== [Includes] ========================================== */
#include "xf_hal.h"
#include "xf_ble_gap.h"
#include "string.h"
/* ==================== [Defines] =========================================== */
#define TAG "sample_gatts"
/* Ble adv min interval */
#define DEFAULT_BLE_GAP_ADV_MIN_INTERVAL 0x30
/* Ble adv max interval */
#define DEFAULT_BLE_GAP_ADV_MAX_INTERVAL 0x60
/* Ble adv handle */
#define DEFAULT_BLE_GAP_ADV_HANDLE_DEFAULT 0x01
/* Ble adv duration */
#define DEFAULT_BLE_GAP_ADV_FOREVER_DURATION 0
/* Server HANDLE */
#define DEFAULT_SERVER_HANDLE (1)
/* Server ID */
#define DEFAULT_SERVER_ID (1)
/* Ser UUID */
#define DEFAULT_SERVICE_UUID (0x1234)
/* Characteristic UUID */
#define DEFAULT_CHARA_UUID (0xCDEF)
/* Client Characteristic Configuration UUID */
#define DEFAULT_CHARA_CFG_UUID (0x2902)
uint8_t sample_gatts_device_name[] = "XF_GATTS";
uint8_t sample_adv_data[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
uint8_t sample_adv_rsp_data[] = {0x11, 0x00, 0x00, 0x00, 0x00, 0x66};
static uint8_t read_req_indication[] = "REQ_READ RSP";
static uint8_t write_req_indication[] = "REQ_WRITE RSP";
/* ==================== [Typedefs] ========================================== */
/* ==================== [Static Prototypes] ================================= */
static void sample_ble_set_adv_data(void);
static void sample_ble_set_adv_param(void);
/* ==================== [Static Variables] ================================== */
static uint8_t chara_value_array[][10] = {
{0x12, 0x34},
{0xAA, 0xBB}
};
{
.chara_set = (xf_ble_gatts_chara_t [])
{
{
.chara_value = {
.value = chara_value_array[0],
.value_len = sizeof(chara_value_array[0]),
.permission =
(
),
},
.properties =
(
),
},
{.chara_uuid = XF_BLE_ATTR_SET_END_FLAG}
}
},
{.service_uuid = XF_BLE_ATTR_SET_END_FLAG}
};
.len_type = XF_BLE_UUID_TYPE_16,
.uuid16 = 0x0000
};
static uint8_t app_id = 0;
/* ==================== [Macros] ============================================ */
/* ==================== [Global Functions] ================================== */
void xf_main(void)
{
XF_LOGI(TAG, "xf ble gatt server sample");
xf_err_t ret = XF_OK;
// 使能 ble
// 注册 gatts 事件回调
"REGISTER event cb failed:%#X", ret);
/* 设置本地名称、外观 */
// 注册 gatts app_profile
"REGISTER app profile failed:%#X app_id:%d", ret, app_id);
// 添加服务至 app_profile
"ADD service failed:%#X", ret);
// 启动服务
ret = xf_ble_gatts_start_service(app_id, service_set[0].service_handle);
"START service failed:%#X", ret);
/* 设置广播数据及参数 */
XF_LOGI(TAG, "CONFIG ADV CMPL");
// 开启广播
"STAR ADV failed:%#X", ret);
XF_LOGI(TAG, "STAR ADV CMPL");
}
/* ==================== [Static Functions] ================================== */
{
UNUSED(param);
switch (event) {
/* 事件: 读请求 */
XF_LOGI(TAG, "EV:RECV READ_REQ:app_id:%d,conn_id:%d,need_rsp:%d,attr_handle:%d",
param.read_req.handle);
xf_ble_gatts_ntf_ind_t indication_param = {
.value_len = sizeof(read_req_indication),
.handle = param.read_req.handle
};
app_id, param.read_req.conn_id, &indication_param);
XF_CHECK(ret != XF_OK, ret, TAG,
"send_notify_indicate failed:%#X", ret);
} break;
/* 事件: 写请求 */
XF_LOGI(TAG, "EV:RECV WRITE_REQ:app_id:%d,conn_id:%d,need_rsp:%d,attr_handle:%d",
param.write_req.handle);
/* 如果是需要响应的请求类型->返回响应 */
if (param.write_req.need_rsp == true) {
xf_ble_gatts_ntf_ind_t indication_param = {
.value_len = sizeof(write_req_indication),
.handle = param.write_req.handle,
};
app_id, param.write_req.conn_id, &indication_param);
XF_CHECK(ret != XF_OK, ret, TAG,
"send_notify_indicate failed:%#X app_id:%d", ret);
}
} break;
/* 事件: MTU 协商 */
XF_LOGI(TAG, "EV:mtu changed:app_id:%d,conn_id:%d,mtu_size:%d",
app_id, param.mtu.conn_id, param.mtu.mtu_size);
} break;
/* 事件: 连接 */
XF_LOGI(TAG, "EV:peer connect:app_id:%d,conn_id:%d,"
"addr_type:%d,addr:"XF_BLE_ADDR_PRINT_FMT,
xf_err_t ret = XF_OK;
XF_BLE_SM_PARAM_AUTHEN_REQ_MODE, &authen_req, sizeof(authen_req));
XF_CHECK(ret != XF_OK, ret, TAG,
"set_security_param failed:%#X", ret);
XF_BLE_SM_PARAM_IO_CAP_MODE, &io_capability, sizeof(io_capability));
XF_CHECK(ret != XF_OK, ret, TAG,
"set_security_param failed:%#X", ret);
} break;
XF_LOGI(TAG, "EV:pair end:app_id:%d,conn_id:%d,"
"addr_type:%d,addr:"XF_BLE_ADDR_PRINT_FMT,
} break;
/* 事件: 断连 */
XF_LOGI(TAG, "EV:peer disconnect:app_id:%d,conn_id:%d,reason:%u,"
"addr_type:%d,addr:"XF_BLE_ADDR_PRINT_FMT,
XF_LOGI(TAG, "It will restart ADV");
} break;
default:
break;
}
return XF_OK;
}
static void sample_ble_set_adv_data(void)
{
xf_ble_gap_adv_data_t adv_data = {
{
{
.ad_data_len = sizeof(sample_gatts_device_name),
.ad_data.local_name = sample_gatts_device_name,
}, {
.ad_data_len = sizeof(xf_ble_appearance_t),
},
{0}
},
.scan_rsp_length = 0,
.scan_rsp_data = NULL,
};
}
static void sample_ble_set_adv_param(void)
{
xf_ble_gap_adv_param_t adv_param = {
/* 广播间隔 [N * 0.625ms] */
// 广播类型
.own_addr =
{
.type = XF_BT_ADDR_TYPE_PUBLIC_DEV, // 本端地址类型
.addr = {0x0}, // 本端地址
},
.peer_addr =
{
.type = XF_BT_ADDR_TYPE_PUBLIC_DEV, // 对端地址类型
.addr = { 0x0 }, // 对端地址
},
.channel_map = XF_BLE_GAP_ADV_CH_ALL, // 使用37/38/39三个通道
.tx_power = 1, // 发送功率,单位dbm,范围-127~20
};
}
void xf_main(void)
Definition xf_main.c:28
#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 码。
uint16_t xf_ble_appearance_t
BLE 外观值,完全遵循蓝牙标准进行定义
xf_err_t xf_ble_gap_set_adv_data(const xf_ble_gap_adv_data_t *data)
BLE GAP 设置广播数据
xf_err_t xf_ble_gap_set_local_appearance(xf_ble_appearance_t appearance)
BLE GAP 设置本端设备的外观
xf_err_t xf_ble_gap_start_adv(void)
BLE GAP 广播开启
#define XF_BLE_APPEARANCE_HID_DIGITIZER_TABLET
xf_err_t xf_ble_gap_set_adv_param(const xf_ble_gap_adv_param_t *param)
BLE GAP 设置广播参数
xf_err_t xf_ble_gap_set_security_param(xf_ble_sm_param_type_t param_type, void *value, uint8_t len)
BLE GAP 设置安全参数
xf_err_t xf_ble_gap_set_local_name(const uint8_t *name, const uint8_t len)
BLE GAP 设置本端设备名称
xf_err_t xf_ble_enable(void)
BLE 功能开启
@ XF_BLE_GAP_ADV_CH_ALL
@ XF_BLE_GAP_ADV_TYPE_CONN_SCAN_UNDIR
@ XF_BLE_ADV_STRUCT_TYPE_APPEARANCE
@ XF_BLE_ADV_STRUCT_TYPE_LOCAL_NAME_ALL
@ XF_BLE_GAP_ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY
xf_err_t xf_ble_gatts_event_cb_register(xf_ble_gatts_event_cb_t evt_cb, xf_ble_gatts_event_t events)
BLE GATTS 事件回调注册
#define XF_BLE_ATTR_SET_END_FLAG
属性集合的结束标记值
xf_err_t xf_ble_gatts_add_service_to_app_profile(uint8_t app_id, xf_ble_gatts_service_t *service)
BLE GATTS 向服务端 (应用) 添加服务
xf_err_t xf_ble_gatts_app_register(xf_ble_uuid_info_t *app_uuid, uint8_t *app_id)
BLE GATTS 服务端注册
xf_err_t xf_ble_gatts_start_service(uint8_t app_id, uint16_t service_handle)
BLE GATTS 服务开启
xf_err_t xf_ble_gatts_send_notification(uint8_t app_id, uint16_t conn_id, xf_ble_gatts_ntf_ind_t *param)
BLE GATTS 发送通知
@ XF_BLE_GATT_CHARA_PROPERTY_NOTIFY
@ XF_BLE_GATT_CHARA_PROPERTY_READ
@ XF_BLE_GATT_ATTR_PERMISSION_WRITE
@ XF_BLE_GATT_ATTR_PERMISSION_READ
@ XF_BLE_GATT_SERVICE_TYPE_PRIMARY
#define XF_BLE_ADDR_PRINT_FMT
BLE 地址打印格式
uint8_t xf_ble_sm_authen_req_t
BLE SM 认证请求 (绑定能力选择与安全模式)
#define XF_BLE_ADDR_EXPAND_TO_ARG(addr)
BLE 地址展开为参数
#define XF_BLE_SM_AUTHEN_OPTION_DISABLE
#define XF_BLE_DECLARE_UUID16(uuid16)
BLE 声明一个 16-bit UUID
uint8_t xf_ble_sm_authen_option_t
BLE SM 认证选项 (配对能力)
uint8_t xf_ble_sm_io_cap_t
BLE SM IO 能力
#define XF_BLE_SM_IO_CAP_NONE
xf_ble_gatts_event_t
BLE GATTS 事件
#define XF_BLE_SM_AUTHEN_REQ_SC_MITM_BOND
struct __packed _xf_ble_uuid_info_t xf_ble_uuid_info_t
BLE UUID 信息 (多种长度类型通用)
@ XF_BT_ADDR_TYPE_PUBLIC_DEV
@ XF_BLE_UUID_TYPE_16
@ XF_BLE_SM_PARAM_AUTHEN_REQ_MODE
@ XF_BLE_SM_PARAM_IO_CAP_MODE
@ XF_BLE_GATTS_EVT_REQ_READ
@ XF_BLE_GATTS_EVT_REQ_WRITE
@ XF_BLE_GATTS_EVT_MTU_CHANGED
@ XF_BLE_GAP_EVT_CONNECT
@ XF_BLE_GAP_EVT_PAIR_END
@ XF_BLE_GAP_EVT_DISCONNECT
xf_osal_event_t event
Definition xf_main.c:35
#define TAG
Definition xf_main.c:24
uint8_t addr[XF_BLE_ADDR_LEN]
xf_ble_addr_type_t type
xf_ble_gap_disconnect_reason_t reason
BLE GAP 广播数据 ( 包含响应数据 )
xf_ble_gap_adv_struct_t * adv_struct_set
BLE GAP 广播参数
BLE GAP 广播数据单元 ( AD structure )
xf_ble_gap_adv_struct_type_t ad_type
BLE GATTS 发送通知或指示的信息
GATT 服务端事件回调参数
xf_ble_evt_param_gatts_mtu_t mtu
xf_ble_evt_param_gatts_read_req_t read_req
xf_ble_evt_param_gatts_write_req_t write_req
xf_ble_evt_param_connect_t connect
xf_ble_evt_param_disconnect_t disconnect
static xf_ble_uuid_info_t app_uuid
Definition xf_main.c:46
static void sample_ble_set_adv_data(void)
Definition xf_main.c:242
uint8_t sample_adv_rsp_data[]
Definition xf_main.c:39
#define DEFAULT_CHARA_UUID
Definition xf_main.c:33
uint8_t sample_adv_data[]
Definition xf_main.c:38
static uint8_t chara_value_array[][10]
Definition xf_main.c:58
static xf_ble_gatts_service_t service_set[]
Definition xf_main.c:63
#define DEFAULT_SERVICE_UUID
Definition xf_main.c:31
static void sample_ble_set_adv_param(void)
Definition xf_main.c:263
uint8_t sample_gatts_device_name[]
Definition xf_main.c:37
#define DEFAULT_BLE_GAP_ADV_MIN_INTERVAL
Definition xf_main.c:18
#define DEFAULT_BLE_GAP_ADV_FOREVER_DURATION
Definition xf_main.c:24
static uint8_t read_req_indication[]
Definition xf_main.c:41
#define DEFAULT_BLE_GAP_ADV_MAX_INTERVAL
Definition xf_main.c:20
static uint8_t app_id
Definition xf_main.c:96
static xf_err_t sample_ble_gatts_event_cb(xf_ble_gatts_event_t event, xf_ble_gatts_evt_cb_param_t param)
Definition xf_main.c:148
static uint8_t write_req_indication[]
Definition xf_main.c:42
#define XF_LOGI(tag, format,...)
#define UNUSED(_x)