蓝牙智能骑行头盔Android终端软件的设计与实现

2018-12-19 12:44黄思远周渊平苗青
现代计算机 2018年32期
关键词:流程图线程头盔

黄思远,周渊平,苗青

(1.四川大学电子信息科学技术学院,成都610065;2.78167 部队610017)

0 引言

随着人们的生活水平不断提升,街道上的车辆增加许多,道路上骑行的风险也骤增,车祸事故频发。不少摩托车事故都是因为驾驶员在驾驶过程中操作手机引起的。为了减少这种风险,设计了一款智能骑行头盔,可以在骑行时便捷地完成一些手机的功能。此头盔使用蓝牙通信技术,将手机端和头盔端联系起来,可以在骑行时无需操作手机就可以便捷地通过语音操控手机的一些功能。这样,既解放了双手,又可以让骑行者专注于骑行。对于广大骑行者,该头盔有着巨大的市场潜力。

为了满足头盔和手机的交互的便利性和功能封装聚合的需求,本文设计了一款头盔控制软件系统。方便头盔端和手机端的交互,包括数据通信、语音控制、地图导航、音乐控制等功能,提高了用户体验的同时,强化了头盔的功能,为使用者提供了便利。

1 蓝牙智能骑行头盔Android终端系统概述

本节将简单介绍系统的操作系统、开发环境、开发语言和使用的工具类,然后介绍系统的主要逻辑结构和功能组成。

1.1 系统集成环境

合适的系统集成环境可以使系统的运行更高效更稳定。Android系统开源免费,是全球使用最广泛的操作系统,因此本软件采用了Android系统。本软件采用Android Studio平台开发,支持Android 4.0到Android 7.0的系统。语音识别和文本理解使用了科大讯飞的API,地图导航使用了百度地图的API,蓝牙连接使用了谷歌的android.bluetooth包。

表1 系统集成环境

1.2 系统的总体结构

如图1所示,一个完整的蓝牙智能骑行头盔An⁃droid终端系统,主要包括监听输入、蓝牙通信、语音处理、功能实现。整个蓝牙智能骑行头盔Android终端系统的功能可以分为两个,一是语音指令的获取和解析,二是语音指令的具体功能实现。语音指令获取过程:手机收到我们的按键提示后监听蓝牙麦克风的语音输入,如果监听到语音信号输入,则通过蓝牙串口传输到手机。串口数据进入手机后由后台线程通过调用讯飞的语音解析接口将语音信号转成文字形式的字符串,得到文本数据[1],提取其中的关键词,随即开启一条线程传入参数,执行语音命令所对应的功能。系统结构如图1所示。

图1 系统结构

2 硬件系统和蓝牙连接协议简介

2.1 硬件系统简介

硬件系统包括C8051F020单片机和蓝牙模块BK8000L。C8051F020是基于CIP-51的微控制器,比传统8051系列单片机执行速度提升很大。蓝牙模块BK8000L体积小、重量轻、功能强大,可以跟许多类型手机连接。将蓝牙和麦克风分别连在单片机上,将其放置在头盔上。效果如图2所示。

图2 硬件组成

2.2 蓝牙连接协议简介

蓝牙连接协议结构可分为底层硬件模块、中间协议层和高端应用层三大部分,底层硬件模块为数据的无线传输提供硬件支持。中间协议层定义了4个蓝牙核心协议,是其他上层协议实现的基础。高端应用层可以让开发者自定义各种应用模型的剖面(Profile)。

本系统主要配置了高端应用层中的蓝牙链路方式。蓝牙物理链路分两种,同步链路SCO(Synchronous Connection Oriented)和异步链路 ACL(Asynchronous Connectionless)。本系统的采用的是SCO方式,此连接类型主要适用于同步语音传输。SCO连接为对称连接,通过有规律的使用保留时隙来维持SCO链接,可以传输对时间要求很高的数据通信。传输即时、快速,符合头盔传输的要求。

在本系统中,通过调用mAudioManager类的start⁃BluetoothSco()方法打开SCO连接。蓝牙SCO连接建立需要时间,连接建立后,使用广播接收该消息而进入后续逻辑。

3 软件系统实现

软件系统主要由两部分构成:一是手机界面设计,二是后台线程设计。下面对这两部分的具体实现做详细阐述。

3.1 手机界面设计

本软件的界面主要有四个,分别是初始连接界面,主界面以及导航界面。初始连接界面负责连接蓝牙;主界面负责识别语音指令以及响应结果。

系统的界面布局均使用了相对布局RelativeLayout管理器。界面设计使用了XML(Extensible Markup Lan⁃guage)布局和代码控制 UI(User Interface)界面相结合。主界面使用了Botton、ImageView、RadioButton等控件,地图导航使用了MapView、EditText等控件,本系统的主界面如图3所示。点击下方正中心的圆圈按钮即可开始语音识别;点击上传联系人按钮能将本地通信录信息上传,便于拨打电话和发送短信;点击地图按钮或语音识别可以进入地图界面,开启导航功能。选项设置可以个性化配置语音识别功能;点击手机按钮可以选择使用手机端还是头盔端发出语音消息。当使用播放歌曲功能时,歌曲的信息如封面、歌曲名称、加载进度,播放进度会显示在上方。

图3 软件主界面

3.2 后台线程实现

后台线程有蓝牙连接、语音识别、音乐播放、地图导航以及打电话发短信查天气,等等。其中最核心的是语音识别,依靠快速可靠的语音识别,才能最大地发挥软件的作用。

(1)蓝牙连接模块

在手机与头盔的连接中,手机为客户端,头盔为服务端,手机端主动请求连接头盔端。首先调用Blue⁃toothAdapter检查当前手机是否支持蓝牙,如果不支持的话退出软件,如果支持蓝牙且蓝牙未启用,则请求用户授权打开蓝牙开关。之后获取BluetoothAdapter对象device,使用蓝牙适配器搜索附近蓝牙设备信息,因为蓝牙在搜索到设备和搜索完毕都是通过广播发送的,这里我们需要注册广播接收器[2]。注册完毕后,通过广播接收器获取搜索得到的蓝牙设备信息,然后通过设备MAC(Media Access Control)地址获取蓝牙设备对象。手机作为客户端,通过 UUID(Universally Unique Identifier)打开一条道服务器的信道来获取设备的BluetoothSocket对象,通过此对象来连接两个蓝牙设备,语音信息以流的形式传输[3]。

在蓝牙连接成功后,即可开始蓝牙通信,这个线程一直维持到程序退出,随时等候发送数据到头盔端或者接受头盔端传输的数据,保障手机端和头盔端畅通的通信环境。蓝牙通信模块的流程图如图4所示。

图4 蓝牙通信流程图

(2)语音识别模块

当点击语音识别按钮后,头盔端监听到的语音信息随即通过蓝牙Socket通信传输到手机端的软件中,语音识别线程在手机端软件获取到语音信息后开始执行。

语音识别就是识别语音信号,将其转变成便于智能终端处理的文字信息。当手机端接收到头盔端的语音指令开启监听信号后,蓝牙麦克风将采集到的声波,通过蓝牙发送给手机端,随后开始语音识别[4]。

首先调用语音接口向服务器请求解析语音信号,服务器验证通过后将解析语音信息转换成文字信息,返回 JSON(JavaScript Object Notation,JS对象简谱)数据包,然后对数据本地解析,获取文字的字符串。这个过程通过SpeechRecognizer类调用语音识别服务。通过TextUnderstander类调用文本理解服务,自行提取其中的关键字。语音识别模块流程图如图5所示。

图5 语音识别流程图

(3)音乐播放模块

考虑到方便使用语音控制,音乐播放模块是在线实时播放音乐的。开启音乐线程时会传入歌曲名字,因为网页解析和服务器请求都是耗时的网络请求,在Android 4.0系统之后建议将这些请求放在子线程中,所以在子线程中使用Jsoup类解析地址,获取网页上的歌曲 ID(Identification),然后通过 URLConnection(Uni⁃form Resource Locator)类向网站服务器请求对应歌曲ID的数据,服务器验证后响应请求返回数据包,本地解析JSON数据,获取歌曲的在线播放链接和封面图片链接,并且设置歌曲的图片和名字等信息显示,随后调用MediaPlayer类,设置好参数后,调用start()方法播放歌曲,播放结束后该线程就会终止。音乐播放模块的流程图如图6所示。

图6 音乐播放流程图

(4)地图导航模块

地图导模块使用了百度地图的SDK(Software Devel⁃opment Kit),该SDK小巧方便,功能强大,被大量应用于实际开发。百度地图GeoCoder类提供从地址到经纬度坐标或者从经纬度坐标到地址的转换服务。BikeNavi⁃gateHelper提供路径规划和实时导航服务。从语音指令获取起点终点参数后,首先校验SDK的版本是否正确。计算出起点和终点的经纬度。在地图上标记出起点和终点,然后计算起点和终点的经纬度,并且在map中标记。然后进行路径规划。规划好路径后,即可开始骑行导航。如果要让导航更精确需要开启定位服务,默认开启语音播报。这样无需查看地图,骑行者戴着头盔听语音即可接受导航[5]。导航过程中会有一些提示,如偏离导航、平均速度等、已行驶路程、距离终点距离等提示音,方便用户导航。地图导航流程图如图7所示。

图7 地图导航流程图

(5)打电话模块和发短信模块

这两个功能都首先需要获取联系人的电话。通过使用ContenResolver类的query()方法查询保存在An⁃droid的手机通讯录中的联系人,此方法在主线程中查询数据,使用query()方法后,返回数据库的游标Cur⁃sor。通过游标遍历通讯录中的所有联系人信息,匹配联系人姓名,遍历完后需要手动关闭Cursor。如果匹配成功,则返回电话号码,进行下一步打电话或者发短信操作。开启线程时传入联系人名字,和本地存储的通信录进行匹配。如果是打电话,则传入参数,参数为电话号码,调用系统的线程ACTION_CALL。如果是发短信,则调用短信管理器的sendTextMessage()方法发送短信,传入参数电话号码短信内容,值得注意的是,如果发送的内容过大,则需要调用divideMessage()方法将短信内容分段多条发送。如果发送短信成功会通过语音播报出发送详情。流程图如图8所示。

图8 打电话和发短信流程图

(6)查询天气模块

查询天气时,向天气网站接口请求对应的城市天气,返回JSON数据包,经过本地解析后,获取完整的天气各项指标,如风向、湿度、温度、天气等情况,再通过语音播报出来。

3.3 系统测试

系统测试主要测试以下几个方面:

(1)蓝牙麦克风和手机端的蓝牙连接是否能可靠。

(2)语音信号是否足够清晰,识别足够准确。

(3)功能执行是否正常,页面显示是否正常。

(4)系统长时间运行是否稳定、流畅。

实际测试表明,该软件能够对有效、稳定地帮助骑行者减少骑行时操作手机的频率,能够做到可靠准确的执行语音指令。部分演示图如图9、图10所示。

图9 音乐播放流演示

图10 地图导航演示

4 结语

本软件系统基于Android平台开发,采用了多线程并发技术进行软件设计。对各个线程之间的执行进行了合理的分配,对不同版本的Android系统有着良好的兼容性,为后续的软件应用奠定了基础。

猜你喜欢
流程图线程头盔
5G终端模拟系统随机接入过程的设计与实现
云的识别指南
实时操作系统mbedOS 互斥量调度机制剖析
浅析体育赛事售票系统错票问题的对策研究
一种程序源代码的标准化流程图转化方法∗
汉字戴头盔
时光减速头盔
Lumos智能头盔,让夜骑更安全
创意头盔
Java的多线程技术探讨