一、 添加自定义服务
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]);
}