ble uart server¶
功能简介¶
uart server主要实现了一个透传功能,sever接收来自串口的数据,并把数据发送到对端设备,对端设备也可以将数据通过蓝牙写入server,server收到数据后,将数据通过串口输出。
ble 自定义 service¶
自定义service的本质就是构造一个service,即构造服务描述、特征声明,特征值,特征描述符,造完成之后再将这个服务注册到协议栈。
1. 定义自己的service 描述
struct gattm_svc_desc const uart_svc_desc ={
.start_hdl = 0,
.task_id = TASK_ID_AHI,
.perm = PERM(SVC_MI,DISABLE)|PERM(SVC_EKS,DISABLE)|\
PERM(SVC_AUTH,NO_AUTH)|PERM(SVC_UUID_LEN,UUID_128),PERM_VAL(SVC_SECONDARY,0),
.nb_att = UART_SVC_ATT_NUM,
.uuid = UART_SVC_UUID_128,
};
2. 定义自己的att 属性列表
struct gattm_att_desc const uart_svc_att_db[UART_SVC_ATT_NUM] = {
[UART_SVC_IDX_RX_CHAR] = {
.uuid = ATT_DECL_CHAR_ARRAY,
.perm = PERM(RD,ENABLE),
.max_len = 0,
.ext_perm= PERM(UUID_LEN,UUID_16),
},
[UART_SVC_IDX_RX_VAL] = {
.uuid = UART_SVC_RX_CHAR_UUID_128,
.perm = PERM(WRITE_REQ,ENABLE)|PERM(WRITE_COMMAND,ENABLE)|PERM(WP,NO_AUTH),
.max_len = UART_SVC_RX_BUF_SIZE,
.ext_perm = PERM(UUID_LEN,UUID_128)|PERM(RI,ENABLE),
},
[UART_SVC_IDX_TX_CHAR] = {
.uuid = ATT_DECL_CHAR_ARRAY,
.perm = PERM(RD,ENABLE),
.max_len = 0,
.ext_perm = PERM(UUID_LEN,UUID_16),
},
[UART_SVC_IDX_TX_VAL] = {
.uuid = UART_SVC_TX_CHAR_UUID_128,
.perm = PERM(NTF,ENABLE),
.max_len = UART_SVC_TX_BUF_SIZE,
.ext_perm = PERM(UUID_LEN,UUID_128)|PERM(RI,ENABLE),
},
[UART_SVC_IDX_TX_NTF_CFG] = {
.uuid = ATT_DESC_CLIENT_CHAR_CFG_ARRAY,
.perm = PERM(RD,ENABLE)|PERM(WRITE_REQ,ENABLE),
.max_len = 0,
.ext_perm = PERM(UUID_LEN,UUID_16),
},
};
3. 注册service的svc 、database以及回调函数
osapp_svc_helper_t uart_server_svc_helper =
{
.svc_desc = &uart_svc_desc,
.att_desc = uart_svc_att_db,
.att_num = UART_SVC_ATT_NUM,
.read = uart_server_read_req_ind,
.write = uart_server_write_req_ind,
};
通过osapp_add_svc_req_helper将svc注册到协议栈中,svc添加完成后,开始广播。
ble 协议栈和应用协议栈的信息交互¶
static osapp_msg_handler_table_t osapp_svc_handler_table[] =
{
{GATTM_ADD_SVC_RSP,(osapp_msg_handler_t)osapp_add_svc_rsp_helper_handler},
{GATTC_WRITE_REQ_IND,(osapp_msg_handler_t)osapp_write_req_ind_helper_handler},
{GATTC_READ_REQ_IND,(osapp_msg_handler_t)osapp_read_req_ind_helper_handler},
{GATTC_ATT_INFO_REQ_IND,(osapp_msg_handler_t)osapp_att_info_req_ind_helper_handler},
{GAPM_CMP_EVT,(osapp_msg_handler_t)osapp_gapm_cmp_evt_handler},
};
当和对端设备连接成功后,当对端设备写sever上的特征时,app会收到GATTC_WRITE_REQ_IND消息,然后调用osapp_write_req_ind_helper_handler处理。当server收到串口的数据时,也会将数据nofity到对端设备。