我试图从BLE芯片向智能手机发送n个字节数组,当我从智能手机接收到BLE芯片中的字节数组后,即,我打算操作的顺序如下:
DA14580芯片——BLE——>智能手机
我已经做了第一部分(智能手机-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__);
// DO操作:只显示数据
for (int i = 0;ilength;我+ +){
arch_printf (" \ tparam - >值(% d) = % d (0 x %) \ n \ r”,我,param - >值[我],param - >值[我]);
}
// 2018-02-12: I2C send byte to external dev
//发送接收字节数组的数据部分到I2C从地址
arch_printf("写入I2C:添加:%d值:%d\n\r", I2C_SLAVE_ADDRESS, param->value[(param->length) - 1]);
i2c_write_mine(I2C_SLAVE_ADDRESS, param->value[(param->length) - 1]);
// 2018-02-20:来自论坛帖子(https://support.dialog-semiconductor.com/ble-transmission)
//************************************* 自定义值1 *********************************//
struct custs1_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("Inside %s n r tCUSTS1_VAL_NTF_REQ = %d n r tTASK_CUSTS1 = %d n r tTASK_APP = %d 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;我< 20;我+ +)
{
样本[i] = 65 + i;
}
申请- > conhdl = app_env - > conhdl;
//设置一个参数:// 2018-02-20:原产地
申请- >处理= USER_IDX_SERVER_TX_DATA_VAL;
// req->length = DEF_CUST1_ADC_VAL_1_CHAR_LEN;// 2018-02-20:原产地
申请- >长度= DEF_USER_SERVER_TX_DATA_CHAR_LEN;
// memcpy(req->value, &sample, DEF_CUST1_ADC_VAL_1_CHAR_LEN);// 2018-02-20:原产地
顺利进行,memcpy(请求- >价值DEF_USER_SERVER_TX_DATA_CHAR_LEN);
ke_msg_send(要求的);
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中定义,作为CUST1_IDX_ADC_VAL_1_VAL旁边的枚举。这个枚举条目是根据ble_peripheral_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_peripheral_app教程是
Training_03_custom_profile_gatt_cmd_example_v1 pdf 0.
我想我遗漏了一些非常基本的东西。我如何能从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:
是否= 0 xd805
CUSTS1_VAL_NTF_CFM detected: msg_param->handle = 27
——编辑2——
以下条目也被添加到user_custs1_def.c文件的struct 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, ENABLE),
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_uuid_128, att_uuid_128_len, perm (rd, enable) | perm (ntf, enable),
DEF_USER_SERVER_TX_DATA_CHAR_LEN 0零},
//用户服务器TX数据特征配置描述符
[USER_IDX_SERVER_TX_DATA_NTF_CFG] = {(uint8_t*)&att_decl_cfg, ATT_UUID_16_LEN, PERM(RD, ENABLE) | PERM(WR, ENABLE),
sizeof (uint16_t), 0,零},
// user服务器TX数据
[USER_IDX_SERVER_TX_DATA_USER_DESC] = {(uint8_t*)&att_decl_user_desc, ATT_UUID_16_LEN, PERM(RD, ENABLE),
1、使用sizeof(USER_SERVER_TX_DATA_USER_DESC) - 1, USER_SERVER_TX_DATA_USER_DESC},
嗨mahaju,
ble_app_peripheral包含可写特征,如控制点和可读可通知特征,如ADC VAL 1。中心可以从一个设备写入一个特性,而该设备可以从中心通知一个特性。
在您的应用程序中,当您通过BLE从智能手机向DA14580 SoC发送消息时,这是一个可写特性。另一方面,当您从DA14580 SoC向您的智能手机发送消息时,这是一个可通知的特性,您必须激活通知。
请检查一下通知是否激活了。
由于PM_dialog
HI I在对话框中启用通知芯片代码如下:
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 - > = 0 x2长度;//使用与KE_MSG_ALLOC_DYN()相同的参数值
memcpy (msg_en_notf - >价值&enable_notif 0 x2);
ke_msg_send (msg_en_notf);
每次我需要从BLE芯片发送东西到智能手机时,我都调用这个代码块,我可以在我的智能手机应用程序中查看我从BLE芯片发送的数据
这是正确的方法吗?我尝试在user_peripheral.c中的user_app_init()中调用这个函数一次,但是它不起作用。
嗨mahaju,
不,这不是一个正确的方法。正确的方法是,主服务器应该启用指示/通知特性。在您的实现中,您做了相反的事情,您从您的代码编写通知属性。根据BLE规范,主程序启用通知属性,因此您必须启用智能手机应用程序的通知。
当您调用user_app_init()函数中的代码块时,预期它不会工作。首先调用user_app_init(),然后重置BLE堆栈。重置后,您将丢失所有数据,BLE堆栈将被释放。
由于PM_dialog
你好,抱歉这么晚才跟进,我还有一个问题
如果我理解正确的话,只需使用智能手机中的android功能就可以启用通知功能
这是正确的吗?我是否需要在对话框程序中添加一些额外的代码来接受和处理来自智能手机的“通知启用”命令?
嗨mahaju,
是的,这是正确的。你应该通过使用你的移动BLE应用程序来启用通知,但是你的特性应该是可通知的,不,你不应该在你的代码中添加任何额外的东西,概要文件会管理这一点。我建议您检查SDK的ble_app_peripheral示例。这个例子包含了一个可通知特征(ADC VAL 1特征)的实现。
由于PM_dialog