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_client.h"
11#include "string.h"
12#include "xf_task.h"
13
14/* ==================== [Defines] =========================================== */
15
16#define TAG "sample_gattc"
17
18/* ==================== [Typedefs] ========================================== */
19
20/* Ble scan interval */
21#define DEFAULT_BLE_GAP_SCAN_INTERVAL 0x48
22#define DEFAULT_BLE_GAP_SCAN_WINDOW 0x48
23
24#define TASK_PRIORITY 5
25#define TASK_DELAY_MS 500
26
27#define DEFAULT_SERVICE_INDEX (1)
28#define DEFAULT_CHARA_READ_INDEX (0)
29#define DEFAULT_CHARA_WRITE_INDEX (1)
30
31/* ==================== [Static Prototypes] ================================= */
32
38
39/* ==================== [Static Variables] ================================== */
40
41/* 目标 ble device name,用于过滤扫描到的广播
42 最后仅会连接该 device name 设备
43*/
44static uint8_t target_gatts_device_name[] = "XF_GATTS";
45static uint8_t write_req_data[] = "I M GATTC";
47 .len_type = XF_BLE_UUID_TYPE_16,
48 .uuid16 = 0x0000
49};
50static uint8_t s_app_id = 0;
51static uint8_t s_conn_id = 0;
52static bool is_need_discovery = false;
53static bool is_discovery_cmpl = false;
54static bool is_read_cmpl = false;
57
58static void discovery_task(xf_task_t task);
59static void read_write_task(xf_task_t task);
60
61/* ==================== [Macros] ============================================ */
62
63/* ==================== [Global Functions] ================================== */
64
65void xf_main(void)
66{
67 XF_LOGI(TAG, "xf ble gatt client sample");
68 xf_err_t ret = XF_OK;
69 // 使能 ble
71
72 // 注册 gattc 事件回调
75 "REGISTER event cb failed:%#X", ret);
76
77 // 注册 gattc app_profile
79 XF_CHECK(ret != XF_OK || s_app_id == 0, XF_RETURN_VOID, TAG,
80 "REGISTER app profile failed:%#X app_id:%d", ret, s_app_id);
81
82 // 设置扫描参数
85 "SET scan param failed:%#X", ret);
86 XF_LOGI(TAG, "SET scan param CMPL");
87
88 // 开启扫描
91 "STAR scan failed:%#X", ret);
92 XF_LOGI(TAG, "STAR scan CMPL");
93
94 // 创建发现任务
96 // 创建读写任务
98}
99
100/* ==================== [Static Functions] ================================== */
101
105{
106 UNUSED(param);
107 xf_err_t ret = XF_OK;
108 switch (event) {
110 ret = gattc_event_scan_result_cb(&param);
111 } break;
113 s_conn_id = param.connect.conn_id;
115
116 XF_LOGI(TAG, "EV:connect:s_conn_id:%d,addr_type:%u,addr:"
120 is_need_discovery = true;
121 } break;
123 if (param.read_cmpl.chara_value_len != 0) {
124 XF_LOGI(TAG, "EV:read CMPL:handle:%d", param.read_cmpl.chara_handle);
127 is_read_cmpl = true;
128 }
129 } break;
131 XF_LOGI(TAG, "EV:write CMPL:handle:%d,it will disconnect",
132 param.write.handle);
134 } break;
136 if (param.read_cmpl.chara_value_len != 0) {
137 XF_LOGI(TAG, "EV:read ntf/ind:chara_handle:%d", param.notify.handle);
139 param.notify.value_len);
140 }
141 } break;
142 default:
143 break;
144 }
145
146 return ret;
147}
148
150{
151 xf_ble_gap_scan_param_t scan_param = {
153 .scan_window = DEFAULT_BLE_GAP_SCAN_WINDOW,
154 .scan_type = XF_BLE_GAP_SCAN_TYPE_PASSIVE,
155 .scan_phy = XF_BLE_GAP_PHY_1M,
156 .scan_filter_policy = XF_BLE_GAP_SCAN_FILTER_ACCEPT_ALL,
157 };
158 return xf_ble_gap_set_scan_param(&scan_param);
159}
160
162{
163 xf_err_t ret = XF_OK;
164 XF_LOGD(TAG, "EV:scan_result:ADV:addr_type:%d,addr:" XF_BLE_ADDR_PRINT_FMT
165 ",RSSI:%d,adv_data_len:%u",
168 );
169 uint8_t *adv_data_all = param->scan_result.adv_data;
170 uint16_t adv_size_all = param->scan_result.adv_data_len;
171 uint8_t *ptr_current = adv_data_all;
172 uint8_t *ptr_end = adv_data_all + adv_size_all;
173
174 /* 解析广播数据,当包含指定设备名的广播时,进行连接 */
175 while (ptr_current <= ptr_end) {
176 uint8_t struct_data_len = ptr_current[0];
177 xf_ble_gap_adv_struct_type_t ad_type = ptr_current[1];
178 XF_LOGD(TAG, "EV:scan_result:struct_data_len:%d ad_type:%#2X",
179 struct_data_len, ad_type);
180 switch (ad_type) {
182 uint8_t *local_name = &ptr_current[2];
183 uint8_t local_namez_size = struct_data_len - XF_BLE_GAP_ADV_STRUCT_AD_TYPE_FIELD_SIZE;
184 if (strncmp((char *)target_gatts_device_name, (char *)local_name, local_namez_size) == 0) {
185 XF_LOGI(TAG, "EV:scan_result:target local name:%s", local_name);
186 ret = xf_ble_gap_stop_scan();
187 XF_CHECK(ret != XF_OK, ret, TAG, "gap stop scan failed:%#X", ret);
189 XF_CHECK(ret != XF_OK, ret, TAG, "gap connect failed:%#X", ret);
190 }
191 } break;
192 default: {
193 XF_LOGD(TAG, "EV:scan_result:uncaring ad_type:%#2X", ad_type);
194 } break;
195 }
196 ptr_current += (struct_data_len + XF_BLE_GAP_ADV_STRUCT_LEN_FIELD_SIZE);
197 }
198 return XF_OK;
199}
200
202{
203 /* 检测是否需要执行发现操作(服务、特征、特征描述符(暂时未支持)) -> 尝试进行连接 */
204 if (is_need_discovery == true) {
205 is_need_discovery = false;
206 xf_err_t ret = XF_OK;
207 /* 尝试发现服务 */
208 XF_LOGI(TAG, "discover service:%p %p", &service_found_set, service_found_set);
210 NULL, &service_found_set);
211 XF_CHECK(ret != XF_OK, XF_RETURN_VOID, TAG, "discover service failed:%#X app_id:%d",
212 ret, s_app_id);
213
214 XF_LOGI(TAG, "discover chara:service_found_set cnt:%u", service_found_set->cnt);
215 uint16_t cnt_service = service_found_set->cnt;
216 while (cnt_service-- > 0) {
217 /* 尝试发现服务下的特征 */
218 xf_ble_gattc_service_found_t *service = &service_found_set->set[cnt_service];
219 // XF_LOGI(TAG, ">> service[%d]", cnt_service);
220 service->chara_set_info = NULL;
222 service->start_hdl, service->end_hdl, NULL, &service->chara_set_info);
224 "discover chara failed:%#X app_id:%d", ret, s_app_id);
225
226 uint16_t cnt_chara = service->chara_set_info->cnt;
227
228 while (cnt_chara-- > 0) {
229 /* 打印服务及其下特征信息 */
230 xf_ble_gattc_chara_found_t *chara = &service->chara_set_info->set[cnt_chara];
231 XF_LOGI(TAG, "service[%u]:uuid(16):[%#X],handle[%u,%u],chara[%u]:%#X",
232 cnt_service, service->uuid.uuid16,
233 service->start_hdl, service->end_hdl,
234 cnt_chara, chara->uuid.uuid16);
235 // /* 尝试发现服务下的特征下的特征描述符 */
236 // chara->desc_set_info = NULL;
237 // ret = xf_ble_gattc_discover_desc_by_chara_handle(s_app_id, s_conn_id,
238 // service->start_hdl, service->end_hdl, NULL, service->chara_set_info);
239 // XF_CHECK(ret != XF_OK, ret, TAG, "xf_ble_gattc_discover_chara failed:%#X app_id:%d",
240 // ret, s_app_id);
241 }
242 is_discovery_cmpl = true;
243 }
244 }
245}
246
248{
249 /* 发现(服务、特征、特征能描述符)完成 -> 进行读写测试 */
250 if (is_discovery_cmpl == true) {
251 is_discovery_cmpl = false;
252
253 xf_err_t ret = XF_OK;
254
257
258 XF_LOGI(TAG, "REQ READ(uuid) and WRITE(handle):"
259 "s_app_id:%d,s_conn_id:%d"
260 "service_uuid(16):%#X,chara_uuid(16):%#X,",
261 service->uuid.uuid16,
264 );
265 /* 向对端服务端发送 读请求 第1次 */
266 is_read_cmpl = false;
269 if (ret != XF_OK) {
270 XF_LOGE(TAG, "REQ READ:failed:%#X", ret);
271 }
272 /* 向对端服务端发送 读请求 第2次 */
273 is_read_cmpl = false;
276 if (ret != XF_OK) {
277 XF_LOGE(TAG, "REQ READ:failed:%#X", ret);
278 }
279 }
280 if (is_read_cmpl == true) {
283
284 /* 向对端服务端发送 写请求 */
289 if (ret != XF_OK) {
290 XF_LOGE(TAG, "REQ WRITE:failed:%#X", ret);
291 }
292 is_read_cmpl = false;
293 }
294}
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
#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 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
static uint8_t s_app_id
Definition xf_main.c:44
static uint8_t s_conn_id
Definition xf_main.c:45
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)
#define XF_LOGD(tag, format,...)
void * xf_task_t
任务句柄。
#define UNUSED(_x)