不能通过蓝牙发送一条信息

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()将消息发送到配置文件,然后自动发送到我的智能手机。

下面是我使用的代码:

空白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;
申请- >处理= CUST1_IDX_ADC_VAL_1_VAL;
申请- >长度= DEF_CUST1_ADC_VAL_1_CHAR_LEN;
顺利进行,memcpy(请求- >价值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
嗨,马克,

嗨,马克,

如果我理解正确,你想每次你有一个中断从一个开关(加速计中断稍后)一个特定的值被发送到你的手机。我已经在外围项目上尝试了您的实现。我好像收到了通知。请检查我所做的更改。

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;
申请- >长度= 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页所示)。我使用Android Studio在我的智能手机上开发应用程序。
在Android Studio中,我找到了ADC VAL 1的UUID

UUID CUST_UUID_ADC_VAL_1 = UUID. fromstring ("15005991-b131-3396-014c-664c9867b917");"

当使用bluetoothgattcharacteristic . getdescriptors()时,有一个特征可用的描述符列表。对于ADC_VAL_1,有两个uuid:

"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 (characteristicVal,真实);
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. Prf_server_send_event ((prf_env_struct *));shdl +参数- >处理);
custs1_env。ntf_handle =参数- >处理;

其他的

一同出席();
状态= PRF_ERR_IND_DISABLED;
}”

在"user_peripheral.c"中有一个名为"user_catch_rest_hndl"的函数。有一种切换情况,当应用程序发送通知时,CUST_IDX_ADC_VAL_1_VAL是这种情况:

“案例CUSTS1_VAL_NTF_CFM:

Struct custs1_val_ntf_cfm const *msg_param = (Struct custs1_val_ntf_cfm const *)(param);

开关(msg_param - >处理)

案例CUST1_IDX_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函数也没有被调用。

当我按下按钮发送通知时,APP在几秒钟后进入断开状态。

我希望你能告诉我怎样才能正确启用通知。

最好的问候,

马可Trettner

MT_dialog
离线
最后看到:7个月1个星期前
工作人员
加入:2015-06-08 34
嗨MarcoTrettner,

嗨MarcoTrettner,

ble_app_peripheral的默认行为的例子是,当你写控制点的特点将使内核定时器和设备将开始发送通知,这些通知你不能让他们因为你必须使中央的通知。一旦启用了通知功能,你就应该在手机上看到它们。在交换机CUST1_IDX_ADC_VAL_1_VAL情况下的user_ catch_rest()函数中,无论何时从您的设备发送通知到您的手机(没有成功传递,因为它是一个通知),您都应该得到一个指示。当在app_ble_peripheral项目上发送通知时,没有实现。正如我之前提到的,你必须启用来自中央的通知,你不需要在设备端做更多的事情,因为通知是由内核计时器周期性触发的。关于按钮,默认外围配置文件中也没有按钮实现。

由于MT_dialog