实验指导书

  • 格式:doc
  • 大小:1.75 MB
  • 文档页数:32

蓝牙通信实验指导书 实验目的: 1. 熟悉使用Eclipse,学习Android开发流程; 2. 了解蓝牙链接通信过程; 3. 学会使用Socket进行蓝牙链接通信。

实验内容:

1、新建项目 新建Android工程项目,并运行。 File→New→Android Project,然后给项目和包命名。(自己新建项目时,用自己的名字命名包名,名字两个字的用com+姓名)

图 1 新建Android项目 图 2 项目命名

图 3 定义包名 文件目录如下: 图 4 项目文件目录 运行程序: 可直接单击标记处,或者通过在项目名处右击,选择Run As→Android Application

图 5 运行项目 添加虚拟机设置: 选择菜单栏中的Window→AVD Manager→New,填好配置信息。

图 6 添加虚拟机 2、添加权限

调用蓝牙API时需要申请权限,在AndroidManifest.xml文件中添加以下权限: 注:项目里边所有的Application、Activity、Broadcast等都需要在AndroidManifest里边进行注册。 这里可以直接先声明两个在项目里边用得到的Activty,分别为BluetoothChat(默认主Activity)和DeviceListActivity(显示设备列表)。接下来将分别完成这两个Activity。而设备搜索和设备通信再专门写一个BluetoothChatService类来实现。

3、主Activity设计—BluetoothChat 3.1界面设计 BluetoothChat是程序启动进入的主界面,如下图1,对应的main.xml文件如下图2: 整个界面的布局将是一个线性布局LinearLayout,其中包含了另一个ListView(用于显示聊天的对话信息)和另外一个线性布局来实现一个发送信息的窗口,发送消息发送框有一个输入框和一个发送按钮构成。

然后,在BluetoothChat.java中设置窗口布局:

这里将窗口风格设置为自定义,并且指定自定义的title布局为custom_title,其定义代码如下: 该布局将title设置为一个相对布局RelativeLayout,其中包含了两个TextView,一个在左边一个在右边,分别用于显示应用程序的标题title和当前的蓝牙配对链接名称,如下图所示:

其中左边显示为应用程序名称"BluetoothChat",右边显示一个connected:scort则表示当前配对成功正在进行聊天的链接名称。

3.2初始化 布局好界面,下面我们需要进入编码状态,首先看BluetoothChat所要那些成员变量,如下代码所示: 然后进行初始化,包括自定义title和获取本地蓝牙适配器: 3.3 BluetoothChat功能实现 在onStart() 函数中,检测蓝牙是否被打开,如果没有打开,则请求打开,否则就可以设置一些聊天信息的准备工作,代码如下:

如果蓝牙没有打开,我们则通过BluetoothAdapter.ACTION_REQUEST_ENABLE来请求打开蓝牙,REQUEST_ENABLE_BT则是我们自己定义的用于请求打开蓝牙的Intent代码,最后当我们调用startActivityForResult来执行请求时,就会在onActivityResult函数中得到一个反馈,如果当前蓝牙已经打开,那么就可以调用setupChat函数来准备蓝牙聊天相关的工作。 请求打开蓝牙之后,在onActivityResult 中得到的反馈信息,我们传递了REQUEST_ENABLE_BT代码作为请求蓝牙打开的命令,因此在onActivityResult 中,需要会得到一个请求代码为REQUEST_ENABLE_BT的消息,对于其处理如下代码所示: 在请求时,如果返回代码为Activity.RESULT_OK,则表示请求打开蓝牙成功,那么我们就可以和上面的操作进度一样,调用setupChat来设置蓝牙聊天相关信息,如果返回其他代码,则表示请求打开蓝牙失败,这时我们同样通过一个Toast来告诉用户,同时也需要调用finish()函数来结束应用程序。 如果打开蓝牙无误,那么下面我们开始进入setupChat的设置,其代码实现如下: 首先构建一个对话进程mConversationArrayAdapter,然后从xml中取得用于显示对话信息的列表mConversationView,最后将列表的数据来源Adapter设置为mConversationArrayAdapter,这里我们可以看到mConversationArrayAdapter所指定的资源为message.xml,其定义实现如下:

其中包含了一个TextView用来显示对话内容,这里设置了文字标签的尺寸大小textSize和padding属性。 然后我们取得编辑框mOutEditText,用于输入聊天内容的输入框,并对其设置事件监听mWriteListener,其监听函数的实现如下:

首先在其监听中实现了onEditorAction函数,通过判断其参数actionId来确定事件触发的动作,其中的"EditorInfo.IME_NULL"表示回车键消息,然后再加上KeyEvent.ACTION_UP,则表示当用户按下回车键并弹起时才触发消息的处理。然后将输入框中内容取出到变量message中,然后调用sendMessage函数来发送一条消息。 在setupChat函数中,对发送消息的按钮进行了初始化,同样为其设置了事件监听(setOnClickListener),监听的内容也是取得输入框中的信息,然后调用sendMessage函数来发送消息,和用户按回车键来发送消息一样。 最后一个重要的操作就是初始化BluetoothChatService对象mChatService用来管理蓝牙的链接,聊天的操作,并且设置其Handler对象mHandler来负责数据的交换和线程之间的通信。另外还准备一个空的字符串对象mOutStringBuffer,用于当发送消息之后,对输入框置空。

3.4菜单设计 应用除了这些界面的布局之外,还设置了一个菜单,菜单包括"扫描设备"和"使设备可见(能够被其他设备所搜索到)",这里将菜单布局通过xml定义,代码如下:

这里定义了上面的两个菜单。然后再在程序中通过onCreateOptionsMenu函数中来装载该菜单布局,对于菜单的点击可以通过onOptionsItemSelected函数的不同参数来辨别,下面是该应用程序中对菜单选项的处理和装载菜单布局的实现: 在处理菜单事件的时候,通过item.getItemId()可以得到当前选择的菜单项的ID,首先是扫描设备(R.id.scan),这里启动另外一个Activity来专门处理扫描设备DeviceListActivity,如果扫描之后将通过startActivityForResult函数来请求链接该设备,同样也会在onActivityResult函数中收到一个反馈信息,命令代码为REQUEST_CONNECT_DEVICE,如果反馈的请求代码为Activity.RESULT_OK,则表示扫描成功,下面就可以开始准备链接了,实现代码如下:

首先我们可以通过DeviceListActivity.EXTRA_DEVICE_ADDRESS来取得设备的Mac地址,然后通过Mac地址使用蓝牙适配器mBluetoothAdapter的getRemoteDevice函数来查找到该地址的设备BluetoothDevice,查询到之后可以通过mChatService对象的connect来链接该设备。 上面是扫描蓝牙设备并链接的过程,一般蓝牙设备在打开之后都需要设置可见状态,下面实现另一个菜单选项,用于使设备处于可见状态,其菜单项的ID为R.id.discoverable,具体实现过程则位于ensureDiscoverable函数中,其实现如下代码: 这里首先通过mBluetoothAdapter.getScanMode()函数取得该蓝牙的扫描模式,然后通过BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE设置可见属性,在这里我们加入一个附加属性BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,用来设置可见状态的时间,表示在指定的时间中蓝牙处于可见状态,设置好之后通过startActivity来执行即可。 在链接某个设备之前,需要开启一个端口监听,该应用程序将其放在onResume()函数中来处理了,代码如下:

首先检测mChatService是否被初始化,然后检测其状态是否为STATE_NONE,STATE_NONE表示初始化之后处于等待的状态,在setupChat函数中初始时,已经将其状态设置为STATE_NONE了(该操作是在BluetoothChatService的构造函数中处理的),所以这里就可以通过一个start函数来启动一个进程即可,就是启动了一个端口监听进程,当有设备连接时,该监听进程结束,然后转向链接进程,链接之后将转换到一个聊天管理进程。

4、设备扫描--DeviceListActivity

搜索周围蓝牙设备,并显示(设备名称,mac地址等)。 其中device_list.xml文件如下: