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

xf_wal sle ssap 客户端 示例。

/* ==================== [Includes] ========================================== */
#include "xf_hal.h"
#include "string.h"
#include "xf_task.h"
/* ==================== [Defines] =========================================== */
#define TAG "sample_ssapc"
#define SAMPLE_SLE_SEEK_INTERVAL 100
#define SAMPLE_SLE_SEEK_WINDOW 100
#define TASK_PRIORITY 5
#define TASK_DELAY_MS 500
/* ==================== [Typedefs] ========================================== */
/* ==================== [Static Prototypes] ================================= */
static void sample_sle_set_seek_param(void);
/* ==================== [Static Variables] ================================== */
/* 目标 device name,用于过滤扫描到的广播
最后仅会连接该 device name 设备 */
static uint8_t target_device_name[] = "XF_SSAPS";
static uint8_t s_app_id = 0;
static uint8_t s_conn_id = 0;
.start_hdl = 1,
.end_hdl = 0XFFFF,
};
.start_hdl = 1,
.end_hdl = 0XFFFF,
};
static bool is_need_discovery = false;
static bool is_discovery_cmpl = false;
static bool is_write_cmpl = false;
/* ==================== [Macros] ============================================ */
/* ==================== [Global Functions] ================================== */
void xf_main(void)
{
XF_LOGI(TAG, "XF SLE SSAP CLient");
xf_err_t ret = XF_OK;
ret = xf_sle_enable();
"xf_sle_enable error!:%#X", ret);
// 注册 ssaps 客户端 app
"xf_sle_ssapc_app_register error:%#X", ret);
XF_LOGI(TAG, ">> register app:aap_id:%d", s_app_id);
/* 设置扫描参数 */
// 启动扫描
"xf_sle_start_seek error:%#X", ret);
XF_LOGI(TAG, ">> STAR seek CMPL");
}
/* ==================== [Static Functions] ================================== */
{
xf_err_t ret;
if (is_need_discovery == true) {
if (ret != XF_OK) {
XF_LOGE(TAG, ">> FIND service error: %d", ret);
return;
}
XF_LOGI(TAG, "service:uuid:%#X,hdl[%d,%d]", service_struct.uuid.uuid16,
}
if (is_discovery_cmpl == true) {
/* 向对端服务端发送 写请求 */
is_write_cmpl = false;
XF_LOGI(TAG, ">> request write data,app_id:%d,conn_id:%d,hdl:%u",
uint8_t data_write[] = "I M SSAPC WRITE REQ!";
data_write, sizeof(data_write));
if (ret != XF_OK) {
XF_LOGE(TAG, ">> request write cmd error: %#X", ret);
return;
}
} else if (is_write_cmpl == true) {
/* 向对端服务端发送 读请求 */
XF_LOGI(TAG, ">> request read,app_id:%d,conn_id:%d,hdl:%u",
if (ret != XF_OK) {
XF_LOGE(TAG, ">> request write cmd error: %#X", ret);
return;
}
is_write_cmpl = false;
}
}
static void sample_sle_set_seek_param(void)
{
xf_sle_seek_param_t seek_param = {
.seek_filter_policy = XF_SLE_SEEK_FILTER_ALLOW_ALL,
.seek_phy = XF_SLE_SEEK_PHY_1M,
.own_addr_type = XF_SLE_ADDRESS_TYPE_PUBLIC,
.phy_param_set[0] =
{
.seek_interval = SAMPLE_SLE_SEEK_INTERVAL,
.seek_window = SAMPLE_SLE_SEEK_WINDOW
}
};
xf_err_t ret = xf_sle_set_seek_param(&seek_param);
"xf_sle_set_seek_param error:%#X", ret);
}
{
switch (event) {
XF_LOGI(TAG, "EV:connect:conn_id:%u," XF_SLE_ADDR_PRINT_FMT,
} break;
} break;
XF_LOGI(TAG, "EV:WRITE confirm:conn_id:%d,hdl:%d",
param->req_write.conn_id, param->req_read.handle);
is_write_cmpl = true;
} break;
XF_LOGI(TAG, "EV:READ confirm:conn_id:%d,hdl:%d",
param->req_read.conn_id, param->req_read.handle);
} break;
XF_LOGI(TAG, "EV:RECV NTF or IND:conn_id:%d,hdl:%d",
param->req_read.conn_id, param->req_read.handle);
} break;
default:
XF_LOGD(TAG, "EV: evt_code:%u", event);
break;
}
return XF_OK;
}
{
xf_err_t ret = XF_OK;
uint8_t *adv_data_all = result->data;
uint16_t adv_size_all = result->data_len;
uint8_t *adv_pos = adv_data_all;
uint8_t *adv_end = adv_data_all + adv_size_all;
while (adv_pos <= adv_end) {
uint8_t struct_data_len = adv_pos[1];
xf_sle_adv_struct_type_t ad_type = adv_pos[0];
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 = &adv_pos[2];
uint8_t local_name_size = struct_data_len - XF_SLE_ADV_STRUCT_TYPE_FILED_SIZE;
if (strncmp((char *)target_device_name, (char *)local_name, local_name_size) == 0) {
XF_LOGD(TAG, "EV:seek result:evt_type:%d,rssi:%d"
XF_SLE_ADDR_PRINT_FMT " data status:%d",
result->evt_type, result->rssi,
result->data_status);
XF_LOGI(TAG, "> target name:%s", local_name);
XF_CHECK(ret != XF_OK, ret, TAG, "xf_sle_stop_seek failed:%#X", ret);
ret = xf_sle_connect(&result->peer_addr);
XF_CHECK(ret != XF_OK, ret, TAG, "xf_sle_connect failed:%#X", ret);
}
} break;
default: {
XF_LOGD(TAG, "EV:scan_result:uncaring ad_type:%#2X", ad_type);
} break;
}
adv_pos += (struct_data_len + XF_SLE_ADV_STRUCT_LEN_FILED_SIZE);
}
return XF_OK;
}
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 uint8_t s_app_id
Definition xf_main.c:50
static uint8_t s_conn_id
Definition xf_main.c:51
static bool is_need_discovery
Definition xf_main.c:52
static bool is_discovery_cmpl
Definition xf_main.c:53
static void sample_sle_set_seek_param(void)
Definition xf_main.c:140
#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:43
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)
#define XF_LOGD(tag, format,...)
void * xf_task_t
任务句柄。