歡迎來(lái)到(dào)深圳市博易美科技有限∏• 公司網站(zhàn)!
人(rén)
已閱讀(dú)

藍(lán)牙開(kāi)發的(de)幾個(gè)↑β↓重要(yào)步驟

來(lái)源:lexintech.com       發布時(shí)間(j↓₹★¶iān):2019-10-15
     不(bù)管是(shì)基于IO¶☆S藍(lán)牙,還(hái)是(shì)An↓↓∑droid 藍(lán)牙,藍(lán)牙開(kāi)發的(de)過程都(dōu)包含下(xià)面幾個(gè)重要(yào)©↕的(de)步驟:
1.搜索設備
       設備搜索是(shì)β< >一(yī)個(gè)掃描程序,它會(huì)搜索本地(dì)附♦↑近(jìn)啓用(yòng)了(le)藍(lánγ≤)牙的(de)設備,并從(cóng)這(zhè)些(xiē)設備上×↓(shàng)獲取一(yī)些(xiē)信息(> 這(zhè)個(gè)過程有(yǒu)時(s®α hí)簡稱為(wèi)“發現(xiàn∏∞‌σ)中”、“查詢中”或者&ld§×♠quo;掃描中”)。然而,在本地(dì)區(qū)域∏↔範圍內(nèi)的(de)藍(lán)牙設備隻±¥有(yǒu)在它是(shì)允許被發現(xiàn)的(de)模式下(xiβ≤←×à)才會(huì)響應其它設備掃描發現(xiàn)的(de)<↓↑‌請(qǐng)求。如(rú)果一(yī)個(gè)設備是(shì)可(kě)σ‌€被發現(xiàn)的(de)狀态模式,它會(huì)通☆≈(tōng)過共享一(yī)些(xiē)信息≤σ來(lái)響應搜索發現(xiàn)的(de)請(qǐng)★∏求,例如(rú)設備名字,設備類型和(hé)它唯一(y™♦ī)的(de)MAC地(dì)址。使用(yòng)這(zhè)些(xi×∞₽♦ē)信息,執行(xíng)掃描的(de)設備©∏Ω≈才能(néng)創建一(yī)個(gè)連接連©×接上(shàng)被發現(xiàn)的(de)設備π☆。
通(tōng)過藍(lán)牙設備搜索的(de)代碼
a.獲取适配器(qì):mBluetoothAdapter = Bluε ↕®etoothAdapter.getDefaultAdap§↓↑ter();
b.打開(kāi)适配器(qì):Intent e↓£nableIntent = new Intent(Bluetooth₽♣§₽Adapter.ACTION_REQUEST_ENABLE)&↕;
startActivityForResult(enableIntent, $> REQUEST_ENABLE_BT);
c.搜索藍(lán)牙設備:
獲取已配對(duì)設備:Set>BluetoothDevice&l↕¥t; pairedDevices = mBtAdapter.getB↕•♠♠ondedDevices();
搜索周邊設備:mBtAdapter.startDiscovery();
BluetoothDevice.ACTION_FOUND找到(dào)×'≥₩一(yī)個(gè);
BluetoothAdapter.ACTION_DISCOVERY_FINI±§→SHED搜索結束。
 
2.連接到(dào)藍(lán)牙ConnectThread:
       服務端σ→設備和(hé)客戶端設備獲取BluetoothSockeφ t的(de)方法不(bù)同。服務端設備将會(huì)在接₩ ≥‍受一(yī)個(gè)傳入的(de)連接請(qǐng)求時(shí)獲得(de→☆<)。客戶端設備會(huì)在它打開(kāi)與服務端設備的(de)RFC÷£λOMM通(tōng)道(dào)時(shí)獲得(de)。
一(yī)種解決方案是(shì)自(zì)動将每一(yī)台設備作(zu®≠ò)為(wèi)服務端,這(zhè)樣每¶α一(yī)台設備都(dōu)擁有(yǒu)一(y&™ī)個(gè)server socket可(kě)以↔♦↓♦監聽(tīng)連接。之後,每一(yī)台設備都(dō Ωu)可(kě)以啓動一(yī)個(gè)與其它設備的(de)連接并♥≥α變成客戶端設備。另外(wài),也(yě)可(><kě)以明(míng)确一(yī)台設備作(zuò)為(wèi)服務端♥∏根據需要(yào)啓動一(yī)個(gè)δ₽→ server socket,其它設備隻要(yào)簡單的(©♥de)建立連接。
a.根據地(dì)址獲取設備:
BluetoothDevice devicφ♠≠e = mBluetoothAdapter.getRemoteDevice(a×♥∞ddress);
b.獲取設備soceket:
device.createRfcommSocketToSe♦∞ rviceRecord(MY_UUID_SEC'¥URE);
c.取消掃描設備,連接soceket:端口:
mAdapter.cancelDiscovery∑ε✘↕();
mmSocket.connect();
 
3.數(shù)據信息交互ConnectedThread:
      &nbπ$©sp;首先,你(nǐ)需要(yào)為(wèi)所有(yǒu₩≥→≥)數(shù)據流的(de)讀(dú)寫操作(zuò)分(fēn)派一(yī)★​個(gè)特定的(de)線程。這(zhè)是(sh©♠δ​ì)非常重要(yào)的(de),因為(wèi)read(byte[])和(ε∑>☆hé)write(byte[])方法都(dōuδ₩♣$)是(shì)會(huì)阻塞的(de)方法。read(byte[])方法ε•在從(cóng)數(shù)據流中讀(dú)取到→₩(dào)數(shù)據之前會(huì)一(yī)直阻塞。writ←>‍↓e(byte[])方法不(bù)會(huì)經常阻塞,但(dàn)↑γ≠是(shì)在遠(yuǎn)程設備沒有(yǒu)及時(shí)調用₹‌α(yòng)read(byte[])方法>→→↑并且中間(jiān)緩沖區(qū)滿的(de)時(shí)候也(yě)∏↔會(huì)進行(xíng)阻塞。因此,你(nǐ)的(≈'βde)線程中的(de)主循環應該專門(mén)用(yòng)來(lái)從(c¥∏óng)InputStream中讀(dú)取β‍數(shù)據。線程中再指定一(yī)個(gè)公共方↕™法将數(shù)據寫入到(dào)Out‌↓≈♥putStream中。
a.獲取讀(dú)寫流
tmpIn = socket.getInputStrea♦εm();
tmpOut = socket.get÷→‍OutputStream();
b.阻塞方法讀(dú)取:
bytes = mmInStream.read(buffe≠€r);
c.發送消息
mmOutStream.write(buff$÷↓er);
d.通(tōng)過handler将文(wén)本添加到(dào)listλ$‍view,成為(wèi)新的(de)消息↔±♠ 
mConversationArrayAdapter.add("M∑≥™e: " + writeMessage);