极客秀
搜索

自制开源的蓝牙传输助手(可视化显示)

通常我们的近距离无线数据传输常用的两个通讯方法是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;                    }  
                }  
            }        }
1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容