Support for Mirage 3 - JoyHub

Hello!

I recently purchased the Mirage 3 and wanted to connect to Intiface, but it looks like it’s not supported. I couldn’t find any trace of this masturbator on IoST, but here is an Amazon Link:

Here is the intiface log, where you can see it recognizes it as J-Mirage3.

I am new to all this. It connects ok to my Joyhub app… I’m willing to provide any additional info to help.

I see there’s issue ongoing to add support for it.

However user didn’t report anything about vibration. So if you could run tests.

You should be able to connect to they toy via console/terminal to check what services are enabled. (Bluetooth commands - Ubuntu Core documentation)

bluetoothctl
devices

You should see your toy appearing under FF:10:00:4F:42:C0 address as your screen shows.

If you don’t see the device you can start the scan

scan on

and then turn if off if you have some other devices spamming log

scan off

If you see the device you should be able to connect to it

connect FF:10:00:4F:42:C0

You should get Connection successful message followed by list of Services with their Characteristics and Destriptors

enter gatt command menu

menu gatt

select-attribute 0000ffa1-0000-1000-8000-00805f9b34fb

So first byte test, using value of 60. you can swap for 255 for full stregth. Remember to put quotes.
This one should rotate and stop after sending second write.

write ‘0xA0 0x03 60 0 0 0 0xAA’
write ‘0xA0 0x03 0 0 0 0 0xAA’

Second:

write ‘0xA0 0x03 0 60 0 0 0xAA’
write ‘0xA0 0x03 0 0 0 0 0xAA’

Third:

write ‘0xA0 0x03 0 0 60 0 0xAA’
write ‘0xA0 0x03 0 0 0 0 0xAA’

and fourth:

write ‘0xA0 0x03 0 0 0 60 0xAA’
write ‘0xA0 0x03 0 0 0 0 0xAA’

One of these should start vibration, unless manufacturer put it somewhere else.

would be nice to check how many level of suction work

write ‘0xA0 0x0D 0 0 1 0xFF’
write ‘0xA0 0x0D 0 0 2 0xFF’

increase it by 1 until it will stop go faster (in theory 7 should be max),
and stop it

write ‘0xA0 0x0D 0 0 0 0xFF’

With all information implementation of these into app will be possible or even before that you will be able to create own custom config (if findings will be compatible with what’s in code)

Hello, thank you for the fast reply!
I followed your instructions and I am happy to report back!

After entering gatt command I found that writing to first byte changes rotation speed. 60 is middle, 255 is indeed fastest.
Second and third byte do nothing.
Fourth byte controls vibration. Again, 255 is indeed fastest.

As for the suction, all 7 levels of suction work, increasing it by 1 every time. Levels 4-7 are less suction strength and more like suction modes, kinda like a rhythm. The same happens when pushing the physical buttons on the device. I also tried writing level 8 and 9 but there is no suction - only the suction icon on the device lights up and the corresponding number on the LCD appears. I didn’t go higher than 9.

It should be noted that pushing the physical buttons for the rotation and the vibration also triggers various modes and patterns. E-g: level 1 and 2 are only different rotation speed while from level three on it also inverts the rotation every so often, depending on the number. Same goes for vibration.

Do you know which bits should be written to achieve the different vibration and rotation modes?

So far i don’t see any joyhub protocol fully compatible with all the features at once in these bits. Only v4 has option to send command in 4th byte, but it addresses suction to A007, instead to A00D` buttplug/buttplug/src/server/device/protocol/joyhub_v4.rs at master · buttplugio/buttplug · GitHub

It seems it will be needed to add new protocol in code (or add capabilities to more easily adjust addressing in config).

As further debugging options go to find more functionalities.

  1. You can try writing values like 0xA0 0x01 x x x x 0xFF or 0xA0 0x06 x x x x 0xFF etc.
    These can have similar effects of selecting preset action as button / remote for the toy. However I think it’s not a scope of the application, where it’s rather for achieving that with application contacting server and just sending commands dynamically adjusting speeds to achieve that.

  2. You can try to subscribe to bluetooth endpoint, some toys report back on it what command they executed. It should be the command notify where you’re in gatt menu in bluetoothctl and the attribute with that should be 0000ffa2-0000-1000-8000-00805f9b34fb.

  3. Using the original app and export/sniff bluetooth connection packets sent using original application. It can be done with android phone with developer settings on and enabling bluetooth hci logs, then exporting them on desktop via usb debug and apt tool.