请如果它是可能的工作中心的例子基于ble_app_peripheral项目。在论坛上有很多成员发现DSPS主机应用程序太复杂,无法理解编写中心应用程序的过程。我想对于我们大多数人来说,如果你放置一个读/写LED或LONG VALUE特征的示例项目就足够了。
提前谢谢你!
嗨hssmltd,
annihilate没有其他中心的例子,对于需求方的复杂性,我相信,最复杂的部分的例子是数据的操作(循环缓冲区,起床和睡觉下降过程取决于缓冲区中的数据)和应用程序作为一个中央。本质上,一个中心应用程序需要扫描,当发现一个有效的设备发出时,应该发出一个连接请求(我认为这是相当直接的,让我知道如果需要任何关于这方面的quidance)。建立连接后中央与发现过程应该开始(我想这是最迷惑你的一部分,如果我错了请纠正我),这个过程相当复杂,不是很难的需求方(也许它增加了一些复杂性自设备验证发现的服务)。因此,如果您需要对这个过程有任何了解,可以查看RW-BLE-GATT-IS.pdf,它记录了中央服务器为了发现位于中央的服务而应该执行的命令(请参阅4.4段服务发现)。如果发现确实是难以理解的部分你可以开始解码需求方主机例子通过检查user_sps_enable()函数,这使函数会发送一个SPS_CLIENT_ENABLE_REQ消息和相应的处理程序(sps_client_enable_req_handler())将会得到调用,处理程序将检查连接的有效性,然后发现过程将开始通过prf_disc_svc_send128() api函数发送GATTC_DISC_CMD。
由于MT_dialog
你好,我在论坛上发现一个用户发布了他对一个SPS主机项目的修改:https://support.dialog-semiconductor.com/da14580-central-connection-two-..。
我修改它以启用任务扫描模式,并成功连接到我的自定义外围设备。这就是我现在感到震惊的地方:
Void user_on_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param){const uint8_t * p_addr;Static uint8_t count =0;arch_printf(“user_on_connection \ r \ n”);如果(app_env [connection_idx]。conidx ! = GAP_INVALID_CONIDX){p_addr = & (param - > peer_addr.addr [0]);app_easy_timer_cancel (connection_timer);//app_prf_enable (param - > conhdl);user_gattc_exc_mtu_cmd (connection_idx);//
arch_printf(“连接% 02 x % 02 x, x % 02, % 02 x % 2 x, x % 02 \ r \ n”,p_addr [5], p_addr [4], p_addr [3], p_addr [2], p_addr [1], p_addr [0]);
是否可以在没有服务发现的情况下发出gattc_read_by_uuid命令?因为自定义特征UUID是已知且固定的(它是长特征- 400字节固定长度)如果是,你能帮我看一下代码的例子吗?
gattc_read_by_uuid命令的使用是为了阅读特点的服务器不知道准确的处理特点和通过提供UUID和服务的开始和结束处理,包括特征与已知的UUID,如果你还没有做任何服务发现、如何知道包含特征的服务的开始和结束句柄?你会静态地做吗?此外,执行发现还检查您在每个特征中拥有的权限,因此,如果您在不知道该特征具有何种权限的情况下读取特征,设备将返回一个错误。无论如何,可以阅读特点的价值,只要你事先知道UUID的特点,最后,开始处理包括个性化的服务,当然如果特征确实是可读的(如果它不是一个错误返回)。关于你想要的例子,你检查以下代码:
void prf_readByUuid_char_send(struct prf_con_info* con_info, uint16_t shdl, uint16_t ehdl, uint16_t valhdl){Uint8_t sps_server_tx[16] = {0xb9, 0x5c, 0x49, 0xd2, 0x04, 0xa3, 0x40, 0x71, 0xa0, 0xb5, 0x35, 0x85, 0x3e, 0xb0, 0x83, 0x07};/ /一个可读的特征struct gattc_read_cmd * req = KE_MSG_ALLOC_DYN(gattc_read_cmd, KE_BUILD_ID(TASK_GATTC, con_info->conidx),con_info - > prf_id、gattc_read_cmd GATT_UUID_128_LEN);/ /请求类型申请- > req_type = GATTC_READ_BY_UUID;申请- > req.by_uuid。start_hdl = shdl;//预先知道这两个值申请- > req.by_uuid。end_hdl = ehdl;申请- > req.by_uuid。uuid_len = GATT_UUID_128_LEN;memcpy(请求- > req.by_uuid。uuid、sps_server_tx GATT_UUID_128_LEN);
//向GATT发送请求ke_msg_send(要求的);}
你好,我导入prf_readByUuid_char_send到prf_utils_128.c,那么在user_on_connection中正确的使用方式是什么呢?你能告诉我如何使用这个函数,例如打印特征值或错误信息吗?
谢谢!
上面的实现只是一个教授的概念,你可以做你在之前的帖子中要求的事情,我所做的只是使用了DSPS主机示例,并注释掉了启用配置文件中的发现过程。因此,剩下的代码刚刚完成了spsc_env的设置,然后我就可以发出上面的命令了。
所以你可以在不执行发现过程的情况下启用你的自定义设备,在连接(填写配置文件作为需求方的环境),然后使结束后(user_sps_client_enable_cfm_handler()或您的自定义支持确认处理程序)就可以使用函数为了阅读我上面贴一个特征(您必须更改你想读的UUID,处理范围)。在发送了读取命令之后,当命令完成时,堆栈将用GATTC_CMP_EVT进行应答,当属性已被读取时,堆栈将用GATTC_READ_IND进行应答(检查RW-BLE-GATT-IS.pdf)。你应该能够抓住这些消息在user_catch_rest_hndl回调(需求方修改这个回调user_process_catch)如果你想做这个需求方我假设您可以添加一些sps_client_task.c文件中的消息和处理程序的全局变量定义部分例如您可以添加您还可以添加一些额外的代码来处理sps_client_default_state[]常量中的gattc_cmp_evt_handler()中的GATTC_CMP_EVT。
嗨hssmltd,
annihilate没有其他中心的例子,对于需求方的复杂性,我相信,最复杂的部分的例子是数据的操作(循环缓冲区,起床和睡觉下降过程取决于缓冲区中的数据)和应用程序作为一个中央。本质上,一个中心应用程序需要扫描,当发现一个有效的设备发出时,应该发出一个连接请求(我认为这是相当直接的,让我知道如果需要任何关于这方面的quidance)。建立连接后中央与发现过程应该开始(我想这是最迷惑你的一部分,如果我错了请纠正我),这个过程相当复杂,不是很难的需求方(也许它增加了一些复杂性自设备验证发现的服务)。因此,如果您需要对这个过程有任何了解,可以查看RW-BLE-GATT-IS.pdf,它记录了中央服务器为了发现位于中央的服务而应该执行的命令(请参阅4.4段服务发现)。如果发现确实是难以理解的部分你可以开始解码需求方主机例子通过检查user_sps_enable()函数,这使函数会发送一个SPS_CLIENT_ENABLE_REQ消息和相应的处理程序(sps_client_enable_req_handler())将会得到调用,处理程序将检查连接的有效性,然后发现过程将开始通过prf_disc_svc_send128() api函数发送GATTC_DISC_CMD。
由于MT_dialog
你好,
我在论坛上发现一个用户发布了他对一个SPS主机项目的修改:
https://support.dialog-semiconductor.com/da14580-central-connection-two-..。
我修改它以启用任务扫描模式,并成功连接到我的自定义外围设备。
这就是我现在感到震惊的地方:
Void user_on_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param)
{
const uint8_t * p_addr;
Static uint8_t count =0;
arch_printf(“user_on_connection \ r \ n”);
如果(app_env [connection_idx]。conidx ! = GAP_INVALID_CONIDX)
{
p_addr = & (param - > peer_addr.addr [0]);
app_easy_timer_cancel (connection_timer);
//
app_prf_enable (param - > conhdl);
user_gattc_exc_mtu_cmd (connection_idx);
//
arch_printf(“连接% 02 x % 02 x, x % 02, % 02 x % 2 x, x % 02 \ r \ n”,
p_addr [5], p_addr [4], p_addr [3], p_addr [2], p_addr [1], p_addr [0]);
是否可以在没有服务发现的情况下发出gattc_read_by_uuid命令?因为自定义特征UUID是已知且固定的(它是长特征- 400字节固定长度)
如果是,你能帮我看一下代码的例子吗?
嗨hssmltd,
gattc_read_by_uuid命令的使用是为了阅读特点的服务器不知道准确的处理特点和通过提供UUID和服务的开始和结束处理,包括特征与已知的UUID,如果你还没有做任何服务发现、如何知道包含特征的服务的开始和结束句柄?你会静态地做吗?此外,执行发现还检查您在每个特征中拥有的权限,因此,如果您在不知道该特征具有何种权限的情况下读取特征,设备将返回一个错误。无论如何,可以阅读特点的价值,只要你事先知道UUID的特点,最后,开始处理包括个性化的服务,当然如果特征确实是可读的(如果它不是一个错误返回)。关于你想要的例子,你检查以下代码:
void prf_readByUuid_char_send(struct prf_con_info* con_info, uint16_t shdl, uint16_t ehdl, uint16_t valhdl)
{
Uint8_t sps_server_tx[16] = {0xb9, 0x5c, 0x49, 0xd2, 0x04, 0xa3, 0x40, 0x71, 0xa0, 0xb5, 0x35, 0x85, 0x3e, 0xb0, 0x83, 0x07};/ /一个可读的特征
struct gattc_read_cmd * req = KE_MSG_ALLOC_DYN(gattc_read_cmd, KE_BUILD_ID(TASK_GATTC, con_info->conidx),
con_info - > prf_id、gattc_read_cmd GATT_UUID_128_LEN);
/ /请求类型
申请- > req_type = GATTC_READ_BY_UUID;
申请- > req.by_uuid。start_hdl = shdl;//预先知道这两个值
申请- > req.by_uuid。end_hdl = ehdl;
申请- > req.by_uuid。uuid_len = GATT_UUID_128_LEN;
memcpy(请求- > req.by_uuid。uuid、sps_server_tx GATT_UUID_128_LEN);
//向GATT发送请求
ke_msg_send(要求的);
}
由于MT_dialog
你好,
我导入prf_readByUuid_char_send到prf_utils_128.c,
那么在user_on_connection中正确的使用方式是什么呢?
你能告诉我如何使用这个函数,例如打印特征值或错误信息吗?
谢谢!
嗨hssmltd,
上面的实现只是一个教授的概念,你可以做你在之前的帖子中要求的事情,我所做的只是使用了DSPS主机示例,并注释掉了启用配置文件中的发现过程。因此,剩下的代码刚刚完成了spsc_env的设置,然后我就可以发出上面的命令了。
所以你可以在不执行发现过程的情况下启用你的自定义设备,在连接(填写配置文件作为需求方的环境),然后使结束后(user_sps_client_enable_cfm_handler()或您的自定义支持确认处理程序)就可以使用函数为了阅读我上面贴一个特征(您必须更改你想读的UUID,处理范围)。在发送了读取命令之后,当命令完成时,堆栈将用GATTC_CMP_EVT进行应答,当属性已被读取时,堆栈将用GATTC_READ_IND进行应答(检查RW-BLE-GATT-IS.pdf)。你应该能够抓住这些消息在user_catch_rest_hndl回调(需求方修改这个回调user_process_catch)如果你想做这个需求方我假设您可以添加一些sps_client_task.c文件中的消息和处理程序的全局变量定义部分例如您可以添加您还可以添加一些额外的代码来处理sps_client_default_state[]常量中的gattc_cmp_evt_handler()中的GATTC_CMP_EVT。
由于MT_dialog