Unity Plugin - Windows
Introduction
This Unity plugin allows Windows devices to connect Lovense toys and send control commands.
Note: A Bluetooth adapter is required to use this plugin.
Compatibility
Unity version: >= 2019.4.0
Api Compatibility Level:
- For
.Net 4.x
, the import package name iswindowsPlugin_.Net4.x.unitypackage
. - For
.Net Framework
, the import package name iswindowsPlugin_.NetFramework.unitypackage
. - For
.Net Standard 2.0
, the import package name iswindowsPlugin_.NetStandard2.0.unitypackage
. - For
.Net Standard 2.1
, the import package name iswindowsPlugin_.NetStandard2.1.unitypackage
.
Import the plugin
Download the plugin package from here. The latest version of the current plugin is V1.2 click to view version records
windowsPlugin_.Net4.x.unitypackage
windowsPlugin_.NetFramework.unitypackage
Import the appropriate package based on your project's Api Compatibility Level.
Select all options and click import.
4.The file Assets/StreamingAssets/LovenseToySupportConfig.json is the configuration file for the toy support directive, and the version field represents the version of the information. The current latest version is 1.0
. If it is older than this version, it is recommended to download and replace the file.
Dowload: LovenseToySupportConfig.json
The LovenseDemo folder is an example that you can refer to. Removing it won't affect the functionality.
Guide
1. Search for attached toys.
public class YourLovenseToyUI: MonoBehaviour {
// do search
private void DoSearch() {
LovenseWinBleTools.GetInstance().ScanDevices();
}
//
private void OnGetToy(string id,LovenseWinBleToy toy) {
// Show the search result in the UI
}
private void OnScanEnd() {
// on scan ended.
}
void Awake(){
// Add listener
LovenseWinBleTools.onGetToyEvent.AddListener(OnGetToy);
LovenseWinBleTools.onGetToyScanEnd.AddListener(OnWinbleToyScanEnd);
}
void OnDestory() {
// Remove listener
LovenseWinBleTools.onGetToyEvent.RemoveListener(OnGetToy);
LovenseWinBleTools.onGetToyScanEnd.RemoveListener(OnScanEnd);
}
}
2. Connect or disConnect toys
public class YourLovenseToyUI: MonoBehaviour {
//do search toys
private void DoConnect(List<string> ids) {
LovenseWinBleTools.GetInstance().ConnectToys(ids);
}
private void DoDisConnect(List<string> ids) {
LovenseWinBleTools.GetInstance().DisconnectToys(ids);
}
private void onToysConnect(string toyId, bool connected)
//Code executes when the connection state of the toy changes
}
private void OnConnectCompleted() {
}
private void OnDisConnectCompleted() {
}
void Awake() {
// Add listener
LovenseWinBleTools.onConnectChangeEvent.AddListener(onToysConnect);
LovenseWinBleTools.onConnectToysCompletedEvent.AddListener(OnConnectCompleted);
LovenseWinBleTools.onDisConnectToysCompletedEvent.AddListener(OnDisConnectCompleted);
}
void OnDestroy() {
// Remove listener
LovenseWinBleTools.onConnectChangeEvent.RemoveListener(onToysConnect);
}
}
3. Send commands
3.1 Get battery
public class YourLovenseToyUI : MonoBehaviour {
private void DoGetBattery(string id) {
LovenseWinBleTools.GetInstance().SendFunctionWithoutValue(id, LovenseCommandType.GETBATTERY);
}
private void OnGetBattery(string id, string battery){
}
void Awake() {
// Add listener
LovenseWinBleTools.onGetBatteryEvent.AddListener(OnGetBattery);
}
void OnDestroy() {
// Remove listener:
LovenseWinBleTools.onGetBatteryEvent.RemoveListener(OnGetBattery);
}
}
3.2 Send function commands
public class YourLovenseToyUI : MonoBehaviour {
private void DoSendCommands(List<string> toyIds, List<LovenseCommand> commands, float timeSec, float loopRunningSec, float loopPauseSec) {
LovenseWinBleTools.GetInstance().SendFunctions(toyIds,commands,timeSec,loopRunningSec,loopPauseSec);
}
private void OnSendCommandError(int code){
//...
}
void Awake() {
// Add listener
LovenseWinBleTools.onSendCommandErrorEvent.AddListener(OnSendCommandError);
}
void OnDestroy() {
// Remove listener:
LovenseWinBleTools.onSendCommandErrorEvent.RemoveListener(OnSendCommandError);
}
}
3.3 Send pattern commands
public class YourLovenseToyUI : MonoBehaviour {
private void DoSendPattern(List<string> toyIds, List<LovenseCommandType> typeList, List<int> strengthValues, float timeSec, int intervalsMs) {
LovenseWinBleTools.GetInstance().SendPattern(toyIds, typeList, strengthValues, timeSec,timeSec,timeMs);
}
private void OnSendCommandError(int code){
//callback function...
}
void Awake() {
// Add listener
LovenseWinBleTools.onSendCommandErrorEvent.AddListener(OnSendCommandError);
}
void OnDestroy() {
// Remove listener:
LovenseWinBleTools.onSendCommandErrorEvent.RemoveListener(OnSendCommandError);
}
}
strengthValues: Changes in intensity
intervalsMs: Time interval for intensity switching in milliseconds
timeSec: Total running time in seconds
3.4 Send preset commands
public class YourLovenseToyUI : MonoBehaviour {
private void DoSendPreset(List<string> ids, int mode, float timeSec) {
LovenseWinBleTools.GetInstance().SendPreset(ids, mode, timeSec);
}
private void OnSendCommandError(int code){
//...
}
void Awake() {
// Add listener
LovenseWinBleTools.onSendCommandErrorEvent.AddListener(OnSendCommandError);
}
void OnDestroy() {
// Remove listener:
LovenseWinBleTools.onSendCommandErrorEvent.RemoveListener(OnSendCommandError);
}
}
mode:we provide four preset patterns:0 is earthquake
,1 is fireworks
,2 is pulse
,3 is wave
3.5 Send stop command
public class YourLovenseToyUI : MonoBehaviour {
private void DoSendStop(List<string> ids) {
LovenseWinBleTools.GetInstance().StopAll(ids);
}
private void OnSendCommandError(int code){
//...
}
void Awake() {
// Add listener
LovenseWinBleTools.onSendCommandErrorEvent.AddListener(OnSendCommandError);
}
void OnDestroy() {
// Remove listener:
LovenseWinBleTools.onSendCommandErrorEvent.RemoveListener(OnSendCommandError);
}
}
3.6 Add interface for Data Reporting
public class YourLovenseToyUI : MonoBehaviour {
private void DoAddDataReporting(string toyId,bool open) {
LovenseWinBleTools.GetInstance().SetDataReportingMode(toyId,open); //Only by using this function and setting it to true will the toy data be reported
}
//callback function.
private void OnGetReportingData(string id,LovenseDataReportingEventType type,int target,int value){
//code
}
void Awake() {
LovenseWinBleTools.GetInstance().AddDataReportingListener(toyId,OnGetReportingData);
}
void OnDestroy() {
// Remove listener:
LovenseWinBleTools.GetInstance().RemoveDataReportingListener(toyId,OnGetReportingData);
}
}
Interface
LovenseWinBleTools
Method
GetInstance
Description:
Get the singleton instance of LovenseWinBleTools
Parameters: None
Return: LovenseWinBleTools instance
GetBattery
Description:
Obtain the power of the toy,when is completed, the onGetBatteryEvent event will be triggered.
Parameters:
Name Type Default Required Description toyId string yes The toy ID you want to obtain battery power Return: None
ScanDevices
Description:
Search for nearby toys, when the search is completing, the onGetToyEvent event will be triggered,And the end of the scan will trigger onGetToyScanEnd event
Parameters: None
Return: None
SendFunctions
Description:
Send Function commands to the toys.
Parameters:
Name Type Default Required Description toyIds List<string> yes The toys ID you want to obtain power from commands List<LovenseCommand> yes See LovenseCommand timeSec float yes Total running time in second, 0
represents no limitloopRunningSec float 0
no time running for each command loop in second loopPauseSec float 0
no time gap for each command loop in second Return: None
SendPattern
Description:
Send a series of functions to the toys, they will execute all the functions in
types
according to the order of the level invalues
with the interval ofintervalsMs
.Parameters:
Name Type Default Required Description toyIds List<string> yes The toys you want to control types List<LovenseCommandType> yes See LovenseCommandType strengthValues List<int> yes The order of the levels timeSec float yes The total runtime in second, "0" = indefinite time length. intervalsMs int 150 no The level interval in milliseconds ,Should be greater than 100 ,default 150 Return: None
SendPreset
Description:
Send a preset command to the toys.
Parameters:
Name Type Default Required Description toys List<string> yes The toys you want to control mode int yes The preset name to send, we provide four preset patterns: 0 is earthquake
,1 isfireworks
,2 ispulse
,3 iswave
timeSec float yes The total runtime in second, "0" = indefinite time length. Return: None
StopAll
Description:
Send a stop command to the toys.
Parameters:
Name Type Description toyIds List<string> The toys you want to stop Return: None
SetDataReportingMode
Description:
Set the switch for toy data reporting function.
Parameters:
Name Type Default Required Description toyId string yes The toys you want to set open bool yes Whether the data reporting is enabled for toy Return: None
CheckDataReportingEnable
Description:
Check if the toy supports data reporting function. If so, onGetToyDataReportingEnabled will be triggered.
Note: This function will be automatically executed right after the toy is connected.if toy's isSupportDataReporting is false, It is recommended that you set the callback of onGetToyDataReportingEnabled before connecting to the toy.
Parameters:
Name Type Default Required Description toyId string yes The toys you want to check Return: None
AddDataReportingListener
Description:
Add a data reporting listener.
Parameters:
Name Type Description id string The toys you want to add data reporting listener event UnityAction(string toyId,LovenseDataReportingEventType type,int target,int value) callback function Return: None
RemoveDataReportingListener
Description:
Remove a data reporting listener.
Parameters:
Name Type Description toyIds string The toys you want to add data reporting listener event UnityAction(string toyId,LovenseDataReportingEventType type ,int target ,int value) callback function Return: None
GetSupportCommandsByType(string type)
Description:
Get support commands by type Obtain Command types supported by toys through their types
Parameters:
Name Type Description type string the type of toy Return: List<LovenseCommandType>
Event
onGetToyEvent
Description:
Triggered when a new toy is discovered
Callback Parameters:
Name Type Description toy LovenseWinbleToy the new toy is discovered
onGetToyScanEnd
Description:
Triggered after scanning is completed
Callback Parameters:
None
onGetBatteryEvent
Description:
Triggered when getting toy's battery is complete.
Callback Parameters:
Name Type Description toyId string The toy's ID battery string The toy's battery life. Will have a s
prefix when the toy is in a status that the return value is not reliable. e.g. When the toy is viberating and toy's battery life is 90, the return value will bes90
onConnectChangeEvent
Description:
Triggered when connected toy's connection status is changed.
Callback Parameters:
Name Type Description toyId string The toy's ID connected bool Connection status
onSendCommandErrorEvent
Description:
Triggered when an error occurs during connection or control
Callback Parameters:
Name Type Description code int ID where the error occurred code:
Value Description 404 The toy is not connected
onConnectToysCompletedEvent
Description:
Triggered when all toys that need to be connected in order to completed the connection
Callback Parameters:
None
onDisConnectToysCompletedEvent
Description:
Triggered when all toys that need to be disconnected in order to complete the disconnection
Callback Parameters:
None
onGetToyDataReportingEnabled
Description:
Triggered after send [CheckDataReportingEnable]
Callback Parameters:
Name Type Description id string the toy's ID
LovenseWinbleToy
Description:
The information of the Lovense toy
Properties:
Name Type Description id string The toy's id name string The toy's name, such as "nora" address string The toy's MAC address isConnected int The toy's connection status typeName string The toy's typeName battery string The toy's battery level, from 0
to100
,SendFunctionWithoutValue(id,LovenseCommandType.GETBATTERY) needs to be called to updateisSupportDataReporting bool Determine if the toy currently support data reporting. Need the toy to be connected in order to synchronize.
LovenseCommand
Description:
The toy control command
Properties:
Name Type Description type LovenseCommandType See below value int Function level
Function Level:
Type | Range |
---|---|
VIBRATE | 0 - 20 |
VIBRATE1 | 0 - 20 |
VIBRATE2 | 0 - 20 |
ROTATE | 0 - 20 |
PUMP | 0 - 3 |
THRUSTING | 0 - 20 |
FINGERING | 0 - 20 |
SUCTION | 0 - 20 |
GETBATTERY |
LovenseCommandType
Description:
The enum of the toy function type.
Enum:
Value VIBRATE VIBRATE1 VIBRATE2 ROTATE PUMP THRUSTING FINGERING SUCTION GETBATTERY
LovenseDataReportingEventType
Description:
The enum of the toy data reporting event type.
Enum:
Value Description KEY_DOWN Trigger when a key is pressed KEY_UP Trigger when a key is up VIBTATE Trigger when the toy vibrates ROTATE Trigger when the toy rotate SHAKE Trigger when the toy shake MOVEMENT Trigger when the toy movement DEEP Trigger when the toy vibrates AIR_IN Trigger when the toy is inflated AIR_OUT Trigger when the toy deflates AIR_CLOSE Trigger when inflating or deflating is turned off AIR_OPEN Trigger when inflating or deflating is turned on BATTERY Trigger when the battery level changes SHAKE_TIMES Trigger when user shakes the toy every time
Version Records
Version1.2 --------------------Date:2023.9.28
1.Add shake event.
Version1.1 --------------------Date:2023.9.21
- Data Reporting interface add parameters 'toyId'
Version1.0 --------------------Date:2023.9.12
1.Functions
2.Pattern
3.Preset
4.Connect/DisConnect
5.Type/Battery
6.Data Reporting Interface