XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_main.c
浏览该文件的文档.
1
6/* ==================== [Includes] ========================================== */
7
8#include "xf_hal.h"
11#include "xf_sle_ssap_client.h"
12#include "string.h"
13#include "xf_task.h"
14
15/* ==================== [Defines] =========================================== */
16
17#define TAG "sample_ssapc"
18
19#define SAMPLE_SLE_SEEK_INTERVAL 100
20#define SAMPLE_SLE_SEEK_WINDOW 100
21
22#define TASK_PRIORITY 5
23#define TASK_DELAY_MS 500
24
25/* ==================== [Typedefs] ========================================== */
26
27/* ==================== [Static Prototypes] ================================= */
28
29static void sle_client_task(xf_task_t task);
33static void sample_sle_set_seek_param(void);
36
37/* ==================== [Static Variables] ================================== */
38
39/* 目标 device name,用于过滤扫描到的广播
40 最后仅会连接该 device name 设备 */
41static uint8_t target_device_name[] = "XF_SSAPS";
42
44static uint8_t s_app_id = 0;
45static uint8_t s_conn_id = 0;
48 .start_hdl = 1,
49 .end_hdl = 0XFFFF,
50};
51
54 .start_hdl = 1,
55 .end_hdl = 0XFFFF,
56};
57
58static bool is_need_discovery = false;
59static bool is_discovery_cmpl = false;
60static bool is_write_cmpl = false;
61
62/* ==================== [Macros] ============================================ */
63
64/* ==================== [Global Functions] ================================== */
65
66void xf_main(void)
67{
68 XF_LOGI(TAG, "XF SLE SSAP CLient");
69
70 xf_err_t ret = XF_OK;
71 ret = xf_sle_enable();
73 "xf_sle_enable error!:%#X", ret);
74
76
77 // 注册 ssaps 客户端 app
80 "xf_sle_ssapc_app_register error:%#X", ret);
81 XF_LOGI(TAG, ">> register app:aap_id:%d", s_app_id);
82
83 /* 设置扫描参数 */
85
86 // 启动扫描
87 ret = xf_sle_start_seek();
89 "xf_sle_start_seek error:%#X", ret);
90 XF_LOGI(TAG, ">> STAR seek CMPL");
91
93
94}
95
96/* ==================== [Static Functions] ================================== */
97
99{
100 xf_err_t ret;
101 if (is_need_discovery == true) {
102 is_need_discovery = false;
104 if (ret != XF_OK) {
105 XF_LOGE(TAG, ">> FIND service error: %d", ret);
106 return;
107 }
108 XF_LOGI(TAG, "service:uuid:%#X,hdl[%d,%d]", service_struct.uuid.uuid16,
110 is_discovery_cmpl = true;
111 }
112 if (is_discovery_cmpl == true) {
113 is_discovery_cmpl = false;
114 /* 向对端服务端发送 写请求 */
115 is_write_cmpl = false;
116 XF_LOGI(TAG, ">> request write data,app_id:%d,conn_id:%d,hdl:%u",
118 uint8_t data_write[] = "I M SSAPC WRITE REQ!";
121 data_write, sizeof(data_write));
122 if (ret != XF_OK) {
123 XF_LOGE(TAG, ">> request write cmd error: %#X", ret);
124 return;
125 }
126 } else if (is_write_cmpl == true) {
127 /* 向对端服务端发送 读请求 */
128 XF_LOGI(TAG, ">> request read,app_id:%d,conn_id:%d,hdl:%u",
132 if (ret != XF_OK) {
133 XF_LOGE(TAG, ">> request write cmd error: %#X", ret);
134 return;
135 }
136 is_write_cmpl = false;
137 }
138}
139
141{
142 xf_sle_seek_param_t seek_param = {
143 .filter_duplicates = true,
144 .seek_filter_policy = XF_SLE_SEEK_FILTER_ALLOW_ALL,
145 .seek_phy = XF_SLE_SEEK_PHY_1M,
146 .own_addr_type = XF_SLE_ADDRESS_TYPE_PUBLIC,
147
148 .phy_param_set[0] =
149 {
150 .seek_type = XF_SLE_SEEK_TYPE_PASSIVE,
151 .seek_interval = SAMPLE_SLE_SEEK_INTERVAL,
152 .seek_window = SAMPLE_SLE_SEEK_WINDOW
153 }
154 };
155 xf_err_t ret = xf_sle_set_seek_param(&seek_param);
157 "xf_sle_set_seek_param error:%#X", ret);
158}
159
163{
164 switch (event) {
166 is_need_discovery = true;
167 s_conn_id = param->connect.conn_id;
168 XF_LOGI(TAG, "EV:connect:conn_id:%u," XF_SLE_ADDR_PRINT_FMT,
170 } break;
173 } break;
175 XF_LOGI(TAG, "EV:WRITE confirm:conn_id:%d,hdl:%d",
176 param->req_write.conn_id, param->req_read.handle);
177 is_write_cmpl = true;
178 } break;
180 XF_LOGI(TAG, "EV:READ confirm:conn_id:%d,hdl:%d",
181 param->req_read.conn_id, param->req_read.handle);
183 } break;
185 XF_LOGI(TAG, "EV:RECV NTF or IND:conn_id:%d,hdl:%d",
186 param->req_read.conn_id, param->req_read.handle);
188 } break;
189 default:
190 XF_LOGD(TAG, "EV: evt_code:%u", event);
191 break;
192 }
193 return XF_OK;
194}
195
198{
199 xf_err_t ret = XF_OK;
200
201 uint8_t *adv_data_all = result->data;
202 uint16_t adv_size_all = result->data_len;
203
204 uint8_t *adv_pos = adv_data_all;
205 uint8_t *adv_end = adv_data_all + adv_size_all;
206 while (adv_pos <= adv_end) {
207 uint8_t struct_data_len = adv_pos[1];
208 xf_sle_adv_struct_type_t ad_type = adv_pos[0];
209 XF_LOGD(TAG, "EV:scan_result:struct_data_len:%d ad_type:%#2X",
210 struct_data_len, ad_type);
211 switch (ad_type) {
213 uint8_t *local_name = &adv_pos[2];
214 uint8_t local_name_size = struct_data_len - XF_SLE_ADV_STRUCT_TYPE_FILED_SIZE;
215 if (strncmp((char *)target_device_name, (char *)local_name, local_name_size) == 0) {
216
217 XF_LOGD(TAG, "EV:seek result:evt_type:%d,rssi:%d"
218 XF_SLE_ADDR_PRINT_FMT " data status:%d",
219 result->evt_type, result->rssi,
221 result->data_status);
222 XF_LOGI(TAG, "> target name:%s", local_name);
223 ret = xf_sle_stop_seek();
224 XF_CHECK(ret != XF_OK, ret, TAG, "xf_sle_stop_seek failed:%#X", ret);
225 ret = xf_sle_connect(&result->peer_addr);
226 XF_CHECK(ret != XF_OK, ret, TAG, "xf_sle_connect failed:%#X", ret);
227 }
228 } break;
229 default: {
230 XF_LOGD(TAG, "EV:scan_result:uncaring ad_type:%#2X", ad_type);
231 } break;
232 }
233 adv_pos += (struct_data_len + XF_SLE_ADV_STRUCT_LEN_FILED_SIZE);
234 }
235 return XF_OK;
236}
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_ESCAPE(buffer, buffer_len)
以十六进制输出 buffer 的内容,同时输出可见的 ascii 码,以及转义字符。
xf_err_t xf_sle_ssapc_request_write_data(uint8_t app_id, uint16_t conn_id, uint16_t handle, uint8_t type, uint8_t *data, uint16_t data_len)
SLE SSAPC 发起写请求
xf_err_t xf_sle_ssapc_app_register(xf_sle_uuid_info_t *app_uuid, uint8_t *app_id)
SLE SSAPC 客户端注册
xf_err_t xf_sle_ssapc_request_read_by_handle(uint8_t app_id, uint16_t conn_id, uint8_t type, uint16_t handle)
SLE SSAPC 通过句柄发起读请求
xf_err_t xf_sle_ssapc_discover_service(uint8_t app_id, uint16_t conn_id, xf_sle_ssapc_find_struct_param_t *param)
SLE SSAPC 搜寻服务
xf_sle_ssapc_event_t
SLE SSAPC 事件
xf_err_t xf_sle_ssapc_event_cb_register(xf_sle_ssapc_event_cb_t evt_cb, xf_sle_ssapc_event_t events)
SLE SSAPC 事件回调注册
@ XF_SLE_SSAP_FIND_TYPE_PROPERTY
@ XF_SLE_SSAP_FIND_TYPE_PRIMARY_SERVICE
@ XF_SLE_SSAP_PROPERTY_TYPE_VALUE
@ XF_SLE_EVT_ALL
@ XF_SLE_CONN_EVT_CONNECT
@ XF_SLE_SEEK_EVT_RESULT
@ XF_SLE_SSAPC_EVT_RECV_READ_CFM
@ XF_SLE_SSAPC_EVT_NOTIFICATION
@ XF_SLE_SSAPC_EVT_RECV_WRITE_CFM
#define XF_SLE_ADDR_EXPAND_TO_ARG(addr)
SLE 地址展开为参数
xf_sle_adv_struct_type_t
SLE 广播单元类型
struct __packed _xf_sle_uuid_info_t xf_sle_uuid_info_t
SLE UUID 信息 (多种长度类型通用)
#define XF_SLE_ADV_STRUCT_LEN_FILED_SIZE
SLE 广播数据单元数据长度字段的大小
xf_err_t xf_sle_start_seek(void)
SLE 扫描开启
#define XF_SLE_ADDR_PRINT_FMT
SLE 地址打印格式
xf_err_t xf_sle_connect(const xf_sle_addr_t *addr)
SLE 发起连接
#define XF_SLE_ADV_STRUCT_TYPE_FILED_SIZE
SLE 广播数据单元类型字段的大小
xf_err_t xf_sle_enable(void)
SLE 功能开启
xf_err_t xf_sle_set_seek_param(xf_sle_seek_param_t *param)
SLE 设置扫描参数
xf_err_t xf_sle_stop_seek(void)
SLE 扫描停止
@ XF_SLE_ADV_STRUCT_TYPE_COMPLETE_LOCAL_NAME
@ XF_SLE_ADDRESS_TYPE_PUBLIC
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
uint8_t addr[XF_SLE_ADDR_LEN]
SLE 收到扫描结果事件的参数
扫描 (发现, seek) 参数
static void task(xf_task_t task)
Definition xf_main.c:45
SLE SSAPC 客户端事件回调参数
xf_sle_evt_param_write_cfm_t req_write
xf_sle_evt_param_connect_t connect
xf_sle_evt_param_seek_result_t seek_result
xf_sle_evt_param_read_cfm_t req_read
static bool is_need_discovery
Definition xf_main.c:52
static bool is_discovery_cmpl
Definition xf_main.c:53
static uint8_t s_app_id
Definition xf_main.c:44
static void sample_sle_set_seek_param(void)
Definition xf_main.c:140
static uint8_t s_conn_id
Definition xf_main.c:45
#define SAMPLE_SLE_SEEK_WINDOW
Definition xf_main.c:20
static xf_err_t ssapc_event_seek_result_cb(xf_sle_evt_param_seek_result_t *result)
Definition xf_main.c:196
#define SAMPLE_SLE_SEEK_INTERVAL
Definition xf_main.c:19
static xf_err_t sample_ssapc_event_cb(xf_sle_ssapc_event_t event, xf_sle_ssapc_evt_cb_param_t *param)
Definition xf_main.c:160
static void sle_client_task(xf_task_t task)
Definition xf_main.c:98
static xf_sle_ssapc_find_struct_param_t prop_struct
Definition xf_main.c:52
static uint8_t target_device_name[]
Definition xf_main.c:41
static xf_sle_ssapc_find_struct_param_t service_struct
Definition xf_main.c:46
static bool is_write_cmpl
Definition xf_main.c:60
static xf_sle_uuid_info_t s_app_uuid
Definition xf_main.c:49
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)
#define XF_LOGD(tag, format,...)
void * xf_task_t
任务句柄。