我正在尝试从BLE芯片向智能手机向智能手机发送N个字节,在从智能手机中收到BLE芯片中的一组字节,即,我的预期操作顺序如下:
智能手机 - > DA14580芯片 - >智能手机
我设法做的第一部分(智能手机--BLE - > 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->长度) - 1]);
i2c_write_mine(i2c_slave_address,param-> value [(param-> length) - 1]);
// 2018-02-20:来自论坛帖子(https://support.dialog-semiconductor.com/ble-transmission)
// *************************************定制价值1 ********************************* //
结构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( “内部%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];
对于(中间体I = 0;我<20; i ++在)
{
样本[i] = 65 + i;
}
req-> conhdl = app_env-> conhdl;
// req-> handle = cust1_idx_adc_val_1_val;// 2018-02-20:orig
req->手柄= USER_IDX_SERVER_TX_DATA_VAL;
// req->长度= DEF_CUST1_ADC_VAL_1_CHAR_LEN;// 2018-02-20:orig
req->长度= DEF_USER_SERVER_TX_DATA_CHAR_LEN;
//的memcpy(req->值,&样品,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定义,如沿侧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定义为
#define def_user_server_tx_data_char_len 20.
教程中,我跟着是ble_peripheral_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:
MSGID = 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,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,NULL},
//用户服务器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,NULL},
//用户服务器TX数据特征用户描述
[USER_IDX_SERVER_TX_DATA_USER_DESC] = {(uint8_t *)&att_decl_user_desc,ATT_UUID_16_LEN,PERM(RD,ENABLE),
的sizeof(USER_SERVER_TX_DATA_USER_DESC) - 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
嗨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->手柄= USER_IDX_SERVER_TX_DATA_VAL;
msg_en_notf->长度= 0×2;//使用相同的值作为用于KE_MSG_ALLOC_DYN()的参数以上
memcpy(msg_en_notf->值,&enable_notif,0x2);
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