Unity连接蓝牙设备的其中一种方法(不一定通用,但思路也许可以)

1. 先让蓝牙设备与Windows系统进行蓝牙配对

        需要输入配对码进行配对,并且要配对成功,连接成功,之后Windows系统会自动分配一个COM端口给该蓝牙设备使用,是长期预留的那种端口,长期预留给该设备。

        也就是是说,若干年以后,如果蓝牙设备启动并连接到电脑,这个设备占用的端口依然还是当初那个端口。形如:“COM3”、“COM4”、“COM5”。。。。。。

         我用的是比较旧版本的设备,用的就是这种方式了,新版本应该也是大差不差。

         首先,打开Windows的设置面板
        接着,添加蓝牙设备

        紧接着,确保先前已经开启了电脑的蓝牙功能,也确保蓝牙设备已经开启,连接需要连接的蓝牙设备,一般的蓝牙模块的默认名称是:HC-05

        据说:HC-05 通常是指一个能够作为主机或从机工作的全功能蓝牙模块,而它的亲戚型号 HC-06 主要用作从机。

        然后,应该是需要配对的pin码,一般默认的配对码是:1234
        随后,一般就会配对成功,连接成功。
        其次,打开设备管理器(Win + X + M),查看端口(COM和LPT),刚刚配对的蓝牙设备所占用的端口就是其中的一个或者两个,如果是占用了两个,很可能是一个用于从电脑输出数据到蓝牙设备,一个是用于从蓝牙向电脑输入数据。

        最后,既然已经知道了端口范围,那就去检验哪一个是“真正的端口”就可以了。

2. 火眼金睛判别真正的蓝牙设备端口

        可能用得到的命名空间
using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using System.Threading;
using UnityEngine;
using TMPro;
using System;
using UnityEngine.UI;
using System.Drawing.Printing;
        我的方法的话,继承MonoBehaviour即可
public class COMPortFinderX : MonoBehaviour

        指定端口号或者遍历端口号,使用字符类型即可,

        例如,你可以指定 portName == "COM3"

private string portName;
        初始化一些后续需要用的东西:

        声明了一个SerialPort类型的私有变量serialPortSerialPort类在.NET中用于表示一个串行端口,可以用于串行通信。

        声明了一个Thread类型的私有变量readThreadThread类在.NET中用于表示一个线程,可以用于并行或后台执行任务。

        声明了一个int类型的私有变量baudRate,并将其初始化为9600。波特率(baud rate)是串行通信中的一个参数,表示每秒传输的符号(或比特)数量。9600是一个常见的波特率值。

private SerialPort serialPort;
private Thread readThread;
private int baudRate = 9600;
        顶层的判断(这里面有个CheckSerialData是我自己自定义的函数,底层的判断是CheckSerialData):

        注意,这里我打开了串口之后,测试完之后没有去关闭串口,在其他地方最终才关闭了串口,小伙伴记得注意打开串口之后要记得关闭串口哦,不然有可能会给项目的开发和测试造成干扰。

        在.NET的SerialPort类中,CtsHolding属性表示清除发送(Clear-to-Send,CTS)信号的状态。CTS是硬件流控制的一部分,用于在串行通信中协调数据的发送。

        当CtsHoldingtrue时,表示CTS信号是活动的,串行设备可以发送数据。当CtsHoldingfalse时,表示CTS信号是非活动的,串行设备应该停止发送数据。

        我使用的蓝牙手柄是支持发送数据的,如果不支持发送数据,或者某个端口是不支持发送数据的,那就不是我的蓝牙手柄,那就不是我想要的串口,那就可以PASS掉了。

try
{
    serialPort = new SerialPort(portName, baudRate);
    serialPort.ReadTimeout = 2000;
    serialPort.Open();
    if (serialPort.CtsHolding && CheckSerialData())
    {
        efficient= true;
    }
    else
    {
        invalid = true;
    }
}
catch (System.Exception e)
{
    string getE = e.ToString();
    invalid = true;
}
done = true;
        底层的判断:

        这里的判断我是根据数据按照自己的格式切分后的长度来判断是否蓝牙手柄

        如果切分后的长度大于等于1,那就是我想要的蓝牙手柄

        小伙伴们可以根据自己的项目需求来自定义自己的判断逻辑

try
{
    bool IsHC;
    string receivedData = serialPort.ReadLine();
    if (receivedData != null)
    {
        string[] values = receivedData.Split(',');
        if (values.Length >= 1)
        {
            IsHC = true;
        }
        else
        {
            IsHC = false;
        }
        serialPort.Close();
        return IsHC;
    }
    else
    {
        IsHC = false;
        serialPort.Close();
        return IsHC;
    }
}
catch (System.Exception e)
{
    bool IsHC = false;
    serialPort.Close();
    return IsHC;
}

        通过多层次的判断,最终就能得到自己的蓝牙设备的端口号了,这个端口号一般情况来说(不去刻意修改的情况下)是长期有效的,配对的时候是什么端口号,以后基本上还会是什么端口号,这个端口号就代表某个蓝牙设备。

        即使不放心,可以写一个自定义的程序,在每次使用蓝牙设备之前,重新识别和绑定一下自己的设备端口号,这种方法就十分稳妥。

        至此,既然得到了端口号,每次在Untiy游戏中需要的时候,连接这个端口,就可以让Unity与蓝牙设备交互了。

总共5个步骤:

        1. 指定端口号和波特率:

serialPort = new SerialPort(portName, baudRate);

        2. 可以指定超时的时间,超时就是过了这个时间还连接不成功,那就不连接了,无效处理

serialPort.ReadTimeout = 2000;

        3. 打开串口传输:

serialPort.Open();

        4. 逐行读取串口数据:

string receivedData = serialPort.ReadLine();

        5. 不用的时候,或者结束的时候,记得关闭串口哦

serialPort.Close();

        甚至是(因为我用的是子线程来连接串口):

readThread.Abort();

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在 Unity连接蓝牙并控制手机震动,可以使用 Unity 的 AndroidJavaClass 和 AndroidJavaObject 类与 Android API 进行交互。 以下是实现该功能的大致步骤: 1. 在 Unity 中创建一个 C# 脚本。 2. 使用 AndroidJavaClass 和 AndroidJavaObject 类连接蓝牙并控制手机震动。 3. 在 Unity 中调用 C# 脚本。 以下是示例代码: 在 Unity 中创建一个 C# 脚本,并编写连接蓝牙并控制手机震动的代码: ``` using UnityEngine; public class BluetoothController : MonoBehaviour { private AndroidJavaObject bluetoothAdapter; void Start() { // 获取 BluetoothAdapter 对象 AndroidJavaClass bluetoothAdapterClass = new AndroidJavaClass("android.bluetooth.BluetoothAdapter"); bluetoothAdapter = bluetoothAdapterClass.CallStatic<AndroidJavaObject>("getDefaultAdapter"); // 如果蓝牙未开启,请求用户开启蓝牙 if (!bluetoothAdapter.Call<bool>("isEnabled")) { AndroidJavaObject enableIntent = new AndroidJavaObject("android.content.Intent", "android.bluetooth.adapter.action.REQUEST_ENABLE"); AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"); activity.Call("startActivityForResult", enableIntent, 0); } } public void Vibrate() { // 控制手机震动 AndroidJavaObject vibrator = new AndroidJavaClass("android.os.Vibrator"); AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"); vibrator.Call("vibrate", 1000); } } ``` 在 Unity 中调用 C# 脚本并控制手机震动: ``` public class Example : MonoBehaviour { public void OnButtonClick() { // 获取 BluetoothController 组件并调用 Vibrate 方法 BluetoothController bluetoothController = GetComponent<BluetoothController>(); bluetoothController.Vibrate(); } } ``` 这将连接蓝牙并控制手机震动。请注意,此示例仅为演示用途,您需要根据您的具体需求进行修改。同时,为了使此代码能够在 Android 设备上运行,您需要将其打包为 Android 应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CCSBRIDGE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值