日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓蓝牙通讯

發布時間:2023/12/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓蓝牙通讯 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需要說明的是,該通訊是安卓手機與藍牙模塊之間的通訊。

通訊的步驟如下

  • 判斷藍牙是否打開,如果沒有打開,則打開藍牙。
  • 掃描周圍的藍牙設備
  • 得到周圍的藍牙設備對象BluetoothDevice
  • 通過掃描到的藍牙設備BluetoothDevice和UUID得到BluetoothSocket,這是雙方進行通訊的socket,是通訊的核心。關于UUID后面會簡單介紹。
  • 通過得到的BluetoothSocket對象,進行數據的讀寫。

    下面我就分別寫下這幾個步驟。

    1,得到本地的藍牙適配器并且打開藍牙

    1.1得到本地藍牙適配器:

  • BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

    1.2打開藍牙

    // 如果藍牙沒有打開,通過這個Activity打開if (!adapter.isEnabled()) {Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivity(intent);}Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);// 300為可以被其他藍牙設備搜索到的時間,單位為秒enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivityForResult(enable, DISCOVERY_REQUEST);

    2,掃描周圍的設備

    通過BluetoothAdapter 的startDiscovery()進行掃描,找到一個設備,就會發出一條廣播,所以找到的新設備要在廣播接收器里面進行接收。
    掃描的時間會比較長,一般會持續十多秒。

    if (adapter!=null) {adapter.startDiscovery();}

    3,通過廣播接收器找到掃描到的新設備。

    前面已經說了,如果adapter發現新的設備,就會發出廣播。因此我們需要在廣播接收器里面得到新設備。
    BluetoothDevice對象就是發現的新設備,BluetoothDevice有好多方法,比如通過bluetoothdevice.getName()獲取新設備名稱。通過bluetoothdevice.getAddress()獲取設備的硬件地址,比如“00:11:22:AA:BB:CC”。當然還有其他的方法,這里不再多說。
    發現的新設備可以顯示到一個列表里面。這里只是說明原理,列表顯示在源碼里面。

    final BroadcastReceiver mReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) {BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);}}};

    當然,最后需要對廣播接收器進行注冊。

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter);

    4,得到BluetoothSocket。

    需要說明的是,這里手機是作為客戶端來使用。如果是作為服務端,得到Socket的方法會有所不同。
    無論手機是作為客戶端還是服務端,在和其他設備連接過程中,都需要UUID,下面簡單地介紹下UUID。

    UUID

    UUID 含義是通用唯一識別碼 (Universally Unique Identifier),這 是一個軟件建構的標
    準,也是被開源軟件基金會 (Open Software Foundation, OSF) 的組織應用在分布式計算環境 (Distributed Computing Environment, DCE) 領域的一部分。
    在藍牙 3.0 及一下版本中,UUID 被用于唯一標識一個服務,比如文件傳輸服務,串口服務、打印機服務等,如下:
    藍牙串口服務
    SerialPortServiceClass_UUID = ‘{00001101-0000-1000-8000-00805F9B34FB}’
    LANAccessUsingPPPServiceClass_UUID = ‘{00001102-0000-1000-8000-00805F9B34FB}’
    撥號網絡服務
    DialupNetworkingServiceClass_UUID = ‘{00001103-0000-1000-8000-00805F9B34FB}’
    信息同步服務
    IrMCSyncServiceClass_UUID = ‘{00001104-0000-1000-8000-00805F9B34FB}’
    SDP_OBEXObjectPushServiceClass_UUID = ‘{00001105-0000-1000-8000-00805F9B34FB}’
    文件傳輸服務
    OBEXFileTransferServiceClass_UUID = ‘{00001106-0000-1000-8000-00805F9B34FB}’
    IrMCSyncCommandServiceClass_UUID = ‘{00001107-0000-1000-8000-00805F9B34FB}’

    因為我們和藍牙模塊進行通訊,所以選擇藍牙串口服務的UUID。

    通過UUID建立連接

    private static String uuid = "00001101-0000-1000-8000-00805F9B34FB"; try{ //device為BluetoothDevice 對象,即掃描到的新設備對象 BluetoothSocket mmSocket=device.createRfcommSocketToServiceRecord(UUID.fromString(uuid)); } catch(IOException e){ }

    得到BluetoothSocket 之后,就可以在兩臺設備之間建立連接,在連接之前,我們最好取消上面開啟的掃描功能功能。

    //adapter是BluetoothAdapter 的對象。 adapter.cancelDiscovery();

    進行連接:

    try{ //這個方法是阻塞式的,所以最好開一個線程進行連接。在這里可以寫一個回調,連接成功后,就可以通過該socket讀寫數據了,詳細的代碼見源碼。mmSocket.connect(); }catch(Exception e){ //連接過程中若拋出異常,則關閉socket。try {mmSocket.close();} catch (Exception e1) {Log.e("close", e1.toString());} }

    5,通過BluetoothSocket 對象讀寫數據。

    收到數據后,通過Handler 發送message來刷新界面。

    public class ConnectedThread extends Thread {private final BluetoothSocket mmSocket;private final InputStream mmInStream;private final OutputStream mmOutStream;public String datas;public Message message;public Handler handler;//輸入輸出流的初始化public ConnectedThread(BluetoothSocket socket,Handler handlers) {mmSocket = socket;this.handler=handlers;InputStream tmpIn = null;OutputStream tmpOut = null;try {tmpIn = socket.getInputStream();tmpOut = socket.getOutputStream();} catch (IOException e) {}mmInStream = tmpIn;mmOutStream = tmpOut;}/*** 接收數據,線程*/public void run() {byte[] buffer = new byte[2048];int bytes;while (true) {try {bytes = mmInStream.read(buffer);String str= new String(buffer,"ISO-8859-1");str=str.substring(0,bytes);datas=str;message=new Message();message.what=Constant.DATAS;handler.sendMessage(message);} catch (IOException e) {break;}}}public void write(byte[] bytes) {try {mmOutStream.write(bytes);} catch (IOException e) {}}}

    6,其他

    關于將手機作為服務端我沒有嘗試過,下面是連接的代碼:

    private static String uuid = "00001101-0000-1000-8000-00805F9B34FB"; //adapter是BluetoothAdapter 的對象。 BluetoothServerSocket =adapter.listenUsingRfcommWithServiceRecord("blue",UUID.fromString(uuid));//連接之前會一直等待,所以要開啟一個線程 while (true) { try { BluetoothSocket socket = mmServerSocket.accept(); } catch (IOException e) { break; } }

    拿到BluetoothSocket之后,就可以進行通訊了,通訊的代碼和作為客戶端連接設備應該是一樣的。我沒有嘗試過。

    7,源碼下載

    源碼下載

    總結

    以上是生活随笔為你收集整理的安卓蓝牙通讯的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。