Unity Bluetooth LE Plugin for Android插件的使用记录

一:使用版本

一:unity版本2020.3.46

二:插件版本2.3

二:环境配置

Project Settings>>Player>>Andorid>>Api Compatiblity Level>>.Net 4.x 

Project Settings>>Player>>Andorid>>Internet Access>>Require

打开 Assers/Plugins/Android/AndroidManifest 改成如下一样 主要增加了定位权限,以及更改启动入口.安卓6-11要扫描到蓝牙都是需要开启定位功能.具体可以去看安卓官网解释

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
	android:installLocation="preferExternal"
    android:versionCode="1"
    android:versionName="1.0">
  <supports-screens
      android:smallScreens="true"
      android:normalScreens="true"
      android:largeScreens="true"
      android:xlargeScreens="true"
      android:anyDensity="true"/>

  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
  <uses-permission android:name="android.permission.BLUETOOTH"/>

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>

  <application
  android:icon="@drawable/app_icon"
      android:label="@string/app_name"
      android:debuggable="true">
    <activity android:name="com.unity3d.player.UnityPlayerProxyActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerNativeActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
      <meta-data android:name="android.app.lib_name" android:value="unity" />
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
  </application>
</manifest>

三:使用方法

我新建了一个场景,主要看画布里面的结点.从上到下代表着

背景 | 提示文本框(连接情况...) | 其他提示文本框(接受数据...) | 滚动视图(当扫描到一个设备时会生成一个预制体并且写上信息放到滚动视图中去) | 文本输入框(接受用户输入的设备名称) | 连接按钮 | 扫描设备按钮

用来生成信息的预制体情况,就是一个文本

 

 然后我新建一个脚本,代码如下

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Bluethood : MonoBehaviour
{
    //存储蓝牙设备名字,赋予初值是为了防止与输入文本框 ""相等
    private string bleName = "-*1.ym,rt";
    //保存的地址
    private string bleAddress;
    //保存的uuid
    private string serviceUUID;
    //保存的特征值
    private string subscribeCharacteristic;
    //表示是否开始扫描
    private bool isScanning;
    //表示是否已经蓝牙初始化
    private bool isInit;
    //设备信息预制体 当扫描到一个设备时就会创建一个实例并放到滚动视图中去
    public GameObject deviceInfoPrefab;
    //滚动视图的容器结点
    public Transform container;
    //提示的文本信息框  连接提示。。。
    public Text text;
    //提示的其他文本信息框  接受数据提示。。。
    public Text otherText;
    //输入设备用的
    public InputField inputField;
    //开始连接按钮
    public Button startConnectBtn;
    //开始扫描按钮
    public Button startScanningBtn;
    //以设备名字做个存储,相同名字的就忽视不在扫描
    private HashSet<string> devisHashSet;

    void Start()
    {
        devisHashSet = new HashSet<string>();
        Input.location.Start(); //定位
        InitBluethood();


        startConnectBtn.onClick.AddListener(() =>
        {
            if (inputField.text.Equals(null) || inputField.text.Equals(""))
            {
                Show("请输入设备名称!");
                return;
            }

            if (bleName.Equals(inputField.text) || devisHashSet.Contains(inputField.text)) //找到名字一样的设备
            {
                BluetoothLEHardwareInterface.StopScan(); //停止扫描
                ConnectBluetooth();  //开始连接
            }
            else
            {
                Show("未找到该设备,请先扫描");
            }

        });
        startScanningBtn.onClick.AddListener(() =>
        {
            StartScnnning();
        });
    }

    /// <summary>
    /// 初始化蓝牙设备
    /// </summary>
    private void InitBluethood()
    {
        if (!isInit)
        {
            BluetoothLEHardwareInterface.Initialize(true, false, () =>
            {
                Show("蓝牙初始化成功");//初始化成功执行回调
                isInit = true;
            },
           (error) =>
           {
               Show("蓝牙未打开或连接失败");//初始化失败的回调响应
           });
        }
    }
    /// <summary>
    /// 扫描设备
    /// </summary>
    private void StartScnnning()
    {
        if (!isScanning && isInit)
        {
            Show("扫描设备中");
            Input.location.Start(); //定位
            Invoke("FindDevice", 1f);
            isScanning = true;
        }
    }
    public void FindDevice()
    {
        BluetoothLEHardwareInterface.ScanForPeripheralsWithServices(null, (address, name) =>
        {
            if (devisHashSet.Contains(name)) return;
            CreationTextPrefab(address, name);
            //扫描处理,加入设备列表              
            AddPeripheral(name, address);
            devisHashSet.Add(name);

        }, (address, name, rssi, advertisingInfo) =>
        {
            if (devisHashSet.Contains(name)) return;
            CreationTextPrefab(address, name);
            AddPeripheral(name, address);
            devisHashSet.Add(name);
        });
    }

    public void Show(string info)
    {
        text.text = info;
    }
   /// <summary>
   /// 创建提示信息预制件
   /// </summary>
   /// <param name="address"></param>
   /// <param name="name"></param>
    private void CreationTextPrefab(string address, string name)
    {
        GameObject game = Instantiate<GameObject>(deviceInfoPrefab);
        game.GetComponent<Text>().text = "设备名字:" + name + "   " + "地址:" + address + "\n";
        game.transform.SetParent(container);
        game.transform.localScale = Vector3.one;
    }

    /// <summary>
    /// 更新存储要连接设备的名字,是否扫描到
    /// </summary>
    /// <param name="name"></param>
    /// <param name="address"></param>
    public void AddPeripheral(string name, string address)
    {
        if (bleName.Equals(inputField.text)) return;
        bleName = name;
        bleAddress = address;
    }
    /// <summary>
    /// 开始连接设备
    /// </summary>
    public void ConnectBluetooth()
    {
        Show("开始连接设备:" + inputField.text);
        try
        {
            BluetoothLEHardwareInterface.ConnectToPeripheral(bleAddress, null, null, (address, serviceUUID, characteristicUUID) =>
            {
                this.serviceUUID = serviceUUID;
                this.subscribeCharacteristic = characteristicUUID;
                otherText.text = "serviceUUID= " + serviceUUID + "\n";
                otherText.text += "characteristicUUID= " + characteristicUUID;
                SubscribeCharacteristicWithDeviceAddress();
            });
        }
        catch (Exception e)
        {
            otherText.text = e.ToString();
            Show("连接失败");
        }
    }

    /// <summary>
    /// 连接成功的回调
    /// </summary>
    private void SubscribeCharacteristicWithDeviceAddress()
    {
        otherText.text += "\n" + "尝试接受数据";
        BluetoothLEHardwareInterface.SubscribeCharacteristicWithDeviceAddress(bleAddress, serviceUUID, subscribeCharacteristic, delegate { }, OnCharacteristicNotification);

    }
    private void OnCharacteristicNotification(string arg1, string arg2, byte[] arg3)
    {
        //Show("接收到数据");

        //StringBuilder hex = new StringBuilder(arg3.Length * 2);
        //foreach (byte b in arg3)
        //{

        //    hex.AppendFormat("{0:x2}", b);
        //    //hex.AppendFormat(b.ToString());
        //    //hex.AppendFormat(b.ToString()+",");
        //}
        otherText.text = "连接成功=" + "arg1=" + arg1 + "arg2=" + arg2 + "\n";
        otherText.text = arg3.ToString();

    }


}

把脚本挂在随便一个物体上,并且赋上值

四:结果演示

有几个注意事项

1.在打开app前需要先打开设备的蓝牙

2.打开app后需要赋予位置权限

3.自己手机先与要连接的硬件配对

4.打包的apk文件最好弄成竖屏

因为本人没有设备测试,所以具体能不能用看情况而定,如果成功连接并接受到数据了希望给个反馈

最后:个人能力有限.如果有误还请指出    谢谢!

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Unity是一种跨平台的游戏开发引擎,支持多个操作系统和设备平台,包括iOS和Android。在Unity中,开发人员可以使用Unity Bluetooth LE插件来实现与蓝牙低功耗(BLE)设备的通信。 Unity Bluetooth LE插件提供了一套易于使用的API,使开发人员能够在游戏中与BLE设备进行通信。无论是在iOS还是Android平台上,都可以使用这个插件来实现与BLE设备的连接、数据交换以及实时通信。 对于iOS平台,Unity Bluetooth LE插件可以与CoreBluetooth框架进行集成。开发人员可以使用Unity的脚本语言编写代码,实现扫描和连接BLE设备、读取和写入特性值、订阅通知等功能。通过使用Unity的跨平台能力,开发人员可以确保他们的游戏在iOS设备上实现BLE功能时具有良好的兼容性和稳定性。 对于Android平台,Unity Bluetooth LE插件可以与AndroidBluetooth Low Energy API进行集成。开发人员可以使用Unity脚本语言编写代码,实现扫描和连接BLE设备、读取和写入特性值、设置通知等功能。通过使用Unity的跨平台能力,开发人员可以在Android设备上实现BLE功能时确保他们的游戏具有良好的可用性和性能。 总而言之,Unity Bluetooth LE插件为开发人员提供了在iOS和Android平台上实现与蓝牙低功耗设备通信的机会。通过使用这个插件,开发人员可以轻松地在他们的游戏中集成BLE功能,为玩家提供更加丰富和交互性的游戏体验。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值