使用宏来简化在Nordic 的sdk中添加蓝牙Service和attribute

        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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值