This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
ARPlusSystem/ARPlusSystem-250418/Assets/Scripts/RTK/BluetoothManager.cs

177 lines
5.0 KiB
C#
Raw Normal View History

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Unity Bluetooth (Android)
/// https://github.com/JCxYIS/UnityBluetooth
/// </summary>
public class BluetoothManager
{
private static AndroidJavaClass _javaClass;
private static AndroidJavaObject _javaInstance = null;
/* -------------------------------------------------------------------------- */
[System.Serializable]
public struct BluetoothDevice
{
public string name;
public string mac;
}
/* -------------------------------------------------------------------------- */
private static void EnsureInstance()
{
if (Application.platform != RuntimePlatform.Android)
{
throw new System.NotSupportedException("BluetoothManager currently only works on Android.");
}
if (_javaInstance == null)
{
// context = activity.Call<AndroidJavaObject>("getApplicationContext");
_javaClass = new AndroidJavaClass("com.bonus.bdxt.BluetoothManager");
//_javaClass = new AndroidJavaClass("im.shv.rtk.BluetoothManager");
_javaInstance = _javaClass.CallStatic<AndroidJavaObject>("getInstance");
Debug.Log("[BluetoothManager] Inited.");
}
}
/* -------------------------------------------------------------------------- */
/// <summary>
/// Init permission.
/// It is recommended to call this method in the first scene (before connect).
/// </summary>
public static void CheckPermission()
{
EnsureInstance();
_javaInstance.Call("CheckPermission");
}
/// <summary>
/// Start scanning nearby bluetooth devices
/// </summary>
public static void StartDiscovery()
{
EnsureInstance();
_javaInstance.Call("StartDiscovery");
}
/// <summary>
/// Get the list of nearby devices.
/// Don't forget to call StartDiscovery() first!
/// </summary>
/// <returns>A string list. String form: <c>"{Name}|{MAC}"</c></returns>
public static List<BluetoothDevice> GetAvailableDevices()
{
EnsureInstance();
string[] devices = _javaInstance.Call<string[]>("GetAvailableDevices");
List<BluetoothDevice> deviceList = new List<BluetoothDevice>();
string[] deviceRawStr;
for (int i = 0; i < devices.Length; i++)
{
deviceRawStr = devices[i].Split('|');
deviceList.Add(new BluetoothDevice
{
name = deviceRawStr[0],
mac = deviceRawStr[1]
});
}
return deviceList;
}
/// <summary>
/// Connect to a device with the specified address.
/// </summary>
/// <param name="mac">Address</param>
/// <param name="pin">If the device hasn't been bonded and it has PIN, then this field is required.</param>
/// <returns></returns>
public static bool Connect(string mac, string pin = "")
{
EnsureInstance();
return _javaInstance.Call<bool>("Connect", mac, pin);
}
/// <summary>
/// Is Connected?
/// </summary>
public static bool IsConnected()
{
EnsureInstance();
return _javaInstance.Call<bool>("IsConnected");
}
/// <summary>
/// Get connected device, if no device is connected, return "|".
/// </summary>
/// <returns>{NAME}|{MAC}</returns>
public static string GetConnectedDevice()
{
EnsureInstance();
return _javaInstance.Call<string>("GetConnectedDevice");
}
/// <summary>
/// Send data to the remote device.
/// You need to append newline (e.g. '\n' or '\r\n') by yourself.
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static bool Send(string data)
{
EnsureInstance();
return _javaInstance.Call<bool>("Send", data);
}
/// <summary>
/// Input stream buffer size
/// </summary>
/// <returns>Negative value means not connected or error</returns>
public static int Available()
{
return _javaInstance.Call<int>("Available");
}
/// <summary>
/// Read a line from input stream
/// </summary>
/// <returns></returns>
public static string ReadLine()
{
EnsureInstance();
return _javaInstance.Call<string>("ReadLine");
}
/// <summary>
/// Stop the connection
/// </summary>
public static void Stop()
{
EnsureInstance();
_javaInstance.Call("Stop");
}
/* -------------------------------------------------------------------------- */
/// <summary>
/// Show a Toast (bottom message)
/// </summary>
public static void Toast(string msg)
{
EnsureInstance();
_javaClass.CallStatic("Toast", msg);
}
/* -------------------------------------------------------------------------- */
public static string[] StrArrTest(int len)
{
EnsureInstance();
return _javaInstance.Call<string[]>("StrArrTest", len);
}
}