基于Android系统蓝牙开发的研究与实现*

2013-03-11 05:48周进波袁钦鹏
光学仪器 2013年1期
关键词:调用蓝牙应用程序

周进波,张 磊,张 敏,袁钦鹏

(上海理工大学 光电信息与计算机工程学院,上海 200093)

引 言

Android是Google开发的一款基于Linux的开源手机系统,由于其完全开放的特点,Android开发群体和用户越来越多,逐渐成为市场份额最大的智能手机操作系统。除了在移动通信方面,Android系统已经应用到其它电子领域,如平板电脑、手持设备等。设备间的数据传输方式主要包括USB 传输、红外传输、蓝牙传输,USB 传输速度快、即插即用、便于扩展,Android 系统从SDK3.1 平台开始引入ADK(accessory development kit),使不支持USB Host功能的Android设备可以与其它USB设备通信。红外传输是一种无线通信技术,因为传输距离较短、易受干扰,现在更多使用蓝牙作为无线传输[1],蓝牙传输方便稳定。Android系统同时支持蓝牙通信,通过对Android系统的蓝牙开发研究,对蓝牙、单片机编程,以实现与单片机通信。

1 系统设计原理

Android系统控制单片机步进电机系统结构图如图1所示。首先由Android系统提供的蓝牙API接口,编写应用程序,实现蓝牙设备的基本操作,设备连接正常后,通过Bluetoothsocket实现数据的输入、输出。单片机蓝牙模块接到数据命令后,调用单片机控制程序,控制步进电机的加速、减速、转向。

图1 系统结构框图Fig.1 Block diagram of system structure

2 Android蓝牙应用程序设计

2.1 Android蓝牙协议栈

Android系统从2.0开始支持蓝牙,使用了BlueZ协议栈,BlueZ通过DBUS来通信交互的。BlueZ是Linux内核的官方蓝牙协议栈,目前在较高Linux内核版本中已有支持,也是目前应用最广泛的蓝牙协议栈,几乎支持所有已通过认证的蓝牙设备。该协议栈由多个相对独立的模块组成,内核空间主要包括设备驱动层(蓝牙的设备驱动一般是指电源的开关驱动以及通信接口的驱动,如串口、USB 等)、L2CAP层与SCO 音频层、RFCOMM、蓝牙核心及HCI层、BNEP、CMTP层与HIDP层、通用蓝牙SDP库和后台服务及面向所有层的标准套接字接口。Android提供Bluetooth通信的API是BlueZ的RFCOMM 的封装,RFCOMM 层支持标准的套接口,并提供了串行仿真TTY 接口,这使串行端口应用程序和协议可以不加更改地运行在蓝牙设备上[2-4]。蓝牙应用程序设计主要包括:蓝牙打开、蓝牙查找、蓝牙连接、数据通信等四个模块[5-6],流程图如图2所示。Android系统为蓝牙开发提供了API,其中最主要的几个类包括:

BluetoothDevice:蓝牙设备类,包括蓝牙设备的名称、MAC地址等信息。

Bluetoothsocket:蓝牙套接字的接口类,蓝牙设备间数据输入输出的连接点。

BluetoothAdapter:蓝牙适配器类,所有蓝牙设备交互的接口,包括查找、绑定、监听其它设备。通过调用上面几个基本类中的方法可以实现蓝牙设备的基本操作。

图2 蓝牙通信流程图Fig.2 Flowchart of bluetooth communication process

2.2 蓝牙设备打开

首先获取蓝牙适配器,通过方法GetDefaultAdapter(),返回本地BluetoothAdpter,通过该对象就可以操作蓝牙设备了,如果返回为空,则启动蓝牙失败,需要检测设备蓝牙模块是否正常工作。然后判断蓝牙是否打开,如果蓝牙处于disable状态,则需要封装ACTION_REQUEST_ENABLED 到intent对象,通过startActivityForResult()方法调用intent对象打开蓝牙。

2.3 蓝牙设备查找

获得蓝牙设备包括新扫描的设备和已经绑定的设备,程序先要注册一个ACTION_FOUND 动作的广播,调用startDiscovery()方法,每次发现一个设备,系统就广播一次,将设备的信息包括设备名、设备mac加入设备列表;调用getBondedDevices()方法得到已绑定的设备数量,依次加入到设备列表。因为在整个扫描过程要持续12s左右,占用一定系统资源,在设备连接之前,程序要调用cancelDiscovery()方法取消设备查找,减少资源浪费。

2.4 蓝牙设备连接

蓝牙支持点对点、点对多点的连接方式。作为主设备,Android 系统中,一个从设备拥有一个RFECOMM 信道,只有当主从设备同时在一个信道上,调用 Bluetoothdevice 类中的createRfcommSocketToServiceRecord(UUID)方法(UUID 为识别码),获取Bluetoothsocket后才能建立连接。连接多个设备时,应用程序需要建立一个服务器端口Bluetoothserversocket,调用accept()方法监听其它设备请求,当有请求发出后,将已经连接的Bluetoothsocket分配给设备。

2.5 蓝牙设备通信

设备连接成功后,主从设备拥有同一个Bluetoothsocket,通 过 getInputStream ()、getOutputStream()方法得到数据流,然后调用write()、read()方法写入或者读出数据,对于复杂的数据传送可能出现堵塞情况,需要单独建立一个线程实现。

至此整个应用程序设计完成,图3为应用程序运行界面、测试结果图。

3 单片机程序设计

步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,达到准确定位的目的;可以通过调整每相通电顺序,改变电机转动方向;可以通过控制脉冲频率来控制电机转动的速度,达到调速的目的[7]。设计采用AT89C52单片机作为控制器芯片,ULN2003芯片作为脉冲驱动芯片,蓝牙串口模块采用HC-06,步进电机采用M35SP-9四相电机,具有调速、调向的功能,数据接收、发送采用查询的方式[8],程序流程如图4所示。应用程序发送控制命令,单片机接收后调用对应的命令子程序,最后返回当前运行状态给应用程序。

图3 应用程序运行效果图Fig.3 Running effect of application program

图4 程序流程图Fig.4 Program flowchart

4 结 论

Android系统的应用越来越广泛,其中蓝牙是一种主要的数据传输方式,通过对Android系统蓝牙编程,完成了应用程序界面编写及单片机步进电机驱动程序设计,实现了Android系统与单片机之间的蓝牙通信。实践表明,该通信方式数据传输稳定、控制精度高,对Android系统的应用具有积极的指导意义。

[1] 邬正义,范 瑜,徐惠钢.现代无线通信技术[M].北京:高等教育出版社,2006:342-343.

[2] 郭宏志.Android应用开发详解[M].北京:电子工业出版社,2010:173-175.

[3] 杨文志.Google Android程序设计指南[M].北京:电子工业出版社,2009:210-212.

[4] 李黎国,张 辉,程 号.基于Android健康服务终端蓝牙传输软件的设计[J].电子科技,2012,25(5):115-118.

[5] MILIER B A.蓝牙核心技术[M].北京:机械工业出版社,2001:180-182.

[6] 朱 刚,谈振辉,周贤伟.蓝牙技术原理与协议[M].北京:北方交通大学出版社,2002:200-201.

[7] 胡虔生,胡敏强.电机学[M].北京:中国电力出版社,2009:145-146.

[8] 陈贵银.单片机原理及接口技术[M].北京:电子工业出版社,2011:98-100.

猜你喜欢
调用蓝牙应用程序
核电项目物项调用管理的应用研究
删除Win10中自带的应用程序
LabWindows/CVI下基于ActiveX技术的Excel调用
谷歌禁止加密货币应用程序
简单、易用,可玩性强Q AcousticsBT3蓝牙音箱
适合自己的才是最好的 德生(TECSUN) BT-50蓝牙耳机放大器
紧急:蓝牙指尖陀螺自燃!安全隐患频出
基于系统调用的恶意软件检测技术研究
利用RFC技术实现SAP系统接口通信
三星电子将开设应用程序下载商店