一:藍牙設備之間的通訊首要包含了四個進程 設置藍牙設備 尋覓區域網內也許或許匹配的設備 銜接設備 設備之間的數據傳輸 二:詳細編程完結 1. 發動藍牙功用 首要經過調用靜態辦法getDefaultAdapter()獲取藍牙適配器BluetoothAdapter,假如回來為空,則無法繼續執行了。例如安
一:藍牙設備之間的通訊首要包含了四個進程
設置藍牙設備 尋覓區域網內也許或許匹配的設備 銜接設備 設備之間的數據傳輸
二:詳細編程完結
1. 發動藍牙功用
首要經過調用靜態辦法getDefaultAdapter()獲取藍牙適配器BluetoothAdapter,假如回來為空,則無法繼續執行了。例如安卓源碼:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth }
其次,調用isEnabled()來查詢當時藍牙設備的狀況,假如回來為false,則表明藍牙設備沒有敞開,接下來你需求封裝一個ACTION_REQUEST_ENABLE懇求到intent裡面,調用startActivityForResult()辦法使能藍牙設備,例如:
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
2. 查找設備
運用BluetoothAdapter類里的辦法,你能夠查找遠端設備(大約十米以內)或許查詢在你手機上現已匹配(或許說綁定)的別的設備了。當然需求斷定對方藍牙設備現已敞開或許現已敞開了“被髮現使能”功用(對方設備是能夠被髮現的是你能夠建議銜接的前提條件)。假如該設備是能夠被髮現的,會反饋回來一些對方的設備信息,比方姓名、MAC地址等,運用這些信息,你的設備就能夠挑選去向對方初始化一個銜接。
假如你是首次與該設備銜接,那麼一個配對的懇求就會主動的顯示給用戶。當設備配對好今後,他的一些根本信息(首要是姓名和MAC)被保留下來並能夠運用藍牙的API來讀取。運用已知的MAC地址就能夠對遠端的藍牙設備建議銜接懇求。
匹配好的設備和銜接上的設備的不同點:匹配好僅僅闡明對方設備發現了你的存在,並具有一個一起的識別碼,而且能夠銜接。銜接上:表明當時設備同享一個RFCOMM通道而且兩者之間能夠交換數據。也即是是說藍牙設備在樹立RFCOMM通道之前,有必要是現已配對好了的。
3. 查詢匹配好的設備
在樹立銜接之前你有必要先查詢配對好了的藍牙設備集以便挑選一個設備進行通訊,例如你能夠你能夠查詢一切配對的藍牙設備,並運用一個數組適配器將其列印顯示出來:
SetpairedDevices =mBluetoothAdapter.getBondedDevices(); // If there are paired devices
if (pairedDevices.size() > 0) {
//Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); }
}
樹立一個藍牙銜接只需求MAC地址就現已滿足。
4. 掃描設備
掃描設備,只需求調用startDiscovery()辦法,這個掃描的進程大約繼續是12秒,應用程式為了ACTION_FOUND動作需求註冊一個BroadcastReceiver來承受設備掃描到的信息。關於每一個設備,體系都會播送ACTION_FOUND動作。
// 用ACTION_FOUND為action註冊播送接收器 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); // 發現設備 if (BluetoothDevice.ACTION_FOUND.equals(action)) { // 從Intent中獲取藍牙設備 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // 增加姓名和地址到設備適配器中 mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
}
}; //註冊播送接收器 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); //在onDestroy時記住刊出播送接收器
5. 使能被髮現
假如你想使你的設備能夠被別的設備發現,將ACTION_REQUEST_DISCOVERABLE動作封裝在intent中並調用startActivityForResult(Intent, int)辦法就能夠了。它將在不使你應用程式退出的情況下使你的設備能夠被髮現。預設情況下的使能時刻是120秒,當然你能夠能夠經過增加EXTRA_DISCOVERABLE_DURATION欄位來改動使能時刻(最大不超越300秒)例如:
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent);
運轉該段代碼今後,體系會彈出一個對話框來提示你發動設備使能被髮現(此進程中假如你的藍牙功用沒有敞開,體系會幫你敞開),而且假如你預備對該遠端設備發現一個銜接,你不需求敞開設備被髮現功用,由於該功用僅僅在你的應用程式作為效勞器端的時分才需求。
6. 銜接設備
在應用程式中,想樹立兩個藍牙設備之間的銜接,有必要完結客戶端和效勞器端的代碼(由於任何一個設備都有必要能夠作為效勞端或許客戶端)。一個敞開效勞來監聽,一個建議銜接懇求(運用效勞器端設備的MAC地址)。當他們都具有一個藍牙套接字在同一RFECOMM通道上的時分,能夠以為他們之間現已銜接上了。效勞端和客戶端經過不同的辦法或別的們的藍牙套接字。當一個銜接監聽到的時分,效勞端獲取到藍牙套接字。當客戶可翻開一個FRCOMM通道給效勞器端的時分,客戶端獲取到藍牙套接字。
註意:在此進程中,假如兩個藍牙設備還沒有配對好的,android體系會經過一個通知或許對話框的方式來通知用戶。RFCOMM銜接懇求會在用戶挑選之前堵塞。
7. 效勞端的銜接
當你想要銜接兩台設備時,一個有必要作為效勞端(經過持有一個翻開的BluetoothServerSocket),目的是監聽外來銜接懇求,當監聽到今後提供一個銜接上的BluetoothSocket給客戶端,當客戶端從BluetoothServerSocket得到BluetoothSocket今後就能夠毀掉BluetoothServerSocket,除非你還想監聽更多的銜接懇求。
樹立效勞套接字和監聽銜接的根本進程:
首要經過調用listenUsingRfcommWithServiceRecord(String, UUID)辦法來獲取BluetoothServerSocket目標,參數String代表了該效勞的稱號,UUID代表了和客戶端銜接的一個標識(128位格局的字元串ID,相當於PIN碼),UUID有必要兩邊匹配才能夠樹立銜接。
其次調用accept()辦法來監聽也許到來的銜接懇求,當監聽到今後,回來一個銜接上的藍牙套接字BluetoothSocket。
最後,在監聽到一個銜接今後,需求調用close()辦法來封閉監聽程式。(通常藍牙設備之間是點對點的傳輸)
註意:accept()辦法不應該放在主Acitvity裡面,由於它是一種堵塞調用(在沒有監聽到銜接懇求之前程式就一向停在那裡)。解決辦法是新建一個線程來辦理。例如:
8. 客戶端的銜接
為了初始化一個與遠端設備的銜接,需求先獲取代表該設備的一個BluetoothDevice目標。經過BluetoothDevice目標來獲取BluetoothSocket並初始化銜接,詳細進程:
運用BluetoothDevice目標里的辦法createRfcommSocketToServiceRecord(UUID)來獲取BluetoothSocket。UUID即是匹配碼。然後,調用connect()辦法來。假如遠端設備接收了該銜接,他們將在通訊進程中同享RFFCOMM通道,而且connect回來。
註意:conncet()辦法也是堵塞調用,通常樹立一個獨立的線程中來調用該辦法。在設備discover進程中不應該建議銜接connect(),這麼會顯著減慢速度以至於銜接失敗。且數據傳輸完結只要調用close()辦法來封閉銜接,這麼能夠節約體系內部資源。
9. 辦理銜接
當設備銜接上今後,每個設備都具有各自的BluetoothSocket。就能夠完結設備之間數據的同享了。
首要經過調用getInputStream()和getOutputStream()辦法來獲取輸入輸出流。
然後經過調用read(byte[]) 和write(byte[]).辦法來讀取或許寫數據。
完結細節:以為讀取和寫操作都是堵塞調用,需求樹立一個專用線程來辦理。
10. 許可權設置
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />