中央向控制物联网MSK DA14585发送的DWS消息

⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在主对话网站中。所有的帖子和账号都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程在//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
11个帖子/ 0个新
最后发表
hwidvorakinfo
离线
最后看到:4个月前2个星期前
加入:2019-10-17 06:49
中央向控制物联网MSK DA14585发送的DWS消息

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

我通过了教程部分“training_03_custom_profile_gatt_cmd_example_v1.2”,现在我能够从iOS应用程序LightBlue控制我的IoT MSK DA14585。

1.连接到IoT-585设备

2.选择wrbl_dws_control_char 2EA7-…-2409的UUID

3.写入0x17使LED闪烁,或写入0x18使LED停止闪烁

现在我需要实现这个GATTC消息从我的设备发送,使用基于活动扫描器示例的定制FW。

1.我可以扫描设备

2.我能看到IoT-585设备

3.我可以成功连接到IoT-585

4.我不知道如何发出一个消息包。

你能帮我指出另一个话题或一个信息源吗?

谢谢你,彼得

设备:
PM_Dialog
离线
最后看到:2周23小时前
工作人员
加入:2018-02-08 11:03
嗨hwidvorakinfo,

嗨hwidvorakinfo,

您是否在MSK项目中实现了自定义服务?

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

我假设你想写一个特征从移动电话到MSK。你想写哪一个特征?

谢谢,PM_DIalog

hwidvorakinfo
离线
最后看到:4个月前2个星期前
加入:2019-10-17 06:49
你好PM_dialog,

你好PM_dialog,

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

1.我使用MSK是,我有MSK工具包与原来的FW在它(外围角色)

2.我正在为我的设备开发一个基于DA14585的定制中央FW(中央角色,能够扫描和连接到外设,user_on_connection回调工作)

3.我正在努力使用一个发现特性,以找到具有特定UUID的外围服务和特征

我在这里浏览了很多主题(包括RW-BLE-GATT-IS文档大约三次),但多次提到的DSPS项目不知为何让我感到困惑。结构spsc_env_tag数据结构对我来说是一个奇迹,因为它是特定于DSPS项目的东西。

如果我说错了,请指正:

1.我需要得到一个处理的特征与UUID我知道(wrbl_ws_control_char这里,从MSK FW)

2.然后发出一个只有单个数据字节的消息0x17来启动LED闪烁或0x18来停止LED闪烁

现在我有:

void user_on_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param) {arch_printf("\r\nDevice connected.");app_prf_enable (param - > conhdl);struct wss_env_tag * ws_env = PRF_ENV_GET(DWS, DWS);prf_disc_svc_send_128(& ds_env ->prf_env, connection_idx, (const uint8_t *) ds_control_uuid);} static int gattc_disc_svc_ind_handler(ke_msg_id_t const msgstr, struct gattc_disc_svc_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id){//获取环境结构的地址ws_env_tag * ws_env = PRF_ENV_GET(DWS, DWS);//即使我们得到多个响应,我们只存储一个范围dss_env ->shdl = param->start_hdl;dws_env - > ehdl =参数- > end_hdl;dws_env - > nb_svc + +;返回(KE_MSG_CONSUMED);} static int gattc_disc_char_ind_handler(ke_msg_id_t const msgstr, struct gattc_disc_char_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id){//获取环境结构的地址ws_env_tag * ws_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); }

我在上面的两个处理程序中都设置了断点,但代码并没有绕过。这是为什么呢?

切赫

hwidvorakinfo
离线
最后看到:4个月前2个星期前
加入:2019-10-17 06:49
好吧,我尽量简短些

好的,我会尽量简单明了:

1.函数user_spsc_enable()是SPS_CLIENT角色的处理程序:

#if (BLE_SPS_CLIENT) {TASK_ID_SPS_CLIENT, user_spsc_create_db, user_spsc_enable}, #endif .使用实例

2.下面是user_spsc_enable()函数体:

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

在不使用SPS_CLIENT角色的情况下,启动和完成发现过程需要哪些步骤?请把它们列出来。

PM_Dialog
离线
最后看到:2周23小时前
工作人员
加入:2018-02-08 11:03
嗨hwidvorakinfo

嗨hwidvorakinfo

DA14585 MSK是我们的支持网站上提供的支持。正如您正确提到的,DA14585是在外围角色中配置的。你把它设置成中央模式了吗?

谢谢,PM_Dialog

hwidvorakinfo
离线
最后看到:4个月前2个星期前
加入:2019-10-17 06:49
你好PM_dialog,

你好PM_dialog,

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

事实:

1.我使用MSK是,我有MSK工具包与原来的FW在它(外围角色)

2.我正在为我的另一个基于DA14585的设备开发一个定制的中央FW(中央角色,能够扫描和连接到外设,user_on_connection回调工作)

3.我正在努力使用一个发现特性,以找到具有特定UUID的外围服务和特征

我的问题:

1.函数user_spsc_enable()是SPS_CLIENT角色的处理程序:

#if (BLE_SPS_CLIENT) {TASK_ID_SPS_CLIENT, user_spsc_create_db, user_spsc_enable}, #endif .使用实例

2.下面是user_spsc_enable()函数体:

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

在不使用SPS_CLIENT角色的情况下,启动和完成发现过程需要哪些步骤?请把它们列出来。

hwidvorakinfo
离线
最后看到:4个月前2个星期前
加入:2019-10-17 06:49
亲爱的PM_dialog,

亲爱的PM_dialog,

我最近进步了一点,我想请您对以下描述的状态进行审查。我的目标是发现在MSK中定义的具有UUID DWS_CONTROL_UUID的DWS周边服务({0x09, 0x24, 0x40, 0x3f, 0x18, 0x26, 0x97, 0xb0, 0xbb, 0x44, 0x44, 0x7d, 0x70, 0x89, 0xa7, 0x2e})。

1.增加了一个新的prf_func回调函数。TASK_ID_DWS_CLIENT是枚举KE_API_ID中的一个新项:

Const struct prf_func_callbacks prf_funcs[] ={…#if (ble_dwws_client) {task_id_dwws_client, user_dwws_client_create_db, user_dwws_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()是DSPS项目的user_spsc_enable()函数的派生。函数应该触发ws_client_enable_req消息:

void user_dwws_client_enable (uint8_t conidx) {struct dwws_enable_req *req = KE_MSG_ALLOC(dwws_client_enable_req,prf_get_task_from_id(task_id_dwws_client),TASK_APP, dwws_enable_req);//填写参数结构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}, //一旦找到服务{dwws_client_enable_req, (ke_msg_func_t) dwws_client_enable_req_handler}, {GATTC_CMP_EVT, (ke_msg_func_t) dwws_client_cmp_evt_handler}, //一旦命令超时{dwws_client_data_tx_req, (ke_msg_func_t) dwws_client_data_tx_req_handler}};

5.当dws_client_enable_req_handler发出带有GATTC_DISC_BY_UUID_SVC参数的GATTC_DISC_CMD时,该命令应该发现与DWS_CONTROL_UUID的期望UUID相对应的服务

static int dwws_client_enable_req_handler (ke_msg_id_t const msgstr,struct dwws_enable_req const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id) {// DWS客户端角色任务环境struct dwws_client_env_tag * dwws_env = PRF_ENV_GET(dwws_client, dwws_client);if (param->con_type == PRF_CON_DISCOVERY){//开始发现对端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);volatile 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_discoveries);} arch_printf("\r\nDWS服务发现");返回(KE_MSG_CONSUMED);}

6.这里的问题是,代码以status == ATT_ERR_ATTRIBUTE_NOT_FOUND和start句柄== 0命中ws_client_cmp_evt_handler:

if(state == dws_client_discoveries) {arch_printf("\r\nDWS发现处理程序");if ((param->status == ATT_ERR_ATTRIBUTE_NOT_FOUND) || (param->status == ATT_ERR_NO_ERROR)){//当前正在发现sps_server Service uint8_t ws_service_uuid[] = ws_control_uuid;如果(!memcmp(dwws_client_env ->last_svc_req, dwws_service_uuid, ATT_UUID_128_LEN)) {if (dwws_client_env ->last_uuid_req == ATT_DECL_PRIMARY_SERVICE) {if (dwws_client_env ->dcs.svc. xml) {shdl = = ATT_INVALID_HANDLE ) <<<<<<<< 在这里  <<<<<<<< { // 停止发现过程。dws_client_enable_cfm_send (dws_client_env conidx PRF_ERR_STOP_DISC_CHAR_MISSING);}

我非常确定发现参数中的UUID是正确的。

这种行为的原因是什么?

hwidvorakinfo
离线
最后看到:4个月前2个星期前
加入:2019-10-17 06:49
请描述一下关系

请描述在user_dws_config.h中定义的MSK特征和我的中心代码从DSPS中提取的数据结构之间的关系:

///用于检索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_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 ws_client_char_desc[ws_client_desc_max] = {///DWS客户端配置[ws_client_control_cli_cfg] = {ATT_DESC_CLIENT_CHAR_CFG, ATT_MANDATORY, ws_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 {ws_client_control_char = 0, ws_client_char_max};/// DWS客户端服务特征描述符enum {/// DWS客户端配置ws_client_control_cli_cfg, ws_client_desc_max,};

hwidvorakinfo
离线
最后看到:4个月前2个星期前
加入:2019-10-17 06:49

好的,我成功地设置到了我想要的点:

1.从我的定制PCB DA14585 FW连接到MSK设备与库存FW IoT-585

2.发现MSK设备的服务和特征

3.发送CMD=0x17启动MSK LED闪烁,发送CMD=0x18停止MSK LED闪烁

以下是上述项目的描述步骤和要点:

答:扫描

Void user_scan_start(Void) {scan_start();Scan_timer = app_easy_timer(1000, user_scan_stop);}

scan_start()函数:

void 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处理程序:

Void 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完成了!”);Scan_timer = app_easy_timer(50, user_choose_device);}

b连接

user_choose_device app_easy_timer夹头:

Void user_choose_device(Void) {wdg_freeze();arch_printf("\r\n试图连接到IoT-585…");//在找到的设备列表中找到IoT-585 device uint8_t i;Uint8_t found = 0;For (i = 0;我< device_count;我+ +){((scanned_devices[我].device_name[0] = =“我”)& & (scanned_devices[我].device_name [1] = = ' o ')){发现= 1;打破;}} if (found) {user_connect_to_device(scanned_devices[i]);} swclock_init (); }

user_connect_to_device功能:

Void user_connect_to_device(结构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回调:

void user_on_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param) {arch_printf("\r\nDevice connected");app_prf_enable (param - > conhdl);//调用所有在prf_func, custs_prf_func和user_prf_func中注册的函数}

app.c中定义的prf_func_callback:

const struct prf_func_callbacks prf_funcs[] = {{task_id_ds_client, user_ds_client_create_db, user_ds_client_enable}, {TASK_ID_INVALID, NULL, NULL}, //不移动。必须永远排在最后;

user_dws_client_create_db功能:

void user_dws_client_create_db(void) {struct gapm_profile_task_add_cmd *req = KE_MSG_ALLOC_DYN(gapm_profile_task_add_cmd, TASK_GAPM, TASK_APP, gapm_profile_task_add_cmd, sizeof(struct dws_db_cfg));//填充消息req->operation = 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;struct dws_db_cfg *db_cfg = (struct dws_db_cfg *) req->param;db_cfg - >特性= 0;//发送消息ke_msg_send(req);}

user_dws_client_enable功能:

void user_dwws_client_enable (uint8_t conidx) {struct dwws_enable_req *req = KE_MSG_ALLOC(dwws_client_enable_req, prf_get_task_from_id(task_id_dwws_client), TASK_APP, dwws_enable_req);//填写参数结构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_disc_char_ind_ind, (ke_msg_func_t)dws_client_disc_char_ind_handler}, {GATTC_DISC_SVC_IND, (ke_msg_func_t) dws_client_disc_char_desc_handler}, //一旦找到服务{GATTC_DISC_CHAR_DESC_IND, (ke_msg_func_t)dws_client_disc_char_desc_ind_handler}, {dwws_client_enable_req, (ke_msg_func_t) dwws_client_enable_req_handler}, {GATTC_CMP_EVT,(ke_msg_func_t) ws_client_cmp_evt_handler}, //一旦命令结束{ws_client_data_tx_req, (ke_msg_func_t) ws_client_data_tx_req_handler}};

dws_client_enable_req_handler:

static int dwws_client_enable_req_handler (ke_msg_id_t const msgstr, struct dwws_enable_req const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) {// DWS客户端角色任务环境struct dwws_client_env_tag * dwws_env = PRF_ENV_GET(dwws_client, dwws_client);if (param->con_type == PRF_CON_DISCOVERY){//开始发现对端设备uint8_t dws_control_service_uuid[] = DWS_SVC_UUID;//DWS_SVC_UUID;/ / DWS_CONTROL_UUID;// ATT_DECL_CHARACTERISTIC;//ATT_DECL_PRIMARY_SERVICE;memcpy (dws_env - > last_svc_req、dws_control_service_uuid ATT_UUID_128_LEN);volatile 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_discoveries);} arch_printf("\r\nDWS服务发现");返回(KE_MSG_CONSUMED); }

dws_client_cmp_evt_handler:

静态int dws_client_cmp_evt_handler(ke_msg_id_t const msgstr, struct gattc_cmp_evt const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) {uint8_t state = ke_state_get(dest_id);uint8_t conidx = KE_IDX_GET(dest_id);//获取环境结构的地址ws_client_env_tag * ws_client_env = PRF_ENV_GET(ws_client, ws_client);uint8_t状态;if(state == dws_client_discoveries) {arch_printf("\r\nDWS发现处理程序");if ((param->status == ATT_ERR_ATTRIBUTE_NOT_FOUND) || (param->status == ATT_ERR_NO_ERROR)){//当前正在发现sps_server Service uint8_t ws_service_uuid[] = ws_svc_uuid;// ws_svc_uuid;/ / DWS_CONTROL_UUID;如果(!memcmp(dwws_client_env ->last_svc_req, dwws_service_uuid, ATT_UUID_128_LEN)) {if (dwws_client_env ->last_uuid_req == ATT_DECL_PRIMARY_SERVICE) {if (dwws_client_env ->dcs.svc. xml) {//停止发现过程。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:

static int dwws_client_event_ind_handler (ke_msg_id_t const msgstr, struct gatc_event_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) {struct dwws_client_env_tag * dwws_env = PRF_ENV_GET(dwws_client, dwws_client);//处理特定的特征如果(dss_env ->dcs.chars[dss_client_control_char]. .val_hdl == param->handle) {} else if (ds_env ->dcs.chars[ds_client_control_reply_char]. valid_hdl == param->handle)val_hdl == param->句柄){}返回(ke_msg_consume);}

dws_client_disc_char_ind_handler:

static int dws_client_disc_char_ind_handler(ke_msg_id_t const msgstr, struct gattc_disc_char_ind const *param, 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], & ds_client_char [0], param, & ds_env ->last_char_code);返回(KE_MSG_CONSUMED);}

dws_client_disc_svc_ind_handler:

static int dws_client_disc_svc_ind_handler(ke_msg_id_t const msgstr, struct gattc_disc_svc_ind const *param, 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);//即使我们得到多个响应,我们只存储一个范围dss_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:

static int dwws_client_disc_char_desc_ind_handler (ke_msg_id_t const msgstr, struct gattc_disc_char_desc_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id){//获取环境结构的地址dwws_client_env_tag * dwws_env = PRF_ENV_GET(dwws_client, DWS_CLIENT);//检索SPS描述符prf_search_descs(ws_client_desc_max, & ws_env->dcs.descs[0], & ws_client_char_desc[0], param, ws_env->last_char_code);返回(KE_MSG_CONSUMED);}

dws_client_data_tx_req_handler:

static int dwws_client_data_tx_req_handler (ke_msg_id_t const msgstr, struct dwws_client_data_tx_req const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) {struct dwws_client_env_tag * dwws_client_env = PRF_ENV_GET(dwws_client, dwws_client);uint8_t conidx = KE_IDX_GET(dest_id);如果(ke_state_get (KE_BUILD_ID (dws_client_env - > prf_env。prf_task, conidx) == dwws_client_connected) {{prf_gatt_write(& dwws_client_env ->prf_env, conidx, dwws_client_env ->dcs.chars[dwws_client_control_char]。val_hdl, (uint8_t *)param->data, sizeof(uint8_t) * param->data_length, GATTC_WRITE);返回(KE_MSG_NO_FREE);}}返回(ke_msg_consuming);}

BLE数据发送程序:

静态uint8_t数据= 0x17;if (central_is_connected() == DWS_CLIENT_CONNECTED) {user_send_ble_data((uint8_t *)&data, 1);arch_printf("\r\nCMD已发送%d", data);Data = (Data == 0x17) ?0 x18: 0 x17;}

user_send_ble_data功能:

void user_send_ble_data(const uint8_t *data, uint16_t length) {struct dwws_client_data_tx_req *req = KE_MSG_ALLOC_DYN(dwws_client_data_tx_req, prf_get_task_from_id(task_id_dwws_client),TASK_APP, dwws_client_data_tx_req,length);申请- > 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}, [ws_client_sensf_char] = {ws_sensf_uuid, Att_mandatory, att_char_prop_ntf}, [ws_client_feat_char] = {ws_feat_uuid, Att_mandatory, att_char_prop_rd}, [ws_client_control_char] = {ws_control_uuid, Att_mandatory, att_char_prop_wr}, [ws_client_control_reply_char] = {ws_control_reply_uuid, Att_mandatory, att_char_prop_ntf}, [ws_client_multi_sens_char] = {ws_multi_sens_uuid, Att_mandatory, att_char_prop_ntf},};const struct prf_char_desc_def ws_client_char_desc_max = {///DWS客户端配置[ws_client_accel_ntf_cfg] = {ATT_DESC_CLIENT_CHAR_CFG, ATT_MANDATORY, ws_client_accel_char}, [ws_client_gyro_cfg] = {ATT_DESC_CLIENT_CHAR_CFG, ATT_MANDATORY, ws_client_gyro_char}, [ws_client_mag_ntf_cfg] = {ATT_DESC_CLIENT_CHAR_CFG, ATT_MANDATORY, ws_client_mag_char}, [ws_client_baro_ntf_cfg] = {ATT_DESC_CLIENT_CHAR_CFG, ATT_MANDATORY, ws_client_baro_char}, [ws_client_baro_cfg] = {ATT_DESC_CLIENT_CHAR_CFG, ATT_MANDATORY, ws_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 Data [1];//[__ARRAY_EMPTY];};
结构ws_client_env_tag{///配置文件环境prf_env_t prf_env;/// Service Start Handle uint16_t shdl;///存储DB最大数量的属性uint8_t max_nb_att;///正在进行的操作结构ke_msg *操作;///用于通知对等设备的连接游标uint8_t游标;/// CCC句柄索引,用于通知/指示繁忙状态uint8_t ccc_idx;///应用程序结构co_list值设置的值列表;/// CUSTS1任务状态ke_state_t state[dss_idx_max];/// Profile Connection Info ///最后请求的UUID(跟踪两个服务和char) 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; };
结构adv_device {uint8_t索引;///多个广告设备的索引uint8_t evt_type;///事件类型:uint8_t adv_addr_type;///广告地址类型:public/random struct 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{///空闲状态dwws_client_idle, ///连接状态dwws_client_connected, ///发现dwws_client_discoveries, ///已定义的状态数。DWS_CLIENT_STATE_MAX};/// DWS客户端服务特性枚举{//// dwws_client_accel_char = 0, dwws_client_gyro_char, dwws_client_mag_char, dwws_client_baro_char, dwws_client_hum_char, dwws_client_temp_char, dwws_client_sensf_char, dwws_client_feat_char, dwws_client_control_char, dwws_client_reply_char, dwws_client_multi_sens_char, //// ws_client_char_max};/// DWS客户端服务特性描述符枚举{/// DWS客户端配置dsws_client_accel_ntf_cfg, dsws_client_gyro_ntf_cfg, dsws_client_mag_ntf_cfg, dsws_client_气压_ntf_cfg, dsws_client_hum_ntf_cfg, dsws_client_temp_ntf_cfg, dsws_client_sens_ntf_cfg, dsws_client_control_reply_ntf_cfg, dsws_client_multi_sens_ntf_cfg, /// dsws_client_desc_max,};///DWS客户端主机API消息enum {///DWS客户端角色启用应用程序请求。dwws_client_enable_req = KE_FIRST_MSG(task_id_dwws_client), /// SPS主机角色启用应用程序确认。dwws_client_enable_cfm, ///发送数据请求dwws_client_data_tx_req, ///确认数据已发送dwws_client_data_tx_cfm, ///发送数据到应用dwws_client_data_rx_ind, //发送流量控制状态dwws_client_rx_flow_ctrl_req, ///指示流量控制状态dwws_client_tx_flow_ctrl_ind,};///服务信息结构dws_client_content{///服务信息结构prf_svc svc;///特征信息:struct prf_char_inf chars[ws_client_char_max];///特性cfg结构prf_char_desc_inf descs[DWS_CLIENT_DESC_MAX]; };

我相信它将帮助另一个正在为DA14585实现非常简单的中央设备FW而奋斗的人。

如果你想联系我,请在领英上联系我https://www.linkedin.com/in/petr-dvorak-hw/

PM_Dialog
离线
最后看到:2周23小时前
工作人员
加入:2018-02-08 11:03
嗨,彼得,

嗨,彼得,

如前所述,585-MSK作为外设提供,并与适当的硬件一起提供。谢谢你的建议和解决方案。我会试着检查一下,评估一下。

问候,PM_Dialog

hwidvorakinfo
离线
最后看到:4个月前2个星期前
加入:2019-10-17 06:49
你好PM_Dialog,

你好PM_Dialog,

我的最新帖子并不是要建议改变585-MSK项目。我使用585-MSK作为外围设备,我说过很多次。我一直在开发一个定制板,为我的定制板,我一直在开发一个定制FW。

这里很少有针对Central角色的固件示例。唯一提到的项目是DSPS项目,一次又一次。但是将Central角色实现到自定义项目中并不是那么简单。我试着帮助这里的社区。在达到我的目标之前,我花了大约两周的时间研究文档和DSPS项目。

切赫