跳转到主要内容

DWS消息从中央控制物联网MSK DA14585

DA14585

1年前

发布的hwidvorakinfo0点 10个回答
0的问题

亲爱的对话yabo国际娱乐框半导体,

我经历了教程部分“training_03_custom_profile_gatt_cmd_example_v1.2”现在我能够控制我的物联网MSK DA14585 LightBlue从iOS应用。

1。连接到物联网- 585设备

2。选择UUID wrbl_dws_control_char 2 ea7 -…-2409

3所示。写0 x17的数量使LED闪烁或0 x18停止闪烁

现在我需要实现这个GATTC消息发送设备定制的FW基于主动扫描器的例子。

1。我可以扫描设备

2。我可以看到物联网- 585设备

3所示。我可以成功连接到物联网- 585

4所示。我不知道如何发出消息包。

你能帮我指着另一个主题或一个信息来源吗?

谢谢你,彼得

1年前

PM_Dialog

嗨hwidvorakinfo,

你实现一个自定义服务的MSK的项目吗?

> > > >我不知道如何发出消息包。

我假设您想编写一个特征构成了MSK的手机。这是你想写的特点?

谢谢,PM_DIalog

1年前

hwidvorakinfo 0点

你好PM_dialog,

请让我解释一下目前的情况。

1。我使用MSK的MSK装备有最初的弗兰克-威廉姆斯(外围角色)

2。我开发一个定制的中央弗兰克-威廉姆斯设备基于DA14585(核心作用,能够扫描和连接到外围,user_on_connection回调工作)

3所示。我在发现功能找到外围服务和特征与特定的UUID

我在这里经历了很多话题(包括RW-BLE-GATT-IS文档大约3倍),但很多次提到需求方的项目是令人困惑的我。struct spsc_env_tag数据结构对我来说是一个奇迹,因为它是需求方具体项目的事情。

请纠正我如果我错了:

1。我需要得到一个处理UUID的特点我知道(MSK的弗兰克-威廉姆斯wrbl_dws_control_char,)

2。然后发出消息只有单一的数据字节0 x17开始LED闪烁或0 x18停止闪烁

现在我有:

空白user_on_connection (uint8_t connection_idx, struct gapc_connection_req_ind const * param) {arch_printf (“\ r \ nDevice连接。”);app_prf_enable (param - > conhdl);struct dws_env_tag * dws_env = PRF_ENV_GET (DWS DWS);prf_disc_svc_send_128 (&dws_env - > prf_env connection_idx (const uint8_t *) DWS_CONTROL_UUID);}静态int gattc_disc_svc_ind_handler (ke_msg_id_t const是否,struct gattc_disc_svc_ind const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id){/ /得到环境结构体的地址dws_env_tag * dws_env = PRF_ENV_GET (DWS DWS);/ /即使我们得到多个反应我们只存储1范围dws_env - > shdl =参数- > start_hdl;dws_env - > ehdl =参数- > end_hdl;dws_env - > nb_svc + +;返回(KE_MSG_CONSUMED);}静态int gattc_disc_char_ind_handler (ke_msg_id_t const是否,struct gattc_disc_char_ind const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id){/ /得到环境结构体的地址dws_env_tag * dws_env = PRF_ENV_GET (DWS DWS); //prf_search_chars_128(dws_env->ehdl, 1, &spsc_env->sps.chars[0], &spsc_sps_char[0], param, &spsc_env->last_char_code); return (KE_MSG_CONSUMED); }

我有一个断点设置在两个以上处理程序,但代码不转动。这是为什么呢?

切赫

1年前

hwidvorakinfo 0点

好的,我会尽量简短而清晰:

1。函数user_spsc_enable SPS_CLIENT角色()是一个处理程序:

#如果(BLE_SPS_CLIENT) {TASK_ID_SPS_CLIENT、user_spsc_create_db user_spsc_enable}, # endif

2。这是user_spsc_enable()身体:

空白user_spsc_enable (uint8_t conidx) {struct sps_client_enable_req *要求= KE_MSG_ALLOC (sps_client_enable_req, prf_get_task_from_id (TASK_ID_SPS_CLIENT) TASK_APP, sps_client_enable_req);/ /填写参数结构要求- > conidx = conidx;申请- > con_type = PRF_CON_DISCOVERY;/ /发送消息arch_printf (“SPSC使\ r \ n”);ke_msg_send(要求的);}

什么是我开始的步骤和完成发现过程不使用SPS_CLIENT作用?请帮我列出来。

1年前

PM_Dialog

嗨hwidvorakinfo

DA14585 MSK的是我们的支持网站上提供支持。你说正确,DA14585在外围配置作用。你配置它在中央模式吗?

谢谢,PM_Dialog

1年前

hwidvorakinfo 0点

你好PM_dialog,

请让我解释一下目前的情况:

事实:

1。我使用MSK的MSK装备有最初的弗兰克-威廉姆斯(外围角色)

2。我开发一个定制的中央为我的另一个设备基于DA14585弗兰克-威廉姆斯(核心作用,能够扫描和连接到外围,user_on_connection回调工作)

3所示。我在发现功能找到外围服务和特征与特定的UUID

我的问题:

1。函数user_spsc_enable SPS_CLIENT角色()是一个处理程序:

#如果(BLE_SPS_CLIENT) {TASK_ID_SPS_CLIENT、user_spsc_create_db user_spsc_enable}, # endif

2。这是user_spsc_enable()身体:

空白user_spsc_enable (uint8_t conidx) {struct sps_client_enable_req *要求= KE_MSG_ALLOC (sps_client_enable_req, prf_get_task_from_id (TASK_ID_SPS_CLIENT) TASK_APP, sps_client_enable_req);/ /填写参数结构要求- > conidx = conidx;申请- > con_type = PRF_CON_DISCOVERY;/ /发送消息arch_printf (“SPSC使\ r \ n”);ke_msg_send(要求的);}

什么是我开始的步骤和完成发现过程不使用SPS_CLIENT作用?请帮我列出来。

1年前

hwidvorakinfo 0点

亲爱的PM_dialog,

我最近进展,我想问您的审查状态描述如下。我的目标是发现DWS外围服务UUID DWS_CONTROL_UUID ({0 x09, 0 x24 0 x40 0 x3f, 0 x18 0 x26 0 x97 0 xb0 0 xbb 0 x44 0 x44 0 x7d 0 x70、0 x89 0 xa7}表示就是0 x2e) MSK中定义。

1。增加了一个新的prf_func回调。enum KE_API_ID TASK_ID_DWS_CLIENT是一个新的项目:

const struct prf_func_callbacks prf_funcs [] = {。#如果(BLE_DWS_CLIENT) {TASK_ID_DWS_CLIENT、user_dws_client_create_db user_dws_client_enable}, # endif。}

2。user_dws_client_create_db()基本上是一个消息触发函数有以下内容:

申请- >操作= GAPM_PROFILE_TASK_ADD;申请- > sec_lvl = get_user_prf_srv_perm (TASK_ID_DWS_CLIENT);申请- > prf_task_id = TASK_ID_DWS_CLIENT;申请- > app_task = TASK_APP;申请- > start_hdl = 0;

3所示。user_dws_client_enable()是一个衍生物的user_spsc_enable需求方项目的()函数。函数应该触发DWS_CLIENT_ENABLE_REQ信息:

空白user_dws_client_enable (uint8_t conidx) {struct dws_enable_req *要求= KE_MSG_ALLOC (DWS_CLIENT_ENABLE_REQ, prf_get_task_from_id (TASK_ID_DWS_CLIENT) TASK_APP, dws_enable_req);/ /填写参数结构要求- > conidx = conidx;申请- > con_type = PRF_CON_DISCOVERY;/ /发送消息arch_printf(“启用\ r \ nDWS客户”);ke_msg_send(要求的);}

4所示。DWS_CLIENT_ENABLE_REQ处理程序中定义:

const struct ke_msg_handler dws_client_default_state [] = {{GATTC_DISC_SVC_IND, (ke_msg_func_t) dws_client_disc_svc_ind_handler}, / /一旦发现服务{DWS_CLIENT_ENABLE_REQ, (ke_msg_func_t) dws_client_enable_req_handler}, {GATTC_CMP_EVT, (ke_msg_func_t) dws_client_cmp_evt_handler}, / /命令结束后{DWS_CLIENT_DATA_TX_REQ, (ke_msg_func_t) dws_client_data_tx_req_handler}};

5。dws_client_enable_req_handler发行一个GATTC_DISC_BY_UUID_SVC GATTC_DISC_CMD参数,这个命令应该发现对应的服务所需的DWS_CONTROL_UUID的UUID

静态int dws_client_enable_req_handler (ke_msg_id_t const是否,struct dws_enable_req const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id) {/ / DWS客户机的角色任务环境结构dws_client_env_tag * dws_env = PRF_ENV_GET (DWS_CLIENT DWS_CLIENT);如果(param - > con_type = = PRF_CON_DISCOVERY){/ /开始发现DWS同行uint8_t dws_control_service_uuid [] = DWS_CONTROL_UUID;dws_env - > last_uuid_req = ATT_DECL_PRIMARY_SERVICE;memcpy (dws_env - > last_svc_req、dws_control_service_uuid ATT_UUID_128_LEN);挥发性uint8_t conidx = KE_IDX_GET (dest_id);prf_disc_svc_send_128 (&dws_env - > prf_env、conidx dws_env - > last_svc_req);/ /设置状态发现ke_state_set (dest_id DWS_CLIENT_DISCOVERING);}arch_printf (“\ r \ nDWS服务发现”);返回(KE_MSG_CONSUMED);}

6。这里的问题是代码的dws_client_cmp_evt_handler与状态= = ATT_ERR_ATTRIBUTE_NOT_FOUND处理= = 0开始:

如果(状态= = DWS_CLIENT_DISCOVERING) {arch_printf (“\ r \ nDWS发现处理程序”);如果((param - >状态= = ATT_ERR_ATTRIBUTE_NOT_FOUND) | | (param - >状态= = ATT_ERR_NO_ERROR)){/ /目前发现sps_server服务uint8_t dws_service_uuid [] = DWS_CONTROL_UUID;如果(!memcmp (dws_client_env - > last_svc_req、dws_service_uuid ATT_UUID_128_LEN)){如果(dws_client_env - > last_uuid_req = = ATT_DECL_PRIMARY_SERVICE)如果(dws_client_env - > dcs.svc {。shdl = = ATT_INVALID_HANDLE)这里< < < < < < < < < < < < < < < <{/ /停止发现过程。dws_client_enable_cfm_send (dws_client_env conidx PRF_ERR_STOP_DISC_CHAR_MISSING);}

我确信UUID发现参数是正确的。

这种行为的原因可能是什么?

1年前

hwidvorakinfo 0点

请描述之间的关系定义在user_dws_config MSK的特征。h和我中心的数据结构代码从需求方:

/ / /状态机用于检索DWS客户特征信息const struct prf_char_def_128 dws_client_char [DWS_CLIENT_CHAR_MAX] = {[DWS_CLIENT_CONTROL_CHAR] = {DWS_CONTROL_UUID、ATT_MANDATORY ATT_CHAR_PROP_RD | ATT_CHAR_PROP_NTF | ATT_CHAR_PROP_WR_NO_RESP} / /原始SPSC: / / [SPSC_SRV_TX_DATA_CHAR] = {SPS_SERVER_TX_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, / / [SPSC_SRV_RX_DATA_CHAR] = {SPS_SERVER_RX_UUID、ATT_MANDATORY ATT_CHAR_PROP_WR_NO_RESP}, / / [SPSC_FLOW_CTRL_CHAR] = {SPS_FLOW_CTRL_UUID、ATT_MANDATORY ATT_CHAR_PROP_RD | ATT_CHAR_PROP_NTF | ATT_CHAR_PROP_WR_NO_RESP}};/ / /状态机用于检索DWS客户服务特征描述信息const struct prf_char_desc_def dws_client_char_desc [DWS_CLIENT_DESC_MAX] = {/ / / DWS客户机配置[DWS_CLIENT_CONTROL_CLI_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_CONTROL_CHAR}, / /原始SPS客户机配置:/ / [SPSC_SRV_TX_DATA_CLI_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY SPSC_SRV_TX_DATA_CHAR}, / / [SPSC_FLOW_CTRL_CLI_CFG] = {ATT_DESC_CLIENT_CHAR_CFG, ATT_MANDATORY, SPSC_FLOW_CTRL_CHAR}};/ / / DWS客户服务特点enum {DWS_CLIENT_CONTROL_CHAR = 0, DWS_CLIENT_CHAR_MAX};/ / / DWS客户服务特征描述符enum {/ / / DWS客户机配置DWS_CLIENT_CONTROL_CLI_CFG、DWS_CLIENT_DESC_MAX};

接受答案!

1年前

hwidvorakinfo 0点

好吧,我设法设置,我想:

1。从我定制的PCB DA14585 FW连接与股票FW MSK的设备物联网- 585

2。发现的MSK设备服务和特色

3所示。发送CMD = 0 x17开始MSK的LED闪烁和发送CMD = 0 x18停止MSK的LED闪烁

这里描述的步骤和重要的项目上面描述:

答:扫描

空白user_scan_start (void) {scan_start ();user_scan_stop scan_timer = app_easy_timer (1000);}

scan_start()函数:

空白scan_start (void) {struct gapm_start_scan_cmd * cmd = KE_MSG_ALLOC (gapm_start_scan_cmd, TASK_GAPM, TASK_APP gapm_start_scan_cmd);user_clear_devices ();cmd - > op。代码= GAPM_SCAN_ACTIVE;cmd - > op。addr_src = GAPM_STATIC_ADDR;cmd - >间隔= 15;/ / 600;cmd窗口- > = 5;/ / 400; cmd->mode = GAP_GEN_DISCOVERY; cmd->filt_policy = SCAN_ALLOW_ADV_ALL; cmd->filter_duplic = SCAN_FILT_DUPLIC_EN; ke_msg_send(cmd); is_scanning = true; ke_state_set(TASK_APP, APP_CONNECTABLE); }

user_scan_stop () app_easy_timer处理程序:

空白user_scan_stop (void) {app_easy_gap_advertise_stop ();/ /停止扫描is_scanning = false;for (int i = 0;我< device_count;我+ +){user_print_device (scanned_devices[我]);}arch_printf (“\ r \ nScan完成了!”);user_choose_device scan_timer = app_easy_timer (50);}

b连接

user_choose_device app_easy_timer夹头:

空白user_choose_device (void) {wdg_freeze ();arch_printf (“\ r \ nTrying连接到物联网- 585…”);/ /找到物联网- 585设备列表中发现设备uint8_t我;uint8_t发现= 0;(我= 0;我< device_count;我+ +){((scanned_devices[我].device_name[0] = =“我”)& & (scanned_devices[我].device_name [1] = = ' o ')){发现= 1;打破;如果(发现)}}{user_connect_to_device (scanned_devices[我]);}swclock_init (); }

user_connect_to_device功能:

空白user_connect_to_device (struct adv_device设备){wdg_resume ();arch_printf (" \ r \ nConnecting ");user_print_device_name(设备);arch_printf_flush ();app_easy_gap_start_connection_to_set(设备。adv_addr_type (uint8_t *) & (device.adv_addr) MS_TO_DOUBLESLOTS (30));app_easy_gap_start_connection_to ();}

user_on_connection回调:

空白user_on_connection (uint8_t connection_idx, struct gapc_connection_req_ind const * param) {arch_printf (“\ r \ nDevice连接”);app_prf_enable (param - > conhdl);/ /调用所有注册函数prf_func, custs_prf_func和user_prf_func}

prf_func_callbacks app.c中定义:

const struct prf_func_callbacks prf_funcs [] = {{TASK_ID_DWS_CLIENT、user_dws_client_create_db user_dws_client_enable}, {TASK_ID_INVALID,空,空},/ /不会移动。必须始终};

user_dws_client_create_db功能:

空白user_dws_client_create_db (void) {struct gapm_profile_task_add_cmd *要求= KE_MSG_ALLOC_DYN (gapm_profile_task_add_cmd、TASK_GAPM TASK_APP, gapm_profile_task_add_cmd, sizeof (struct dws_db_cfg));/ /填充消息请求- >操作= GAPM_PROFILE_TASK_ADD;申请- > sec_lvl = get_user_prf_srv_perm (TASK_ID_DWS_CLIENT);申请- > prf_task_id = TASK_ID_DWS_CLIENT;申请- > app_task = TASK_APP;申请- > start_hdl = 0;/ /设置配置参数,以供将来使用结构体dws_db_cfg * db_cfg = (struct dws_db_cfg *)请求- >参数;db_cfg - >特性= 0;/ /发送消息ke_msg_send(要求的);}

user_dws_client_enable功能:

空白user_dws_client_enable (uint8_t conidx) {struct dws_enable_req *要求= KE_MSG_ALLOC (DWS_CLIENT_ENABLE_REQ, prf_get_task_from_id (TASK_ID_DWS_CLIENT) TASK_APP, dws_enable_req);/ /填写参数结构要求- > conidx = conidx;申请- > con_type = PRF_CON_DISCOVERY;/ /发送消息arch_printf(“启用\ r \ nDWS客户”);ke_msg_send(要求的);}

default_state_handlers:

const struct ke_msg_handler dws_client_default_state [] = {{GATTC_EVENT_IND, (ke_msg_func_t) dws_client_event_ind_handler}, {GATTC_DISC_CHAR_IND, (ke_msg_func_t) dws_client_disc_char_ind_handler}, {GATTC_DISC_SVC_IND, (ke_msg_func_t) dws_client_disc_svc_ind_handler}, / /一旦发现服务{GATTC_DISC_CHAR_DESC_IND, (ke_msg_func_t) dws_client_disc_char_desc_ind_handler}, {DWS_CLIENT_ENABLE_REQ, (ke_msg_func_t) dws_client_enable_req_handler}, {GATTC_CMP_EVT, (ke_msg_func_t) dws_client_cmp_evt_handler}, / /命令结束后{DWS_CLIENT_DATA_TX_REQ, (ke_msg_func_t) dws_client_data_tx_req_handler}};

dws_client_enable_req_handler:

静态int dws_client_enable_req_handler (ke_msg_id_t const是否,struct dws_enable_req const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id) {/ / DWS客户机的角色任务环境结构dws_client_env_tag * dws_env = PRF_ENV_GET (DWS_CLIENT DWS_CLIENT);如果(param - > con_type = = PRF_CON_DISCOVERY){/ /开始发现DWS同行uint8_t dws_control_service_uuid [] = DWS_SVC_UUID; / / DWS_SVC_UUID;/ / DWS_CONTROL_UUID;dws_env - > last_uuid_req = ATT_DECL_PRIMARY_SERVICE; / / ATT_DECL_CHARACTERISTIC; / / ATT_DECL_PRIMARY_SERVICE;memcpy (dws_env - > last_svc_req、dws_control_service_uuid ATT_UUID_128_LEN);挥发性uint8_t conidx = KE_IDX_GET (dest_id);prf_disc_svc_send_128 (&dws_env - > prf_env、conidx dws_env - > last_svc_req);/ /设置状态发现ke_state_set (dest_id DWS_CLIENT_DISCOVERING);}arch_printf (“\ r \ nDWS服务发现”);返回(KE_MSG_CONSUMED); }

dws_client_cmp_evt_handler:

静态int dws_client_cmp_evt_handler (ke_msg_id_t const是否,struct gattc_cmp_evt const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id) {uint8_t状态= ke_state_get (dest_id);uint8_t conidx = KE_IDX_GET (dest_id);/ /得到的地址环境结构dws_client_env_tag * dws_client_env = PRF_ENV_GET (DWS_CLIENT DWS_CLIENT);uint8_t状态;如果(状态= = DWS_CLIENT_DISCOVERING) {arch_printf (“\ r \ nDWS发现处理程序”);如果((param - >状态= = ATT_ERR_ATTRIBUTE_NOT_FOUND) | | (param - >状态= = ATT_ERR_NO_ERROR)){/ /目前发现sps_server服务uint8_t dws_service_uuid [] = DWS_SVC_UUID; / / DWS_SVC_UUID;/ / DWS_CONTROL_UUID;如果(!memcmp (dws_client_env - > last_svc_req、dws_service_uuid ATT_UUID_128_LEN)){如果(dws_client_env - > last_uuid_req = = ATT_DECL_PRIMARY_SERVICE)如果(dws_client_env - > dcs.svc {。shdl = = ATT_INVALID_HANDLE){/ /停止的发现过程。dws_client_enable_cfm_send (dws_client_env conidx PRF_ERR_STOP_DISC_CHAR_MISSING); } // Too many services found only one such service should exist else if(dws_client_env->nb_svc > 1) { // stop discovery procedure. dws_client_enable_cfm_send(dws_client_env, conidx, PRF_ERR_MULTIPLE_SVC); } else { // Discover DWS Client Device characteristics prf_disc_char_all_send(&(dws_client_env->prf_env), conidx, &(dws_client_env->dcs.svc)); // Keep last UUID requested and for which service in env dws_client_env->last_uuid_req = ATT_DECL_CHARACTERISTIC; } } else if (dws_client_env->last_uuid_req == ATT_DECL_CHARACTERISTIC) { status = prf_check_svc_char_validity_128(DWS_CLIENT_CHAR_MAX, dws_client_env->dcs.chars, dws_client_char); // Check for characteristic properties. if (status == ATT_ERR_NO_ERROR) { dws_client_env->last_uuid_req = ATT_INVALID_HANDLE; dws_client_env->last_char_code = dws_client_char_desc[ATT_DESC_CLIENT_CHAR_CFG].char_code; //Discover characteristic descriptor prf_disc_char_desc_send(&(dws_client_env->prf_env), conidx, &(dws_client_env->dcs.chars[dws_client_env->last_char_code])); } else { // Stop discovery procedure. dws_client_enable_cfm_send(dws_client_env, conidx, status); } } else //Descriptors { //Get code of next char. having descriptors dws_client_env->last_char_code = dws_get_next_desc_char_code(dws_client_env, &dws_client_char_desc[0]); if (dws_client_env->last_char_code != DWS_CLIENT_CHAR_MAX) { prf_disc_char_desc_send(&(dws_client_env->prf_env), conidx, &(dws_client_env->dcs.chars[dws_client_env->last_char_code])); } else { status = prf_check_svc_char_desc_validity(DWS_CLIENT_DESC_MAX, dws_client_env->dcs.descs, dws_client_char_desc, dws_client_env->dcs.chars); dws_client_env->nb_svc = 0; dws_client_enable_cfm_send(dws_client_env, conidx, status); } } } } else { dws_client_enable_cfm_send(dws_client_env, conidx, param->status); } } else if (state == DWS_CLIENT_CONNECTED) { if(param->operation == GATTC_WRITE_NO_RESPONSE) { arch_printf("\r\nDWS no response"); } } return (KE_MSG_CONSUMED); }

dws_client_event_ind_handler:

静态int dws_client_event_ind_handler (ke_msg_id_t const是否,struct gattc_event_ind const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id) {struct dws_client_env_tag * dws_env = PRF_ENV_GET (DWS_CLIENT DWS_CLIENT);/ /如果处理特定的特征(dws_env - > dcs.chars [DWS_CLIENT_CONTROL_CHAR]。val_hdl = =参数- >处理){}else if (dws_env - > dcs.chars [DWS_CLIENT_CONTROL_REPLY_CHAR]。val_hdl = =参数- >处理){}返回(KE_MSG_CONSUMED);}

dws_client_disc_char_ind_handler:

静态int dws_client_disc_char_ind_handler (ke_msg_id_t const是否,struct gattc_disc_char_ind const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id){/ /得到环境结构体的地址dws_client_env_tag * dws_env = PRF_ENV_GET (DWS_CLIENT DWS_CLIENT);prf_search_chars_128 (dws_env - > dcs.svc。ehdl、DWS_CLIENT_CHAR_MAX &dws_env - > dcs。字符[0],&dws_client_char[0],参数,&dws_env - > last_char_code);返回(KE_MSG_CONSUMED);}

dws_client_disc_svc_ind_handler:

静态int dws_client_disc_svc_ind_handler (ke_msg_id_t const是否,struct gattc_disc_svc_ind const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id){/ /得到环境结构体的地址dws_client_env_tag * dws_env = PRF_ENV_GET (DWS_CLIENT DWS_CLIENT);/ /即使我们得到多个反应我们只存储1 dws_env - > dcs.svc范围。shdl =参数- > start_hdl;dws_env - > dcs.svc。ehdl =参数- > end_hdl;dws_env - > nb_svc + +;返回(KE_MSG_CONSUMED);}

dws_client_disc_char_desc_ind_handler:

静态int dws_client_disc_char_desc_ind_handler (ke_msg_id_t const是否,struct gattc_disc_char_desc_ind const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id){/ /得到环境结构体的地址dws_client_env_tag * dws_env = PRF_ENV_GET (DWS_CLIENT DWS_CLIENT);/ /检索SPS描述符prf_search_descs (DWS_CLIENT_DESC_MAX &dws_env - > dcs.descs [0], &dws_client_char_desc[0],参数,dws_env - > last_char_code);返回(KE_MSG_CONSUMED);}

dws_client_data_tx_req_handler:

静态int dws_client_data_tx_req_handler (ke_msg_id_t const是否,struct dws_client_data_tx_req const *参数,ke_task_id_t const dest_id, ke_task_id_t const src_id) {struct dws_client_env_tag * dws_client_env = PRF_ENV_GET (DWS_CLIENT DWS_CLIENT);uint8_t conidx = KE_IDX_GET (dest_id);如果(ke_state_get (KE_BUILD_ID (dws_client_env - > prf_env。prf_task, conidx)) = = DWS_CLIENT_CONNECTED) {{prf_gatt_write (&dws_client_env - > prf_env、conidx dws_client_env - > dcs.chars [DWS_CLIENT_CONTROL_CHAR]。val_hdl (uint8_t *)参数- >数据,sizeof (uint8_t) *参数- > data_length, GATTC_WRITE);返回(KE_MSG_NO_FREE);}}返回(KE_MSG_CONSUMED);}

BLE数据发送程序:

静态uint8_t数据= 0 x17;如果(central_is_connected () = = DWS_CLIENT_CONNECTED) {user_send_ble_data ((uint8_t *)与数据,1);arch_printf (“\ r \ nCMD送% d”数据);data = = = 0 x17)(数据?0 x18: 0 x17;}

user_send_ble_data功能:

空白user_send_ble_data (const uint8_t *数据,uint16_t长度){struct dws_client_data_tx_req *要求= KE_MSG_ALLOC_DYN (dws_client_data_tx_req, prf_get_task_from_id (TASK_ID_DWS_CLIENT) TASK_APP, dws_client_data_tx_req,长度);申请- > data_length =长度;memcpy(要求[0]- >数据,数据长度);ke_msg_send(要求的);}

c .特点:

const struct prf_char_def_128 dws_client_char [DWS_CLIENT_CHAR_MAX] = {[DWS_CLIENT_ACCEL_CHAR] = {DWS_ACCEL_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, [DWS_CLIENT_GYRO_CHAR] = {DWS_GYRO_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, [DWS_CLIENT_MAG_CHAR] = {DWS_MAG_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, [DWS_CLIENT_BARO_CHAR] = {DWS_BARO_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, [DWS_CLIENT_HUM_CHAR] = {DWS_HUM_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, [DWS_CLIENT_TEMP_CHAR] = {DWS_TEMP_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, [DWS_CLIENT_SENSF_CHAR] = {DWS_SENSF_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, [DWS_CLIENT_FEAT_CHAR] = {DWS_FEAT_UUID、ATT_MANDATORY ATT_CHAR_PROP_RD}, [DWS_CLIENT_CONTROL_CHAR] = {DWS_CONTROL_UUID、ATT_MANDATORY ATT_CHAR_PROP_WR}, [DWS_CLIENT_CONTROL_REPLY_CHAR] = {DWS_CONTROL_REPLY_UUID、ATT_MANDATORY ATT_CHAR_PROP_NTF}, (DWS_CLIENT_MULTI_SENS_CHAR) = {DWS_MULTI_SENS_UUID, ATT_MANDATORY, ATT_CHAR_PROP_NTF}};const struct prf_char_desc_def dws_client_char_desc [DWS_CLIENT_DESC_MAX] = {/ / / DWS客户机配置[DWS_CLIENT_ACCEL_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_ACCEL_CHAR}, [DWS_CLIENT_GYRO_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_GYRO_CHAR}, [DWS_CLIENT_MAG_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_MAG_CHAR}, [DWS_CLIENT_BARO_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_BARO_CHAR}, [DWS_CLIENT_HUM_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_HUM_CHAR}, [DWS_CLIENT_TEMP_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_TEMP_CHAR}, [DWS_CLIENT_SENSF_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_SENSF_CHAR}, [DWS_CLIENT_CONTROL_REPLY_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG、ATT_MANDATORY DWS_CLIENT_CONTROL_REPLY_CHAR}, (DWS_CLIENT_MULTI_SENS_NTF_CFG) = {ATT_DESC_CLIENT_CHAR_CFG, ATT_MANDATORY, DWS_CLIENT_MULTI_SENS_CHAR}};

d .的数据结构:

struct dws_client_data_tx_req{/ / /连接指数uint16_t conidx;/ / /处理的属性必须是书面uint16_t处理;/ / /数据长度写uint16_t data_length;/ / /数据写在属性数据库uint8_t数据[1];/ / [__ARRAY_EMPTY];};
struct dws_client_env_tag{/ / /配置环境prf_env_t prf_env;/ / /服务开始处理uint16_t shdl;/ / /存储DB最大数量的属性uint8_t max_nb_att;/ / /正在进行的操作结构ke_msg *操作;/ / /连接用于通知同行设备上的光标uint8_t光标;/ / / CCC处理索引,用于通知/显示忙碌状态uint8_t ccc_idx;/ / /的值列表设置的应用程序结构co_list值;/ / / CUSTS1任务状态ke_state_t状态(DWS_IDX_MAX);/ / / / / /配置文件连接信息最后请求UUID(跟踪两个服务和字符)uint16_t last_uuid_req;/ / /最后服务的东西被发现uint8_t last_svc_req [ATT_UUID_128_LEN]; /// Last char. code requested to read. uint8_t last_char_code; /// counter used to check service uniqueness uint8_t nb_svc; /// DWS Client Service Device Service information recovered from discovery struct dws_client_content dcs; }; struct spsc_db_cfg { ///Database configuration uint16_t features; };
struct adv_device {uint8_t指数;/ / /指数的多个广告设备uint8_t evt_type;/ / /事件类型:uint8_t adv_addr_type;/ / /广告地址类型:公共/随机结构bd_addr adv_addr;/ / /广告地址值uint8_t device_name_len;/ /广告/数据长度数据包uint8_t device_name [ADV_DATA_LEN];/ /广告/数据信息包uint8_t device_spec_len;uint8_t device_spec [ADV_DATA_LEN];uint8_t flags_len;uint8_t旗帜(ADV_DATA_LEN); uint8_t services[4]; uint8_t uuid_len; uint8_t uuid[ADV_DATA_LEN]; uint8_t uuid_sol_len; uint8_t uuid_sol[ADV_DATA_LEN]; uint8_t raw_len; uint8_t raw[ADV_DATA_LEN]; int8_t rssi; ///RSSI value for advertising packet }; struct scan_configuration { /// Operation code. uint8_t code; /// Own BD address source of the device uint8_t addr_src; /// Scan interval uint16_t interval; /// Scan window size uint16_t window; /// Scanning mode uint8_t mode; /// Scan filter policy uint8_t filt_policy; /// Scan duplicate filtering policy uint8_t filter_duplic; };
enum{/ / /空闲状态DWS_CLIENT_IDLE, / / / DWS_CLIENT_CONNECTED连接状态,发现DWS_CLIENT_DISCOVERING / / /, / / /定义状态的数目。DWS_CLIENT_STATE_MAX};/ / / DWS客户服务特点enum {/ / / / DWS_CLIENT_ACCEL_CHAR = 0 DWS_CLIENT_GYRO_CHAR DWS_CLIENT_MAG_CHAR, DWS_CLIENT_BARO_CHAR, DWS_CLIENT_HUM_CHAR, DWS_CLIENT_TEMP_CHAR, DWS_CLIENT_SENSF_CHAR, DWS_CLIENT_FEAT_CHAR, DWS_CLIENT_CONTROL_CHAR, DWS_CLIENT_CONTROL_REPLY_CHAR, DWS_CLIENT_MULTI_SENS_CHAR, / / / / DWS_CLIENT_CHAR_MAX};/ / / DWS客户服务特征描述符enum {/ / / DWS客户机配置DWS_CLIENT_ACCEL_NTF_CFG、DWS_CLIENT_GYRO_NTF_CFG DWS_CLIENT_MAG_NTF_CFG, DWS_CLIENT_BARO_NTF_CFG, DWS_CLIENT_HUM_NTF_CFG, DWS_CLIENT_TEMP_NTF_CFG, DWS_CLIENT_SENSF_NTF_CFG, DWS_CLIENT_CONTROL_REPLY_NTF_CFG, DWS_CLIENT_MULTI_SENS_NTF_CFG, / / / DWS_CLIENT_DESC_MAX};/ / / DWS客户端主机API消息enum {/ / / DWS客户角色启用请求的应用程序。DWS_CLIENT_ENABLE_REQ = KE_FIRST_MSG (TASK_ID_DWS_CLIENT) / / / SPS主机角色使确认应用程序。DWS_CLIENT_ENABLE_CFM, / / /请求传输数据DWS_CLIENT_DATA_TX_REQ, / / /确认数据已经发送DWS_CLIENT_DATA_TX_CFM, / / /发送数据应用DWS_CLIENT_DATA_RX_IND, / /发送流量控制状态DWS_CLIENT_RX_FLOW_CTRL_REQ, / / /显示DWS_CLIENT_TX_FLOW_CTRL_IND流控制状态,};/ / /服务信息结构体dws_client_content{/ / /服务信息结构体prf_svc svc;/ / /特征信息:struct prf_char_inf字符[DWS_CLIENT_CHAR_MAX];/ / /特点cfg struct prf_char_desc_inf desc [DWS_CLIENT_DESC_MAX]; };

我相信这将帮助另一个人挣扎在实现一个非常简单的中央设备DA14585弗兰克-威廉姆斯。

你想要我,请联系我在LinkedInhttps://www.linkedin.com/in/petr-dvorak-hw/

1年前

PM_Dialog

嗨,彼得,

如前所述585 - msk是外围,连同适当的硬件。不过,谢谢你的建议和解决方案。我会通过和评估tham。

问候,PM_Dialog

1年前

hwidvorakinfo 0点

你好PM_Dialog,

最新的文章并不是为了任何建议改变585 - msk的项目。我用585 - msk的外围,我说很多次了。我一直为我的自定义开发一个定制的董事会和董事会,我一直在开发一个定制的弗兰克-威廉姆斯。

任何固件为核心作用是非常罕见的例子。只提到项目需求方的项目,一遍又一遍。但它不是那么简单实现核心作用到一个自定义项目。我试图帮助社区。我花了大约两周的时间学习文件和需求方的项目之前,我可以达到我的目标。

切赫