版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Android BLE與終端通信(三)客戶端與服務(wù)端通信過(guò)程以及實(shí)現(xiàn)數(shù)據(jù)通信一.藍(lán)牙數(shù)據(jù)傳輸藍(lán)牙數(shù)據(jù)傳輸其實(shí)跟我們的 Socket(套接字)有點(diǎn)類似,如果有不懂的,可以百度一下概念,我們只要知道是這么回事就可以了,在網(wǎng)絡(luò)中使用Socket和ServerSocket控制客戶端和服務(wù)端來(lái)數(shù)據(jù)讀寫(xiě)。而藍(lán)牙通訊也是由客戶端和服務(wù)端來(lái)完成的,藍(lán)牙客戶端Socket是BluetoothSocket,藍(lán)牙服務(wù)端Socket是BluetoothServerSocket,這兩個(gè)類都在Android.bluetooth包下,而且無(wú)論是BluetoothSocket還是BluetoothServerSocket,我
2、們都需要一個(gè)UUID(標(biāo)識(shí)符),這個(gè)UUID在上篇也是有提到,而且他的格式也是固定的:UUID:XXXXXXXX(8)-XXXX(4)-XXXX(4)-XXXX(4)-XXXXXXXXXXXX(12)第一段是8位,中間三段式4位,最后一段是12位,UUID相當(dāng)于Socket的端口,而藍(lán)牙地址則相當(dāng)于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="搜索藍(lán)牙設(shè)備" /> <ListView android:id="+id/lvDevices&qu
4、ot; android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /></LinearLayout>2.實(shí)現(xiàn)步驟1.聲明我們需要的東西 / 本地藍(lán)牙適配器 private BluetoothAdapter mBluetoothAdapter; / 列表 private ListView lvDevices; / 存儲(chǔ)搜索到的藍(lán)牙 private List<String> bluetoo
5、thDevices = new ArrayList<String>(); / listview的adapter private ArrayAdapter<String> arrayAdapter; / UUID.randomUUID()隨機(jī)獲取UUID private final UUID MY_UUID = UUID .fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3"); / 連接對(duì)象的名稱 private final String NAME = "LGL" / 這里本身即是服務(wù)
6、端也是客戶端,需要如下類 private BluetoothSocket clientSocket; private BluetoothDevice device; / 輸出流_客戶端需要往服務(wù)端輸出 private OutputStream os;2.初始化/ 獲取本地藍(lán)牙適配器 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); / 判斷手機(jī)是否支持藍(lán)牙 if (mBluetoothAdapter = null) Toast.makeText(this, "設(shè)備不支持藍(lán)牙", Toast.LENGTH_SH
7、ORT).show(); finish(); / 判斷是否打開(kāi)藍(lán)牙 if (!mBluetoothAdapter.isEnabled() / 彈出對(duì)話框提示用戶是后打開(kāi) Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 1); / 不做提示,強(qiáng)行打開(kāi) / mBluetoothAdapter.enable(); / 初始化listview lvDevices = (ListView) findViewById(R.id.lvDevices); lvD
8、evices.setOnItemClickListener(this); / 獲取已經(jīng)配對(duì)的設(shè)備 Set<BluetoothDevice> pairedDevices = mBluetoothAdapter .getBondedDevices(); / 判斷是否有配對(duì)過(guò)的設(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); /* * 異步搜索藍(lán)牙設(shè)備廣播接收 */ / 找到設(shè)備的廣播 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
10、 / 注冊(cè)廣播 registerReceiver(receiver, filter); / 搜索完成的廣播 filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); / 注冊(cè)廣播 registerReceiver(receiver, filter); 3.點(diǎn)擊搜索public void btnSearch(View v) / 設(shè)置進(jìn)度條 setProgressBarIndeterminateVisibility(true); setTitle("正在搜索."); / 判斷是否在搜索,如果在搜
11、索,就取消搜索 if (mBluetoothAdapter.isDiscovering() mBluetoothAdapter.cancelDiscovery(); / 開(kāi)始搜索 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); / 判斷是否配對(duì)過(guò) 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)閉進(jìn)度條 setProgressBarIndeterminateVisibility(true); setTitle("搜索完成!"); ;5.客戶端實(shí)現(xiàn)已經(jīng)發(fā)送數(shù)據(jù)流 / 客戶端 Override public void onItemClick(AdapterView<?&
14、gt; parent, View view, int position, long id) / 先獲得藍(lán)牙的地址和設(shè)備名 String s = arrayAdapter.getItem(position); / 單獨(dú)解析地址 String address = s.substring(s.indexOf(":") + 1).trim(); / 主動(dòng)連接藍(lán)牙 try / 判斷是否在搜索,如果在搜索,就取消搜索 if (mBluetoothAdapter.isDiscovering() mBluetoothAdapter.cancelDiscovery(); try / 判斷是否
15、可以獲得 if (device = null) / 獲得遠(yuǎn)程設(shè)備 device = mBluetoothAdapter.getRemoteDevice(address); / 開(kāi)始連接 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)聽(tīng)客戶端的線程類 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() / 截獲客戶端的藍(lán)牙消息 try socket = serverSocket.accept(); / 如果阻塞了,就會(huì)一直停留在這里 is = socket.getInputStream(); os = socket.getOu
19、tputStream(); / 不斷接收請(qǐng)求,如果客戶端沒(méi)有發(fā)送的話還是會(huì)阻塞 while (true) / 每次只發(fā)送128個(gè)字節(jié) byte buffer = new byte128; / 讀取 int count = is.read(); / 如果讀取到了,我們就發(fā)送剛才的那個(gè)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.開(kāi)啟服務(wù)首先要聲明 /啟動(dòng)服務(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 / 本地藍(lán)牙適配器 private BluetoothAdapter mBluetoothAdapter; / 列表 private ListView lvDevices; / 存儲(chǔ)搜索到的藍(lán)牙 pri
24、vate List<String> bluetoothDevices = new ArrayList<String>(); / listview的adapter private ArrayAdapter<String> arrayAdapter; / UUID.randomUUID()隨機(jī)獲取UUID private final UUID MY_UUID = UUID .fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3"); / 連接對(duì)象的名稱 private final String NA
25、ME = "LGL" / 這里本身即是服務(wù)端也是客戶端,需要如下類 private BluetoothSocket clientSocket; private BluetoothDevice device; / 輸出流_客戶端需要往服務(wù)端輸出 private OutputStream os; /線程類的實(shí)例 private AcceptThread ac; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView
26、(R.layout.activity_main); initView(); private void initView() / 獲取本地藍(lán)牙適配器 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); / 判斷手機(jī)是否支持藍(lán)牙 if (mBluetoothAdapter = null) Toast.makeText(this, "設(shè)備不支持藍(lán)牙", Toast.LENGTH_SHORT).show(); finish(); / 判斷是否打開(kāi)藍(lán)牙 if (!mBluetoothAdapter.isEnabled()
27、 / 彈出對(duì)話框提示用戶是后打開(kāi) Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 1); / 不做提示,強(qiáng)行打開(kāi) / mBluetoothAdapter.enable(); / 初始化listview lvDevices = (ListView) findViewById(R.id.lvDevices); lvDevices.setOnItemClickListener(this); / 獲取已經(jīng)配對(duì)的設(shè)備 Set<BluetoothDev
28、ice> pairedDevices = mBluetoothAdapter .getBondedDevices(); / 判斷是否有配對(duì)過(guò)的設(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); /啟動(dòng)服務(wù) ac = new AcceptThread(); ac.start(); /* * 異步搜索藍(lán)牙設(shè)備廣播接收 */ / 找到設(shè)備的廣播 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); / 注冊(cè)廣播 registerReceiver(re
30、ceiver, filter); / 搜索完成的廣播 filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); / 注冊(cè)廣播 registerReceiver(receiver, filter); public void btnSearch(View v) / 設(shè)置進(jìn)度條 setProgressBarIndeterminateVisibility(true); setTitle("正在搜索."); / 判斷是否在搜索,如果在搜索,就取消搜索 if (mBluetoothAdapter.isD
31、iscovering() mBluetoothAdapter.cancelDiscovery(); / 開(kāi)始搜索 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); / 判斷是否配對(duì)過(guò) 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)閉進(jìn)度條 setProgressBarIndeterminateVisibility(true); setTitle("搜索完成!"); ; / 客戶端 Override public void onItemClick(AdapterView<?> parent, View view, int position, long id)
34、 / 先獲得藍(lán)牙的地址和設(shè)備名 String s = arrayAdapter.getItem(position); / 單獨(dú)解析地址 String address = s.substring(s.indexOf(":") + 1).trim(); / 主動(dòng)連接藍(lán)牙 try / 判斷是否在搜索,如果在搜索,就取消搜索 if (mBluetoothAdapter.isDiscovering() mBluetoothAdapter.cancelDiscovery(); try / 判斷是否可以獲得 if (device = null) / 獲得遠(yuǎn)程設(shè)備 device = mBl
35、uetoothAdapter.getRemoteDevice(address); / 開(kāi)始連接 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年貴州省普通高中學(xué)業(yè)水平合格性考試模擬地理試題(解析版)
- 2023屆山東省平度市高考二模地理試題(解析版)
- 2023-2024學(xué)年山東省濱州市高一下學(xué)期期末考試地理試題(解析版)
- 2024年植物促生菌劑項(xiàng)目合作計(jì)劃書(shū)
- 2024年系列催化裂化催化劑合作協(xié)議書(shū)
- 打擊“黃賭毒”違法犯罪專項(xiàng)行動(dòng)方案
- 承包商與供應(yīng)商管理制度
- 成長(zhǎng)的煩惱作文10篇
- 2024年醫(yī)藥級(jí)纖維素醚項(xiàng)目建議書(shū)
- 2024年絕緣隔離柱項(xiàng)目合作計(jì)劃書(shū)
- DB37∕T 5097-2021 山東省綠色建筑評(píng)價(jià)標(biāo)準(zhǔn)
- 泛光照明技術(shù)標(biāo)
- 水稻種植管護(hù)工作方案管護(hù)措施方法
- 隧道監(jiān)測(cè)總結(jié)報(bào)告
- 果樹(shù)栽培技術(shù)培訓(xùn)心得體會(huì)
- 遠(yuǎn)離流動(dòng)攤點(diǎn),拒絕垃圾食品
- 二次供水單位各類制度及應(yīng)急處理預(yù)案
- 三人表決器課堂教學(xué)設(shè)計(jì) 1-5 三人表決器的元器件的檢測(cè)、電路安裝、調(diào)試、維修.docx
- 船體結(jié)構(gòu)焊接要求作業(yè)指導(dǎo)書(shū)
- 漢語(yǔ)拼音字母描紅示范(打印版)
- 大腦分區(qū)AAL模板
評(píng)論
0/150
提交評(píng)論