以下是基于沁恒CH592F芯片新增BLE Service的步骤说明及示例代码:
获取SDK和开发环境
理解BLE服务结构
修改配置文件
gattprofile.h中的属性表大小(CFG_MAX_SERVICE)。定义自定义UUID
service.h)定义UUID:#define MY_SERVICE_UUID 0xAA10 // 自定义服务UUID
#define MY_CHARACTERISTIC_UUID 0xAA11 // 自定义特征UUID初始化服务
在应用初始化函数中注册服务,例如:
void MyService_Init(void) {
// 添加服务
uint8_t serviceUUID[2] = {LO_UINT16(MY_SERVICE_UUID), HI_UINT16(MY_SERVICE_UUID)};
ADD_SERVICE(0, PRIMARY_SERVICE, serviceUUID, 0, 0);
// 添加特征值
uint8_t charUUID[2] = {LO_UINT16(MY_CHARACTERISTIC_UUID), HI_UINT16(MY_CHARACTERISTIC_UUID)};
ADD_CHARACTERISTIC(0, CHAR_PROP_READ | CHAR_PROP_WRITE,
charUUID, ATT_PERMISSION_AUTHEN_READ | ATT_PERMISSION_AUTHEN_WRITE,
myCharData, sizeof(myCharData), 0);
}处理读写事件
void handleBleEvent(tmos_event_hdr_t *pMsg) {
switch(pMsg->event) {
case ATT_READ_IND:
case ATT_WRITE_IND:
// 解析并处理读写请求
if(pMsg->handle == myCharHandle) {
// 读取或更新数据
}
break;
}
}编译测试
// service.h
#define MY_SERVICE_UUID 0xAA10
#define MY_CHARACTERISTIC_UUID 0xAA11
// 服务初始化函数
void MyService_Init(void);
// service.c
static uint8_t myCharData[20] = {0}; // 特征值数据
static uint16_t myCharHandle = 0; // 特征值句柄
void MyService_Init(void) {
// 添加服务
uint8_t serviceUUID[2] = {LO_UINT16(MY_SERVICE_UUID), HI_UINT16(MY_SERVICE_UUID)};
uint16_t serviceHandle = AddService(PRIMARY_SERVICE, serviceUUID, 2, 0);
// 添加特征值
uint8_t charUUID[2] = {LO_UINT16(MY_CHARACTERISTIC_UUID), HI_UINT16(MY_CHARACTERISTIC_UUID)};
myCharHandle = AddCharacteristic(
CHAR_PROP_READ | CHAR_PROP_WRITE,
charUUID,
ATT_PERMISSION_AUTHEN_READ | ATT_PERMISSION_AUTHEN_WRITE,
myCharData,
sizeof(myCharData),
sizeof(myCharData),
0
);
}
// 在main.c中调用初始化
int main() {
// ...其他初始化
MyService_Init();
// ...
}
// 处理BLE事件(简化示例)
void TMOS_ProcessEvent(uint8 task_id, uint16 events) {
if(events & BLE_EVENT) {
handleBleEvent((tmos_event_hdr_t*)&msg);
}
}UUID类型
属性表大小
gattprofile.h中的CFG_MAX_SERVICE以防止内存溢出。权限控制
ATT_PERMISSION_ENC_READ)。测试工具
数据更新
GATT_HandleValueNoti发送数据。如需完整工程示例,建议参考沁恒SDK中的Peripheral例程,替换其中的服务部分。
更多回帖