51822如何创建自己的服务
2016-08-31 12:15
323 查看
本文主要参考http://blog.chinaunix.net/uid-29270628-id-5748172.html
#define MY_UUID 0x1234
int main(void)
{
uint32_t err_code;
bool erase_bonds;
ble_stack_init();
gap_params_ init();
advertising_init();
services_init();
err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
APP_ERROR_CHECK(err_code);
// Enter main loop.
for (;;)
{
power_manage();
}
}
这个时候编译工程下载到板子后是可以搜索设备的。
只是连接后并没有服务,下面我们来创建一个服务。 要实现的 就是上面services_init() 函数。
首先我们需要定义一个自己的服务结构体来记录这相关些信息。
直接在 main.c 文件的上面 定义如下结构体。
typedef struct BlkMyServiceTag{
uint16_t conn_handle; // 连接后用 来记录下句柄,供续使连接后用
uint16_t service_handle; // 保存服务的句柄
ble_gatts_char_handles_t handle; //保存特性句柄
}BlkMyService;
然后定义一个全局变量
BlkMyService my_service; // 这个全局变量保存了我们的服务相关信息
然后实现 myservices_init() 函数。
这里不使用模板工程中 建议的初始化方法,为简单起见我 们就直接在该函数里面调用服务添加和特征值。
为方便也是直接就在 main.c 文件中实现如下函数
void myservices_init(void)
{
ble_uuid_t service_uuid;
service_uuid.type=BLE_UUID_TYPE_BLE;
service_uuid.uuid=MY_UUID;
sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,&service_uuid,&my_service.service_handle);
ble_gatts_char_md_t char_md;
ble_gatts_attr_t attr_char_value;
ble_gatts_attr_md_t cccd_md;
ble_gatts_attr_md_t attr_md;
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm);
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm);
//BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&cccd_md.read_perm);
//BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&cccd_md.write_perm);
cccd_md.vloc=BLE_GATTS_VLOC_STACK;
memset(&char_md, 0, sizeof(char_md));
char_md.p_cccd_md=&cccd_md;
char_md.char_props.notify=1;
char_md.char_props.write=1;
char_md.p_char_pf=NULL;
char_md.p_char_user_desc=NULL;
char_md.p_user_desc_md=NULL;
char_md.p_sccd_md=NULL;
attr_md.rd_auth=0;
attr_md.wr_auth=0;
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm);
attr_md.vloc=BLE_GATTS_VLOC_STACK;
attr_md.vlen=1;
ble_uuid_t val_uuid;
val_uuid.type=BLE_UUID_TYPE_BLE;
val_uuid.uuid=0x5678;
attr_char_value.p_uuid=&val_uuid;
attr_char_value.p_attr_md=&attr_md;
attr_char_value.init_len=sizeof(uint8_t);
attr_char_value.init_offs=0;
attr_char_value.max_len=20;
sd_ble_gatts_characteristic_add(my_service.service_handle,&char_md,&attr_char_value,&my_service.handle);
}
到这里服务以及其中的特征值都已经创建好了。编译工程下载后,手机连接设备可以看到服务列表中 已经有了我们添加的服务 uuid 为 0x1234 ,点击服务也可以看到 其中的特征值 uuid 为 0x5678
服务 创建完后就是与手机 创建完后就是与手机 创建完后就是与手机 创建完后就是与手机 通信了。我们要实现的是手机发送一个 数据
设备收到后对数据做 加 1 操作后再发回给手机。
手机发给设备的数据最 终会被打包成一个 写事件结构 然后交给 app 。
先实现对写事件的处理。就是将数据 加一 然后在发送回给手机。
当然发送数据 给手机 之前,我们要知道 之前,我们要知道 conn_handle ,这在 手机连接的时候 app 会受到这个事件,记录下句 柄就可以了。
我们针对写事件实 我们实现如下的数 据操作和发送函( 为方便都是直接在 main.c 文 件中实现 )
static void service_write_handle(ble_evt_t *p_evt)
{
uint16_t data_len;
uint8_t data;
data_len=sizeof(uint8_t);
data=p_evt->evt.gatts_evt.params.write.data[0]; data++;
ble_gatts_hvx_params_t hvx_params;
memset(&hvx_params, 0, sizeof(hvx_params));
hvx_params.handle=my_service.handle.value_handle;
hvx_params.offset=0;
hvx_params.p_data=&data;
hvx_params.p_len=&data_len;
hvx_params.type=BLE_GATT_HVX_INDICATION;
sd_ble_gatts_hvx(my_service.conn_handle,&hvx_params);
}
然后实现的服务处理函数如下
void my_server_handler(ble_evt_t *p_evt)
{
switch(p_evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
my_service.conn_handle=p_evt->evt.gap_evt.conn_handle;
break;
case BLE_GATTS_EVT_WRITE:
service_write_handle(p_evt);
break;
default:
break;
}
}
static void ble_evt_dispatch(t * p_evt)
{
dm_ble_evt_handler(p_evt);
ble_conn_params_on_evt(p_evt);
bsp_btn_ble_on_b le_evt(p_ble_evt);
on_ble_evt(p_evt);
ble_advertising_on_evt(p_evt);
// 添加到这里
my_server_handler(p_ble_evt);
}
编译工程下载后 ,手机连接上进入服务的特征值勾选使能 notify 功能, 然后发送数据就可以看到 收加 1的数据了
以上实验都通过本人验证
#define MY_UUID 0x1234
int main(void)
{
uint32_t err_code;
bool erase_bonds;
ble_stack_init();
gap_params_ init();
advertising_init();
services_init();
err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
APP_ERROR_CHECK(err_code);
// Enter main loop.
for (;;)
{
power_manage();
}
}
这个时候编译工程下载到板子后是可以搜索设备的。
只是连接后并没有服务,下面我们来创建一个服务。 要实现的 就是上面services_init() 函数。
首先我们需要定义一个自己的服务结构体来记录这相关些信息。
直接在 main.c 文件的上面 定义如下结构体。
typedef struct BlkMyServiceTag{
uint16_t conn_handle; // 连接后用 来记录下句柄,供续使连接后用
uint16_t service_handle; // 保存服务的句柄
ble_gatts_char_handles_t handle; //保存特性句柄
}BlkMyService;
然后定义一个全局变量
BlkMyService my_service; // 这个全局变量保存了我们的服务相关信息
然后实现 myservices_init() 函数。
这里不使用模板工程中 建议的初始化方法,为简单起见我 们就直接在该函数里面调用服务添加和特征值。
为方便也是直接就在 main.c 文件中实现如下函数
void myservices_init(void)
{
ble_uuid_t service_uuid;
service_uuid.type=BLE_UUID_TYPE_BLE;
service_uuid.uuid=MY_UUID;
sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,&service_uuid,&my_service.service_handle);
ble_gatts_char_md_t char_md;
ble_gatts_attr_t attr_char_value;
ble_gatts_attr_md_t cccd_md;
ble_gatts_attr_md_t attr_md;
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm);
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm);
//BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&cccd_md.read_perm);
//BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&cccd_md.write_perm);
cccd_md.vloc=BLE_GATTS_VLOC_STACK;
memset(&char_md, 0, sizeof(char_md));
char_md.p_cccd_md=&cccd_md;
char_md.char_props.notify=1;
char_md.char_props.write=1;
char_md.p_char_pf=NULL;
char_md.p_char_user_desc=NULL;
char_md.p_user_desc_md=NULL;
char_md.p_sccd_md=NULL;
attr_md.rd_auth=0;
attr_md.wr_auth=0;
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm);
attr_md.vloc=BLE_GATTS_VLOC_STACK;
attr_md.vlen=1;
ble_uuid_t val_uuid;
val_uuid.type=BLE_UUID_TYPE_BLE;
val_uuid.uuid=0x5678;
attr_char_value.p_uuid=&val_uuid;
attr_char_value.p_attr_md=&attr_md;
attr_char_value.init_len=sizeof(uint8_t);
attr_char_value.init_offs=0;
attr_char_value.max_len=20;
sd_ble_gatts_characteristic_add(my_service.service_handle,&char_md,&attr_char_value,&my_service.handle);
}
到这里服务以及其中的特征值都已经创建好了。编译工程下载后,手机连接设备可以看到服务列表中 已经有了我们添加的服务 uuid 为 0x1234 ,点击服务也可以看到 其中的特征值 uuid 为 0x5678
服务 创建完后就是与手机 创建完后就是与手机 创建完后就是与手机 创建完后就是与手机 通信了。我们要实现的是手机发送一个 数据
设备收到后对数据做 加 1 操作后再发回给手机。
手机发给设备的数据最 终会被打包成一个 写事件结构 然后交给 app 。
先实现对写事件的处理。就是将数据 加一 然后在发送回给手机。
当然发送数据 给手机 之前,我们要知道 之前,我们要知道 conn_handle ,这在 手机连接的时候 app 会受到这个事件,记录下句 柄就可以了。
我们针对写事件实 我们实现如下的数 据操作和发送函( 为方便都是直接在 main.c 文 件中实现 )
static void service_write_handle(ble_evt_t *p_evt)
{
uint16_t data_len;
uint8_t data;
data_len=sizeof(uint8_t);
data=p_evt->evt.gatts_evt.params.write.data[0]; data++;
ble_gatts_hvx_params_t hvx_params;
memset(&hvx_params, 0, sizeof(hvx_params));
hvx_params.handle=my_service.handle.value_handle;
hvx_params.offset=0;
hvx_params.p_data=&data;
hvx_params.p_len=&data_len;
hvx_params.type=BLE_GATT_HVX_INDICATION;
sd_ble_gatts_hvx(my_service.conn_handle,&hvx_params);
}
然后实现的服务处理函数如下
void my_server_handler(ble_evt_t *p_evt)
{
switch(p_evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
my_service.conn_handle=p_evt->evt.gap_evt.conn_handle;
break;
case BLE_GATTS_EVT_WRITE:
service_write_handle(p_evt);
break;
default:
break;
}
}
static void ble_evt_dispatch(t * p_evt)
{
dm_ble_evt_handler(p_evt);
ble_conn_params_on_evt(p_evt);
bsp_btn_ble_on_b le_evt(p_ble_evt);
on_ble_evt(p_evt);
ble_advertising_on_evt(p_evt);
// 添加到这里
my_server_handler(p_ble_evt);
}
编译工程下载后 ,手机连接上进入服务的特征值勾选使能 notify 功能, 然后发送数据就可以看到 收加 1的数据了
以上实验都通过本人验证
相关文章推荐
- 如何创建自己的短网址服务
- 如何创建和使用Web服务
- 如何创建自己的wiki-Dokuwiki
- [安装部署]如何让用户自己选择是否在桌面创建快捷方式
- 如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序
- 如何利用Visual Studio创建自己的模板
- MattPowell介绍了如何在服务器端使用异步Web方法,来创建高性能的 Microsoft ASP.NET Web 服务
- 如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序
- 如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序
- 如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序
- 如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序
- 如何在 VisualC # .NET 和 VisualC # 2005 中创建安装项目用于 Windows 服务应用程序
- 如何创建和使用Web服务
- 如何让自己的应用程序,控制台程序,windows 服务收到操作系统注销或者重启的消息
- 教你如何使用Visual C#来创建Windows服务程序
- Tips: 如何让自己的应用程序,控制台程序,windows 服务收到操作系统注销或者重启的消息?
- 不能启动 Easy Config时如何创建一个新的网络服务
- 如何创建和使用Web服务
- 如何:创建异步 Web 服务方法
- 如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序