版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Android BLE與終端通信(三)客戶端與服務(wù)端通信過程以及實現(xiàn)數(shù)據(jù)通信一.藍牙數(shù)據(jù)傳輸藍牙數(shù)據(jù)傳輸其實跟我們的 Socket(套接字)有點類似,如果有不懂的,可以百度一下概念,我們只要知道是這么回事就可以了,在網(wǎng)絡(luò)中使用Socket和ServerSocket控制客戶端和服務(wù)端來數(shù)據(jù)讀寫。而藍牙通訊也是由客戶端和服務(wù)端來完成的,藍牙客戶端Socket是BluetoothSocket,藍牙服務(wù)端Socket是BluetoothServerSocket,這兩個類都在Android.bluetooth包下,而且無論是BluetoothSocket還是BluetoothServerSocket,我
2、們都需要一個UUID(標識符),這個UUID在上篇也是有提到,而且他的格式也是固定的:UUID:XXXXXXXX(8)-XXXX(4)-XXXX(4)-XXXX(4)-XXXXXXXXXXXX(12)第一段是8位,中間三段式4位,最后一段是12位,UUID相當于Socket的端口,而藍牙地址則相當于Socket的IP1.activity_main.xml<LinearLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_heig
3、ht="match_parent" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="btnSearch" android:text="搜索藍牙設(shè)備" /> <ListView android:id="+id/lvDevices&qu
4、ot; android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /></LinearLayout>2.實現(xiàn)步驟1.聲明我們需要的東西 / 本地藍牙適配器 private BluetoothAdapter mBluetoothAdapter; / 列表 private ListView lvDevices; / 存儲搜索到的藍牙 private List<String> bluetoo
5、thDevices = new ArrayList<String>(); / listview的adapter private ArrayAdapter<String> arrayAdapter; / UUID.randomUUID()隨機獲取UUID private final UUID MY_UUID = UUID .fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3"); / 連接對象的名稱 private final String NAME = "LGL" / 這里本身即是服務(wù)
6、端也是客戶端,需要如下類 private BluetoothSocket clientSocket; private BluetoothDevice device; / 輸出流_客戶端需要往服務(wù)端輸出 private OutputStream os;2.初始化/ 獲取本地藍牙適配器 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); / 判斷手機是否支持藍牙 if (mBluetoothAdapter = null) Toast.makeText(this, "設(shè)備不支持藍牙", Toast.LENGTH_SH
7、ORT).show(); finish(); / 判斷是否打開藍牙 if (!mBluetoothAdapter.isEnabled() / 彈出對話框提示用戶是后打開 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 1); / 不做提示,強行打開 / mBluetoothAdapter.enable(); / 初始化listview lvDevices = (ListView) findViewById(R.id.lvDevices); lvD
8、evices.setOnItemClickListener(this); / 獲取已經(jīng)配對的設(shè)備 Set<BluetoothDevice> pairedDevices = mBluetoothAdapter .getBondedDevices(); / 判斷是否有配對過的設(shè)備 if (pairedDevices.size() > 0) for (BluetoothDevice device : pairedDevices) / 遍歷到列表中 bluetoothDevices.add(device.getName() + ":" + device.getAd
9、dress() + "n"); / adapter arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, bluetoothDevices); lvDevices.setAdapter(arrayAdapter); /* * 異步搜索藍牙設(shè)備廣播接收 */ / 找到設(shè)備的廣播 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
10、 / 注冊廣播 registerReceiver(receiver, filter); / 搜索完成的廣播 filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); / 注冊廣播 registerReceiver(receiver, filter); 3.點擊搜索public void btnSearch(View v) / 設(shè)置進度條 setProgressBarIndeterminateVisibility(true); setTitle("正在搜索."); / 判斷是否在搜索,如果在搜
11、索,就取消搜索 if (mBluetoothAdapter.isDiscovering() mBluetoothAdapter.cancelDiscovery(); / 開始搜索 mBluetoothAdapter.startDiscovery(); 4.搜索設(shè)備private final BroadcastReceiver receiver = new BroadcastReceiver() Override public void onReceive(Context context, Intent intent) / 收到的廣播類型 String action = intent.getAc
12、tion(); / 發(fā)現(xiàn)設(shè)備的廣播 if (BluetoothDevice.ACTION_FOUND.equals(action) / 從intent中獲取設(shè)備 BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); / 判斷是否配對過 if (device.getBondState() != BluetoothDevice.BOND_BONDED) / 添加到列表 bluetoothDevices.add(device.getName() + ":" + devi
13、ce.getAddress() + "n"); arrayAdapter.notifyDataSetChanged(); / 搜索完成 else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED .equals(action) / 關(guān)閉進度條 setProgressBarIndeterminateVisibility(true); setTitle("搜索完成!"); ;5.客戶端實現(xiàn)已經(jīng)發(fā)送數(shù)據(jù)流 / 客戶端 Override public void onItemClick(AdapterView<?&
14、gt; parent, View view, int position, long id) / 先獲得藍牙的地址和設(shè)備名 String s = arrayAdapter.getItem(position); / 單獨解析地址 String address = s.substring(s.indexOf(":") + 1).trim(); / 主動連接藍牙 try / 判斷是否在搜索,如果在搜索,就取消搜索 if (mBluetoothAdapter.isDiscovering() mBluetoothAdapter.cancelDiscovery(); try / 判斷是否
15、可以獲得 if (device = null) / 獲得遠程設(shè)備 device = mBluetoothAdapter.getRemoteDevice(address); / 開始連接 if (clientSocket = null) clientSocket = device .createRfcommSocketToServiceRecord(MY_UUID); / 連接 clientSocket.connect(); / 獲得輸出流 os = clientSocket.getOutputStream(); catch (Exception e) / TODO: handle except
16、ion / 如果成功獲得輸出流 if (os != null) os.write("Hello Bluetooth!".getBytes("utf-8"); catch (Exception e) / TODO: handle exception 6.Handler服務(wù)/ 服務(wù)端,需要監(jiān)聽客戶端的線程類 private Handler handler = new Handler() public void handleMessage(android.os.Message msg) Toast.makeText(MainActivity.this, Str
17、ing.valueOf(msg.obj), Toast.LENGTH_SHORT).show(); super.handleMessage(msg); ;7.服務(wù)端讀取數(shù)據(jù)流/ 線程服務(wù)類 private class AcceptThread extends Thread private BluetoothServerSocket serverSocket; private BluetoothSocket socket; / 輸入 輸出流 private OutputStream os; private InputStream is; public AcceptThread() try ser
18、verSocket = mBluetoothAdapter .listenUsingRfcommWithServiceRecord(NAME, MY_UUID); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); Override public void run() / 截獲客戶端的藍牙消息 try socket = serverSocket.accept(); / 如果阻塞了,就會一直停留在這里 is = socket.getInputStream(); os = socket.getOu
19、tputStream(); / 不斷接收請求,如果客戶端沒有發(fā)送的話還是會阻塞 while (true) / 每次只發(fā)送128個字節(jié) byte buffer = new byte128; / 讀取 int count = is.read(); / 如果讀取到了,我們就發(fā)送剛才的那個Toast Message msg = new Message(); msg.obj = new String(buffer, 0, count, "utf-8"); handler.sendMessage(msg); catch (Exception e) / TODO: handle exce
20、ption 8.開啟服務(wù)首先要聲明 /啟動服務(wù) ac = new AcceptThread(); ac.start();MainActivity完整代碼package com.lgl.bluetoothget;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import java.util.Set;import java.util.UUID;import android.app.Ac
21、tivity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothServerSocket;import android.bluetooth.BluetoothSocket;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.conte
22、nt.IntentFilter;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAd
23、apter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnItemClickListener / 本地藍牙適配器 private BluetoothAdapter mBluetoothAdapter; / 列表 private ListView lvDevices; / 存儲搜索到的藍牙 pri
24、vate List<String> bluetoothDevices = new ArrayList<String>(); / listview的adapter private ArrayAdapter<String> arrayAdapter; / UUID.randomUUID()隨機獲取UUID private final UUID MY_UUID = UUID .fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3"); / 連接對象的名稱 private final String NA
25、ME = "LGL" / 這里本身即是服務(wù)端也是客戶端,需要如下類 private BluetoothSocket clientSocket; private BluetoothDevice device; / 輸出流_客戶端需要往服務(wù)端輸出 private OutputStream os; /線程類的實例 private AcceptThread ac; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView
26、(R.layout.activity_main); initView(); private void initView() / 獲取本地藍牙適配器 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); / 判斷手機是否支持藍牙 if (mBluetoothAdapter = null) Toast.makeText(this, "設(shè)備不支持藍牙", Toast.LENGTH_SHORT).show(); finish(); / 判斷是否打開藍牙 if (!mBluetoothAdapter.isEnabled()
27、 / 彈出對話框提示用戶是后打開 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 1); / 不做提示,強行打開 / mBluetoothAdapter.enable(); / 初始化listview lvDevices = (ListView) findViewById(R.id.lvDevices); lvDevices.setOnItemClickListener(this); / 獲取已經(jīng)配對的設(shè)備 Set<BluetoothDev
28、ice> pairedDevices = mBluetoothAdapter .getBondedDevices(); / 判斷是否有配對過的設(shè)備 if (pairedDevices.size() > 0) for (BluetoothDevice device : pairedDevices) / 遍歷到列表中 bluetoothDevices.add(device.getName() + ":" + device.getAddress() + "n"); / adapter arrayAdapter = new ArrayAdapter&
29、lt;String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, bluetoothDices); lvDevices.setAdapter(arrayAdapter); /啟動服務(wù) ac = new AcceptThread(); ac.start(); /* * 異步搜索藍牙設(shè)備廣播接收 */ / 找到設(shè)備的廣播 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); / 注冊廣播 registerReceiver(re
30、ceiver, filter); / 搜索完成的廣播 filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); / 注冊廣播 registerReceiver(receiver, filter); public void btnSearch(View v) / 設(shè)置進度條 setProgressBarIndeterminateVisibility(true); setTitle("正在搜索."); / 判斷是否在搜索,如果在搜索,就取消搜索 if (mBluetoothAdapter.isD
31、iscovering() mBluetoothAdapter.cancelDiscovery(); / 開始搜索 mBluetoothAdapter.startDiscovery(); / 廣播接收器 private final BroadcastReceiver receiver = new BroadcastReceiver() Override public void onReceive(Context context, Intent intent) / 收到的廣播類型 String action = intent.getAction(); / 發(fā)現(xiàn)設(shè)備的廣播 if (Bluetooth
32、Device.ACTION_FOUND.equals(action) / 從intent中獲取設(shè)備 BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); / 判斷是否配對過 if (device.getBondState() != BluetoothDevice.BOND_BONDED) / 添加到列表 bluetoothDevices.add(device.getName() + ":" + device.getAddress() + "n"
33、); arrayAdapter.notifyDataSetChanged(); / 搜索完成 else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED .equals(action) / 關(guān)閉進度條 setProgressBarIndeterminateVisibility(true); setTitle("搜索完成!"); ; / 客戶端 Override public void onItemClick(AdapterView<?> parent, View view, int position, long id)
34、 / 先獲得藍牙的地址和設(shè)備名 String s = arrayAdapter.getItem(position); / 單獨解析地址 String address = s.substring(s.indexOf(":") + 1).trim(); / 主動連接藍牙 try / 判斷是否在搜索,如果在搜索,就取消搜索 if (mBluetoothAdapter.isDiscovering() mBluetoothAdapter.cancelDiscovery(); try / 判斷是否可以獲得 if (device = null) / 獲得遠程設(shè)備 device = mBl
35、uetoothAdapter.getRemoteDevice(address); / 開始連接 if (clientSocket = null) clientSocket = device .createRfcommSocketToServiceRecord(MY_UUID); / 連接 clientSocket.connect(); / 獲得輸出流 os = clientSocket.getOutputStream(); catch (Exception e) / TODO: handle exception / 如果成功獲得輸出流 if (os != null) os.write("Hello Bluetooth!&qu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年酒籃子項目投資價值分析報告
- 2025至2030年液體分樣器項目投資價值分析報告
- 2025至2030年工程承包項目投資價值分析報告
- 藥店裝修管理協(xié)議
- 超市消防設(shè)施居間服務(wù)合同
- 特色小吃店改造協(xié)議范例
- 校園裝修安全協(xié)議書
- 2024年度浙江省公共營養(yǎng)師之四級營養(yǎng)師押題練習試題A卷含答案
- 2024年度海南省公共營養(yǎng)師之三級營養(yǎng)師模擬考試試卷B卷含答案
- 全員育人導師在科研中的應(yīng)用計劃
- 2025年慢性阻塞性肺疾病全球創(chuàng)議GOLD指南修訂解讀課件
- DB11-T 825-2021綠色建筑評價標準
- 人教版八年級下冊英語單詞默寫(可直接打印)
- 糖廠熱力衡算(6000噸每天)
- 燃氣有限公司危險作業(yè)安全管理規(guī)定
- 北京市刑事訴訟律師事務(wù)所函(擔任訴訟代理人適用)格式文書(2020版)
- XX鎮(zhèn)“我為群眾辦實事”滿意度調(diào)查問卷
- (完整版)Brownbear繪本
- 魯教版初中英語七年級下冊單詞漢語(背誦)
- 玻璃纖維拉絲作業(yè)中幾個常見問題的處理
- 鐵路信號室內(nèi)施工總結(jié)
評論
0/150
提交評論