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

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程//www.wsdof.com/support。我们将在未来几天修复错误/优化搜索和标记。
11个帖子/ 0新
最后一篇
hwidvorakinfo.
离线
最后看到:2个月3周前
加入:2019-10-17 06:49
来自中央控制物联网MSK DA14585的DWS消息

亲爱的对话雷竞技电竞平台半导体,

我经过教程零件“training_03_custom_profile_gatt_cmd_example_v1.2”,现在我可以从ios app lightblue控制我的IoT MSK DA14585。

1.连接到IOT-585设备

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

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

现在我需要实现这个GATTC消息发送从我的设备与定制的FW基于Active扫描仪的例子。

1.我可以扫描设备

我可以看到IOT-585设备

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

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

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

谢谢,宠物

设备:
PM_Dialog
离线
最后看到:48分37秒前
工作人员
加入:2018-02-08 11:03
嗨hwidvorakinfo,

嗨hwidvorakinfo,

你在MSK项目中实现了自定义服务吗?

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

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

谢谢,PM_DIalog

hwidvorakinfo.
离线
最后看到:2个月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文件大约三次),但是多次提到的DSPS项目不知怎么的让我感到困惑。结构体spsc_env_tag数据结构对我来说是一个奇迹,因为它是DSPS项目特定的东西。

如果我错了,请纠正我:

1.我需要用UUID来获得句柄,我知道(来自MSK FW的WRBL_DWS_CONTROL_CHAR)

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.
离线
最后看到:2个月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

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启用\ R \ n”);ke_msg_send(要求的);}

在不使用sps_client角色的情况下,我可以启动和完成发现过程的步骤是什么?请为我列出它们。

PM_Dialog
离线
最后看到:48分37秒前
工作人员
加入:2018-02-08 11:03
嗨hwidvorakinfo.

嗨hwidvorakinfo.

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

谢谢,PM_Dialog

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

你好PM_dialog,

请让我解释当前情况:

事实:

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

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

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启用\ R \ n”);ke_msg_send(要求的);}

在不使用sps_client角色的情况下,我可以启动和完成发现过程的步骤是什么?请为我列出它们。

hwidvorakinfo.
离线
最后看到:2个月3周前
加入:2019-10-17 06:49
亲爱的pm_dialog,

亲爱的pm_dialog,

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

1.添加了一个新的prf_func回调。task_id_dws_client是enumke_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()基本上是一个消息触发功能,其中包含以下内容:

req->操作= gapm_profile_task_add;req-> sec_l​​vl = get_user_prf_srv_perm(task_id_dws_client);req-> prf_task_id = task_id_dws_client;req-> app_task = task_app;req-> start_hdl = 0;

3. user_dws_client_enable()是DSP项目的user_spsc_enable()函数的衍生。该函数应触发DWS_CLIEND_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_CLIEND_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.使用gattc_disc_by_uuuid_svc参数发出gattc_disc_cmd的dws_client_enable_req_handler,此命令应该发现与dws_control_uuuid的所需UUID对应的服务

static int dws_client_enable_req_handler(ke_msg_id_t const msgid,struct dws_enable_req const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id) {// DWS客户端角色任务环境struct dws_client_env_tag *dws_env = PRF_ENV_GET(DWS_CLIENT, DWS_CLIENT);if (param->con_type == PRF_CON_DISCOVERY){//开始发现DWS on peer 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);conidx = KE_IDX_GET(dest_id);prf_disc_svc_send_128 (&dws_env - > prf_env、conidx dws_env - > last_svc_req);//设置状态为discovery ke_state_set(dest_id, dws_client_discovery);} arch_printf("\r\nDWS服务发现");返回(KE_MSG_CONSUMED);}

6.此处的问题是代码命中dws_client_cmp_evt_handler status == agt_err_attribute_not_found with start handle == 0:

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服务uint8_t dws_service_uuuid [] = dws_control_uuuid;if(!memcmp(dws_client_env-> last_svc_req,dws_service_uuuid,att_uuid_128_len)){if(dws_client_env-> last_uuid_req == att_decl_primary_service){if(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是正确的。

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

hwidvorakinfo.
离线
最后看到:2个月3周前
加入:2019-10-17 06:49
请描述关系

请介绍user_dws_config.h中定义的msk特性与从DSP中获取的中央代码中的数据结构之间的关系:

///状态机用于检索DWS客户特性信息const的结构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客户端服务特性说明信息CONSS STRUCT PRF_CHAR_DESC_DEF DWS_CLIENT_CHAR_DESC [DWS_CLIENT_DESC_CHAR_DESC [DWS_CLIENT_CLINE_CONIC [DWS_CLIENT_CLINT_CLI_CFG] = {ATT_DESC_CLIENT_CHAR_CFG,ATT_MANDORY,DWS_CLIENT_CONTROL_CHAR},//原始SPS客户端配置://[spsc_srv_tx_data_cli_cfg] = {att_desc_client_char_cfg,att_mancatory,spsc_srv_tx_data_char},// [spsc_flow_ctrl_cli_cfg] = {att_desc_client_char_cfg,att_mandatory,spsc_flow_ctrl_char};/// DWS客户端服务特征枚举{dws_client_control_char = 0,dws_client_char_max};/// dws客户端服务特征描述符enum {/// dws client config dws_client_control_cli_cfg,dws_client_desc_max,};

hwidvorakinfo.
离线
最后看到:2个月3周前
加入:2019-10-17 06:49

好的,我设法设置为我想得出的点:

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

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

3.发送CMD = 0x17开始MSK LED闪烁并发送CMD = 0x18停止MSK LED闪烁

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

A.扫描

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.code = 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 handler:

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\nTrying to connect to IoT-585…");//在找到的设备列表中找到IoT-585设备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(struct adv_device设备){wdg_resume();ARCH_PRINTF(“\ r \ n nconnecting to”);user_print_device_name(设备);ARCH_PRINTF_FLUSH();app_easy_gap_start_connection_to_set(device.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_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函数:

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->操作= gapm_profile_task_add;req-> sec_l​​vl = get_user_prf_srv_perm(task_id_dws_client);req-> prf_task_id = task_id_dws_client;req-> app_task = task_app;req-> 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_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:

常量结构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},//一旦命令over {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 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 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_characterative; // att_decl_primary_service;memcpy (dws_env - > last_svc_req、dws_control_service_uuid ATT_UUID_128_LEN);conidx = KE_IDX_GET(dest_id);prf_disc_svc_send_128 (&dws_env - > prf_env、conidx dws_env - > last_svc_req);//设置状态为discovery ke_state_set(dest_id, dws_client_discovery);} 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);conidx 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服务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->dcs.svc. memcmp(dws_client_env->last_svc_req, dws_service_uuid, ATT_UUID_128_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 msgid, struct gattc_disc_svc_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);//即使我们得到多个响应,我们也只存储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 msgs,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_g_get的地址(dws_client,dws_client);//检索sps descriptors prf_search_descs(dws_client_desc_max,&dws_env-> dcs.descs [0],&dws_client_char_desc [0],param,dws_env-> last_char_code);返回(KE_MSG_CONSUMED);}

dws_client_data_tx_req_handler:

static int dws_client_data_tx_req_handler(ke_msg_d_t const msgs,struct dws_client_data_tx_req const * param,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);conidx uint8_t conidx = KE_IDX_GET(dest_id);if(ke_state_get(ke_build_id(dws_client_env-> prf_env.prf_task,conidx))== dws_client_connection){{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-> data_length,gattc_write);返回(KE_MSG_NO_FREE);}} return (KE_MSG_CONSUMED);}

BLE数据发送程序:

静态UINT8_T数据= 0x17;if(central_is_connected()== dws_client_connected){user_send_ble_data((uint8_t *)和数据,1);ARCH_PRINTF(“\ r \ ncmd发送%d”,数据);data =(data == 0x17)?0x18:0x17;}

user_send_ble_data函数:

void user_send_ble_data(const uint8_t * data,uint16_t长度){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_tx_req,length);req-> data_length = length;Memcpy(&Req->数据[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_repl_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{///配置环境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;///由应用程序struct co_list values设置的值的列表;/// CUSTS1任务状态ke_state_t state[DWS_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; };
struct avv_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 [avd_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]; };

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

在您希望我到达的情况下,请在LinkedIn上与我联系https://www.linkedin.com/in/petr-dvorak-hw/

PM_Dialog
离线
最后看到:48分37秒前
工作人员
加入:2018-02-08 11:03
培养宠物,

培养宠物,

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

问候,pm_dialog

hwidvorakinfo.
离线
最后看到:2个月3周前
加入:2019-10-17 06:49
你好pm_dialog,

你好pm_dialog,

我的最新帖子并非旨在改变585-MSK项目的任何建议。我使用585-msk作为外设,正如我多次说明的那样。我一直在开发定制董事会和我的定制委员会,我一直在开发一个定制的FW。

任何中心角色的固件例子在这里都是非常罕见的。唯一提到的项目是DSPS项目,一次又一次。但是要在自定义项目中实现Central角色并不是那么简单。我试着帮助这里的社区。在我能够达到我的目标之前,我已经花了大约两周的时间来学习文档和DSPS项目。

切赫