C# 蓝牙通讯

首次发布:2018-08-20
开发语言:C#
源码大小:184KB


本次赞助金额为:9
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有编译问题可以找我解决。QQ:78630559

核心代码

public class BluetoothHepler
{
    private BluetoothClient _bluetoothClient;
    private BluetoothDeviceInfo _connectedDevice;
    private NetworkStream _bluetoothStream;
    private Thread _receiveThread;
    private bool _isReceiving;

    // 事件定义
    public event EventHandler<BluetoothDeviceInfo> DeviceDiscovered;
    public event EventHandler<bool> ConnectionStatusChanged;
    public event EventHandler<byte[]> DataReceived;
    public event EventHandler<string> LogMessage;

    /// <summary>
    /// 是否已连接到蓝牙设备
    /// </summary>
    public bool IsConnected => _bluetoothClient?.Connected ?? false;

    /// <summary>
    /// 当前连接的设备
    /// </summary>
    public BluetoothDeviceInfo ConnectedDevice => _connectedDevice;

    public BluetoothHepler()
    {
        _bluetoothClient = new BluetoothClient();
    }

    /// <summary>
    /// 搜索附近的蓝牙设备
    /// </summary>
    /// <returns>发现的蓝牙设备列表</returns>
    public List<BluetoothDeviceInfo> DiscoverDevices()
    {
        var devices = new List<BluetoothDeviceInfo>();

        try
        {
            Log("开始搜索蓝牙设备...");

            // 开始搜索
            var discoveredDevices = _bluetoothClient.DiscoverDevices();

            Log($"发现 {discoveredDevices.Count} 个蓝牙设备");

            foreach (var device in discoveredDevices)
            {
                devices.Add(device);
                DeviceDiscovered?.Invoke(this, device);
                Log($"发现设备: {device.DeviceName} [地址: {device.DeviceAddress}]");
            }
        }
        catch (Exception ex)
        {
            Log($"搜索蓝牙设备时出错: {ex.Message}");
        }

        return devices;
    }

    /// <summary>
    /// 连接到指定的蓝牙设备
    /// </summary>
    /// <param name="device">要连接的蓝牙设备</param>
    /// <param name="serviceGuid">服务GUID</param>
    /// <returns>是否连接成功</returns>
    public bool Connect(BluetoothDeviceInfo device, Guid serviceGuid)
    {
        if (IsConnected)
        {
            Disconnect();
        }

        try
        {
            Log($"正在连接到设备: {device.DeviceName}...");

            // 配对设备(如果需要)
            if (!device.Authenticated)
            {
                Log("设备未配对,尝试配对...");
                var isPaired = BluetoothSecurity.PairRequest(device.DeviceAddress, null);
                if (!isPaired)
                {
                    Log("配对请求被拒绝或失败");
                    return false;
                }
                Log("配对成功");
            }

            // 连接到设备
            _bluetoothClient.Connect(device.DeviceAddress, serviceGuid);

            if (_bluetoothClient.Connected)
            {
                _connectedDevice = device;
                _bluetoothStream = _bluetoothClient.GetStream();

                // 启动接收线程
                _isReceiving = true;
                _receiveThread = new Thread(ReceiveData);
                _receiveThread.Start();

                Log($"已成功连接到设备: {device.DeviceName}");
                ConnectionStatusChanged?.Invoke(this, true);
                return true;
            }
        }
        catch (Exception ex)
        {
            Log($"连接蓝牙设备时出错: {ex.Message}");
        }

        return false;
    }

    /// <summary>
    /// 断开当前蓝牙连接
    /// </summary>
    public void Disconnect()
    {
        try
        {
            if (_bluetoothClient != null && _bluetoothClient.Connected)
            {
                _isReceiving = false;
                _receiveThread?.Join(500); // 等待接收线程结束

                _bluetoothStream?.Close();
                _bluetoothClient.Close();

                Log($"已断开与设备 {_connectedDevice?.DeviceName} 的连接");
                ConnectionStatusChanged?.Invoke(this, false);
            }
        }
        catch (Exception ex)
        {
            Log($"断开蓝牙连接时出错: {ex.Message}");
        }
        finally
        {
            _connectedDevice = null;
            _bluetoothStream = null;
        }
    }

    /// <summary>
    /// 发送数据到已连接的蓝牙设备
    /// </summary>
    /// <param name="data">要发送的数据</param>
    /// <returns>是否发送成功</returns>
    public bool SendData(byte[] data)
    {
        if (!IsConnected || _bluetoothStream == null)
        {
            Log("未连接到蓝牙设备,无法发送数据");
            return false;
        }

        try
        {
            _bluetoothStream.Write(data, 0, data.Length);
            _bluetoothStream.Flush();
            Log($"已发送 {data.Length} 字节数据");
            return true;
        }
        catch (Exception ex)
        {
            Log($"发送数据时出错: {ex.Message}");
            Disconnect();
            return false;
        }
    }

    /// <summary>
    /// 接收数据的线程方法
    /// </summary>
    private void ReceiveData()
    {
        var buffer = new byte[1024];

        try
        {
            while (_isReceiving && _bluetoothClient.Connected && _bluetoothStream != null)
            {
                // 检查是否有可读数据
                if (_bluetoothStream.CanRead && _bluetoothStream.DataAvailable)
                {
                    int bytesRead = _bluetoothStream.Read(buffer, 0, buffer.Length);
                    if (bytesRead > 0)
                    {
                        var receivedData = new byte[bytesRead];
                        Array.Copy(buffer, receivedData, bytesRead);

                        Log($"接收到 {bytesRead} 字节数据");
                        DataReceived?.Invoke(this, receivedData);
                    }
                }
                else
                {
                    Thread.Sleep(100); // 避免CPU占用过高
                }
            }
        }
        catch (Exception ex)
        {
            Log($"接收数据时出错: {ex.Message}");
            Disconnect();
        }
    }

    /// <summary>
    /// 记录日志消息
    /// </summary>
    /// <param name="message">日志消息</param>
    private void Log(string message)
    {
        var fullMessage = $"[{DateTime.Now:HH:mm:ss.fff}] {message}";
        LogMessage?.Invoke(this, fullMessage);
        Console.WriteLine(fullMessage);
    }

    /// <summary>
    /// 释放资源
    /// </summary>
    public void Dispose()
    {
        Disconnect();
        _bluetoothClient?.Dispose();
        _bluetoothClient = null;
    }
}

视频教程,点击进入B站可以看高清视频

本文来自www.LuoFenMing.com