XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_main.c
浏览该文件的文档.
1
6/* ==================== [Includes] ========================================== */
7
8#include "xf_hal.h"
9#include "xf_ble_gap.h"
10#include "xf_ble_gatt_server.h"
11#include "string.h"
12
13/* ==================== [Defines] =========================================== */
14
15#define TAG "sample_gatts"
16
17/* Ble adv min interval */
18#define DEFAULT_BLE_GAP_ADV_MIN_INTERVAL 0x30
19/* Ble adv max interval */
20#define DEFAULT_BLE_GAP_ADV_MAX_INTERVAL 0x60
21/* Ble adv handle */
22#define DEFAULT_BLE_GAP_ADV_HANDLE_DEFAULT 0x01
23/* Ble adv duration */
24#define DEFAULT_BLE_GAP_ADV_FOREVER_DURATION 0
25
26/* Server HANDLE */
27#define DEFAULT_SERVER_HANDLE (1)
28/* Server ID */
29#define DEFAULT_SERVER_ID (1)
30/* Ser UUID */
31#define DEFAULT_SERVICE_UUID (0x1234)
32/* Characteristic UUID */
33#define DEFAULT_CHARA_UUID (0xCDEF)
34/* Client Characteristic Configuration UUID */
35#define DEFAULT_CHARA_CFG_UUID (0x2902)
36
37uint8_t sample_gatts_device_name[] = "XF_GATTS";
38uint8_t sample_adv_data[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
39uint8_t sample_adv_rsp_data[] = {0x11, 0x00, 0x00, 0x00, 0x00, 0x66};
40
41static uint8_t read_req_indication[] = "REQ_READ RSP";
42static uint8_t write_req_indication[] = "REQ_WRITE RSP";
43
44/* ==================== [Typedefs] ========================================== */
45
46/* ==================== [Static Prototypes] ================================= */
47
48static void sample_ble_set_adv_data(void);
49
50static void sample_ble_set_adv_param(void);
51
55
56/* ==================== [Static Variables] ================================== */
57
58static uint8_t chara_value_array[][10] = {
59 {0x12, 0x34},
60 {0xAA, 0xBB}
61};
62
64 {
67 .chara_set = (xf_ble_gatts_chara_t [])
68 {
69 {
71 .chara_value = {
72 .value = chara_value_array[0],
73 .value_len = sizeof(chara_value_array[0]),
74 .permission =
75 (
78 ),
79 },
80 .properties =
81 (
84 ),
85 },
86 {.chara_uuid = XF_BLE_ATTR_SET_END_FLAG}
87 }
88 },
89 {.service_uuid = XF_BLE_ATTR_SET_END_FLAG}
90};
91
93 .len_type = XF_BLE_UUID_TYPE_16,
94 .uuid16 = 0x0000
95};
96static uint8_t app_id = 0;
97
98/* ==================== [Macros] ============================================ */
99
100/* ==================== [Global Functions] ================================== */
101
102void xf_main(void)
103{
104 XF_LOGI(TAG, "xf ble gatt server sample");
105 xf_err_t ret = XF_OK;
106 // 使能 ble
108
109 // 注册 gatts 事件回调
112 "REGISTER event cb failed:%#X", ret);
113
114 /* 设置本地名称、外观 */
117
118 // 注册 gatts app_profile
120 XF_CHECK(ret != XF_OK || app_id == 0, XF_RETURN_VOID, TAG,
121 "REGISTER app profile failed:%#X app_id:%d", ret, app_id);
122
123 // 添加服务至 app_profile
125 app_id, &service_set[0]);
127 "ADD service failed:%#X", ret);
128
129 // 启动服务
130 ret = xf_ble_gatts_start_service(app_id, service_set[0].service_handle);
132 "START service failed:%#X", ret);
133
134 /* 设置广播数据及参数 */
137 XF_LOGI(TAG, "CONFIG ADV CMPL");
138
139 // 开启广播
140 ret = xf_ble_gap_start_adv();
142 "STAR ADV failed:%#X", ret);
143 XF_LOGI(TAG, "STAR ADV CMPL");
144}
145
146/* ==================== [Static Functions] ================================== */
147
151{
152 UNUSED(app_id);
153 UNUSED(param);
154 switch (event) {
155 /* 事件: 读请求 */
157 XF_LOGI(TAG, "EV:RECV READ_REQ:app_id:%d,conn_id:%d,need_rsp:%d,attr_handle:%d",
159 param.read_req.handle);
160
161 xf_ble_gatts_ntf_ind_t indication_param = {
163 .value_len = sizeof(read_req_indication),
164 .handle = param.read_req.handle
165 };
167 app_id, param.read_req.conn_id, &indication_param);
168 XF_CHECK(ret != XF_OK, ret, TAG,
169 "send_notify_indicate failed:%#X", ret);
170 } break;
171 /* 事件: 写请求 */
173 XF_LOGI(TAG, "EV:RECV WRITE_REQ:app_id:%d,conn_id:%d,need_rsp:%d,attr_handle:%d",
175 param.write_req.handle);
177
178 /* 如果是需要响应的请求类型->返回响应 */
179 if (param.write_req.need_rsp == true) {
180 xf_ble_gatts_ntf_ind_t indication_param = {
182 .value_len = sizeof(write_req_indication),
183 .handle = param.write_req.handle,
184 };
186 app_id, param.write_req.conn_id, &indication_param);
187 XF_CHECK(ret != XF_OK, ret, TAG,
188 "send_notify_indicate failed:%#X app_id:%d", ret);
189 }
190 } break;
191 /* 事件: MTU 协商 */
193 XF_LOGI(TAG, "EV:mtu changed:app_id:%d,conn_id:%d,mtu_size:%d",
194 app_id, param.mtu.conn_id, param.mtu.mtu_size);
195 } break;
196 /* 事件: 连接 */
198 XF_LOGI(TAG, "EV:peer connect:app_id:%d,conn_id:%d,"
199 "addr_type:%d,addr:"XF_BLE_ADDR_PRINT_FMT,
200 app_id, param.connect.conn_id,
201 param.connect.peer_addr.type,
203
207 xf_err_t ret = XF_OK;
209 XF_BLE_SM_PARAM_AUTHEN_REQ_MODE, &authen_req, sizeof(authen_req));
210 XF_CHECK(ret != XF_OK, ret, TAG,
211 "set_security_param failed:%#X", ret);
213 XF_BLE_SM_PARAM_IO_CAP_MODE, &io_capability, sizeof(io_capability));
214 XF_CHECK(ret != XF_OK, ret, TAG,
215 "set_security_param failed:%#X", ret);
216 } break;
218 XF_LOGI(TAG, "EV:pair end:app_id:%d,conn_id:%d,"
219 "addr_type:%d,addr:"XF_BLE_ADDR_PRINT_FMT,
220 app_id, param.connect.conn_id,
221 param.connect.peer_addr.type,
223 } break;
224 /* 事件: 断连 */
226 XF_LOGI(TAG, "EV:peer disconnect:app_id:%d,conn_id:%d,reason:%u,"
227 "addr_type:%d,addr:"XF_BLE_ADDR_PRINT_FMT,
229 param.disconnect.reason,
232 XF_LOGI(TAG, "It will restart ADV");
234 } break;
235 default:
236 break;
237 }
238
239 return XF_OK;
240}
241
242static void sample_ble_set_adv_data(void)
243{
244 xf_ble_gap_adv_data_t adv_data = {
246 {
247 {
249 .ad_data_len = sizeof(sample_gatts_device_name),
250 .ad_data.local_name = sample_gatts_device_name,
251 }, {
253 .ad_data_len = sizeof(xf_ble_appearance_t),
254 .ad_data.appearance = XF_BLE_APPEARANCE_HID_DIGITIZER_TABLET,
255 },
256 {0}
257 },
258 .scan_rsp_length = 0,
259 .scan_rsp_data = NULL,
260 };
261 xf_ble_gap_set_adv_data(&adv_data);
262}
264{
265 xf_ble_gap_adv_param_t adv_param = {
266 /* 广播间隔 [N * 0.625ms] */
268 .max_interval = DEFAULT_BLE_GAP_ADV_MAX_INTERVAL,
269
270 // 广播类型
272 .own_addr =
273 {
274 .type = XF_BT_ADDR_TYPE_PUBLIC_DEV, // 本端地址类型
275 .addr = {0x0}, // 本端地址
276 },
277 .peer_addr =
278 {
279 .type = XF_BT_ADDR_TYPE_PUBLIC_DEV, // 对端地址类型
280 .addr = { 0x0 }, // 对端地址
281 },
282 .channel_map = XF_BLE_GAP_ADV_CH_ALL, // 使用37/38/39三个通道
285 .tx_power = 1, // 发送功率,单位dbm,范围-127~20
286 };
287 xf_ble_gap_set_adv_param(&adv_param);
288}
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)