![AndroidBLE與終端通信(三)-客戶端與服務(wù)端通信過程以及實現(xiàn)數(shù)據(jù)通信資料_第1頁](http://file4.renrendoc.com/view/cbc05a6353057fa66d931e2f85e923e9/cbc05a6353057fa66d931e2f85e923e91.gif)
![AndroidBLE與終端通信(三)-客戶端與服務(wù)端通信過程以及實現(xiàn)數(shù)據(jù)通信資料_第2頁](http://file4.renrendoc.com/view/cbc05a6353057fa66d931e2f85e923e9/cbc05a6353057fa66d931e2f85e923e92.gif)
![AndroidBLE與終端通信(三)-客戶端與服務(wù)端通信過程以及實現(xiàn)數(shù)據(jù)通信資料_第3頁](http://file4.renrendoc.com/view/cbc05a6353057fa66d931e2f85e923e9/cbc05a6353057fa66d931e2f85e923e93.gif)
![AndroidBLE與終端通信(三)-客戶端與服務(wù)端通信過程以及實現(xiàn)數(shù)據(jù)通信資料_第4頁](http://file4.renrendoc.com/view/cbc05a6353057fa66d931e2f85e923e9/cbc05a6353057fa66d931e2f85e923e94.gif)
![AndroidBLE與終端通信(三)-客戶端與服務(wù)端通信過程以及實現(xiàn)數(shù)據(jù)通信資料_第5頁](http://file4.renrendoc.com/view/cbc05a6353057fa66d931e2f85e923e9/cbc05a6353057fa66d931e2f85e923e95.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
AndroidBLE與終端通信(三)——客戶端與服務(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,我們都需要一個 UUID(標識符),這個UUID在上篇也是有提到,而且他的格式也是固定的:UUID:XXXXXXXX(8)-XXXX(4)-XXXX(4)-XXXX(4)-XXXXXXXXXXXX(12)第一段是 8位,中間三段式 4位,最后一段是 12位,UUID相當于Socket的端口,而藍牙地址則相當于 Socket的IPandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="btnSearch"android:text="搜索藍牙設(shè)備"/><ListViewandroid:id="@+id/lvDevices"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout>2.實現(xiàn)步驟1.聲明我們需要的東西本地藍牙適配器privateBluetoothAdaptermBluetoothAdapter;列表privateListViewlvDevices;存儲搜索到的藍牙privateList<String>bluetoothDevices=newArrayList<String>();//listview的adapterprivateArrayAdapter<String>arrayAdapter;UUID.randomUUID()隨機獲取UUIDprivatefinalUUIDMY_UUID=UUID.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");連接對象的名稱privatefinalStringNAME="LGL";這里本身即是服務(wù)端也是客戶端,需要如下類privateBluetoothSocketclientSocket;privateBluetoothDevicedevice;輸出流_客戶端需要往服務(wù)端輸出privateOutputStreamos;2.初始化獲取本地藍牙適配器mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();判斷手機是否支持藍牙if(mBluetoothAdapter==null){Toast.makeText(this,"設(shè)備不支持藍牙",Toast.LENGTH_SHORT).show();finish();}判斷是否打開藍牙if(!mBluetoothAdapter.isEnabled()){彈出對話框提示用戶是后打開Intentintent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(intent,1);不做提示,強行打開mBluetoothAdapter.enable();}//初始化listviewlvDevices.setOnItemClickListener(this);獲取已經(jīng)配對的設(shè)備Set<BluetoothDevice>pairedDevices=mBluetoothAdapter.getBondedDevices();判斷是否有配對過的設(shè)備if(pairedDevices.size()>0){for(BluetoothDevicedevice:pairedDevices){遍歷到列表中bluetoothDevices.add(device.getName()+":"+device.getAddress()+"\n");}}//adapterlvDevices.setAdapter(arrayAdapter);/**異步搜索藍牙設(shè)備——廣播接收*/找到設(shè)備的廣播IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);注冊廣播registerReceiver(receiver,filter);搜索完成的廣播filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);注冊廣播registerReceiver(receiver,filter);}3.點擊搜索publicvoidbtnSearch(Viewv){設(shè)置進度條setProgressBarIndeterminateVisibility(true);setTitle("正在搜索...");判斷是否在搜索,如果在搜索,就取消搜索if(mBluetoothAdapter.isDiscovering()){mBluetoothAdapter.cancelDiscovery();}開始搜索mBluetoothAdapter.startDiscovery();}4.搜索設(shè)備privatefinalBroadcastReceiverreceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){收到的廣播類型Stringaction=intent.getAction();發(fā)現(xiàn)設(shè)備的廣播從intent中獲取設(shè)備BluetoothDevicedevice=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);判斷是否配對過if(device.getBondState()!=BluetoothDevice.BOND_BONDED){添加到列表bluetoothDevices.add(device.getName()+":"device.getAddress()+"\n");arrayAdapter.notifyDataSetChanged();}搜索完成}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){關(guān)閉進度條setProgressBarIndeterminateVisibility(true);setTitle("搜索完成!");}}};5.客戶端實現(xiàn)已經(jīng)發(fā)送數(shù)據(jù)流客戶端@OverridepublicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){先獲得藍牙的地址和設(shè)備名單獨解析地址Stringaddress=s.substring(s.indexOf(":")+1).trim();主動連接藍牙try{判斷是否在搜索,如果在搜索,就取消搜索if(mBluetoothAdapter.isDiscovering()){mBluetoothAdapter.cancelDiscovery();}try{判斷是否可以獲得if(device==null){獲得遠程設(shè)備device=mBluetoothAdapter.getRemoteDevice(address);}開始連接if(clientSocket==null){clientSocket=device.createRfcommSocketToServiceRecord(MY_UUID);連接clientSocket.connect();獲得輸出流os=clientSocket.getOutputStream();}}catch(Exceptione){TODO:handleexception}//如果成功獲得輸出流if(os!=null){os.write("HelloBluetooth!".getBytes("utf-8"));}}catch(Exceptione){TODO:handleexception}}6.Handler服務(wù)服務(wù)端,需要監(jiān)聽客戶端的線程類privateHandlerhandler=newHandler(){Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};7.服務(wù)端讀取數(shù)據(jù)流線程服務(wù)類privateclassAcceptThreadextendsThread{privateBluetoothServerSocketserverSocket;privateBluetoothSocketsocket;輸入輸出流privateOutputStreamos;privateInputStreamis;publicAcceptThread(){try{serverSocket=mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);}catch(IOExceptione){TODOAuto-generatedcatchblocke.printStackTrace();}}@Overridepublicvoidrun(){截獲客戶端的藍牙消息try{socket=serverSocket.accept();//如果阻塞了,就會一直停留在這里is=socket.getInputStream();os=socket.getOutputStream();不斷接收請求,如果客戶端沒有發(fā)送的話還是會阻塞while(true){每次只發(fā)送128個字節(jié)byte[]buffer=newbyte[128];讀取intcount=is.read();//如果讀取到了,我們就發(fā)送剛才的那個 ToastMessagemsg=newMessage();msg.obj=newString(buffer,0,count,"utf-8");handler.sendMessage(msg);}}catch(Exceptione){TODO:handleexception}}}8.開啟服務(wù)首先要聲明//啟動服務(wù)ac=newAcceptThread();ac.start();MainActivity 完整代碼publicclassMainActivityextendsActivityimplementsOnItemClickListener{本地藍牙適配器privateBluetoothAdaptermBluetoothAdapter;列表privateListViewlvDevices;存儲搜索到的藍牙privateList<String>bluetoothDevices=newArrayList<String>();//listview的adapterprivateArrayAdapter<String>arrayAdapter;UUID.randomUUID()隨機獲取UUIDprivatefinalUUIDMY_UUID=UUID.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");連接對象的名稱privatefinalStringNAME="LGL";這里本身即是服務(wù)端也是客戶端,需要如下類privateBluetoothSocketclientSocket;privateBluetoothDevicedevice;輸出流_客戶端需要往服務(wù)端輸出privateOutputStreamos;//線程類的實例privateAcceptThreadac;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);initView();}privatevoidinitView(){獲取本地藍牙適配器mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();判斷手機是否支持藍牙if(mBluetoothAdapter==null){Toast.makeText(this,"設(shè)備不支持藍牙",Toast.LENGTH_SHORT).show();finish();}判斷是否打開藍牙if(!mBluetoothAdapter.isEnabled()){彈出對話框提示用戶是后打開Intentintent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(intent,1);不做提示,強行打開mBluetoothAdapter.enable();}//初始化listviewlvDevices.setOnItemClickListener(this);獲取已經(jīng)配對的設(shè)備Set<BluetoothDevice>pairedDevices=mBluetoothAdapter.getBondedDevices();判斷是否有配對過的設(shè)備if(pairedDevices.size()>0){for(BluetoothDevicedevice:pairedDevices){遍歷到列表中bluetoothDevices.add(device.getName()+":"+device.getAddress()+"\n");}}//adapterlvDevices.setAdapter(arrayAdapter);//啟動服務(wù)ac=newAcceptThread();ac.start();/**異步搜索藍牙設(shè)備——廣播接收*/找到設(shè)備的廣播IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);注冊廣播registerReceiver(receiver,filter);搜索完成的廣播filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);注冊廣播registerReceiver(receiver,filter);}publicvoidbtnSearch(Viewv){設(shè)置進度條setProgressBarIndeterminateVisibility(true);setTitle("正在搜索...");判斷是否在搜索,如果在搜索,就取消搜索if(mBluetoothAdapter.isDiscovering()){mBluetoothAdapter.cancelDiscovery();}開始搜索mBluetoothAdapter.startDiscovery();}廣播接收器privatefinalBroadcastReceiverreceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){收到的廣播類型Stringaction=intent.getAction();發(fā)現(xiàn)設(shè)備的廣播從intent中獲取設(shè)備BluetoothDevicedevice=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);判斷是否配對過if(device.getBondState()!=BluetoothDevice.BOND_BONDED){添加到列表bluetoothDevices.add(device.getName()+":"device.getAddress()+"\n");arrayAdapter.notifyDataSetChanged();}搜索完成}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){關(guān)閉進度條setProgressBarIndeterminateVisibility(true);setTitle("搜索完成!");}}};客戶端@OverridepublicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){先獲得藍牙的地址和設(shè)備名Strings=arrayAdapter.getItem(position);單獨解析地址Stringaddress=s.substring(s.indexOf(":")+1).trim();主動連接藍牙try{判斷是否在搜索,如果在搜索,就取消搜索if(mBluetoothAdapter.isDiscovering()){mBluetoothAdapter.cancelDiscovery();}try{判斷是否可以獲得if(device==null){獲得遠程設(shè)備device=mBluetoothAdapter.getRemoteDevice(address);}開始連接if(clientSocket==null){clientSocket=device.createRfcommSocketToServiceRecord(MY_UUID);連接clientSocket.connect();獲得輸出流os=clientSocket.getOutputStream();}}catch(Exceptione){TODO:handleexception}如果成功獲得輸出流if(os!=null){os.write("HelloBluetooth!".getBytes("utf-8"));}}catch(Exceptione){TODO:handleexception}}服務(wù)端,需要監(jiān)聽客戶端的線程類privateHandlerhandler=newHandler(){Toast.makeText(MainActivity.this,Stri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代企業(yè)現(xiàn)金流分析與優(yōu)化策略
- 國慶節(jié)漢服節(jié)活動方案
- 環(huán)境安全教育在校園的推廣與實踐
- Unit 4 Natural disasters Project 說課稿-2024-2025學(xué)年高中英語人教版(2019)必修第一冊
- 3 地球的形狀說課稿-2023-2024學(xué)年大象版科學(xué)四年級下冊
- 2023六年級語文上冊 第三單元 12 故宮博物院說課稿新人教版
- Unit1 Making friends Part C(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊001
- 2024年四年級品社下冊《第三單元 交通連著你我他》說課稿 山東版
- 27巨人的花園 說課稿 -2023-2024學(xué)年語文四年級下冊統(tǒng)編版
- Module 3 Unit 2 You can use the computers.(說課稿)-2023-2024學(xué)年外研版(一起)英語五年級下冊001
- 國家安全教育課程教學(xué)大綱分享
- 養(yǎng)殖場獸醫(yī)服務(wù)合同
- 電氣工程及其自動化基礎(chǔ)知識單選題100道及答案解析
- HR六大板塊+三支柱體系
- 慢性病患者門診身份管理方案
- 2025年高考英語一輪復(fù)習(xí)講義(新高考)第2部分語法第23講狀語從句(練習(xí))(學(xué)生版+解析)
- 連鑄工職業(yè)技能大賽考試題庫-上(單選、多選題)
- 2024年全國統(tǒng)一高考數(shù)學(xué)試卷(新高考Ⅱ)含答案
- 十七個崗位安全操作規(guī)程手冊
- 爆花(2023年陜西中考語文試卷記敘文閱讀題及答案)
- 自主簽到培訓(xùn)課件-早安!幼兒園
評論
0/150
提交評論