嗨对话小组!
我正在开发我自己的蓝牙骰子,有一个简单的问题/问题,我不能解决自己。我试了很多东西,但还是没有成功。
我正在使用与“ble_app_peripheral.uvprojx”中所示的自定义配置文件相同的自定义配置文件。在“user_custs1_impl1.c”中实现了如何通过蓝牙访问芯片。我已经为我的智能手机开发了一个应用程序,并可以编写和读取DA14580的数据,以便我可以配置开发套件的LED,我可以用智能手机读取ADC值。
在我自己的骰子应用程序中,我希望骰子在移动时向应用程序发送特殊消息。展示此我正在使用简单的交换机。
我已经为此开关配置了IRQ,这适用于(通过切换LED)。
现在我正在使用ke_msg_send()将消息发送到配置文件,然后自动发送到我的智能手机。
下面是我使用的代码:
void sensor_int_send_ble()
{
struct custs1_val_ntf_req* req = KE_MSG_ALLOC_DYN(custs1_val_ntf_req,
task_custs1,
task_app,
custs1_val_ntf_req,
DEF_CUST1_ADC_VAL_1_CHAR_LEN);
// 价值
静态uint16_t样本;
示例= 42;
申请- > conhdl = app_env - > conhdl;
req-> handle = cust1_idx_adc_val_1_val;
申请- >长度= DEF_CUST1_ADC_VAL_1_CHAR_LEN;
memcpy(req->值,和样本,def_cust1_adc_val_1_char_len);
ke_msg_send(要求的);
}
我无法在我的智能手机上收到“42”。我尝试使用app_easy_timer如上使用示例项目。此计时器使DA一直发送数据。我不希望他这样做,因为功耗应该很低。所以我尝试了“app_easy_timer_cancel”以在1,2,10调用后取消计时器。有时智能手机一直收到数据,有时它只收到了几个时间的数据,然后再也没有了 - 真的很困惑。
我希望你能帮我解决这个“简单”的问题。
谢谢,
MarcoTrettner
嗨Marco,
如果我在每次从交换机(稍后稍后的加速度计中断)中断时都会正确地理解您想要的特定值,则需要发送到手机的特定值。我试过在外围项目上实现。似乎我正在收到通知。请检查我所做的更改。
void app_nft_button_send(void)//发送通知
{
静态uint8_t button_st;
Button_st = (Button_st <= 0xff) ?(button_st + 1): 0;
struct custs1_val_ntf_req* req = KE_MSG_ALLOC_DYN(custs1_val_ntf_req,
task_custs1,
task_app,
custs1_val_ntf_req,
DEF_CUST1_BUTTON_STATE_CHAR_LEN);
申请- > conhdl = app_env - > conhdl;
申请- >处理= CUST1_IDX_BUTTON_STATE_VAL;
req-> length = def_cust1_button_state_char_len;
memcpy(请求- >值、&button_st DEF_CUST1_BUTTON_STATE_CHAR_LEN);
ke_msg_send(要求的);
}
空白button_press(空白)
{
app_nft_button_send ();
wkupct_register_callback (button_press);
wkupct_enable_irq(PIN_P11_SEL, PIN_POL_LOW, PIN_EVT_NUM, PIN_DB_TIME);// P1_1,极性低,1事件,去噪时间= 20ms
}
还添加了wkupct_register_callback()和Wkupct_enable_irq()(与上面相同的配置)在user_app_init();确保你的智能手机能收到通知。
谢谢mt_dialog.
嗨MT_Dialog,
谢谢你的回答。
我已经尝试过你的示例代码并对它有一些问题。
我尝试为ADC Val 1启用通知(如UM-B-050 Page 55所示)。我正在使用Android Studio在我的智能手机上开发应用程序。
使用Android Studio我发现了Charachteristy ADC Val 1的UUID
UUID CUST_UUID_ADC_VAL_1 = UUID. fromstring ("15005991-b131-3396-014c-664c9867b917");"
使用BlueToothGattCharachteristic.getDescriptors(),有一个可用于Charachterters的描述符列表。对于ADC_VAL_1有两个uuids:
"UUID ATT_DESC_CHAR_USER_DESCRIPTION = UUID. fromstring ("00002901-0000-1000-8000-00805f9b34fb");
UUID ATT_DESC_CLIENT_CHAR_CFG = UUID.FROMSTRING(“00002902-0000-1000-8000-00805F9B34FB”);“
在ble_app_peripheral。uvprojx在"at .h"中有这些uuid的16位版本。我想我已经为描述符找到了正确的uuid。
当我向自定义服务的控制点发送0x01时,我可以看到 - 由LED识别 - 函数“app_adcval1_timer_cb_handler()”被调用。所以我想连接有效。
现在我想接收每个“app_adcval1_timer_cb_handler()”发送的通知。
在Android Studio中,我必须做到:
“bluetoothgatt.setcharacteristicnotification(特征,真实);
BluetoothGattDescriptor descriptor = characterval . getdescriptor (ATT_DESC_CHAR_USER_DESCRIPTION);
descriptor.setValue(bluetoothgattdescriptor.enable_notification_value);
bluetoothGatt.writeDescriptor(描述符);“
完成此操作后,DA14580调用“cust1_task.c”中的“custs1_val_ntf_req_handler()”。状态为PRF_ERR_IND_DISABLED:
"//通过关贸总协定发出指示
如果((uint16_t) * ((uint16_t *) &cfg_val [0]) = = PRF_CLI_START_NTF)
{
prf_server_send_event((prf_env_struct *)&custs1_env,0,custs1_env.shdl + param->句柄);
custs1_env。ntf_handle =参数- >处理;
}
别的
{
带领();
status = prf_err_ind_disabled;
}“
在“user_peripheral.c”中,存在名为“user_catch_rest_hndl”的函数。有一个开关案例,当应用程序发送通知时,Cust_IDX_ADC_VAL_1_VAL是这样的:
“案例CUSTS1_VAL_NTF_CFM:
{
struct musts1_val_ntf_cfm const * msg_param =(struct custs1_val_ntf_cfm const *)(param);
开关(msg_param - >处理)
{
案例cust1_dx_adc_val_1_val:
带领();
打破;
案例CUST1_IDX_BUTTON_STATE_VAL:
打破;
案例CUST1_IDX_LONG_VALUE_VAL:
打破;
默认值:
打破;
}
} 休息;”
我不知道为什么我的“Ledon()”的情况下没有代码。我是否需要在那里实现DA14580应该为ADC_VAL_1启用不疑问?当我必须这样做时,我该怎么办?
当我改变ATT_DESCR_CHAR_USER_DESCRIPTION与ATT_DESCR_CLIENT_CHAR_CFG在Android Studio我得到同样的问题。
Android Studio中的onCharactersticChanged函数也没有被调用。
当我按下按钮发送通知时,应用程序将在几秒钟后转换为断开连接状态。
我希望你能告诉我怎样才能正确启用通知。
最好的问候,
马可Trettner
嗨Marcotreettner,
BLE_APP_PERITIVELAL示例的默认行为是,当您在控制点特性时写入时,它将启用内核计时器,设备将开始发送通知,因为您必须启用中央的通知,您将无法获取它们的通知。。一旦启用通知,您应该在手机上获取它们。在Cust1_IDX_ADC_VAL_1_VAL函数中的user_catch_rest()函数中,您应该在设备向手机留出通知时,您应该在手机上留下指示(自发出以来未成功交付)。在App_ble_Peripheral项目发送通知时没有实现。正如我之前所提到的那样,您必须从中中心启用通知,您不必在设备方面做任何事情,因为通知通过内核定时器定期触发。还关于按钮在默认外围配置文件中没有按钮实现。
谢谢mt_dialog.