Got Stuck?
Forum for Lovense Developers
Support
Document Feedback

Unity Plugin - Dongle

Introduction

This Unity plugin allows Windows devices to connect Lovense toys and send control commands.

Note: A Lovense USB 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 is donglePlugin_.Net4.x.unitypackage.
  • For .Net Framework, the import package name is donglePlugin_.NetFramework.unitypackage.
  • For .Net Standard 2.0, the import package name isdonglePlugin_.NetStandard2.0.unitypackage.
  • For .Net Standard 2.1, the import package name is donglePlugin_.NetStandard2.1.unitypackage.

Import the plugin

  1. Download the plugin package from here. The latest version of the current plugin is V1.3 click to view version records

    donglePlugin_.Net4.x.unitypackage

    donglePlugin_.NetFramework.unitypackage

    donglePlugin_.NetStandard2.0.unitypackage

    donglePlugin_.NetStandard2.1.unitypackage

  2. Import the appropriate package based on your project's Api Compatibility Level.

    image

  3. Select all options and click import.

    image

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.2. 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() {
      LovenseDongleTools.GetInstance().GetConnectedToys();
      LovenseDongleTools.GetInstance().SearchToys()
   }

   //
	private void onGetToy(LovenseDongleToy data) {
       // Show the search result in the UI
	}

   void Awake() {
      // Add listener
		 LovenseDongleTools.onGetToyEvent.AddListener(onGetToy);
   }

	void OnDestory() {
		// Remove listener
		 LovenseDongleTools.onGetToyEvent.RemoveListener(onGetToy);
	}
}

2. Connect or disConnect toys

public class YourLovenseToyUI: MonoBehaviour {
   
   //do connect toys
   private void DoConnect(List<string> ids) {
      LovenseDongleTools.GetInstance().ConnectToys(ids);
   }
   //do disconnect toys
   private void DoDisConnect(List<string> ids) {
       LovenseDongleTools.GetInstance().DisConnectToys(ids)
   }

   private void OnConnectedChange(string toyId, bool connected) {
       //Code executes when the connection state of the toy changes
   }

   void Awake() {
      // Add listener
      LovenseDongleTools.onConnectChangeEvent.AddListener(OnConnectedChange);
   } 
 
   void OnDestroy() {
       // Remove listener
     LovenseDongleTools.onConnectChangeEvent.RemoveListener(OnConnectedChange);
   }
}

3. Send commands

3.1 Get device type

public class YourLovenseToyUI : MonoBehaviour {
   
  private void DoGetDeviceType(string id) {
    LovenseDongleTools.GetInstance().GetDeviceType(id);
  }

  private void OnGetType(string id,string type) {
    
  }

  void Awake() {
    // Add listener
     LovenseDongleTools.onGetTypeEvent.AddListener(OnGetType);
  } 

  void OnDestroy() {
    // Remove listener:
    LovenseDongleTools.onGetTypeEvent.RemoveListener(OnGetType);
  }
}

3.2 Get battery

public class YourLovenseToyUI : MonoBehaviour {
   
  private void DoGetBattery(string id) {
    LovenseDongleTools.GetInstance().GetBattery(id);
  }

  private void OnGetBattery(string id, string battery){
  
  }

  void Awake() {
    // Add listener
     LovenseDongleTools.onGetBatteryEvent.AddListener(OnGetBattery);
  } 

  void OnDestroy() {
    // Remove listener:
     LovenseDongleTools.onGetBatteryEvent.RemoveListener(OnGetBattery);
  }
}

3.3 Send function commands

public class YourLovenseToyUI : MonoBehaviour {
   
  private void DoSendCommands(List<string> ids, List<LovenseCommand> commands, float timeSec,  float loopRunningSec , float loopPauseSec ) {
    LovenseDongleTools.GetInstance().SendFunctions(ids, commands, timeSec, loopRunningSec, loopPauseSec);
  }

  private void OnErrorCodeResult(int code){
      //...
  }

  void Awake() {
    // Add listener
     LovenseDongleTools.onResultCodeEvent.AddListener(OnErrorCodeResult);
  } 

  void OnDestroy() {
    // Remove listener:
     LovenseDongleTools.onResultCodeEvent.RemoveListener(OnErrorCodeResult);
  }
}

3.4 Send pattern commands

public class YourLovenseToyUI : MonoBehaviour {

  private void DoSendPattern(List<string> ids, List<LovenseCommandType> types, List<int> strengthValues,float timeSec,int intervalsMs ) {

     LovenseDongleTools.GetInstance().SendPattern(ids, types, strengthValues, timeSec,oneTime,intervalsMs);
  }

  private void OnErrorCodeResult(int code){
      //action failed
  }

  void Awake() {
    // Add listener
     LovenseDongleTools.onResultCodeEvent.AddListener(OnErrorCodeResult);
  } 

  void OnDestroy() {
    // Remove listener:
     LovenseDongleTools.onResultCodeEvent.RemoveListener(OnErrorCodeResult);
  }
}

strengthValues: Changes in intensity

intervalsMs: Time interval for intensity switching in milliseconds

timeSec: Total running time in seconds

3.5 Send preset commands

public class YourLovenseToyUI : MonoBehaviour {

   private void DoSendPreset(List<string> ids, int mode, float timeSec) {

      LovenseDongleTools.GetInstance().SendPreset(new List<string>() { thisToy.id }, mode, timeSec);
   }

   private void OnErrorCodeResult(int code){
      //action failed
   }

  void Awake() {
    // Add listener
     LovenseDongleTools.onResultCodeEvent.AddListener(OnErrorCodeResult);
  } 

  void OnDestroy() {
    // Remove listener:
     LovenseDongleTools.onResultCodeEvent.RemoveListener(OnErrorCodeResult);
  }
}

mode:we provide four preset patterns:0 is earthquake,1 is fireworks,2 is pulse,3 is wave

3.6 Send stop command

public class YourLovenseToyUI : MonoBehaviour {

   private void DoSendStop(List<string> ids) {
       LovenseDongleTools.GetInstance().StopAll(ids);
   }

   private void OnErrorCodeResult(int code){
      //action failed
   }

   void Awake() {
    // Add listener
     LovenseDongleTools.onResultCodeEvent.AddListener(OnErrorCodeResult);
   } 

   void OnDestroy() {
    // Remove listener:
     LovenseDongleTools.onResultCodeEvent.RemoveListener(OnErrorCodeResult);
   }
}

3.6 Add interface for Data Reporting

public class YourLovenseToyUI : MonoBehaviour {

   private void DoAddDataReporting(string toyId,bool open) {
       LovenseDongleTools.GetInstance().SetDataReportingMode(toyId,true); //Only by using this function and setting it to true will the toy data be reported
   }


   //callback function.
   private void OnGetReportingData(LovenseDataReportingEventType type,int target,int value){
      //code 
   }

   void Awake() {
        LovenseDongleTools.GetInstance().AddDataReportingListener(toyId,OnGetReportingData);
   } 

   void OnDestroy() {
    // Remove listener:
        LovenseDongleTools.GetInstance().RemoveDataReportingListener(toyId,OnGetReportingData);
   }
}

Interface

LovenseDongleTools

Method

GetInstance
GetBattery
  • Description:

    Obtain the power of the toy,when completed, the onGetBatteryEvent event will be triggered.

  • Parameters:

    NameTypeDefaultRequiredDescription
    toyIdstringyesThe toy ID you want to obtain battery power
  • Return: None

GetDeviceType
  • Description:

    Obtain the power of the toy,when completed, the onGetTypeEvent event will be triggered.

  • Parameters:

    NameTypeDefaultRequiredDescription
    toyIdstringyesThe toy ID you want to obtain toy type
  • Return: None

GetConnectedToys
  • Description:

    Obtain toys in a connected state, when completed, the onGetToyEvent event will be triggered.

  • Parameters:None

  • Return: None

SearchToys
  • Description:

    Search for nearby toys, when the search is completed, the onGetToyEvent event will be triggered.

  • Parameters: None

  • Return: None

SendFunctions
  • Description:

    Send function commands to the toys.

  • Parameters:

    NameTypeDefaultRequiredDescription
    toyIdsList<string>yesThe toys ID you want to obtain power from
    commandsList<LovenseCommand>yesSee LovenseCommand
    timeSecfloatyesTotal running time in second, 0 represents no limit
    loopRunningSecfloat0notime running for each command loop in second
    loopPauseSecfloat0notime 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 in values with the interval of intervalsMs.

  • Parameters:

    NameTypeDefaultRequiredDescription
    toyIdsList<string>yesThe toys you want to control
    typesList<LovenseCommandType>yesSee LovenseCommandType
    strengthValuesList<int>yesThe order of the levels
    timeSecfloatyesThe total runtime in second, "0" = indefinite time length.
    intervalsMsint150noThe level interval in milliseconds, should be greater than 100, default 150
  • Return: None

SendPreset
  • Description:

    Send a preset command to the toys.

  • Parameters:

    NameTypeDefaultRequiredDescription
    toysList<string>yesThe toys you want to control
    modeintyesThe preset name to send, we provide four preset patterns: 0:earthquake,1:fireworks,2:pulse,3:wave
    timeSecfloatyesThe total runtime in second, "0" = indefinite time length.
  • Return: None

StopAll
  • Description:

    Send a stop command to the toys.

  • Parameters:

    NameTypeDescription
    toyIdsList<string>The toys you want to stop
  • Return: None

SetDataReportingMode
  • Description:

    Set the switch for toy data reporting function.

  • Parameters:

    NameTypeDefaultRequiredDescription
    toyIdstringyesThe toys you want to set
    openboolyesWhether the data reporting function is enabled or not
  • Return: None

CheckDataReportingEnable
  • Description:

    Check if the toy supports data reporting function. If so, onGetToyDataReportingEnabled will be triggered.

  • Parameters:

    NameTypeDefaultRequiredDescription
    toyIdstringyesThe toys you want to check
  • Return: None

AddDataReportingListener
  • Description:

    Add a data reporting listener.

  • Parameters:

    NameTypeDescription
    toyIdsstringThe toys you want to add data reporting listener
    eventUnityAction(string toyId,LovenseDataReportingEventType type,int targer, int value)callback function
  • Return: None

RemoveDataReportingListener
  • Description:

    Remove a data reporting listener.

  • Parameters:

    NameTypeDescription
    toyIdsstringThe toys you want to add data reporting listener
    eventUnityAction(string toyId,LovenseDataReportingEventType type,int targer,int value)callback function
  • Return: None

GetSupportCommandsByType(string type)
  • Description:

    Obtain Command types supported by toys through their types

  • Parameters:

    NameTypeDescription
    typestringthe type of toy
  • Return: List<LovenseCommandType>

Event

onGetToyEvent
  • Description:

    Triggered when a new toy is discovered

  • Callback Parameters:

    NameTypeDescription
    toyLovenseDongleToythe new toy which recently been discovered
onGetTypeEvent
  • Description:

    Triggered when getting toy's type is complete.

  • Callback Parameters:

    NameTypeDescription
    toyIdstringThe toy's ID
    typestringThe toy's type
onGetBatteryEvent
  • Description:

    Triggered when getting toy's battery is complete.

  • Callback Parameters:

    NameTypeDescription
    toyIdstringThe toy's ID
    batterystringThe 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 be s90
onConnectChangeEvent
  • Description:

    Triggered when connected toy's connection status is changed.

  • Callback Parameters:

    NameTypeDescription
    toyIdstringThe toy's ID
    connectedboolConnection status
onResultCodeEvent
  • Description:

    Triggered when an error occurs during connection or control

  • Callback Parameters:

    NameTypeDescription
    codeintID where the error occurred
  • code:

    ValueDescription
    99No Lovense USB Bluetooth adapter
    100Lovense USB Bluetooth adapter initialization completed
    101Lovense USB Bluetooth adapter is inserted
    102Lovense USB Bluetooth adapter is Removed
    400Command does not exist or command is not supported
    401parameter error
    402JSON format error
    403Toy not connected
    404This toy does not exist
    406Toy connection is full
    501Scanning toys, some commands are not supported
    505Other errors
onGetToyDataReportingEnabled
  • Description:

    Triggered when a toy is found to have a data reporting function

  • Callback Parameters:

    NameTypeDescription
    codeintToy ID

LovenseDongleToy

  • Description:

    The information of the Lovense toy

  • Properties:

    NameTypeDescription
    idstringThe toy's id
    namestringThe toy's name, such as "nora"
    uuidstringThe toy's uuid
    isConnectedintThe toy's connection status
    typestringThe toy's type
    batteryintThe toy's battery level, from 0 to 100 ,[GetBattery] needs to be called to update
    isSupportDataReportingboolDetermine if the toy currently support data reporting. Need the toy to be connected in order to synchronize.

LovenseCommand

  • Description:

    The toy control command

  • Properties:

    NameTypeDescription
    typeLovenseCommandTypeSee below
    valueintFunction level

Function Level:

TypeRange
VIBRATE0 - 20
VIBRATE10 - 20
VIBRATE20 - 20
VIBRATE30 - 20
ROTATE0 - 20
PUMP0 - 3
THRUSTING0 - 20
FINGERING0 - 20
SUCTION0 - 20
DEPTH0-3
GETBATTERY
GETTYPE

LovenseCommandType

  • Description:

    The enum of the toy function type.

  • Enum:

    Value
    VIBRATE
    VIBRATE1
    VIBRATE2
    VIBRATE3
    ROTATE
    PUMP
    THRUSTING
    FINGERING
    SUCTION
    DEPTH
    GETBATTERY
    GETTYPE

The DEPTH command is a setting command that requires the THRUSTRING command to take effect.

LovenseDataReportingEventType

  • Description:

    The enum of the toy data reporting event type.

  • Enum:

    ValueDescription
    KEY_DOWNTrigger when a key is pressed
    KEY_UPTrigger when a key is up
    VIBTATETrigger when the toy vibrates
    ROTATETrigger when the toy rotate
    SHAKETrigger when the toy shake
    MOVEMENTTrigger when the toy movement
    DEEPTrigger when the toy vibrates
    AIR_INTrigger when the toy is inflated
    AIR_OUTTrigger when the toy deflates
    AIR_CLOSETrigger when inflating or deflating is turned off
    AIR_OPENTrigger when inflating or deflating is turned on
    BATTERYTrigger when the battery level changes
    SHAKE_TIMESTrigger when user shakes the toy every time

Version Records

[Version1.3] - 2023-11-15

  • 1.Command sending optimization.

  • 2.Add Depth command.

  • 3.Update the configuration file to version1.3.

[Version1.2] - 2023-10-20

  • 1.Add Vibrate3 command.

[Version1.1] - 2023-09-28

  • 1.Add shake event.

[Version1.0] - 2023-09-12

  • 1.Functions

  • 2.Pattern

  • 3.Preset

  • 4.Connect/DisConnect

  • 5.Type/Battery

  • 6.Data Reporting Interface