两个手机进行蓝牙通信项目制作
? ? ? ?最近,花了幾天時間搞了一下藍牙實現雙機通信,在此分享一下自己的制作過程,及遇到的相關問題。首先這篇博文將結合各個部分進行詳細的說明,有便于后期新人學習,同時利于個人的溫習鞏固。
? ? ? ? ?項目關鍵點:
? ? ? ? ?大的結構組織:
? ? ? ? ?Activity, Service, Thread, BroadcastReceiver,?
?藍牙模塊所用到的點:
?BluetoothDevice, ? ? ? ? ? ? ??
?BluetoothSocket,
?BluetoothServerSocket,
?BluetoothAdapter,
?數據流的點:
?ObjectInputStream,?
?ObjectOutputStream 。
? ? ? ?接下來,項目所用到重點知識進行一一詳解:
Activity:(活動)
首先理解定義:包含用戶界面的組件,主要用于和用戶進行交互。
了解其生命周期:
主要分為三個生存期:
完整生存期:onCreate()和onDestroy()方法之間的過程。
可見生存期:onStart()和onStop()方法之間的過程。
前臺生存期:onResume()和onPause()方法之間的過程。
項目所用到的onCreate(),onStart(),onStop()。
? ? ? ? ? ?onCreate():活動的一些初始化,例如按鈕,TextView的初始化等。
onStart():活動由可見到不可見時調用,主要在此開啟Service。
onStop():活動不可見時,主要是在此停止Service。
Service:(服務)
服務實現后臺運行,就算活動被關了,服務照樣運行,Service運行在程序進程的主線程中。
項目所用到的服務的生命周期函數:
startService()啟動服務
onCreate(),onDestroy();
onCreate()方法是在服務被創建的時候執行,
stopSelf()或者stopService()停止服務。
onDestroy();注銷服務。
Thread(線程)
?BroadcastReceiver(廣播接收器)
http://blog.csdn.net/huangbiao86/article/details/6668525?
?BluetoothSocket(客戶端套接字)
所謂Socket,網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。
建立網絡通信連接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。(摘自百度百科)
<span style="color:#330033;">socket = serverDevice.createRfcommSocketToServiceRecord(BluetoothTools.</span><span style="color: rgb(51, 0, 51); font-family: Arial, Helvetica, sans-serif;">RFCOMM_UUID</span><span style="color:#330033;">); socket.connect();</span>
BluetoothServerSocket(服務端套接字)
在服務器端,使用BluetoothServerSocket類創建一個監聽服務端口,當一個連接被BluetoothServerSocket接受,會返回一個新的BluetoothSocket來管理該連接。客戶端,使用一個單獨的BluetoothSocket類去初始化一個外接連接和管理該連接。
使用的藍牙端口是RFCOMM(面向連接,通過藍牙模塊進行數據流傳輸方式,也被稱為串行端口規范SPP),
項目代碼:
private BluetoothAdapter adapter; private BluetoothSocket socket;//用于通信的Socket private BluetoothServerSocket serverSocket; serverSocket=adapter.listenUsingRfcommWithServiceRecord("Server"RFCOMM_UUID); socket = serverSocket.accept();//接收到客戶端的連接,轉為BluetoothSocket進行通信 public static final UUID RFCOMM_UUID = UUID.fromString("36a274b5-be67-4782-a260-81586f26262a"); ? ?代碼說明:
accept()方法是一個線程阻塞的,只有接受到客戶端的連接,線程才會繼續執行。
當然這個UUID是用代碼自動生成的,只要客戶端與服務端的UUID是一致的,兩者就可以匹配成功。
在此注意一點,如果想讓手機藍牙APP連接單片機的藍牙模塊,UUID就是官方提供的通用碼:
<span style="white-space:pre"> </span>00001101-0000-1000-8000-00805F9B34FB
由于連接過程是屬于耗時操作,所以上面的過程是在子線程中完成的。
?BluetoothAdapter(藍牙適配器)
首先講一下Adapter, 定義為將一個類的接口變換成客戶端所期待的一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。BluetoothAdapter 可以初始化藍牙設備的搜索,查詢可匹配的設備集,使用一個已知的MAC地址來初始化一個BluetoothDevice類,創建一個BluetoothServerSocket類以監聽其他設備對本機的連接請求。
IP地址專注于網絡層,將數據包從一個網絡轉發到另外一個網絡;而MAC地址專注于數據鏈路層,將一個數據幀從一個節點傳送到相同鏈路的另一個節點。
具體代碼的實現:
<span style="font-size:18px;">//搜索到的遠程設備集合private List<BluetoothDevice> discoveredDevices = new ArrayList<BluetoothDevice>();//藍牙適配器private final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();</span> <span style="font-size:18px;"> bluetoothAdapter.enable();//打開藍牙bluetoothAdapter.startDiscovery();//開始搜索</span>接下來介紹一下廣播事件:
BluetoothAdapter.ACTION_DISCOVERY_STARTED 開啟對遠程設備的搜索 BluetoothDevice.ACTION_FOUND 發現遠程設備 BluetoothAdapter.ACTION_DISCOVERY_FINISHED 搜索結束
ObjectInputStream
ObjectOutputStream
兩個類讀寫的對象需要實現Serializable接口,何為Serializable,java提供的通用數據保存和讀取的接口。至于從什么地方讀出來和保存到哪里去都被隱藏在函數參數的背后。任何類型只要實現了Serializable接口,就可以被保存到文件中,或者作為數據流通過網絡發送到別的地方。也可以用管道來傳輸到系統的其他程序中。
<span style="font-size:18px;">dataIntent.putExtra(DATA,(Serializable)msg.obj); intent.getExtras().getSerializable(DATA);</span> private ObjectInputStream inStream; //對象輸入流 private ObjectOutputStream outStream;//對象輸出流this.outStream = new ObjectOutputStream(socket.getOutputStream()); this.inStream = new ObjectInputStream(new BufferedInputStream(socket.getInputStream())); <pre name="code" class="java">Object obj = inStream.readObject();//讀取數據 <pre name="code" class="java">//寫入一個可序列化的對象public void writeObject(Object obj) {try {/** Flush() 是清空,而不是刷新* 主要用在IO中,即清空緩沖區數據,就是說你用讀寫流的時候,* 其實數據是先被讀到了內存中,然后用數據寫到文件中,當你* 數據讀完的時候不代表你的數據已經寫完了,因為還有一部分* 有可能會留在內存這個緩沖區中。這時候如果你調用了 Close()* 方法關閉了讀寫流,那么這部分數據就會丟失,所以應該在關閉* 讀寫流之前先Flush(),先清空數據。* */outStream.flush();outStream.writeObject(obj);outStream.flush();} catch (IOException e) {e.printStackTrace();}}可能有些問題,請看客們給與意見。
參考書籍 ? android的
《第一行代碼》郭霖 ? ?著
《android經典項目開發實戰》王翠萍 ? ?著
? ? ? ? ? ? ? ? ?
總結
以上是生活随笔為你收集整理的两个手机进行蓝牙通信项目制作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ESLint : Expected li
- 下一篇: 淄博计算机文化基础试卷,计算机基础 学习