AndroidBLE與終端通信(三)——客戶端與服務(wù)端通信過(guò)程以及實(shí)現(xiàn)數(shù)據(jù)通信_(tái)第1頁(yè)
AndroidBLE與終端通信(三)——客戶端與服務(wù)端通信過(guò)程以及實(shí)現(xiàn)數(shù)據(jù)通信_(tái)第2頁(yè)
AndroidBLE與終端通信(三)——客戶端與服務(wù)端通信過(guò)程以及實(shí)現(xiàn)數(shù)據(jù)通信_(tái)第3頁(yè)
AndroidBLE與終端通信(三)——客戶端與服務(wù)端通信過(guò)程以及實(shí)現(xiàn)數(shù)據(jù)通信_(tái)第4頁(yè)
AndroidBLE與終端通信(三)——客戶端與服務(wù)端通信過(guò)程以及實(shí)現(xiàn)數(shù)據(jù)通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論