打开主菜单

谷雨文档中心 β

更改

NRF52832DK协议栈高级实验

添加6,425字节2019年10月14日 (一) 10:59
实验简介
|'''异常'''
|-
|3.8_ble_hid_takephoto|自拍实验|利用BLE HID协议,蓝牙模块控制手机照相机拍照
|-
|3.9_ble_hid_musicplayer|音乐播放器实验|利用BLE HID协议,蓝牙模块控制手机音乐播放器
|}
{| class="wikitable"
!bit
!colspan="2" |功能
|-
|00(0x01)|Play/Pause |开始/暂停暂停(音乐播放控制)
|-
|1<s>1(0x02)</s>|一键启动<s>AL Consumer Control Configuration</s> |<s>用于将通用控件与特定的消费类设备或软件播放器相关联,以接收控件输入,而不考虑用户的关注点。 例如,一组传输控件可能与DVD-ROM播放器相关联,即使没有用户关注,该DVD-ROM播放器也将接收静音输入(没有深入研究,不清楚具体含义)</s>
|-
|22(0x04)|下一首Scan Next Track|下一首(音乐播放控制)
|-
|33(0x08)|上一首Scan Previous Track|上一首(音乐播放控制)
|-
|44(0x10)|Volume Down
|音量减
|-
|55(0x20)|Volume Up
|音量加
|-
|6<s>6(0x40)</s>|应用控制<s>AC Forward</s>|<s>加载上一个文档(功能测试不可用)</s>
|-
|77(0x80)|返回AC Back|载入下一个文件(切换手机应用,功能可用)
|}
<syntaxhighlight lang="c" line="1" start="432">
buffer[0] = 0x20;
err_code = ble_hids_inp_rep_send(&m_hids,
INPUT_REP_MPLAYER_INDEX,
INPUT_REP_MEDIA_PLAYER_LEN,
buffer,
m_conn_handle);
if (err_code != NRF_ERROR_INVALID_STATE)
{
APP_ERROR_CHECK(err_code);
}
}
break;
default:
break;
}
}
</syntaxhighlight>
=== 音乐播放器实验 ===
 
==== 实验简介 ====
上一个自拍实验,我们已经给大家介绍了BLE HID的含义以及使用方式。
 
大家都知道蓝牙耳机与蓝牙音响是蓝牙最常用的方向,而这两个应用都是和手机音乐播放器相关的控制,自拍实验中我们已经了解到了如何控制手机音量的加减,所以这一章节我们补充性的给大家带来音乐播放的其他3个按键控制(开始/暂停、下一首、上一首)。
 
==== 硬件说明 ====
nRF52DK开发板采用与Nordic官方开发板相同的按键电路,原则协议栈例程可以直接使用按键,无需修改代码。
 
按键与芯片引脚对应关系如下表格。
{| class="wikitable"
!网络标号
!芯片引脚号
!连接方式
|-
|BTN1
|P0.13
|直连,下降沿(低电平)触发
|-
|BTN2
|P0.14
|直连,下降沿(低电平)触发
|-
|BTN3
|P0.15
|直连,下降沿(低电平)触发
|-
|BTN4
|P0.16
|直连,下降沿(低电平)触发
|}[[文件:NRF52832DK 按键电路.png|居中|无框|475x475像素|link=]]
==== 实验现象 ====
 
==== 源码讲解 ====
本实验和自拍实验的主体代码都是相同,唯一不同的只有按键触发下的hid控制。
 
===== mian.c =====
按键按下,我们分别看下每个按键对应的hid功能。
 
S1:控制音乐的暂停与播放
 
S2:控制音乐切换下一首
 
S3:控制音乐切换上一首
 
S4:控制手机应用app切换(与本实验无关,仅做功能展示)<syntaxhighlight lang="c" line="1" start="1012">
//******************************************************************
// fn : bsp_event_handler
//
// brief : 处理来自BSP模块的事件的函数
//
// param : event -> 事件按下按钮产生的事件
//
// return : none
static void bsp_event_handler(bsp_event_t event)
{
ret_code_t err_code;
 
switch (event)
{
case BSP_EVENT_KEY_0:
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
//mouse_movement_send(-MOVEMENT_SPEED, 0);
uint8_t buffer[INPUT_REP_MEDIA_PLAYER_LEN];
 
APP_ERROR_CHECK_BOOL(INPUT_REP_MEDIA_PLAYER_LEN == 1);
 
buffer[0] = 0x01; // 开始/暂停
err_code = ble_hids_inp_rep_send(&m_hids,
INPUT_REP_MPLAYER_INDEX,
INPUT_REP_MEDIA_PLAYER_LEN,
buffer,
m_conn_handle);
if (err_code != NRF_ERROR_INVALID_STATE)
{
APP_ERROR_CHECK(err_code);
}
}
break;
 
case BSP_EVENT_KEY_1:
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
//mouse_movement_send(0, -MOVEMENT_SPEED);
uint8_t buffer[INPUT_REP_MEDIA_PLAYER_LEN];
 
APP_ERROR_CHECK_BOOL(INPUT_REP_MEDIA_PLAYER_LEN == 1);
 
buffer[0] = 0x04; // 下一首
err_code = ble_hids_inp_rep_send(&m_hids,
INPUT_REP_MPLAYER_INDEX,
INPUT_REP_MEDIA_PLAYER_LEN,
buffer,
m_conn_handle);
if (err_code != NRF_ERROR_INVALID_STATE)
{
APP_ERROR_CHECK(err_code);
}
}
break;
 
case BSP_EVENT_KEY_2:
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
//mouse_movement_send(0, -MOVEMENT_SPEED);
uint8_t buffer[INPUT_REP_MEDIA_PLAYER_LEN];
 
APP_ERROR_CHECK_BOOL(INPUT_REP_MEDIA_PLAYER_LEN == 1);
 
buffer[0] = 0x08; // 上一首
err_code = ble_hids_inp_rep_send(&m_hids,
INPUT_REP_MPLAYER_INDEX,
INPUT_REP_MEDIA_PLAYER_LEN,
buffer,
m_conn_handle);
if (err_code != NRF_ERROR_INVALID_STATE)
{
APP_ERROR_CHECK(err_code);
}
}
break;
case BSP_EVENT_KEY_3:
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
//mouse_movement_send(0, -MOVEMENT_SPEED);
uint8_t buffer[INPUT_REP_MEDIA_PLAYER_LEN];
 
APP_ERROR_CHECK_BOOL(INPUT_REP_MEDIA_PLAYER_LEN == 1);
 
buffer[0] = 0x80; // 切换手机应用(切换已经打开的app)
err_code = ble_hids_inp_rep_send(&m_hids,
INPUT_REP_MPLAYER_INDEX,
510
个编辑