蓝牙编程基础_第1页
蓝牙编程基础_第2页
蓝牙编程基础_第3页
蓝牙编程基础_第4页
蓝牙编程基础_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在移动设备上,联网的方式很多,也存在了很大的差异,包括速度,有效范围等等因素都会 对网络有不同的要求,本文我们就先分析一下Ophone平台上如何通过蓝牙进行网络连接, 进而使用蓝牙来开发一些小的游戏或者应用,这里我们先从最基础的开始,首先学习蓝牙编 程,我在查看了 android sdk之后,发现蓝牙聊天这个示例基本上已经包含了所有的蓝牙 基础知识,但是学习实例之前,我们有必要介绍一下蓝牙的基础知识,我大概浏览了一下, 没有看到过多介绍蓝牙开发包的使用的文章,因此我们这里会对Ophone平台中蓝牙开发 包进行一个详细的介绍,后面则会通过一个蓝牙聊天程序来进行实际开发。蓝牙API在OPhone平

2、台中,蓝牙api主要存在于android.bluetooth包中,它提供了皆如扫描 设备、连接设备以及对设备间的数据传输进行管理的类,这些类对蓝牙设备进行功能性管理, 蓝牙模块API提供的应用包括一下几个方面:扫描其它蓝牙设备通过查询本地蓝牙适配器来匹配蓝牙设备建立RFCOMM (无线射频通信协议)的通道/端口从其他的蓝牙设备中连接到指定的端口传输数据到其他设备,或者从其他设备中接收数据如需运用这些API来执行蓝牙通信,应用程序必须声明BLUETOOTH许可。对于皆如寻找 设备请求等的一些附加功能,也同样需要BLUETOOTH_ADMIN许可。比如本文所介绍的 蓝牙聊天程序就包含了一下两个权限

3、许可:view plain copy to clipboard print ?在蓝牙包(android.bluetooth)中有存在了以下几个类和接口,下面我们看一下他们分别 具有什么样的功能,如下表所示。类接口功能描述BluetoothAdapter本地的蓝牙适配器设备BluetoothClass描述了设备通用特性和功能的蓝牙类BluetoothClass.Device定义了所有设备类的常量BluetoothClass.Device.Major定义了所有主要设备类的常量BluetoothClass.Service定义了所有服务类的常量BluetoothDevice代表一个远程的蓝牙设备Blu

4、etoothServerSocket监听蓝牙服务的端口BluetoothSocket一个双向连接的蓝牙端口 socketBluetoothAdapter本地的蓝牙适配器。该类主要用来操作蓝牙的基本服务。比如:初始化设备的可见,查询可 匹配的设备集,使用一个已知的MAC地址来初始化一个BluetoothDevice类,创建一个BluetoothServerSocket类以监听其它设备对本机的连接请求等。如果要获得本地蓝牙适配器,只有一个唯一的方式就是调用getDefaultAdapter()函数, 同时也只有获得了蓝牙适配器之后才能进一步的操作!下面我们将本地蓝牙适配器的api 整理成以下一个表

5、格。牙的名称。QSrxlngIXTrUPVIOU S_S CAM_MODE43ACT 工。N_5 CANJOrr_C riA7GZ D 常童 中 作为一个整型附加域,来请求以前的扫描SrxzngZXTSAPRZVIOU 5_5 TATEkCTI0N_5TATED 常壁中作为 个整型附加域,来请求以前的供电状 态 QStringZXTRA_5CANJ0 DACT 工。CANJ0D5_C HANG三?常童 中 作为一个整型附加域,来请求当前的扫描 嗯PString*3三iCT IOT_S TATE_CH2G E D 常童中作为 个整型附加域,来请求当前的供电状 态。Jint5CANJ0DI_C0N

6、NE C TABLED指明在本地蓝牙适配器中,查询扫描功能 失款,但页面扫描功能有效。2int5C?lN_M0DE_C0NCTA5LZ_B IS COVESJkBZLE指明在本地蓝牙适配器中,查询扫描功能 和页面扫挹功能都有效。P2hB5CAN_M0DZ_N0N材指明在本地蓝牙适配器中,查伺扫描功能 和贞血扫描功能都失效a Pinr*356H_0FF3本地蓝牙适配器模块已经关PfL 2hB5TATZ_ON*本地蓝牙适配器模块已经打开,而且准备被使用。5int5TATZ_TU5NING_0F本地蓝牙适配器模块正在关闭。intETA巨_TU3NMG_0W本地蓝牙适配器模块正在打开。常用函数bccl

7、ean*21cance 1 Di b cc ve 22 y (取消当前的设备可见进程。staticche ckBluetc-OT hAddr 已 sb(Spring adaress验证设备地址是古伺效。bcclean*21disable(4关闭本地蓝牙适配器。4boolean*21e nabl 己 0 +、打开本地蓝牙适配器*StringgetAddress返回本地蓝牙适配器的健件地址。Blue tc-c thDevlaetBondedDevices退回已经匹配到本地适配器的 Blaetc ct hDe v.i ce 类的.对象集 舍-synchronizedgstDe fr ( Q荻取本地蓝

8、牙适配器。PstaticStringg已 tKaine荻取本地蓝牙适配器名称。PBluetccthDevi cegetRemoteDevice(EzxLng address+为制定的地址荻取一个BlueuccThDevzce4intgetScarJdcde (荻取本地蓝牙适配器的当前蓝牙扫 描模式。gstState(荻取本地蓝牙适配器的当前状态。9boolean*21sDicoverina()判断是否处于可见状态中。bc-clean3is Enabled判断是否被打开。4BlueTcot hServer5ceke t*21lis tenUsingRf ccmrilflierviceRecord

9、(Str ing name f UUID uuld +创建一个正在监听的安全的带自服 务记录的无线射频通信蓝牙端口。Qboclean*3m已tNarne String name +设置蓝牙或者本地蓝牙适配器的至 称口boolean*21startDiseever y (查技可见设备。9那么上面的表中所列出的都是一些常用的操作,我们在稍后实现蓝牙聊天程序时,都会介绍 如何详细的使用这些api。通常我们在使用一下代码请求使用蓝牙时,会弹出一个权限对话 框,如图14-1所示。view plain copy to clipboard print ?Intent enableBtIntent = new

10、 Intent(BluetoothAdapter.ACTION_REQUEST_ENAstartActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);BlueEth permission 伦questAn applotion on your phoneis requesting permission toturn on Bluetooth. Do you炯nt to ck? this?Yes图14-1请求使用蓝牙的权限当我们在使用ACTION_REQUEST_DISCOVERABLE来请求蓝牙可见状态时,也会弹出一个对话框来让用户确认,如图1

11、4-2所示。请求蓝牙可见代码如下:view plain copy to clipboard print ?Intent discoverableIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);startActivity(discoverableIntent);O Bluetooth permission requestAn application on yo

12、ur phoneii requesting perfnission toturn ori Bluetoath andmmake your phonediscoverable by other devicesfor 300 swondSr Do you wmntto da this?图14-2请求蓝牙可见最后,当我们的蓝牙首次在配对时,同样会出现如图14-3所示的确认对话框。Blu etooth pa i ring requesETo pair with android phone; confirm that it is shoeing the passkey: 980&53.PairDcnft

13、 PcrPair图14-3请求配对BluetoothClass该类用来描述设备通用特性和功能的蓝牙类。比如,一个蓝牙类会指定比如电话、计算机或 耳机的通用设备类型,可以提供比如音频或者电话的服务。每个蓝牙类都是有0个或更多 的服务类,以及一个设备类组成。设备类将被分解成主要和较小的设备类部分。BluetoothClass用作一个能大致描述一个设备(比如关闭用户界面上一个图标的设备)的 特性,但当蓝牙服务事实上是被一个设备所支撑的时候,BluetoothClass的描述则不一定 很准确。精确的服务搜寻通过SDP请求来完成。当运用createRfcommSocketToServiceRecord(

14、UUID)和listenUsingRfcommWithServiceRecord(String, UUID)来 创建 RFCOMM 端口的时候, SDP请求就会自动执行。我们可以使用getBluetoothClass()方法来获取为远程设备所提 供的类。同样,我们还是将该类的常用api列一个表,如下所示。内部类classBluetoothClass.Device定义所有设备类的常量。classBluetoothClass.Service定义所有服务类的常量。常用方法booleanequals(Object o)判断相等操作。intgetDeviceClass()返回BluetoothClass

15、.中的设备类部 分。intgetMajorDeviceClass()返回BluetoothClass.中设备类的主 要部分。booleanhasService(int service)如果该指定服务类被BluetoothClass.所支持,则返回 true。inthashCode()返回这个对象的整型哈希码。StringtoString()返回这个对象的字符串。这里,有几个方法需要说明一下,首先getDeviceClass()返回BluetoothClass.中的设备 类部分,从函数中返回的值可以和在BluetoothClass.Device中的公共常量做比较,从而 确定哪个设备类在这个蓝牙类

16、中是被编码的;其次,getMajorDeviceClass()返回 BluetoothClass .中设备类的主要部分,从函数中返回的值可以和在BluetoothClass.Device.Major中的公共常量做比较,从而确定哪个主要类在这个蓝牙类 中是被编码的。BluetoothClass.DeviceBluetoothClass.Device.MajorBluetoothClass.Service这三个类比较简单,主要是包含了一推常量,其中BluetoothClass.Device中的常量代表 主要和较小的设备类部分(完整的设备类)的组合。BluetoothClass.Device.Maj

17、or的常 量只能代表主要设备类。而BluetoothClass.Service定义了所有服务类的常量。由于这些 常量的数量比较多,这里我们就不一一列举了,详细信息大家可以参考sdk文档中: view plain copy to clipboard print ?docs/reference/android/bluetooth/BluetoothClass.Device.html2.docs/reference/android/bluetooth/BluetoothClass.Device.Major.htmldocs/reference/android/bluetooth/BluetoothC

18、lass.Service.htmlBluetoothDevice该类是一个远程蓝牙设备。我们可以创建一个带有各自设备的BluetoothDevice或者查询 其皆如名称、地址、类和连接状态等信息。对于蓝牙硬件地址而言,这个类仅仅是一个包装 器。这个类的对象是不可改变的。这个类上的操作会使用这个用来创建BluetoothDevice 类的BluetoothAdapter类执行在远程蓝牙硬件上。为了获得BluetoothDevice类,我们 可以使用 BluetoothAdapter.getRemoteDevice(String)方法去创建一个指定MAC地址 的设备(用户可以通过带有Bluetoo

19、thAdapter类来完成对设备的查找)或者从一个通过 BluetoothAdapter.getBondedDevices()得到返回值的有联系的设备集合来得到该设备。注意:使用该类需要加入BLUETOOTH权限。该类主要包含一下api可供我们使用。常量Stri ngACTION_ACL_CONNECTED广播活动:指明一个与远程设备建 立的低级别(ACL)连接。Stri ngACTION_ACL_DISCONNECTED广播活动:指明一个来自于远程设 备的低级别(ACL)连接的断开。Stri ngACTION_ACL_DISCONNECT_REQUESTE D广播活动:指明一个为远程设备提

20、出的低级别(ACL)的断开连接请 求,并即将断开连接。Stri ngACTION_BOND_STATE_CHANGED广播活动:指明一个远程设备的连 接状态的改变。Stri ngACTION_CLASS_CHANGED广播活动:一个已经改变的远程设 备的蓝牙类。Stri ngACTION_FOUND广播活动:发现远程设备。Stri ngACTION_NAME_CHANGED广播活动:指明一个远程设备的名 称第一次找到,或者自从最后一次 找到该名称开始已经改变。intBOND_BONDED表明远程设备已经匹配。intBOND_BONDING表明和远程设备的匹配正在进行 中。intBOND_NON

21、E表明远程设备并未匹配。intERROR错误信息。StriEXTRA_BOND_STATE作为一个ngACTION_BOND_STATE_CHANGED的整型附加域。Stri ngEXTRA_CLASS作为一个 ACTION_FOUND and 和 ACTION_CLASS_CHANGED 的 Parcelabe BluetoothClass附 加域。Stri ngEXTRA_DEVICE每次通过该类进行广播时,作为Parcelable BluetoothDevice 的 附加域。Stri ngEXTRA_NAME作为ACTION_NAME_CHANGED 和 ACTION_FOUND的字符串

22、附加 域。Stri ngEXTRA_PREVIOUS_BOND_STATE作为ACTION_BOND_STATE_CHANGED的整型附加域。Stri ngEXTRA_RSSI作为ACTION_FOUND的可选短整型附加域。常用方法BluetoothSocketcreateRfcommSocketToServiceRe cord(UUID uuid)创建一个RFCOMM以准备开始一个对使用 uuid的SDP查找的远程 设备进行安全而连接。intdescribeContents()描述了包含在Parcelables marshalled representation 中的特殊对象的种类。Stri

23、nggetAddress()返回该蓝牙设备的硬件 地址。BluetoothClassgetBluetoothClass()获得远程设备的蓝牙类。intgetBondState()获得远程设备的连接状 态。StringgetName()获得远程蓝牙设备的名 称。下面有几个需要说明的,ACL连接通过Android蓝牙栈自动进行管理,需要BLUETOOTH 去获取。该类中常量所对应需要的常量值如下:ACTION_?kCL_COBNZ, CT ED+1rrandreid .blueTooth . d&vice . acticn. ACL_CQNACTI ON_?kCL_D : S CONN EC TK

24、DP,randroid .bluetooth . device . action. ACL_DISCONNECTED,rACT I ON_lCL_DI 3 CONN EC,Fandrcid .blueteeth . device . acTicn. ACL_DI53TEDACT ITAT E_CHANGrrandroid . bl ue. devi ce . acti c-n. BOND_ST咨G壬ACTI 0N_CLA5rF an droid . bl ue teerh . dev2. ce . acticn. CLj5S_CHANGEDACTION_FOLDrrandroid. blue

25、see th . devi ce . action. FOUND ”4ACTI 戏买巨_CGErFandrcid .bluetccrh . device . acticn.我NGEDrrTATE Prrandroid .bluecc-th . device . extr a.EOND_SZATE*,Fandrc2.d.blueuooth . devzce . extra. CZJkSS”4ZXTR_DZVICErrndrcid.bluetccth . device . extra . DZVIC5;r,3rrandrca.bdu巳二口Th . device . extra.QU S_B ON

26、D_ 5 ZA,Fandrcs.d .blue. device . exrr a. F2E7I0US_B0ND_5TATEMrrandrcid.blue teerh . device .a.RHSI*21注意:toSting()函数会返回该蓝牙设备的字符串表达式。当我们在取得蓝牙地址时,一般 会得到一个类似于00:11:22:AA:BB:CC的字符串,如果用户明确需要蓝牙硬件地址以 防以后toString()表达式会改变的话,用户总是需要使用getAddress()方法来获取蓝牙的 地址。getName()函数也只获取远程蓝牙设备的名称,当执行设备扫描的时候,本地适配 器将自动寻找远程名称。该

27、方法只返回来自存储器中该设备的名称。该类中大多数方法的使 用都需要获得BLUETOOTH权限。BluetoothServerSocket该类用于实现一个蓝牙的监听端口,蓝牙端口的监听接口和TCP端口类似:Socket和 ServerSocket类。在服务器端,使用BluetoothServerSocket类来创建一个监听服务端 口。当一个连接被BluetoothServerSocket所接受,它会返回一个新的BluetoothSocket 来管理该连接。在客户端,使用一个单独的BluetoothSocket类去初始化一个外接连接和 管理该连接。最通常使用的蓝牙端口是RFCOMM,它是被Andr

28、oid API支持的类型。RFCOMM是一个面向连接,通过蓝牙模块进行的数据流传输方式,它也被称为串行端口规 范(Serial Port Profile,SPP)。为了创建一个对准备好的新来的连接去进行监听 BluetoothServerSocket 类,使用BluetoothAdapter.listenUsingRfcommWithServiceRecord()方法。然后调用 accept() 方法去监听该链接的请求。在连接建立之前,该调用会被阻断,也就是说,它将返回一个 BluetoothSocket类去管理该连接。每次获得该类之后,如果不再需要接受连接,最好调 用在 BluetoothS

29、erverSocket类下的 close()方法。关闭 BluetoothServerSocket 类不 会关闭这个已经返回的BluetoothSocket类BluetoothSocket类线程安全。特别的,close()方法总会马上放弃外界操作并关闭服务器 端口。如果使用需要BLUETOOTH权限的许可。我们后面将要介绍的蓝牙聊天服务则整需 要使用该功能。该类提供了一下一些常用操作方法。accept ()函数将在一个成功建立的连接上返回一个已连接的BluetoothSocket类。每当该 调用返回的时候,它可以在此调用去接收以后新来的连接。close()方法可以用来放弃从另 一线程来的调用。

30、close()将马上关闭端口,并释放所有相关的资源。在其他线程的该端口 中引起阻塞,从而使系统马上抛出一个IO异常。关闭BluetoothServerSocket不会关闭 接受自 accept()的任意 BluetoothSocket。BluetoothSocket上面说过蓝牙端口监听接口和TCP端口类似:Socket和ServerSocket类。在服务器端, 使用BluetoothServerSocket类来创建一个监听服务端口。当一个连接被BluetoothServerSocket所接受,它会返回一个新的BluetoothSocket来管理该连接。在客户端,使用一个单独的BluetoothSocket类去初始化一个外接连接和管理该连接。最 通常使用的蓝牙端口是RFCOMM,它是被Android API支持的类型。RFCOMM是一个面 向连接,通过蓝牙模块进行的数据流传输方式,它也被称为串行端口规范(Serial Port Profile,SPP)。为了创建一个BluetoothSocket去连接

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论