试图将字节从外设发送到中央(DA14580到智能手机)

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
6个员额/ 0个新员额
最后发表
mahaju
离线
最后看到:2年4个月前
加入:2018-01-29 01:08
试图将字节从外设发送到中央(DA14580到智能手机)

我尝试从BLE芯片向智能手机发送n个字节数组,当我从智能手机接收到BLE芯片中的一个字节数组后,即我的预期操作顺序如下:

智能手机——BLE——> DA14580芯片——BLE——>智能手机

我已经设法做了第一部分(智能手机 - > DA14580芯片),但我无法理解如何做第二部分

我正在修改ble_app_peripheral示例程序

我在user_custs1_impl.c中的void app_adcval1_timer_cb_handler()中获取代码,并试图修改它,但它不工作(即,我的bustom BLE接收应用程序在我的智能手机上没有检测到任何东西)
(我也确定它不是智能手机应用程序的问题,因为它可以从我拥有的另一个自定义BLE模块中检测到传入的BLE数据,以及我的目标创建我自己的此自定义模块的版本)

以下是我的代码:

Void user_server_rx_data_ind_handler(ke_msg_id_t const msgid,
Struct custs1_val_write_ind const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)

Arch_printf ("in function %s\n\r", __func__);
//执行操作:只需显示数据即可
for (int i = 0;ilength;我+ +){
arch_printf (" \ tparam - >值(% d) = % d (0 x %) \ n \ r”,我,param - >值[我],param - >值[我]);

// 2018-02-12: I2C发送字节到外部dev
//发送接收字节数组的数据部分到I2C从地址
ARCH_PRINTF(“写入I2C:添加:%D值:%d \ n \ r”,i2c_slave_address,param->值[(param-> length) - 1]);
i2c_write_mine(I2C_SLAVE_ADDRESS, param->value[(param->length) - 1]);

// 2018-02-20:来自论坛(https://support.dialog-semicondiondiond.com/ble-transmission.
//************************************* 自定义值1 *********************************//
struct musts1_val_ntf_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,
TASK_CUSTS1,
TASK_APP,
custs1_val_ntf_req,
DEF_USER_SERVER_TX_DATA_CHAR_LEN);

ARCH_PRINTF(“INSION%S \ n \ r \ tcusts1_val_ntf_req =%d \ n \ r \ ttask_custs1 =%d \ n \ r \ ttask_app =%d \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ r \ tdef_cust1_adc_val_1_char_len =%d \ n \ r”,__ func__custs1_val_ntf_req,task_custs1,task_app,def_user_server_tx_data_char_len);
静态uint16_t样本[20];
for(int i = 0; i <20; i ++)

样本[i] = 65 + i;

req-> conhdl = app_env-> conhdl;
// req->句柄= CUST1_IDX_ADC_VAL_1_VAL;// 2018-02-20: origin . //
req-> handle = user_idx_server_tx_data_val;
// req-> length = def_cust1_adc_val_1_char_len;// 2018-02-20: origin . //
req-> length = def_user_server_tx_data_char_len;
// memcpy(req->值,&sample,def_cust1_adc_val_1_char_len);// 2018-02-20: origin . //
顺利进行,memcpy(请求- >价值DEF_USER_SERVER_TX_DATA_CHAR_LEN);

KE_MSG_SEND(REQ);

ARCH_PRINTF(“I2C数据发送完成\ n \ r”);

user_server_rx_data_ind_handler()是自定义函数,当DA14580从BLE接收字节时被调用(这个函数在user_peripheral.c中的user_catch_rest_hndl()中被调用,在一个switch()…情况下块

user_idx_server_tx_data_val在user_custs1_def.h中定义,沿着side cust1_idx_adc_val_1_val in枚举。此枚举条目是在BLE_PERITELAL_APP的教程中创建的。与此同时创建的其他枚举是:

USER_IDX_SERVER_TX_DATA_CHAR,
user_idx_server_tx_data_val,
USER_IDX_SERVER_TX_DATA_NTF_CFG,
USER_IDX_SERVER_TX_DATA_USER_DESC,
基本上,我试图使其与cust1_idx_adc_val_1_ *相同

def_user_server_tx_data_char_len在user_custs1_def.h中定义为
#定义DEF_USER_SERVER_TX_DATA_CHAR_LEN 20

BLE_PERITALAL_APP教程我遵循是
training_03_custom_profile_gatt_cmd_example_v1 0.pdf.

我想我在这里缺少非常基本的东西。如何从BLE芯片向智能手机发送单个数据字节?

——编辑
这会导致UART终端上的以下输出:

内部user_server_rx_data_ind_handler
custs1_val_ntf_req = 55300.
task_custs1 = 54.
TASK_APP = 50
DEF_CUST1_ADC_VAL_1_CHAR_LEN = 20
I2C数据发送完成

它还会调用user_peripheral.c中的user_catch_rest_hndl()函数

输入user_catch_rest_hndl:
msgd = 0xD805.
检测到CUSTS1_VAL_NTF_CFM: msg_param->句柄= 27

---编辑2 ---
下面的条目也被添加到user_custs1_def.c文件的结构定义attm_desc_128 custs1_att_db[CUST1_IDX_NB] =结构定义中:

//用户服务器TX数据特征声明
[user_idx_server_tx_data_char] = {(uint8_t *)和att_decl_char,att_uuid_16_len,perm(rd,启用),
sizeof(user_server_tx_data_char),sizeof(user_server_tx_data_char),(uint8_t *)和user_server_tx_data_char},

//用户服务器TX数据特征值
//在这里可能需要启用NTF权限;如果需要的话,以后再回到这一点
[user_idx_server_tx_data_val] = {user_server_tx_data_uuuid_128,att_uuid_128_len,perm(rd,启用)|perm(ntf,启用),
def_user_server_tx_data_char_len,0,null},

//用户服务器TX数据特征配置描述符
[user_idx_server_tx_data_ntf_cfg] = {(uint8_t *)和att_decl_cfg,att_uuid_16_len,perm(rd,启用)|perm(wr,启用),
sizeof(uint16_t),0,null},

// user服务器TX数据特征用户描述
[user_idx_server_tx_data_user_desc] = {(uint8_t *)&att_decl_user_desc,att_uuid_16_len,perm(rd,启用),
sizeof(user_server_tx_data_user_desc) - 1,sizeof(user_server_tx_data_user_desc) - 1,user_server_tx_data_user_desc},

设备:
PM_Dialog
离线
最后看到:20小时44分钟前
工作人员
加入:2018-02-08 11:03
嗨马哈茹,

嗨马哈茹,

BLE_APP_PERITWAL包含可写特性,如控制点和可读 - 可读取的特性,如ADC VAL 1.中央可以从设备写入特性,并且设备可以通知来自中央的特性。

在您的应用程序中,当您通过BLE将消息从智能手机发送到DA14580 SoC时,这是一个可写特性。另一方面,当你从DA14580 SoC向你的智能手机发送消息时,这是一个可通知的特征,你必须激活通知。

请检查通知是否已激活。

谢谢pm_dialog.

mahaju
离线
最后看到:2年4个月前
加入:2018-01-29 01:08
嗨,我启用了通知

HI I在Dialog芯片代码中启用了通知,如下所示:

struct custs1_val_set_req* msg_en_notf = KE_MSG_ALLOC_DYN(custs1_val_set_req,
TASK_CUSTS1,
TASK_APP,
custs1_val_set_req,
0 x2);
静态uint16_t enable_notif;
enable_notif = 0 x0001;
// enable_notif[0] = 0x01;
// enable_notif[2] = 0x00;

msg_en_notf-> conhdl = app_env-> conhdl;
msg_en_notf - >处理= USER_IDX_SERVER_TX_DATA_NTF_CFG;
// msg_en_notf-> handle = user_idx_server_tx_data_val;
msg_en_notf-> length = 0x2;//使用与上面的ke_msg_alloc_dyn()的参数相同的值
memcpy (msg_en_notf - >价值&enable_notif 0 x2);

ke_msg_send (msg_en_notf);

每次需要将某些东西从BLE芯片发送到智能手机时,我都会调用此代码块,并且我能够在智能手机应用程序中查看从BLE芯片发送的数据

这是正确的方法吗?我尝试在User_PeripherAl.cn中的user_app_init()中调用一次,但它不起作用。

PM_Dialog
离线
最后看到:20小时44分钟前
工作人员
加入:2018-02-08 11:03
嗨马哈茹,

嗨马哈茹,

不,这不是一个正确的方法。正确的方法是主服务器应该启用指示/通知特性。在您的实现中,您做了相反的事情,您从代码中编写通知属性。根据BLE规范,master启用通知属性,因此您必须启用来自智能手机应用程序的通知。
当您在user_app_init()函数中调用代码块时,预期它不会工作。首先调用user_app_init(),然后重置BLE堆栈。重置后,您将丢失所有数据,BLE堆栈将被释放。

谢谢pm_dialog.

mahaju
离线
最后看到:2年4个月前
加入:2018-01-29 01:08
你好,抱歉打扰了

嗨抱歉跟进这么晚,但我有另一个问题

如果我正确地理解这一点,只需使用智能手机中的Android函数即可启用通知

这样对吗?是否需要在对话程序程序中添加一些额外的代码以接受和处理来自智能手机的“通知启用”命令?

PM_Dialog
离线
最后看到:20小时44分钟前
工作人员
加入:2018-02-08 11:03
嗨马哈茹,

嗨马哈茹,

对,那是正确的。您应该通过使用移动BLE应用程序启用通知,但您应该通知您的特征,否您在代码中不应添加任何额外的内容,配置文件将管理此内容。我建议您检查SDK的BLE_APP_PERITELAL示例。此示例包含通知特性(ADC Val 1特征)的实现。

谢谢pm_dialog.