實現藍芽通訊

2021-10-06 17:22:26 字數 3405 閱讀 4912

1.新增藍芽會話的服務元件chatservice

//構造方法,接收ui主線程傳遞的物件

public chatservice(context context, handler handler)

private synchronized void setstate(int state)

public synchronized int getstate()

public synchronized void start()

if (mconnectedthread != null)

if (macceptthread == null)

setstate(state_listen);

}//取消 connecting 和 connected 狀態下的相關執行緒,然後執行新的 mconnectthread 執行緒

public synchronized void connect(bluetoothdevice device)

}if (mconnectedthread != null)

mconnectthread = new connectthread(device);

mconnectthread.start();

setstate(state_connecting);}/*

開啟乙個 connectedthread 來管理對應的當前連線。之前先取消任意現存的 mconnectthread 、

mconnectedthread 、 macceptthread 執行緒,然後開啟新 mconnectedthread ,傳入當前剛剛接受的

socket 連線。最後通過 handler來通知ui連線

*/public synchronized void connected(bluetoothsocket socket, bluetoothdevice device)

if (mconnectedthread != null)

if (macceptthread != null)

mconnectedthread = new connectedthread(socket);

mconnectedthread.start();

message msg = mhandler.obtainmessage(bluetoothchat.message_device_name);

bundle bundle = new bundle();

bundle.putstring(bluetoothchat.device_name, device.getname());

msg.setdata(bundle);

mhandler.sendmessage(msg);

setstate(state_connected);

}// 停止所有相關執行緒,設當前狀態為 none

public synchronized void stop()

if (mconnectedthread != null)

if (macceptthread != null)

setstate(state_none);

}// 在 state_connected 狀態下,呼叫 mconnectedthread 裡的 write 方法,寫入 byte

public void write(byte out)

r.write(out);

}// 連線失敗的時候處理,通知 ui ,並設為 state_listen 狀態

private void connectionfailed()

// 當連線失去的時候,設為 state_listen 狀態並通知 ui

private void connectionlost()

// 建立監聽執行緒,準備接受新連線。使用阻塞方式,呼叫 bluetoothserversocket.accept()

private class acceptthread extends thread catch (ioexception e)

mmserversocket = tmp;

}@override

public void run() catch (ioexception e)

if (socket != null) catch (ioexception e)

break;}}

}}

}public void cancel() catch (ioexception e)

}/*連線線程,專門用來對外發出連線對方藍芽的請求和處理流程。

建構函式裡通過 bluetoothdevice.createrfcommsockettoservicerecord() ,

從待連線的 device 產生 bluetoothsocket. 然後在 run 方法中 connect ,

成功後呼叫 bluetoothchatsevice 的 connected() 方法。定義 cancel() 在關閉執行緒時能夠關閉相關socket 。

*/private class connectthread extends thread catch (ioexception e)

mmsocket = tmp;

}@override

public void run() catch (ioexception e) catch (ioexception e2)

chatservice.this.start();

return;

}synchronized (chatservice.this)

connected(mmsocket, mmdevice);

}public void cancel() catch (ioexception e)

}/*雙方藍芽連線後一直執行的執行緒;建構函式中設定輸入輸出流。

run()方法中使用阻塞模式的 inputstream.read()迴圈讀取輸入流,然後傳送到 ui 執行緒中更新聊天訊息。

本執行緒也提供了 write() 將聊天訊息寫入輸出流傳輸至對方,傳輸成功後回寫入 ui 執行緒。最後使用cancel()關閉連線的 socket

*/private class connectedthread extends thread catch (ioexception e)

mminstream = tmpin;

mmoutstream = tmpout;

}@override

public void run() catch (ioexception e)

}}public void write(byte buffer) catch (ioexception e)

}public void cancel() catch (ioexception e)

}}2.選擇介面布局

<?xml version="1.0" encoding="utf-8"?>

Android藍芽通訊(三) 藍芽通訊的實現

在前兩篇部落格中大致介紹了藍芽相關的基礎知識,不了解的朋友可以檢視前兩篇部落格 android藍芽通訊 一 藍芽功能的相關許可權 android藍芽通訊 二 藍芽的相關操作 在本篇部落格中我將介紹如何實現兩個藍芽裝置之間的通訊,藍芽的通訊類似於socket的通訊,在藍芽通訊中沒有絕對的裝置充當ser...

python藍芽通訊 python實現藍芽通訊

安裝和示例 linux下安裝 sudo apt get install python pip libglib2.0 dev sudo pip install bluepy 官方示例 importbtleclassmydelegate btle.defaultdelegate def init sel...

python藍芽通訊 python實現藍芽通訊

安裝和示例 linux下安裝 sudo apt get install python pip libglib2.0 dev sudo pip install bluepy 官方示例 import btle class mydelegate btle.defaultdelegate def init ...