我正在尝试从BLE芯片向智能手机向智能手机发送N个字节,在从智能手机中收到BLE芯片中的一组字节,即,我的预期操作顺序如下:
智能手机 - > DA14580芯片 - >智能手机
我已经设法做了第一部分(智能手机 - > DA14580芯片),但我无法理解如何做第二部分
我正在修改ble_app_peripheral样本程序
我在user_custs1_impl.c中取消了void app_adcval1_timer_cb_handler()的代码,并尝试修改它,但它不起作用(即,我的智能手机上的Buttom BLE接收应用程序不会检测到任何东西)
(我也确定它不是智能手机应用程序的问题,因为它可以从我拥有的另一个自定义BLE模块中检测到传入的BLE数据,以及我的目标创建我自己的此自定义模块的版本)
这是我的代码:
void user_server_rx_data_ind_handler(ke_msg_id_t const msgid,
struct musts1_val_write_ind const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
ARCH_PRINTF(“功能%s \ n \ r”,__func__);
//执行操作:只需显示数据即可
for(int i = 0; iLength; i ++){
ARCH_PRINTF(“\ TPARAM->值[%d] =%d(0x%x)\ n \ r”,i,param-> value [i],param-> value [i]);
}
// 2018-02-12:i2c将字节发送到外部开发
//将接收的字节数组的数据部分发送到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-> handle = cust1_idx_adc_val_1_val;// 2018-02-20:orig
req-> handle = user_idx_server_tx_data_val;
// req-> length = def_cust1_adc_val_1_char_len;// 2018-02-20:orig
req-> length = def_user_server_tx_data_char_len;
// memcpy(req->值,&sample,def_cust1_adc_val_1_char_len);// 2018-02-20:orig
memcpy(req->值,&sample,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_catch_rest_hndl()中调用user_peripheral.c中的一个,其中一个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中定义为
#define def_user_server_tx_data_char_len 20.
BLE_PERITALAL_APP教程我遵循是
training_03_custom_profile_gatt_cmd_example_v1 0.pdf.
我想我在这里缺少非常基本的东西。如何从BLE芯片向智能手机发送单个数据字节?
- - 编辑 - -
这会导致UART终端上的以下输出:
Inside 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.
检测到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,启用),
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},
//用户服务器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},
嗨马哈茹,
BLE_APP_PERITWAL包含可写特性,如控制点和可读 - 可读取的特性,如ADC VAL 1.中央可以从设备写入特性,并且设备可以通知来自中央的特性。
在您的应用程序中,当您通过BLE从智能手机发送消息到DA14580 SoC时,这是一个可写的特征。在另一方面,当您向智能手机发送DA14580 SoC的消息时,这是一个通知的特征,您必须启动通知。
请检查通知是否已激活。
谢谢pm_dialog.
嗨I启用了对话框芯片代码中的通知,如下所示:
struct susts1_val_set_req * msg_en_notf = ke_msg_alloc_dyn(custs1_val_set_req,
task_custs1,
task_app,
custs1_val_set_req,
0x2);
静态uint16_t enable_notif;
启用_notif = 0x0001;
// enable_notif [0] = 0x01;
// enable_notif [2] = 0x00;
msg_en_notf-> conhdl = app_env-> conhdl;
msg_en_notf-> handle = 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,0x2);
ke_msg_send(msg_en_notf);
每次需要将某些东西从BLE芯片发送到智能手机时,我都会调用此代码块,并且我能够在智能手机应用程序中查看从BLE芯片发送的数据
这是正确的方法吗?我尝试在User_PeripherAl.cn中的user_app_init()中调用一次,但它不起作用。
嗨马哈茹,
不,这不是一个正确的方法。正确的方法是主站应启用指示/通知特性。在您的实现中,您已完成相反的操作,您将从代码中编写通知属性。根据BLE规范,主设备启用通知属性,因此您必须从智能手机应用程序启用通知。
当您在User_App_Init()函数中调用代码块时,它的预期它不起作用。首先调用user_app_init(),然后重置BLE堆栈。重置后,您将丢失所有数据,并且放电BLE堆栈。
谢谢pm_dialog.
嗨抱歉跟进这么晚,但我有另一个问题
如果我正确地理解这一点,只需使用智能手机中的Android函数即可启用通知
这样对吗?是否需要在对话程序程序中添加一些额外的代码以接受和处理来自智能手机的“通知启用”命令?
嗨马哈茹,
对,那是正确的。您应该通过使用移动BLE应用程序启用通知,但您应该通知您的特征,否您在代码中不应添加任何额外的内容,配置文件将管理此内容。我建议您检查SDK的BLE_APP_PERITELAL示例。此示例包含通知特性(ADC Val 1特征)的实现。
谢谢pm_dialog.