android 蓝牙开发.docx

上传人:李司机 文档编号:7210651 上传时间:2024-06-29 格式:DOCX 页数:29 大小:29.20KB
返回 下载 相关 举报
android 蓝牙开发.docx_第1页
第1页 / 共29页
android 蓝牙开发.docx_第2页
第2页 / 共29页
android 蓝牙开发.docx_第3页
第3页 / 共29页
android 蓝牙开发.docx_第4页
第4页 / 共29页
android 蓝牙开发.docx_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《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)/Dow

16、orktomanagetheconnection(inaseparatethread)manageConnectedSocket(socket);mmSe11erSocket.closeO;break;*Willcancelthelisteningsocket,andcausethethreadtofinish*/publicvoidcancel()trymmSe11erSocket.close();catch(IOExceptione)客户端的连接:为了初始化一个与远端设备的连接,须要先获得代表该设备的一个bluetoothdevice对象。通过bluetthdevice对象来获得bluet

17、oothsocket并初始化连接:详细步骤:运用bluetoothdevice对象里的方法CreateRfcommsocketToserviceRecord(UUID)bluctoothsocket0UUlD就是匹配码。然后,调用COnnCCt()方法来。假如远端设备接收了该连接,他们将在通信过程中共享RFFCOMM信道,并且COnneCt()方法返回。例如:privateclassConnectThreadextendsThreadprivatefinalBluetoothSocketmmSocket;privatefinalBluetoothDevicemmDevice;publicCon

18、nectThreadlBluetoothDevicedevice)/UseatemporaryobjectthatislaterassignedtommSocket,/becausemmSocketisfinalBluetoothSockettmp=null;mmDevice=device;/GetaBluetoothSockettoconnectwiththegivenBluetoothDevicetry/MY_UUIDistheappsUUIDstring,alsousedbytheservercodetmp=device.createRfcommSocketToServiceRecord

19、(MY_UUID);catch(IOExceptione)mmSocket=tmp;publicvoidrun()/CanceldiscoverybecauseitwillslowdowntheconnectionmAdapter.cancelDiscoveryO;try/Connectthedevicethroughthesocket.Thiswillblock/untilitsucceedsorthrowsanexceptionmmSocket.connect();catch(IOExceptionConnectException)/Unabletoconnect;closethesock

20、etandgetouttrymmSocket.close();catch(IOExceptionCloseException)return;/Doworktomanagetheconnection(inaseparatethread)manageConnectedSocket(mmSocket);*Willcancelanin-progressconnection,andclosethesocket*/publicvoidcancel()trymmSocket.close();:catch(IOExceptione)留意:ConnCet()方法也是培塞调用,一般建汇一个独立的线程中来调用该方法

21、。在设备disc。Ver过程中不应当发起连接Conneet(),这样会明显减慢速度以至于连接失败。且数据传输完成只有调用close()方法来关闭连接,这样可以节约系统内部资源。管理连接(主要涉与数据的传输):当设备连接上以后,每个设备都拥有各自的bluetoothsocket0现在你就可以实现设备之间数据的共享了。】.首先通过潮用getInputStream()和getOutputStream()方法来获得输入输出流。然后通过调用read(bytel)和Write(byte).方法来读取或者写数据。2 .实现细微环节:因为读取和写操作都是堵塞调用,须要建立一个专用线程来管理。3 .privat

22、eclassConnectedThreadextendsThreadprivatefinalBluetoothSocketmmSocket;privatefinalInputStreammmlnStream;privatefinalOutputStreammmOutStream;publicConnectedThread(BluetoothSocketsocket)mmSocket=socket;InputStreamtmpln=null;OutputStreamtmput=null;/Gettheinputandoutputstreams,usingtempobjectsbecause/me

23、mberstreamsarefinaltrytmpln=socket.gctInputStream();tmput=socket.getOutputStreamO;Jcatch(IOExceptione)mmlnStream=tmpln;TnmOutStream=tmput;publicvoidrun()byte)buffer=newbyte1024;/bufferstoreforthestreamintbytes;/bytesreturnedfromread()/KeeplisteningtotheInputStreamuntilanexceptionoccurswhile(true)try

24、/ReadfromtheInputStreambytes=mmInSteam.read(buffer);/SendtheobtainedbytestotheUIActivitymHandler.obtainMessage(MESSAGE_READ,bytes,-1,buffer).SendToTargetO;catch(IOExceptione)break;*CallthisfromthemainActivitytosenddatatotheremotedevice*/publicvoidwrite(bytebytes)mmutStream.write(bytes);catch(IOExcep

25、tione)*CallthisfromthemainActivitytoshutdowntheconnection7publicvoidcancel()trymmSocket.close();catch(IOExceptione)AIIdroid蓝牙UUlDandroid蓝牙UUlD,蓝牙开发必备居家良药。ServiceDiscovcryScrverServiceClassID-UUID=100001000-0000-1000-8000-00805F9B34FB,BrowseGroupDescriptorServiceClassID_UUID=100001001-0000-1000-8000-

26、00805F9B34FB,PublicBrowseGroupserviceClasS-UUID=,00001002-0000-1000-8000-00805F9B34FB#蓝牙串口服务Seria!PortServiceClass_UUID=,0000IlOl-0000-1000-8000-00805F9B34FB1.ANACCeSSUSingPPPSerViCeClaSS_UUlD=,00001102-0000-1000-8000-00805F9B34FB#拨号网络服务DialupNctworkingserviceClaSS-UUID=,100001103-0000-1000-8000-008

27、05F9B34FB#信息同步服务IrMCSynCSerViCeCIaSSJJUID=,00001104-0000-1000-8000-00805F9B34FBSDP-OBEXObjectPushServiceClass-UUID=,00001105-0000-1000-8000-00805F9B34FB,#文件传输服务OBEX=00001106-0000-1000-8000-00805F9B34FBIrMCSynCCommandSerViCeeIaSS_UUID=(00001107-0000-1000-8000-00805F9B34FBSDP_HeadsetServiceClass_UUID=

28、,(00001108-0000-1000-8000-00805F9B34FB,CordlessTelephonySemceClass_UUID三(00001109-0000-1000-8000-00805F9B34FBfSDP_AudioSourceServiceClass_UUID=00001IOA-OOOO-1000-8000-00805F9B34FB),SDP_AUdioSinkSerViCeClaSS_UUID=,0000llOB-OOOO-1000-8000-00805F9B34FBSDP-AVRemoteControlTargetSemceClass_UUID=,0000110C-

29、0000-1000-8000-00805F9B34FBrSDP_AdvancedAudioDistributionSen?iceClass_UUID=(000011OD-OOOO-1000-8000-00805F9B34FBfSDP_AVRemoteControlServiceClass_UUID=(00001IOE-OOOO-1000-8000-00805F9B34FBVideoConferencingSemceClass_UUID=(0000110F-0000-1000-8000-00805F9B34FBIntercomServiceClass_UUID=,(00001110-OOOO-1

30、000-8000-00805F9B34FB,#蓝牙传真服务FaXSerViCeCIassRUlD=,0000llll-OOOO-l000-8000-00805F9B34FBHcadsetAudioGatcwayscrviceClasS-UUID=,100001112-0000-1000-8000-00805F9B34FB,=500001113-0000-1000-8000-00805F9B34FB1,=100001114-0000-1000-8000-00805F9B34FB#个人局域网服务PANUServiceClass.UUID=,00001115-0000-1000-8000-00805

31、F9B34FB#个人局域网服务NApserviceClass-UUID=,00001116-0000-1000-8000-00805F9B34FB#个人局域网服务GNSerViCeClaSSjJUlD=,!OOOOl117-0000-1000-8000-00805F9B34FBDireCtPrintingSerViCeeIassJUUID=,(00001118-0000-1000-8000-00805F9B34FBReferencePrintingServiceClass_UUID=,!OOOOl119-0000-1000-8000-00805F9B34FBImagingSerViCeClaS

32、S_UUID=,000011IA-OOOO-1000-8000-00805F9B34FB),ImagingResponderserviceClasS.UUID,(000011lB-0000-1000-8000-00805F9B34FB,ImagingAutomaticArchiveserviceClasS-UUID=,000011lC-0000-1000-8000-00805F9B34FBImagingReferenceobjectsserviceClasS-UUID=,000011ID-OOOO-1000-8000-00805F9B34FBJSDP_HandsfreeServiceClass

33、_UUID=,000011IE-OOOO-1000-8000-00805F9B34FB,HandsfreeAudioGatewayserviceClasS-UUID=,000011IF-OOOO-1000-8000-00805F9B34FBDirectprintingReferenceobjectsserviceClasS-UUID=,?00001120-0000-1000-8000-00805F9B34FBReflecteduiserviceClasS-UUID=,00001121-0000-1000-8000-00805F9B34FBBaSiCPringingSerViCeCIassJJU

34、ID=,!OOOOl122-0000-1000-8000-00805F9B34FBPrintingStatUSSerViCeClaSS_UUlD=,(00001123-0000-1000-8000-00805F9B34FB#人机输入服务HUmanlntCrfaCeDCViCeSerViCCClass_UUID=,100001124-0000-1000-8000-00805F9B34FB,HardcopyCableRcplacementSendceClass_UUID=100OOl125-0000-1000-8000-00805F9B34FB,#蓝牙打印服务HCRPrintServiceClas

35、s.UUID=(00001126-0000-1000-8000-00805F9B34FBHCRScanServiceClass_UUID=,(00001127-0000-1000-8000-00805F9B34FB,CommOnlSDNACCeSSSerViCeCIassJJUID=(00001128-0000-1000-8000-00805F9B34FBfVideoconferencingGwserviceClasS-UUID=00001129-0000-1000-8000-00805F9B34FBUDlMTSerViCeClaSSjJUID=,0000112A-0000-l000-8000

36、-00805F9B34FBUDlTAserviceClass-UUID=,0000112B-0000-l000-8000-00805F9B34FBAudioVideoServiceClass_UUID=(0000112C-OOOO-1000-8000-00805F9B34FBSIMAccessServiceClass_UUID=(0000112D-OOOO-1000-8000-00805F9B34FBPnPInfOrmatiOnSerViCeCIassJJUID=(00001200-0000-1000-8000-00805F9B34FBGenericNetworkingserviceClasS

37、-UUID三,(00001201-0000-1000-8000-00805F9B34FB,GencricAudioServiceClass-UUID=,00001203-0000-1000-8000-00805F9B34FB,GcncricTelephonyserviccClasS-UUID=,00001204-0000-1000-8000-00805F9B34FB今日找了一K嗣於Bluetooth的檄型Semce/Profile的UUID,但是看了一下SpecificationDoucments都只有16bits晟道是所谓的UUlDI6格式彼来才了解,原来BlUetOOthMUUID的部份固

38、定,只取16bits作力各做SerViCe的1晶分,追槎可以箭省分析SDPRecordand典程式空!讥避开增加BluetoothDevice的成本。地下的值可以优windowsXPorSenrer2003SDK的bt-sdp.horBlueZ的sdp.h(UUID16)中找到定海可以践察出下列的固定序列除了替换XXXX部份,0000xxxx-0000-1000-8000-00805F9B34FB;,(jXXXX部份就是所需的UUID16定羲。ProtocolsUUIDBASEUUID00000000-0000-1000-8000-00805F9B34FBSDP_PROTOCO1._UUID=

39、,00000001-0000-1000-8000-00805F9B34FB,;UDP_PROTOCO1._UUID=,00000002-0000-1000-8000-00805F9B34FB,;RFCOMM_PROTOCo1._UUID=,00000003-0000-1000-8000-00805F9B34FB;TCP_PROTOCO1._UUID=,00000004-0000-1000-8000-00805F9B34FB;TCSBIN_PROTOCO1._UUID=00000005-0000-1000-8000-00805F9B34FB;TCSAT_PROTOCO1._UUID=000000

40、06-0000-1000-8000-00805F9B34FB,;OBEX_PROTOCO1._UUID=(00000008-0000-1000-8000-00805F9B34FB,;IP_PROTOCO1._UUID=,(00000009-0000-1000-8000-00805F9B34FB1,;=0000000-0000-1000-8000-00805F9B34FB;HTTP-PROTOCO1.UUID=(0000000C-0000-1000-8000-00805F9B34FB,;WSP_PROTOCO1._UUID=(0000000E-0000-1000-8000-00805F9B34F

41、B,;BNEP_PROTOCO1._UUID=(0000000F-0000-1000-8000-00805F9B34FB,;UPNP_PROTOCOjUUID=,(00000010-OOOO-1000-8000-00805F9B34FB,;,(00000011-OOOO-1000-8000-00805F9B34FB;HCCC_PROTOCO1._UUID=(00000012-0000-1000-8000-00805F9B34FB,;HCDC-PROTOCO1.UUID,(00000014-0000-1000-8000-00805F9B34FB,;HN-PROTOCO1.UUID=(000000

42、16-0000-1000-8000-00805F9B34FB,;AVCTP_PROTOCO1._UUID=00000017-0000-1000-8000-00805F9B34FB,;AVDTP_PROTOCO1._UUID=,00000019-0000-1000-8000-00805F9B34FB;CMPT_PROTOCO1._UUID=,0000001B-OOOO-1000-8000-00805F9B34FBr;UDI_C_P1.ANE_PROTOCO1._UUID=(0000001D-OOOO-1000-8000-00805F9B34FB;1.2CAP_PROTOCO1._UUID=(00

43、000100-OOOO-1000-8000-00805F9B34FB,;Ref.SerViCeclassIDsServiceDiscovcryScrverServiceClassID-UUID,00001000-0000-1000-8000-00805F9B34FB;BrowseGroupDescriptorServiceClassID_UUIDPublicBrowscGroupServiccClass_UUID,00001002-0000-1000-8000-00805F9B34FB,;SeriaIPOrtSerViCeClass_UUID=,00001101-0000-1000-8000-

44、00805F9B34FB;1.ANACCeSSUSingPPPSCrViCeCIaSS_UUID00001102-0000-1000-8000-00805F9B34FB;DialupNetworkingserviceClaSS-UUID,00001103-0000-1000-8000-00805F9B34FB,;IrMCSyncServiceClass-UUID=00001104-0000-1000-8000-00805F9B34FB,;OBEXObjectPushServiceClass_UUID,(00001105-0000-1000-8000-00805F9B34FB1,;OBEX=,0

45、0001106-0000-1000-8000-00805F9B34FB,;IrMCSynCCommandSCrViCeClass_UUID00001107-0000-1000-8000-00805F9B34FB;HCadSetSerViCeClass_UUID=,00001108-0000-1000-8000-00805F9B34FB;CordlessTelcphonyServiceClass_UUID,00001109-0000-1000-8000-00805F9B34FB;AUdioSOUrCeSerViCeelass_UUID=100OOlIOA-OOOO-1000-8000-00805F9B34FB,;AudioSinkServiceClass_UUID=,0000110B-0000-1000-8000-00805F9B34FB;AVRemoteControlTargetServiceClass_UUID=OOOO11OC-OOOO-1000-8000-00805F9B34FB;AdvanccdAudioDistributionscrviceClasS-UUID=0000110D-0000-1000-8000-00805F9B34FB5,;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号