Nordic的SDK做的很好,但是他们一副生怕有什么地方做的不到位一样, 很多简单的功能代码却写的很复杂,如果是java还好,但是C语言实现起来,很多地方的代码读起来特别费劲。我在添加自己的服务的时候,没有仿照他们的示例格式去定义,而是重新处理了一下,由于复用了大量的代码,比示例程序更容易理解和阅读。
核心代码使用两个宏来定义,一个是向Service添加attribute,一个是authorize reply,就是client端对于某个attr 进行 read的回调。这里添加属性的话,为了省一个参数,所有的write操作我这里都定义为既可以write request也可以write command(两者的区别是client端进行write操作的时候一个可以得到回调一个不会得到回调),如果希望区分开这两类写操作,可以再新增一个参数。然后,每个属性的value可以在初始化的时候指定一个值,我们没有这个需求,如果你需要指定的话,可以扩充这个宏。
#define CHAR_HND_ADD(att_uuid,base_uuid_type,uuid_val_len,perm,p_handler) \
do{ \
ble_add_char_params_t add_char_params; \
memset(&add_char_params, 0, sizeof(add_char_params)); \
add_char_params.uuid_type=base_uuid_type; \
add_char_params.uuid = att_uuid; \
add_char_params.max_len = uuid_val_len; \
if(((perm)&PERM_READ)==PERM_READ){ \
add_char_params.char_props.read=true; \
add_char_params.read_access =SEC_OPEN; \
add_char_params.is_defered_read=true; \
} \
if(((perm)&PERM_WRITE)==PERM_WRITE){ \
add_char_params.char_props.write=true; \
add_char_params.char_props.write_wo_resp=true; \
add_char_params.write_access =SEC_OPEN; \
} \
if(((perm)&PERM_NTF)==PERM_NTF){ \
add_char_params.char_props.notify =true; \
add_char_params.cccd_write_access =SEC_OPEN; \
} \
APP_ERROR_CHECK(characteristic_add(BLE_GATT_HANDLE_INVALID,&add_char_params,p_handler)); \
}while(0)
#define AUTHORIZE_READ_REPLY(reply_len,p_reply_data) \
do{ \
ble_gatts_rw_authorize_reply_params_t m_rw_authorize_reply_params={ \
.type=BLE_GATTS_AUTHORIZE_TYPE_READ, \
.params.read.gatt_status=BLE_GATT_STATUS_SUCCESS, \
.params.read.offset=0, \
.params.read.update=1, \
.params.read.len=reply_len, \
.params.read.p_data=(uint8_t *)p_reply_data, \
}; \
sd_ble_gatts_rw_authorize_reply(get_conn_handle(),&m_rw_authorize_reply_params); \
}while(0)
定义一个handle用来保存各种handle value,主要用于在client访问的时候,知道是针对的哪个属性。实际上,不论是ble_gatts_evt_read_t 还是 ble_gatts_evt_write_t,这两个ble访问的回调中都带有uuid参数,如果不想定义handle,下边这个struct不用定义,使用uuid来来判断也是可以的。
typedef struct {
uint16_t service_handle; /**< Handle of LED Button Service (as provided by the BLE stack). */
// uint16_t conn_handle; /**< Hand