此例子基于 Android demo
對(duì)于一般的軟件開發(fā)人員來(lái)說(shuō),藍(lán)牙是很少用到的,,尤其是Android的藍(lán)牙開發(fā),,國(guó)內(nèi)的例子很少
Android對(duì)于藍(lán)牙開發(fā)從2.0版本的sdk才開始支持,而且模擬器不支持,,測(cè)試至少需要兩部手機(jī),,所以制約了很多技術(shù)人員的開發(fā); 首先,,要操作藍(lán)牙,,先要在AndroidManifest.xml里加入權(quán)限 <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permissionandroid:name="android.permission.BLUETOOTH" />
1.BluetoothAdapter 顧名思義,,藍(lán)牙適配器,直到我們建立bluetoothSocket連接之前,,都要不斷操作它BluetoothAdapter里的方法很多,,常用的有以下幾個(gè): cancelDiscovery() 根據(jù)字面意思,是取消發(fā)現(xiàn),,也就是說(shuō)當(dāng)我們正在搜索設(shè)備的時(shí)候調(diào)用這個(gè)方法將不再繼續(xù)搜索 disable()關(guān)閉藍(lán)牙 enable()打開藍(lán)牙,,這個(gè)方法打開藍(lán)牙不會(huì)彈出提示,更多的時(shí)候我們需要問(wèn)下用戶是否打開,,一下這兩行代碼同樣是打開藍(lán)牙,,不過(guò)會(huì)提示用戶: Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enabler,reCode);//同startActivity(enabler); getAddress()獲取本地藍(lán)牙地址 getDefaultAdapter()獲取默認(rèn)BluetoothAdapter,實(shí)際上,,也只有這一種方法獲取BluetoothAdapter getName()獲取本地藍(lán)牙名稱 getRemoteDevice(String address)根據(jù)藍(lán)牙地址獲取遠(yuǎn)程藍(lán)牙設(shè)備 getState()獲取本地藍(lán)牙適配器當(dāng)前狀態(tài)(感覺(jué)可能調(diào)試的時(shí)候更需要) isDiscovering()判斷當(dāng)前是否正在查找設(shè)備,,是返回true isEnabled()判斷藍(lán)牙是否打開,,已打開返回true,否則,,返回false listenUsingRfcommWithServiceRecord(String name,UUID uuid)根據(jù)名稱,,UUID創(chuàng)建并返回BluetoothServerSocket,這是創(chuàng)建BluetoothSocket服務(wù)器端的第一步 startDiscovery()開始搜索,,這是搜索的第一步
2.BluetoothDevice 看名字就知道,,這個(gè)類描述了一個(gè)藍(lán)牙設(shè)備 createRfcommSocketToServiceRecord(UUIDuuid)根據(jù)UUID創(chuàng)建并返回一個(gè)BluetoothSocket
getState()
藍(lán)牙狀態(tài)這里要說(shuō)一下,只有在 BluetoothAdapter.STATE_ON 狀態(tài)下才可以監(jiān)聽,,具體可以看andrid api;
這個(gè)方法也是我們獲取BluetoothDevice的目的——?jiǎng)?chuàng)建BluetoothSocket
3.BluetoothServerSocket 如果去除了Bluetooth相信大家一定再熟悉不過(guò)了,既然是Socket,,方法就應(yīng)該都差不多,,這個(gè)類一種只有三個(gè)方法兩個(gè)重載的accept(),accept(inttimeout)兩者的區(qū)別在于后面的方法指定了過(guò)時(shí)時(shí)間,需要注意的是,,執(zhí)行這兩個(gè)方法的時(shí)候,,直到接收到了客戶端的請(qǐng)求(或是過(guò)期之后),都會(huì)阻塞線程,,應(yīng)該放在新線程里運(yùn)行,!
close()這個(gè)就不用說(shuō)了吧,,翻譯一下——關(guān)閉!
4.BluetoothSocket
跟BluetoothServerSocket相對(duì),,是客戶端一共5個(gè)方法,,不出意外,都會(huì)用到 close(),關(guān)閉 connect()連接 getInptuStream()獲取輸入流 getOutputStream()獲取輸出流 getRemoteDevice()獲取遠(yuǎn)程設(shè)備,,這里指的是獲取bluetoothSocket指定連接的那個(gè)遠(yuǎn)程藍(lán)牙設(shè)備
1,、獲取本地藍(lán)牙適配器
BluetoothAdapter 2、打開藍(lán)牙 if(!mAdapter.isEnabled()){ //彈出對(duì)話框提示用戶是后打開 Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enabler, REQUEST_ENABLE); //不做提示,,強(qiáng)行打開 // mAdapter.enable(); }
3,、搜索設(shè)備 是第一步,可以你會(huì)發(fā)現(xiàn)沒(méi)有返回的藍(lán)牙設(shè)備,怎么知道查找到了呢,?向下看,,不要急 2)定義BroadcastReceiver,關(guān)于BroadcastReceiver不多講了,不是今天的討論內(nèi)容,,代碼如下
BroadcastReceiver,,具體代碼如下
(這段代碼,,一般寫在onCreate()里..) 4、建立連接,,首先Android sdk(2.0以上版本)支持的藍(lán)牙連接是通過(guò)BluetoothSocket建立連接(說(shuō)的不對(duì)請(qǐng)高人指正),,服務(wù)器端(BluetoothServerSocket)和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,,因?yàn)榻⑦B接的方法會(huì)阻塞線程,,所以服務(wù)器端和客戶端都應(yīng)啟動(dòng)新線程連接
1)服務(wù)器端:
//http://www. 申請(qǐng)
android.bluetooth下有8個(gè)類,,還有4個(gè)類沒(méi)有用到,那4個(gè)類里定義的都是常量,,我也沒(méi)用到它們..
最后把我找到的幾個(gè)藍(lán)牙的例子附在后面,,希望從事軟件開發(fā),尤其是Android開發(fā)的朋友以后多溝通,、多分享,! 補(bǔ)充一下,使設(shè)備能夠被搜索 Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); startActivityForResult(enabler,REQUEST_DISCOVERABLE);
demo是包括客戶端和服務(wù)端,;分別放到兩個(gè)手機(jī)上就可以通信,;大家改改應(yīng)該就可以用; http://download.csdn.NET/detail/q610098308/8681065 |
|