通常我们的近距离无线数据传输常用的两个通讯方法是Wifi和蓝牙,之前我们利用微软的.NET
MAUI实现了使用Wifi利用TCP协议来实现数据的传输和可视化处理。 在此基础上,我们实现了数据处理,将其做成了类似串口示波器的功能。
而近期应小伙伴要求,我们制作同样的一款相同的APP但是是利用蓝牙协议进行传输的。我也会尝试将其整合到一起。
在此之前我们首先要实现的是蓝牙设备的连接,这里我使用的蓝牙设备是HC-08和电脑的串口连接。 (其实这里有一个大坑!!)
HC08是BLE低功耗蓝牙。
传输速率慢,并不适合用来做大规模的数据传输功能。 利用串口来驱动其发送消息,之后编写我们的APP软件。
由于代码结构异常复杂,我们还是简单的粘贴一下主要的源码内容,具体的源码或者安装包可以加QQ群获取。 我们将蓝牙的内容主要分为以下部分。
public bool isConneted = false;//蓝牙是否连接
BluetoothAdapter? mBluetoothAdapter;//蓝牙适配器
//注册一个委托public delegate void MessageEventHandler(object sender, string message);public event MessageEventHandler? MessageEvent;//接收消息
public string ConnectedBluetoothName;//连接蓝牙的名称private BluetoothSocket mmSocket; // 蓝牙Socketprivate UUID uuid = UUID.FromString("00001101-0000-1000-8000-00805F9B34FB");//串口
同样的,我们利用委托机制,将蓝牙接收到的消息传输出去。
private void Conncet_Clicked(object sender, EventArgs e) {#if ANDROID if (mybluetooth.isConneted == true) { mybluetooth.Disconnect(); mybluetooth.MessageEvent -= ReciveMessage; Conncet.Text = "连接蓝牙"; Conncet.BackgroundColor = Microsoft.Maui.Graphics.Colors.Red; } else { mybluetooth.ConnectBluetooth("KIKI"); if (mybluetooth.isConneted) { Conncet.Text = "断开连接"; mybluetooth.MessageEvent += ReciveMessage; Conncet.BackgroundColor = Microsoft.Maui.Graphics.Colors.Green; } }#endif }
在连接按钮中,我们调用蓝牙的连接函数,并且订阅蓝牙的接收函数。
private void ReciveMessage(Object sender,string message){ //在后台线程 Device.BeginInvokeOnMainThread(() => { Label1.Text = message; });}
在UI线程中,我们更新标签的内容。之后测试我们的代码。
可以看到我们成功的接收信息。 接着我们在此基础上加上升级。
我们在之前的程序之中加上导航页,这样子我们就可以开始选择我们需要的模式了。 如果选择蓝牙连接的话,则利用构造函数,将我们的蓝牙设备连入。
private void WiFiButton_Clicked(object sender, EventArgs e) { Navigation.PushAsync(new MainPage()); }
private void BluetoothButton_Clicked(object sender, EventArgs e) {#if ANDROID if(myBlueTooch.ConnectedBluetoothName.Length == 0) { DisplayAlert("提示", "请先连接蓝牙设备", "确定"); return; } myBlueTooch.ConnectBluetooth(DeviceListView.SelectedItem.ToString()); Navigation.PushAsync(new BlueToothPage(myBlueTooch));#endif
在两个按钮的函数中,添加不同的页导航。
这样子我们就可以实现导航到不同的界面中。
public void ConnectBluetooth(string address) { if (mBluetoothAdapter == null) { return; } if (mBluetoothAdapter.IsEnabled) { string desiredDeviceName = address; // 蓝牙设备的名称 BluetoothDevice? desiredDevice = null;
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.DefaultAdapter; ICollection<BluetoothDevice> pairedDevices = mBluetoothAdapter.BondedDevices;
if (pairedDevices != null && pairedDevices.Count > 0) { foreach (BluetoothDevice device in pairedDevices) { if (device.Name == desiredDeviceName) { // 找到匹配的蓝牙设备 desiredDevice = device; break; } } }
if (desiredDevice != null) { mmSocket = desiredDevice.CreateRfcommSocketToServiceRecord(uuid); try { mmSocket.Connect(); isConneted = true; ConnectedBluetoothName = desiredDevice.Name; //创建一个线程去接收 Task.Run(() => ReadData(mmSocket)); } catch (Java.IO.IOException ex) { //Console.WriteLine(ex.Message); isConneted = false; }
}
} }