来自中央控制物联网MSK DA14585的DWS消息

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在https://www.dialog-seminile.com/support..我们会在接下来的几天修复bug /优化搜索和标记。
11个帖子/ 0新
最后发表
hwidvorakinfo.
离线
最后一次露面:4个月3周前
加入:2019-10-17 06:49
来自中央控制物联网MSK DA14585的DWS消息

亲爱的Diyabo国际娱乐alog半导体,

我通过教程部分“training_03_custom_profile_gatt_cmd_example_v1.2”去了,现在我可以从iOS应用LightBlue控制自己的物联网MSK DA14585。

1.连接到的IoT-585设备

2.选择WRBL_DWS_CONTROL_CHAR 2EA7 -...- 2409的UUID

3.写入0x17的数量以使LED闪烁或0x18停止LED闪烁

现在,我需要通过基于主动扫描仪示例的自定义FW来实现从我的设备发送的Gattc消息。

1.我可以扫描设备

2.我可以看到的IoT-585设备

3.我可以连接到物联网-585成功

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

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

谢谢你,彼得

设备:
PM_DIALOG.
离线
最后一次露面:1天6小时前
职员
加入:2018-02-08 11:03
嗨hwidvorakinfo,

嗨hwidvorakinfo,

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

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

我假设您想向MSK写一个特征,将手机形成为MSK。哪个是您想要写的特征?

谢谢,PM_DIALOG.

hwidvorakinfo.
离线
最后一次露面:4个月3周前
加入:2019-10-17 06:49
你好pm_dialog,

你好pm_dialog,

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

1.我使用msk,我有一个msk套件,它有原始fw(外围角色)

2.我正在为基于DA14585(能够扫描并连接到外围设备,User_on_Connection回调工作)的设备开发自定义中央FW

3.我有发现功能在努力寻找与特定的周边服务和特色UUID

我在这里经历了很多主题(包括RW-BLE-GATT-IS文件约三次),但多次提到的DSP项目是以某种方式对我困惑。struct spsc_env_tag数据结构是我的奇迹,因为它是特定于DSP的项目。

请纠正我,如果我错了:

1.我需要用我知道的UUID(这里是wrbl_dws_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连接”);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_uuuid);静态int gattc_disc_svc_ind_handler(ke_msg_id_t const msgs,struct gattc_disc_svc_ind const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id){//获取环境结构dws_env_tag * dws_env = prf_get(dws,dws)的地址;//即使我们得到多个响应,我们只能存储1范围dws_env-> shdl = param-> start_hdl;dws_env-> ehdl = param-> end_hdl;dws_env-> nb_svc ++;返回(KE_MSG_CONSUMED);静态int gattc_disc_char_ind_handler(ke_msg_id_t const msgs,struct gattc_disc_char_ind const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id){//获取环境结构dws_env_tag * dws_env = prf_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个月3周前
加入: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 . log . log . log . log . log . log . log

这是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.
离线
最后一次露面:1天6小时前
职员
加入:2018-02-08 11:03
嗨hwidvorakinfo.

嗨hwidvorakinfo.

我们支持网站上提供的DA14585 MSK支持。如您所提到的正确,DA14585配置在外围角色中。您是否在中央模式下配置了?

谢谢,PM_DIALOG.

hwidvorakinfo.
离线
最后一次露面:4个月3周前
加入: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 . log . log . log . log . log . log . log

这是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个月3周前
加入:2019-10-17 06:49
亲爱的PM_dialog,

亲爱的PM_dialog,

最近我向前迈进了一下,我想请你审查描述的状态如下。我的目标是使用UUID DWS_CONTROL_UUID({0x09,0x24,0x40,0x3f,0x118,0x26,0x97,0xb0,0x7,0x44,0xb0,0x7,0x44,0x44,0x7d,0x70,0x44,0x7d,0x20,0x89,0xA7,0x2e})使用MSK中定义的DWS外设服务.

1.增加了一个新prf_func回调。TASK_ID_DWS_CLIENT是枚举KE_API_ID一个新项目:

const struct prf_func_callbacks prf_funcs [] = {。..#if(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()是DSPS项目user_spsc_enable()函数的导数。该函数应触发DWS_CLIENT_ENABLE_REQ消息:

void user_dws_client_enable(uint8_t conidx){struct dws_enable_req * req = ke_msg_alloc(dws_client_enable_req,prf_get_task_from_id(task_id_dws_client),task_app,dws_enable_req);//填写参数结构req->conidx = conidx;申请- > con_type = PRF_CON_DISCOVERY;//发送消息arch_printf(启用“\ r \ ndws客户端”);ke_msg_send(要求的);}

4.DWS_CLIENT_ENABLE_REQ处理程序定义在:

常量结构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_CMD与GATTC_DISC_BY_UUID_SVC参数,该命令应该发现,对应于所期望的DWS_CONTROL_UUID的UUID的服务

静态int dws_client_enable_req_handler(ke_msg_id_t const msgs,struct dws_enable_req const * param,ke_task_id_t const dest_id,ke_task_d_t const src_id){// dws client角色任务环境结构struct dws_client_env_tag * dws_env = prf_env_get(dws_client,dws_client);if(param-> con_type == prf_con_discovery){//开始在对等体上发现dws uinter8_t dws_control_service_uuid [] = dws_control_uuuid;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_discovering);ARCH_PRINTF(“\ r \ ndws服务发现”);返回(KE_MSG_CONSUMED);}

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

if(state == dws_client_discovery) {arch_printf("\r\nDWS发现处理器");if ((param->status == ATT_ERR_ATTRIBUTE_NOT_FOUND) || (param->status == ATT_ERR_NO_ERROR)){//当前发现sps_server Service uint8_t dws_service_uuid[] = DWS_CONTROL_UUID;如果(!memcmp(dws_client_env->last_svc_req, dws_service_uuid, ATT_UUID_128_LEN)) {if (dws_client_env->last_uuid_req == ATT_DECL_PRIMARY_SERVICE) {if (dws_client_env-> cs.svc. len)}shdl = = ATT_INVALID_HANDLE ) <<<<<<<< 在这里  <<<<<<<< { // 停止发现过程。dws_client_enable_cfm_send (dws_client_env conidx PRF_ERR_STOP_DISC_CHAR_MISSING);}

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

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

hwidvorakinfo.
离线
最后一次露面:4个月3周前
加入: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_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,};

hwidvorakinfo.
离线
最后一次露面:4个月3周前
加入:2019-10-17 06:49

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

1.通过使用DA14585 FW的定制PCB连接到带有库存FW IOT-585的MSK设备

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

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

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

答:扫描

空隙user_scan_start(无效){scan_start();scan_timer = app_easy_timer(1000,user_scan_stop);}

scan_start()函数:

空隙scan_start(无效){结构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.code = GAPM_SCAN_ACTIVE;CMD-> op.addr_src = GAPM_STATIC_ADDR;CMD->间隔= 15;// 600;CMD->窗口= 5;// 400;CMD->模式= 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 handler:

void user_scan_stop(void){app_easy_gap_advertise_stop();//停止扫描is_scanning = false;for(int i = 0; i 

B.连接

user_choose_device app_easy_timer hander:

void user_choose_device(void){wdg_freeze();ARCH_PRINTF(“\ r \ ntring连接到IOT-585 ......”);//在找到的设备列表中找到IoT-585设备UINT8_T i;找到uint8_t = 0;for(i = 0; i 

user_connect_to_device函数:

Void user_connect_to_device(struct adv_device 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连接”);app_prf_enable(param-> conhdl);//调用在prf_func,custs_prf_func和user_prf_func}中注册的所有函数

app.c中定义的prf_func_callbacks:

const struct prf_func_callbacks prf_funcs [] = {{task_id_dws_client,user_dws_client_create_db,user_dws_client_enable},{task_id_invalid,null,null},//不要移动。必须始终持续};

user_dws_client_create_db函数:

空隙user_dws_client_create_db(无效){结构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(结构dws_db_cfg));//填充消息req->操作= 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 =(结构dws_db_cfg *)req-> PARAM;db_cfg->设有= 0;//发送消息ke_msg_send(REQ);}

user_dws_client_enable功能:

void user_dws_client_enable(uint8_t conidx){struct dws_enable_req * req = ke_msg_alloc(dws_client_enable_req,prf_get_task_from_id(task_id_dws_client),task_app,dws_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_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常量MSGID,结构dws_enable_req常量* PARAM,ke_task_id_t const的DEST_ID,ke_task_id_t常量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);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_discovering);} arch_printf( “\ r \ nDWS服务发现”);返回(KE_MSG_CONSUMED); }

dws_client_cmp_evt_handler:

Static int dws_client_cmp_evt_handler(ke_msg_id_t const msgid, 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);//获取环境结构体的地址dws_client_env_tag *dws_client_env = PRF_ENV_GET(DWS_CLIENT, DWS_CLIENT);uint8_t状态;if(state == dws_client_discovery) {arch_printf("\r\nDWS发现处理器");if ((param->status == ATT_ERR_ATTRIBUTE_NOT_FOUND) || (param->status == ATT_ERR_NO_ERROR)){//当前发现sps_server Service uint8_t dws_service_uuid[] = DWS_SVC_UUID;/ / DWS_CONTROL_UUID;如果(!memcmp(dws_client_env->last_svc_req, dws_service_uuid, ATT_UUID_128_LEN)) {if (dws_client_env->last_uuid_req == ATT_DECL_PRIMARY_SERVICE) {if (dws_client_env-> cs.svc. len)}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_d_t const msgs,struct gattc_event_ind const * param,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 == param->句柄){} else if(dws_env-> dcs.chars [dws_client_control_reply_char] .val_hdl == param->句柄){} return(ke_msg_consumed);}

dws_client_disc_char_ind_handler:

静态int dws_client_disc_char_ind_handler(ke_msg_id_t const msgs,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.chars [0],&dws_client_char [0],param,&dws_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 msgs,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_g_get的地址(dws_client,dws_client);//即使我们得到多个响应,我们只存储1个范围dws_env-> dcs.svc.shdl = param-> start_hdl;dws_env-> dcs.svc.ehdl = param-> end_hdl;dws_env-> nb_svc ++;返回(KE_MSG_CONSUMED);}

dws_client_disc_char_desc_ind_handler:

static int dws_client_disc_char_desc_ind_handler(ke_msg_id_t const msgid, struct gattc_disc_char_desc_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);//获取SPS描述符prf_search_descs(DWS_CLIENT_DESC_MAX, &dws_env-> cs.descs[0], &dws_client_char_desc[0], param, 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常量MSGID,结构dws_client_data_tx_req常量* PARAM,ke_task_id_t const的DEST_ID,ke_task_id_t常量src_id){结构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 *)param->数据,的sizeof(uint8_t)* param->数据长度,GATTC_WRITE);回报(KE_MSG_NO_FREE);}} return (KE_MSG_CONSUMED);}

BLE数据发送例程:

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

user_send_ble_data功能:

void user_send_ble_data(const uint8_t *data, uint16_t length) {struct dws_client_data_tx_req *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,length);申请- > data_length =长度;memcpy(请求- >[0]的数据,数据长度);ke_msg_send(要求的);}

c .特点:

常量结构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},};常量结构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.数据结构:

结构dws_client_data_tx_req {///连接索引uint16_t conidx;///这已被写入uint16_t手柄属性的句柄;///数据长度被写入数据长度uint16_t;///要写入的数据在属性数据库uint8_t数据[1]; // [__ ARRAY_EMPTY];};
struct dws_client_env_tag {///配置文件环境prf_env_t prf_env;///服务开始处理UINT16_T SHDL;///存储DB最大属性的uint8_t max_nb_att;///正在进行的操作struct ke_msg *操作;/// Coursor用于通知对等设备UINT8_T光标的连接;/// CCC句柄索引,在通知期间使用/指示忙状态UINT8_T CCC_IDX;///按应用程序结构co_list值设置的值列表;/// custs1任务状态ke_state_t state [dws_idx_max];///配置文件连接信息///最后请求的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; };
Struct adv_device {uint8_t index;///多个广告设备索引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; };
枚举{///空闲状态dws_client_idle,///连接状态dws_client_connected,///发现dws_client_discovering,///定义状态。dws_client_state_max};/// DWS客户端服务特性枚举{//// 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客户端服务特性描述符枚举{/// 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邮件枚举{/// 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,///向app dws_client_data_rx_ind,//发送流控制状态dws_client_rx_flow_ctrl_req,///表示流控制状态dws_client_tx_flow_ctrl_ind,};///服务信息struct dws_client_content {///服务信息struct prf_svc svc;///特征信息:struct prf_char_inf chars [dws_client_char_max];///特征cfg struct prf_char_desc_inf descs [dws_client_desc_max]; };

我相信它将帮助另一个人努力实现一个非常简单的中央设备FW为DA14585。

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

PM_DIALOG.
离线
最后一次露面:1天6小时前
职员
加入:2018-02-08 11:03
培养宠物,

培养宠物,

如前所述,585-MSK作为外围设备提供,并与适当的硬件一起使用。但是,感谢您的建议和您的解决方案。我会尝试通过并评估Tham。

问候,PM_Dialog

hwidvorakinfo.
离线
最后一次露面:4个月3周前
加入:2019-10-17 06:49
你好PM_Dialog,

你好PM_Dialog,

我的最新帖子的目的不是以任何建议改变585-MSK项目。我用的585-MSK外围,正如我多次指出。我一直在开发一个定制电路板,并为我定制电路板,我一直在开发一个自定义固件。

任何固件角色的例子都在这里非常罕见。只有提到的项目是DSPS项目,一次又一次。但在自定义项目中实现中心角色并不简单。我试图在这里帮助社区。在我能够达到我的目标之前,我花了大约两周时间的研究文件和DSP项目。

培养皿