打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、 添加自定义服务

app_att.c – static const attribute_t my_Attributes[] = {xx}

1.1 定义变量:

u8  TxDataCCC[2]  				= {0};
u8  TxCmdDataCCC[2]  			= {0};

 device Information  attribute values
static const u8 DataDescCharVal[5] = {
	CHAR_PROP_READ | CHAR_PROP_NOTIFY,
	U16_LO(TX_INPUT_DP_H), U16_HI(TX_INPUT_DP_H),
};

static const u8 TxCharVal[5] = {
	CHAR_PROP_READ | CHAR_PROP_NOTIFY,
	U16_LO(TX_INPUT_DP_H), U16_HI(TX_INPUT_DP_H),
};

 device Information  attribute values
static const u8 CmdTxDescCharVal[5] = {
	CHAR_PROP_READ | CHAR_PROP_NOTIFY,
	U16_LO(TXCMD_INPUT_DP_H), U16_HI(TXCMD_INPUT_DP_H),
};

static const u8 ugee_CmdTxCharVal[5] = {
	CHAR_PROP_READ | CHAR_PROP_NOTIFY,
	U16_LO(TXCMD_INPUT_DP_H), U16_HI(TXCMD_INPUT_DP_H),
};

 device Information  attribute values
static const u8 RxDescCharVal[5] = {
	CHAR_PROP_WRITE|CHAR_PROP_WRITE_WITHOUT_RSP,
	U16_LO(RX_OUT_DP_H), U16_HI(RX_OUT_DP_H),
};

static const u8 RxCharVal[5] = {
	CHAR_PROP_WRITE|CHAR_PROP_WRITE_WITHOUT_RSP,
	U16_LO(RX_OUT_DP_H), U16_HI(RX_OUT_DP_H),
};

1.2 数组加入如下内容:

/// 3. uart Service /
// 总服务类  9--代表这个服务有9个属性值
{9,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID), 	(u8*)(&uartServiceUUID), 0},
// 接收通道
{0,ATT_PERMISSIONS_READ,2,sizeof(RxDescCharVal),(u8*)(&my_characterUUID), (u8*)(RxDescCharVal), 0},
{0,ATT_PERMISSIONS_RDWR,2,sizeof (RxCharVal),(u8*)(&uartRxUUID), (u8*)(RxCharVal), (att_readwrite_callback_t)&module_onReceiveData},
// 命令通道
{0,ATT_PERMISSIONS_READ,2,sizeof(CmdTxDescCharVal),(u8*)(&my_characterUUID), (u8*)(CmdTxDescCharVal), 0},
{0,ATT_PERMISSIONS_READ,2,sizeof(CmdTxCharVal), (u8*)(&uartCmdTxUUID), (u8*)(&CmdTxCharVal), 0},
{0,ATT_PERMISSIONS_RDWR,2,sizeof(TxCmdDataCCC),(u8*)&clientCharacterCfgUUID,(u8*)(&TxCmdDataCCC), (att_readwrite_callback_t)&module_TxcmdDataccc},
//数据通道
{0,ATT_PERMISSIONS_READ,2,sizeof(ugee_DataDescCharVal),(u8*)(&my_characterUUID), (u8*)(DataDescCharVal), 0},				//prop
{0,ATT_PERMISSIONS_READ,2,sizeof(TxCharVal),(u8*)(&uartDataUUID), (u8*)(TxCharVal), 0},
{0,ATT_PERMISSIONS_RDWR,2,sizeof(TxDataCCC),(u8*)&clientCharacterCfgUUID,(u8*)(&TxDataCCC), (att_readwrite_callback_t)&module_TxDataccc},

1.3 添加宏定义:找到ATT_HANDLE
在这里插入图片描述
在末尾添加

	LISUN_PS_H, 						//UUID: 2800, 	VALUE: uuid 180f
	RX_OUT_CD_H,					    //UUID: 2803, 	VALUE:
	RX_OUT_DP_H,					    //UUID: 0001, 	VALUE:
	TXCMD_INPUT_CD_H,                  //UUID: 2803, 	VALUE:  			Prop: Read | Notify
	TXCMD_INPUT_DP_H,					//UUID: 0002 	VALUE:
	TXCMD_INPUT_CCC_H,                 //      2902
	TX_INPUT_CD_H,					    //UUID: 2803, 	VALUE:  			Prop: Read | Notify
	TX_INPUT_DP_H,					    //UUID: 0003, 	VALUE:  			Prop: Read | Notify
	TX_INPUT_CCC_H,                    //      2902

1.4 module_onReceiveData 注册接收回调函数

u8 recvdata[20];
int module_onReceiveData(rf_packet_att_write_t *p)
{
	u16 len = p->l2capLen - 3;
	if(len > 0)
	{
		memcpy(recvdata, &p->value, len);
	}
	return 0;
}

1.5 module_TxcmdDataccc / module_TxDataccc 注册CCCD接收回调函数

int module_TxcmdDataccc(rf_packet_att_write_t *p)
{
	TxCmdDataCCC[0] = (&p->value)[0];
	TxCmdDataCCC[1] = (&p->value)[1];
	printf("Txcmddataccc %d,%d\r\n",(&p->value)[0], (&p->value)[1]);
}

int module_TxDataccc(rf_packet_att_write_t *p)
{
	TxDataCCC[0] = (&p->value)[0];
	TxDataCCC[1] = (&p->value)[1];
	printf("Txdataccc %d,%d\r\n",(&p->value)[0], (&p->value)[1]);
}

u16 getNotifyCmdChannelIsOpen(void)
{
	notify_Cmden= ugee_TxCmdDataCCC[0] || (ugee_TxCmdDataCCC[1]<<8);
	return notify_Cmden;
}

u16 getNotifyDataChannelIsOpen(void)
{
	notify_en= ugee_TxDataCCC[0] || (ugee_TxDataCCC[1]<<8);
	return notify_en;
}

二、 置通知

问:46 49 这两个值怎么来的?
答:上文1.3 ATT_HANDLE 中 找到 TXCMD_INPUT_CCC_H 和 TX_INPUT_CCC_H ,对应值

// 置通知
u8  mster_device1[2]={0};
mster_device1[0] = 1;
if(BLE_SUCCESS ==blc_gatt_pushWriteComand(cur_conn_device.conn_handle, 46, (u8 *)&mster_device1, 2))
{
	printf("cmd ser\r\n");
   //printf("mster_device1[1]=%x\n\r",mster_device1[1]);
}

if(BLE_SUCCESS ==blc_gatt_pushWriteComand(cur_conn_device.conn_handle, 49, (u8 *)&mster_device1, 2))
{
	printf("data ser\r\n");
   //printf("mster_device1[1]=%x\n\r",mster_device1[1]);
}
posted on 2022-08-13 11:00  xuejianqiang  阅读(84)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033