无法通过蓝牙发送一条消息

4个帖子/ 0新
最后一篇
MarcoTrettner
离线
最后一次露面:3年5个月前
加入:2015-10-26 15:20
无法通过蓝牙发送一条消息

嗨对话小组!

我正在开发我自己的蓝牙骰子,有一个简单的问题/问题,我不能解决自己。我试了很多东西,但还是没有成功。

我正在使用与“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

设备:
mt_dialog.
离线
最后一次露面:7个月1个星期前
职员
加入:2015-06-08 34
嗨Marco,

嗨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.

MarcoTrettner
离线
最后一次露面:3年5个月前
加入:2015-10-26 15:20
嗨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

mt_dialog.
离线
最后一次露面:7个月1个星期前
职员
加入:2015-06-08 34
嗨Marcotreettner,

嗨Marcotreettner,

BLE_APP_PERITIVELAL示例的默认行为是,当您在控制点特性时写入时,它将启用内核计时器,设备将开始发送通知,因为您必须启用中央的通知,您将无法获取它们的通知。。一旦启用通知,您应该在手机上获取它们。在Cust1_IDX_ADC_VAL_1_VAL函数中的user_catch_rest()函数中,您应该在设备向手机留出通知时,您应该在手机上留下指示(自发出以来未成功交付)。在App_ble_Peripheral项目发送通知时没有实现。正如我之前所提到的那样,您必须从中中心启用通知,您不必在设备方面做任何事情,因为通知通过内核定时器定期触发。还关于按钮在默认外围配置文件中没有按钮实现。

谢谢mt_dialog.