android藍牙傳輸
① Android藍牙開發(二)經典藍牙消息傳輸實現
上篇文章中,我們主要介紹了藍牙模塊,傳統/經典藍牙模塊BT和低功耗藍牙BLE及其相關的API,不熟悉的可以查看 Android藍牙開發(一)藍牙模塊及核心API 進行了解。
本篇主要記錄用到的經典藍牙開發流程及連接通訊。
藍牙連接前,給與相關系統許可權:
安卓6.0以上系統要動態請求及獲取開啟GPS內容:
藍牙核心對象獲取,若獲取對象為null則說明設備不支持藍牙:
判斷藍牙是否開啟,沒有則開啟:
藍牙掃描:
取消掃描:
藍牙監聽廣播,監聽藍牙開關,發現設備,掃描結束等狀態,定義狀態回調介面,進行對應操作,例如:監聽到藍牙開啟後,進行設備掃描;發現設備後進行連接等。
客戶端,與服務端建立長連接,進行通訊:
服務端監聽客戶端發起的連接,進行接收及通訊:
客戶端連接及服務端監聽基類,用於客戶端和服務端之前Socket消息通訊,進行消息或文件的發送、接收,進行通訊關閉操作等:
我這里只是簡單記錄了項目中用到的藍牙通訊,兩個設備之間不通過配對進行連接、通訊。
相關詳細內容及使用請查看Github項目: https://github.com/MickJson/BluetoothCS
藍牙配對操作及其它內容,可以詳細查看我下面的參考資料,寫的十分詳細,比如設備通過MAC地址,可以通過BluetoothAdapter獲取設備,再通過客戶端connect方法去進行連接等。
連接中遇到問題:read failed, socket might closed or timeout, read ret: -1。
通過改UUID,反射等方法都還是會出現錯誤。連接時,要確保服務端及客戶端都處於完全斷開狀態,否則連接就會出現以上問題,但偶爾還是會有問題,期待有什麼好的方法可留言告訴我。
參考資料:
Android-經典藍牙(BT)-建立長連接傳輸短消息和文件
Android藍牙開發—經典藍牙詳細開發流程
歡迎點贊/評論,你們的贊同和鼓勵是我寫作的最大動力!
② 如何使用android原生BLE藍牙進行操作
之前的涉及的物聯網項目中使用的: BLE 低功耗藍牙(藍牙4.0), 支持android 4.3以上的手機
主從關系: BLE低功耗藍牙只能做從端設備 ,一個藍牙主端設備,可同時與7個藍牙從端設備進行通訊
1)低功耗
低功耗的原理:
1低功耗藍牙僅使用了3個廣播通道,傳統藍牙技術採用 16~32 個頻道
2每次廣播開啟時間也由傳統的 22.5ms 減少到 0.6~1.2ms(毫秒)
2)傳輸距離極大提高
傳統藍牙傳輸距離為 2~10m,而藍牙4.0的有效傳輸距離可達到 60~100m
3)安全性
使用AES-128 CCM加密演算法進行數據包加密和認證。
更多BLE藍牙的解析參考博客 : BLE4.0教程一 藍牙協議連接過程與廣播分析
添加許可權
打開藍牙
1.先拿到BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
2.再拿到BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
判斷是否打開藍牙
未打開彈出 系統彈框 ,除了 魅族手機 是打開系統設置
設備/手機都是藍牙信號
在回調方法中:
一般在掃描的過程中,我們還會設置 設備過濾原則 (因為我只想要搜索到我們想要的設備,忽略無關設備)
如:從 scanRecord -- beacon -- beacon.type == 0xFF代表Manufacture,通過與嵌入式軟體定義 自己的 Manufacture值即可
用BluetoothDevice得到BluetoothGatt:
斷連:
關鍵問題:連接後一般要做什麼事?
( 必須在剛連接成功後2秒內app寫一個值給設備,否則會被設備斷開連接)
主要是讀寫 characteristic
gatt.wirteCharacteristic(mCurrentcharacteristic);
gatt.readCharacteristic(characteristic);
bluetoothGatt.setCharacteristicNotification(data, true);
真實工作中使用的藍牙庫BlueToothKit請參考我的另一篇博客:
android藍牙入門知識和優秀藍牙第三方庫BluetoothKit的使用
③ syu android藍牙連接方法
syu android藍牙連接方法先展示代碼結構。
藍牙是一種無線數據與語音通信的開放性全球規范,它以低成本的短距離無線連接為基礎,可為固定的或移動的終端設備提供廉價的接入服務。
藍牙(Bluetooth)是一項短途無線電連接系統,它可以將不同的電子器材連系起來。原理就好像收音機一樣,裝有藍牙的電子器材,可以接收外來的訊息,從而進行特定的指令。
藍牙簡介:
不過,藍牙不但可以接收,也都可以「傳送」,因此裝有藍牙的電子器材,能夠互相溝通。現在,大部分的電腦配件,如列印機、熒幕等,都要接駁上電線,才可以互傳訊息,但藍牙透過其短途的接收系統,便可以使這些配件在沒有駁線下,仍然能夠傳送指令,做到真正「無線」的世界。
頭藍技術實質內容是為固定設備或移動設備之間的通信環境建立通用的近距無線介面,將通信技術與計算機技術進一步結合起來,使各種設備在沒有電線或電纜相互連接的情況下,能在近距離范圍內實現相互通信或操作。藍牙功能可以參考下面的操作打開使用,打開其他設備的藍牙。
並使其對其他設備可見,打開下拉頂簾,點擊藍牙圖標使其變為綠色,跳出提示框,勾選對其他設備可見。點擊掃描,搜索到其他設備後,點擊該設備名稱,雙方點確定後配對成功。選擇要傳輸的文件,共享通過藍牙即可傳輸文件。
④ android studio藍牙傳送mp3文件
android studio藍牙傳送mp3文件如下
1.兩部要傳送歌曲的手機的藍牙打開,注意是兩部都打開。
2.點擊要傳送歌曲手機的播放軟體,我以華為為例,其他手機大同小異。
3.找到歌曲所在的根目錄
4.點擊進入並尋找想要傳送的歌曲,點擊歌曲後面的標識。
⑤ Android藍牙傳輸速率限制在串口嗎
這個限制是在串口。
為了保證有效通訊,根據電、傳輸介質等的物理特性結合串口設備使用的要求,確定RS232最大傳輸速率只能是115200,然後逐級二分得到57600,28800,19200??為適應這些速率,設計相應的晶振頻率。
串口通信是指外設和計算機間,通過數據信號線、地線、控制線等,按位進行傳輸數據的一種通訊方式。這種通信方式使用的數據線少,在遠距離通信中可以節約通信成本,但其傳輸速度比並行傳輸低。
串口是計算機上一種非常通用的設備通信協議。大多數計算機(不包括筆記本電腦)包含兩個基於RS-232的串口。串口同時也是儀器儀表設備通用的通信協議;很多GPIB兼容的設備也帶有RS-232口。同時,串口通信協議也可以用於獲取遠程採集設備的數據。
⑥ android開發SPP經典藍牙
Android 開發SPP經典藍牙。
1、傳統藍牙採用的是SPP(Serial Port Profile)協議進行數據傳輸。
2、SPP的UUID:00001101-0000-1000-8000-00805F9B34FB
3、手機一般以客戶端的角色主動連接SPP協議設備
概念:
BluetoothAdapter:
本地藍牙適配器,是所有藍牙交互的入口,表示藍牙設備自身的一個藍牙適配器,整個系統只有一個藍牙適配器,通過他可以發現其他藍牙設備,查詢綁定(配對)設備列表,使用MAC地址實例化BluetoothDevice以及創建BluetoothServerSocket用來偵聽來自其他設備的通信。
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//獲取默認的藍牙Adapter
BluetoothDevice:
遠程的藍牙設備。
private static BluetoothDevice myDevice;
myDevice = myBluetoothAdapter.getRemoteDevice(BDAddr);//獲取遠程設備,通過藍牙的MAC地址來獲取一個遠程對象
兩種連接方式
BluetoothSocket
客戶端:調用BluetoothDevice的()可以獲取該對象;調用connect()方法可以建立連接。
private static BluetoothSocket mySocket = null;
private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Method m = myDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});//由BluetoothDevice衍生出BluetoothSocket, createRfcommSocket來選擇連接的服務和協議
mySocket = (BluetoothSocket) m.invoke(myDevice, 1);
BluetoothServerSocket:
服務端:通過BluetoothServerSocket對象可以創建BluetoothSocket對象,調用BluetoothServerSocket的accept()的方法可以得到改對象。
開發流程:
1:聲明許可權:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
2:啟動和關閉藍牙
獲取藍牙適配器,使用close()介面可以關閉藍牙適配器
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//獲取默認的藍牙Adapter
啟動藍牙
if (!blueadapter.isEnabled())
//判斷本機藍牙是否打開
{//如果沒打開,則打開藍牙
blueadapter.enable();
}
3.使用BlueAdatper搜索
使用bluetoothAdapter搜索設備,bluetoothAdapter.startDiscovery()在搜索過程中,系統會發出三個廣播信息:
ACTION_DISCOVERY_START:開始搜索
ACTION_DISCOVERY_FINISHED:搜索結束
ACTION_FOUND:找到設備
if (bluetoothAdapter.isDiscovering()) {
bluetoothAdapter.cancelDiscovery();//如果藍牙設備未連接則取消搜索
}
bluetoothAdapter.startDiscovery();
}
4:(1)通過注冊廣播獲取搜索到的設備。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);//找到設備廣播
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索完成廣播
registerReceiver(receiver, intentFilter);//注冊廣播接收器
// receiver
private final BroadcastReceiver receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// find a device
BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
//未配對設備
newDeviceArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}else {
//已經配對過的設備
TextView tvPaired = (TextView)findViewById(R.id.tv_paired);
tvPaired.setVisibility(View.VISIBLE);
lvPairedDevices.setVisibility(View.VISIBLE);
pairedDeviceArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
Log.i(TAG,"name:" + device.getName() + " address"+ device.getAddress());
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action){
// search finish
Log.i(TAG, "search finish!");
}
}
};
(2),直接得到當前的藍牙設備後,就可用通過遍歷pairedDevices ,得到當前手機已經配對過的藍牙設備。
Set<BluetoothDevice> pairedDevices = myBluetoothAdapter.getBondedDevices();//獲取當前藍牙設備
if (pairedDevices.size() <= 0) return false;
for (BluetoothDevice device : pairedDevices) {
Map<String, String> map = new HashMap<String, String>();
map.put("DeviceName", device.getName());
map.put("BDAddress", device.getAddress());
list.add(map);
5.建立連接
private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Method m = myDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});//由BluetoothDevice衍生出BluetoothSocket, createRfcommSocket來選擇連接的服務和協議
mySocket = (BluetoothSocket) m.invoke(myDevice, 1);
mySocket.connect();//使用BluetoothSocket來連接設備
6.把得到的藍牙設備給通過點擊ListView選擇設備。
listView.setOnItemClickListener(new ListView.OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
SelectedBDAddress = list.get(arg2).get("BDAddress");
if (((ListView) arg0).getTag() != null) {
((View) ((ListView) arg0).getTag()).setBackgroundDrawable(null);
}
((ListView) arg0).setTag(arg1);
arg1.setBackgroundColor(Color.BLUE);
myDevice = myBluetoothAdapter.getRemoteDevice(SelectedBDAddress);
}
});
7.客戶端發送數據
當兩個設備成功連接之後,雙方都會有一個BluetoothSocket對象,這時,就可以在設備之間傳送數據了。
1.使用getOutputStream()方法來獲取輸出流來處理傳輸。
2.調用write()。
os = socket.getOutputStream();//獲取輸出流
if (os != null) {//判斷輸出流是否為空
os.write(message.getBytes("UTF-8"));
}
os.flush();//將輸出流的數據強制提交
os.close();//關閉輸出流
}
將輸出流中的數據提交後,要記得關閉輸出流,否則,可能會造成只能發送一次數據。
8.服務端接收數據
1.使用getInputStream()方法來獲取輸入流來處理傳輸。
2.調用read()。
InputStream im=null;
im=bluetoothSocket.getInputStream();
byte buf[] = new byte[1024];
if (is != null) {
is.read(buf, 0, buf.length);//讀取發來的數據
String message = new String(buf);//把發來的數據轉化為String類型
BuletoothMainActivity.UpdateRevMsg(message);//更新信息在顯示文本框
is.close();//關閉輸入流
使用服務端接收數據時,要先從客戶端向服務端發起連接,只有接收到連接請求之後,才會返回一個BluetoothSocket對象。有BluetoothSocket對象才能獲取到輸入流。
⑦ 怎樣用Android手機藍牙傳送文件
1. 進入手機的設置,找到藍牙的相關設置。
點擊藍牙開關,將藍牙打開,如果已經開啟,可以忽略。因為手機系統的不同,設置界面可能會稍有差異。設置為讓所有設備都檢測到
2. 需要注意,開啟藍牙之後,搜索配對的手機必須設置為讓所有設備都檢測到。否則無法搜索配對。
3. 搜索到設備後,點擊搜索到的設備,兩部手機都必須在一定快速按下配對按鈕,否則將自動取消配對。
4. 在文件管理器里找到要傳輸的文件,選中後,按菜單鍵,選分享/藍牙。然後對方手機會收到一個文件接收請求,點確認接收,然後等待,就可以了。
⑧ 如何讓你的安卓手機通過藍牙跟Mac互傳文件
安卓到 Mac
前提需要 Mac 上打開「系統偏好設置-共享-藍牙共享」, 打開藍牙共享 。
然後從安卓手機里選擇文件,選擇通過藍牙分享,然後選擇這台 Mac 就可以了。
Mac 到安卓
Mac 上打開藍牙偏好設置(可以從桌面頂部菜單欄快速打開「藍牙偏好設置」)。
在你的安卓設備右鍵點選「將文件發送到設備」。在打開的窗口選擇要傳送到安卓上的文件,點「發送」就可以了。
藍牙傳輸速度還是有限制,速度遠不如 AirDrop 快。也可以安裝第三方 app 實現 Mac 與安卓的快速傳輸。比如 Portal、Send Anywhere 等。
當然,不管是哪種方案,都不如 iPhone 和 Mac 之間使用 AirDrop 傳輸來的方便、優雅。
⑨ Android-藍牙傳輸
通過藍牙傳輸數據與Socket類似。在網路中使用Socket和ServerSocket控制客戶端和服務端的數據讀寫。而藍牙通訊也由客戶端和服務端Socket來完成。藍牙客戶端Socket是BluetoothSocket,藍牙服務端Socket是BluetoothServerSocket。這兩個類都在android.bluetooth包中。
如果打算建議兩個藍牙設備之間的連接,則必須實現伺服器端與客戶端的機制。當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。
伺服器設備與客戶端設備獲取BluetoothSocket的途徑是不同的。伺服器設備是通過accepted一個incoming connection來獲取的,而客戶端設備則是通過打開一個到伺服器的RFCOMMchannel來獲取的。
通過調用BluetoothAdapter的(String, UUID) 方法來獲取
BluetoothServerSocket(UUID用於客戶端與伺服器端之間的配對)調用BluetoothServerSocket的 accept() 方法監聽連接請求,如果收到請求,則返回一個BluetoothSocket實例。
如果不想在accept其他的連接,則調用BluetoothServerSocket的 close() 方法釋放資源(調用該方法後,之前獲得的BluetoothSocket實例並沒有close。但由於RFCOMM一個時刻只允許在一條channel中有一個連接,則一般在accept一個連接後,便close掉BluetoothServerSocket)
通過搜索得到伺服器端的BluetoothService,調用BluetoothService的(String, UUID)方法獲取BluetoothSocket(該UUID應該同於伺服器端的UUID)。
調用BluetoothSocket的 connect() 方法(該方法為block方法),如果UUID同伺服器端的UUID匹配,並且連接被伺服器端accept,則 connect() 方法返回。