《android 蓝牙开发.docx》由会员分享,可在线阅读,更多相关《android 蓝牙开发.docx(29页珍藏版)》请在优知文库上搜索。
1、Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传蛤.本文档描述了怎样利用android平台供应的蓝牙APl去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备;找寻局域网内可能或者匹配的设备;连接设备;设备之间的数据传输C以下是建立蓝牙连接的所须要的些基本类:BhIetOothAdaPter类:代表:一个本地的蓝牙适配器C他是哈部蓝牙交互的的入口点。利用它你可以发觉其他蓝牙设备,查询绑定了的设备,运用已知的MAC地址实例化一个蓝牙设备和建立一个BlUetoothServerSocket(作为服务器端)来监听来自其他没备的连接。BIUetOOthDevi
2、ce类:代表一个远端的蓝牙设备,运用它恳求远端蓝牙设备连接或者获得远端蓝牙设备的名称、地址、种类和绑定状态。(其信息是封装在bluetoothsocket中)。BIUetOOthSOCket类:代表了个蓝牙套接字的接口(类似于tcp中的套接字),他是应用程序通过输入、输出流与其他蓝牙设备通信的连接点CBlueboothserversocket类:代表打开服务连接来监听可能到来的连接恳求(属于SerVer端),为了连接两个蓝牙设备必需有一个设备作为服务器打开个服务套接字。当远端设备发起连接恳求的时候,并且已经连接到了的时候,Blueboothserversocket类将会返同一个bluetoot
3、hsocket0Bluetoothclass类:描述一个蓝牙设备的一般特点和实力。他的只读屈性集定义了设备的主、次设备类和一些相关服务。然而,他并没有精确的描述全部该设备所支持的蓝牙文件和服务,而是作为对设备种类来说的一个小小示意。下面说说详细的编程实现:忏先,耍操作蓝牙,先要在AndrOidManifeSt.xml里加入权限其次,必需确定你的设备支持蓝牙,并保证他可以用。假如你的设备支持蓝牙,将它使能。当然,有两种方法,种是在你的系统设置里开启蓝牙,另外一中是在你的应用程序里启动蓝牙功能,第一种方法就不讲广,详细讲一个其次种方法:首先通过调用静态方法getDefaultdapter()获得蓝
4、牙适配器bluetoothadapter,以后你就可以运用该对象了。假如返回为空,thestoryisover。BluetoothAdaptermBluetoothAdapter=Bluetoothdapter.getDefaultdapter();if(mBluetoothAdapter=null)/DevicedoesnotsupportBluetooth其次,调用isEnabled()来查询当前蓝牙设备的状态,假如返回为false,则表示蓝牙设备没才开启,接下来你须要封装一个ACTION-REQUEST-ENAB1.E恳求到intent里面,调用StartActivityForRcsul
5、tO方法使能蓝牙设备,例如:if(!mBluetoothAdapter.isEnabledO)IntentCnableBtIntent=newIntent(BluetoothAdapter-ACTION-REQUEST-ENAB1.E);StartACtivityForReSUlt(CnabIeBtInten1.REQUEST-ENAB1.E-BT);至此,如不出意外,恭喜你的蓝牙设备已经开启广,接下来须要杳找周边可能存在的蓝牙设备了。杳找设备:运用Huetoothadapter类里的方法,你可以查找远端设备(不过蓝牙杳找的范围似乎是在十米以内吧)或者杳询在你手机上已经匹配(或者说绑定)的其他
6、手机了。当然须要确定对方蓝牙设备已经开启或者已经开后r“被发觉使能“功能(对方设备是可以被发觉的是你能够发起连接的前提条件)。假如该设备是可以被发觉的,会反馈回来些对方的设备信息,比如名字、MAC地址等,利用这些信息,你的设备就可以选择去向对方初始化一个连接。假如你是第一次与该设备连接,那么一个配对的恳求就会自动的显示给用户。当设备配对好之后,他的一些基本信息(主要是名字和MAC)被保存下来并可以运用蓝牙的APl来读取C运用已知的MAe地址就可以对远端的蓝牙设备发起连接恳求。匹配好的设备和连接上的设备的不同点:匹配好只是说明对方设备发觉了你的存在,并拥有一个共同的识别码,并且可以连接。连接匕表
7、示当前设备共享一个RFCOMM信道并且两者之间可以交换数据也就是是说蓝牙设备在建v:RFCOMM信道之前,必需是已经配对好了的。怎么查询匹配好的设备:在建立连接之前你必需先杳询配对好了的蓝牙设备集(你四周的蓝牙设备可能不止一个),以便你选取哪一个设备进行通信,例如你可以你可以杳询全部配对的蓝牙设备,并运用一个数组适配器将其打印显示出来:SetpairedDevices=mBluetoothAdapter.getBondedDcvices();/Iftherearepaireddevicesif(PairCdDCViCeS.size。0)/1.oopthroughpaireddevicesfor
8、(BluetoothDevicedevice:pairedDevices)/Addthenameandaddresstoanarrayadaptertoshowina1.istVicwmArrayAdapter.add(device.getNameO+n+device.getAddress();建立一个蓝牙连接只须要MAC地址就已经足够了。扫描设备:扫描设备,只须要简洁的调用StartDiSCOVery()方法,这个扫描的过程也许持续是12秒,应用程序为了ACTION_FOUND动作须要注册一个BrOadCaStRCCCiver来接受设备扫描到的信息.对于每一个设备,系统都会广播ACTloN_
9、F0UND动作。例如:/CreateaBroadcastReceiverforACTION_FOUNDprivatefinalBroadcastReceivermReceiver=newBroadcastReccivcrOpublicvoidonReceive(Contextcontext,Intentintent)Stringaction=intent.getAction();/Whendiscoveryfindsadeviceif(BluetoothDevice.ACTION-FOUND.equals(action)/GettheBluetoothDeviceobjectfromtheIn
10、tentBluetoothDevicedevice=intent.getParcelableExtra(BluetthDevice.EXTRA-DEVICE);/Addthenameandaddresstoanarrayadaptertoshowina1.istViewmArrayAdapter.add(device.getName()+n+device.getAddress(););/RegistertheBroadcastReceiver运行该段代码之后,系统会弹出一个对话框来提示你启动设备使能被发觉(次过程中假如你的蓝牙功能没有开启,系统会帮你开启),并且假如你打算对该远端设备发觉个连接
11、,你不须要开启使能设备被发觉功能,因为该功能只是在你的应用程序作为服务器端的时候才须要。连接设备:在你的应用程序中,想建汇两个蓝牙设备之间的连接,你必需实现客户端和服务器端的代码(因为任何一个设备都必需可以作为服务端或者客户端)。一个开启服务来监听,一个发起连接恳求(运用服务器端设备的MAC地址)。当他们都拥有一个蓝牙套接字在同一RFECOMM信道上的时候,可以认为他们之间已经连接匕了。服务端和客户端通过不同的方式或者他们的蓝牙套接字。当个连接监听到的时候,服务端获得到蓝牙套接字。当客户可打开一个FRCOMM信道给服务器端的时候,客户端获得到蓝牙套接字。盥意:在此过程中,假如两个蓝牙设备还没有
12、配对好的,android系统会通过一个通知或者对话框的形式来通知用户。RFCOMM连接恳求会在用户选择之前堵塞。当你想要连接两台设备时,一个必需作为服务端(通过持有一个打开的bluetoothserversocket),目的是监听外来连接恳求,当监听到以后供应一个连接上的bluetoothsocket给客户端,当客户端从bluetoothserversocket得到bluetoothsocket以后就可以销毁bluetoothserversocket,除非你还想监听更多的连接恳求。建立服务套接字和监听连接的基本步骤:首先通过调用IiStCnUSingRfCOmmWithSerViCeRCCOr
13、d(String,(JUID)方法来获得bluetoothserversocket对象,参数string代表了该服务的名称,UUlD代表了和客户端连接的一个标识(128位格式的字符串ID,相当于Pin码),UUID必需双方匹配才可以建立连接。其次调用accept0方法来监听可能到来的连接恳求,当监听到以后,返回一个连接上的蓝牙套接字bluetoothsocket。最终,在监听到个连接以后,须要调用close()方法来关闭监听程序。(一般蓝牙设备之间是点对点的传输)留意:accept()方法不应当放在主ACitVity里面,因为他是一种堵塞倜用(在没有监听到连接恳求之间程序就始终停在那里)。解决
14、方法是新建一个线程来管理。例如:privateclassAcceptThreadextendsThreadprivatefinalBluctoothServerSocketmmServerSockct;publicAcceptThreadO/UseatemporaryobjectthatislaterassignedtommServerSocket,/becausemmServerSocketisfinalBluetoothServerSockettmp=null;try/MY_UUIDistheappsUUIDstring,alsousedbytheclientcodetmp=mAdapte
15、r.listenUsingRfcommWithServiccRecord(NAME,MY,UUID);catch(IOExceptione)FnmServerSocket=tmp;publicvoidrun()BluetoothSocketsocket=null;/Keeplisteninguntilexceptionoccursorasocketisreturnedwhile(true)trysocket=mmSe11erSocket.accept();catch(IOExceptione)break;/Ifaconnectionwasacceptedif(socket!=null)/Doworktomanagetheconnection(inaseparatethread)manageConnectedSocket(socket);mmSe