VS2019 Xamarin.Android开发蓝牙通讯
第一步
新建項目
注意:不要選成移動應用xamarin.Forms要選android應用(Xamarin)?xamarin.Forms 和?Xamarin.Android還是有區別的。小項目就用Xamarin.Android就好了
選擇空白模板
作為通訊App 必定需要 Server端 所以我們在這里在新建一個Client端 原本的app1項目作為server端
在解決方案上右鍵 添加新的項目
繼續選 Android 應用
起名字叫app1Client
繼續選空白模板
OK到這里第一步建立項目就完成了
下一步我們將開始配置項目了。
第二步
配置項目
Android在使用藍牙時需要添加4個權限
在app1項目上 右鍵屬性 Android清單 內找到 所需權限 勾選
BLUETOOTH(利用這個權限去執行藍牙通信)
BLUETOOTH_PRIVILEGED(配對連接時需要)
BLUETOOTH_ADMIN(讓app擁有啟動設備發現或操縱藍牙設置,必須聲明BLUETOOTH_ADMIN權限)
注意:真機android版本6.0及以上使用藍牙搜索需要開發權限ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION
將App1 和 App1Client 2個項目都添加上述權限
第三步 編寫代碼
怎么添加界面和按鈕一類的我就不詳細寫了 這里主要寫怎么實現通訊的部分
1.獲得藍牙設備 這需要用到?BluetoothAdapter 這個類?
private readonly BluetoothAdapter localAdapter; localAdapter = BluetoothAdapter.DefaultAdapter;localAdapter 就是默認藍牙適配器了
BluetoothAdapter 類 提供了 藍牙適配器的狀態 以及打開藍牙 關閉藍牙等一些方法 具體內容請自己點進該類查看
2獲取建立服務端的監聽和通訊線程
我先寫下思路 我們首先需要一個線程來監聽是否有客戶端來請求建立連接
如果建立連接成功就去建立一個通訊線程來讀取Client端發來的數據..是不是很簡單
下面我們來是實現
監聽線程方法
//在你想要啟動監聽線程的地方添加這個線程 Thread t = new Thread(Monitor); t.Start();public void Monitor(){BluetoothServerSocket serverSock = localAdapter.ListenUsingRfcommWithServiceRecord("Bluetooth", Java.Util.UUID.FromString("0000-0000-0000-0000-1234567"));BluetoothSocket sock = null;while (true){try{sock = serverSock.Accept();}catch (System.Exception){}Thread t = new Thread(Connected);t.Start(sock);}核心方法 localAdapter.ListenUsingRfcommWithServiceRecord
//// 摘要:// Create a listening, secure RFCOMM Bluetooth socket with Service Record.//// 參數:// name:// service name for SDP record//// uuid:// uuid for SDP record//// 返回結果:// To be added.//// 異常:// T:Java.IO.IOException:// on error, for example Bluetooth not available, or insufficient permissions, or// channel in use.//// 言論:// Portions of this page are modifications based on work created and shared by the// Android Open Source Project and used according to terms described in the Creative// Commons 2.5 Attribution License.[Register("listenUsingRfcommWithServiceRecord", "(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;", "")]public BluetoothServerSocket ListenUsingRfcommWithServiceRecord(string name, UUID uuid);public BluetoothServerSocket ListenUsingRfcommWithServiceRecord(string name, UUID uuid); 該方法 需要個一個連接名稱和一個 UUID 并返回一個BluetoothServerSocket 對象 如果你會Socket的話接下來就很簡單了。
BluetoothServerSocket 類提供了幾個建立連接的方法
Accept()方法返回了一個BluetoothSocket對象
BluetoothSocket 類提供了藍牙適配輸入輸出流的操作
public Stream OutputStream { get; } //輸入流 讀操作使用該流 public Stream InputStream { get; } //輸出流 寫操作使用該流 public BluetoothDevice RemoteDevice { get; } //遠程設備屬性接下來我們要實現通訊線程
Thread t = new Thread(Connected);t.Start(sock);當建立連接成功 執行該代碼來新建一個通訊線程?
由于通訊線程需要該連接的套接字 所以我們要把建立連接成功后的套接字作為參數傳遞到線程函數內
通訊線程方法
public void Connected(object sock){BluetoothSocket mSock = (BluetoothSocket)sock;byte[] rebuf = new byte[1024]; while (true){int len = mSock.InputStream.Read(rebuf,0, rebuf.Length);if (len > 0){byte[] rebuf2 = new byte[len];Array.Copy(rebuf, 0, rebuf2, 0, len);string str = System.Text.Encoding.ASCII.GetString(rebuf2);Toast.MakeText(this, str, ToastLength.Short).Show();}Thread.Sleep(100);}由于線程啟動時傳遞的參數只能是Object對象所以先將 Object對象轉換為BluetoothSocket 對象? BluetoothSocket mSock = (BluetoothSocket)sock;
然后我們在新建一個緩沖區 用來讀取數據 由于我們現在還不知道將要讀取的數據有多大。我們可以先建立一個和藍牙讀取緩沖區大小一樣的byte數組?byte[] rebuf = new byte[1024]; 當然我這里只用了1KB 藍牙的讀取緩沖區默認好像是4KB?
接下來我們就每100毫秒區讀一下是否有數據 當然你可以用更快的速度來讀取如果你一個包的大小很小的話
//// 摘要:// 當在派生類中重寫時,從當前流讀取字節序列,并將此流中的位置提升讀取的字節數。//// 參數:// buffer:// 字節數組。 當此方法返回時,此緩沖區包含指定的字符數組,此數組中 offset 和 (offset + count - 1) 之間的值被從當前源中讀取的字節所替換。//// offset:// buffer 中的從零開始的字節偏移量,從此處開始存儲從當前流中讀取的數據。//// count:// 要從當前流中最多讀取的字節數。//// 返回結果:// 讀入緩沖區中的總字節數。 如果很多字節當前不可用,則總字節數可能小于請求的字節數;如果已到達流結尾,則為零 (0)。//// 異常:// T:System.ArgumentException:// offset 和 count 的總和大于緩沖區長度。//// T:System.ArgumentNullException:// buffer 為 null。//// T:System.ArgumentOutOfRangeException:// offset 或 count 為負數。//// T:System.IO.IOException:// 出現 I/O 錯誤。//// T:System.NotSupportedException:// 流不支持讀取。//// T:System.ObjectDisposedException:// 在流關閉后調用方法。public abstract int Read(byte[] buffer, int offset, int count);int len = mSock.InputStream.Read(rebuf,0, rebuf.Length);Read方法返回一個int 類型的對象 表示讀到的數據長度
如果數據長度 > 0
我們就可以解析了
byte[] rebuf2 = new byte[len]; Array.Copy(rebuf, 0, rebuf2, 0, len); string str = System.Text.Encoding.ASCII.GetString(rebuf2);新建一個 讀取到長度大小的byte數組 將讀到的數據拷貝到新的數組內進行解析。到這一步 一個最基礎的服務端就完成了
To be continued .......
下集預告:明天我們將講解如何寫一個客戶端來與服務端建立連接
-------------------------------------------------------------------------------------------------
本想把客戶端的也好好寫一篇。可惜工作太忙時間有限。
我把源碼放出來。。
BLETEST.rar_Xamarin藍牙通訊-Android代碼類資源-CSDN下載
有需求的自己下載吧
----------------------------------------------------------------------------------------
對一些大家提出的問題回答
1.說缺少文件的。應該是缺少Xamarin
感謝下載 Xamarin - Visual Studio
?添加Xamarin
2.無法連接服務端的
?
請修改client端
MainActivity.cs文件內的代碼
void Monitor() 函數內我限定了服務端是HUAWEI P30的設備,請修改為你自己做服務端的設備名稱。
總結
以上是生活随笔為你收集整理的VS2019 Xamarin.Android开发蓝牙通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu16.04使用360随身wi
- 下一篇: aac mediarecorder录制_