Cannot connect to Satisfyer Plug-ilicious 2

I am trying to connect my buttplug to my laptop using buttplug.io. I use the following code, adapted from the examples:

use std::str::FromStr;
use buttplug::client::{ButtplugClient, ButtplugClientEvent};
use buttplug::core::connector::ButtplugInProcessClientConnectorBuilder;
use buttplug::server::device::hardware::communication::btleplug::BtlePlugCommunicationManagerBuilder;
use buttplug::server::ButtplugServerBuilder;
use futures::StreamExt;
use tokio::io::{AsyncBufReadExt, BufReader, stdin};


async fn wait_for_input() -> anyhow::Result<Option<String>> {
    Ok(BufReader::new(stdin())
        .lines()
        .next_line()
        .await?)
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let server = ButtplugServerBuilder::default()
        .name("Buttboost embedded buttplug server")
        .comm_manager(BtlePlugCommunicationManagerBuilder::default())
        .finish()?;
    let connector = ButtplugInProcessClientConnectorBuilder::default()
        .server(server)
        .finish();
    let client = ButtplugClient::new("Buttboost");
    client.connect(connector).await?;
    let mut events = client.event_stream();

    tokio::spawn(async move {
        while let Some(event) = events.next().await {
            match event {
                ButtplugClientEvent::DeviceAdded(device) => {
                    println!("Device {} Connected!", device.name());
                }
                ButtplugClientEvent::DeviceRemoved(info) => {
                    println!("Device {} Removed!", info.name());
                }
                ButtplugClientEvent::ScanningFinished => {
                    println!("Device scanning is finished!");
                }
                other => println!("Other event received: {other:?}"),
            }
        }
    });

    println!("Scanning for devices. Press [ENTER] to finish.");
    client.start_scanning().await?;
    wait_for_input().await?;

    println!("Stopping scanning...");
    client.stop_scanning().await?;

    let devices = client.devices();
    if devices.is_empty() {
        println!("Found no devices, exiting");
        return Ok(());
    }

    println!("Choose a device by entering its number:");
    for (index, device) in devices.iter().enumerate() {
        println!("{index} - {}", device.name());
    }
    let _device = loop {
        let Some(Ok(choice)) = wait_for_input().await?.map(|choice| usize::from_str(&choice)) else {
            println!("Invalid choice, enter a non-negative integer");
            continue;
        };
        let Some(device) = devices.get(choice) else {
            println!("Choice too large, enter a device number from the list above");
            continue;
        };
        break device;
    };

    Ok(())
}

However, my buttplug is not found. I have used wireshark to capture bluetooth traffic, and it seems like the buttplug does generate some traffic. However, it ends with “insufficient authentication”.

Using the intiface central, while it does find the buttplug in the logs, it does not show it under devices.

If required, I can also send the wireshark capture file.


System info:

Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Codename: jammy

buttplug version: 7.0.1


Here is the pairing request sent my my laptop to the device. The following error package contains only a flag for the error, and no further information. The error package is the last package in the sequence.

Satisfyer devices are weird: because they don’t properly advertise their names buttplug matches them by the manufacturer information advertisements, but Satisfyers must be paired with the OS first or they will not accept commands (the pairing alone can be a pain).

On Linux, this is where things get worse: once paired with Bluez, the device can ONLY be found by name: the advertisements aren’t sent because Bluez connects instead of waiting for the explicit connection request from buttplug.

So, you’ll most likely need to add the device name to the buttplug device config file, in the satisfyer section. This will likely get Intiface Central to see the device, but probably won’t from your application if you continue to use the embedded server (you’ll get more mileage using the websocket client connector pointed to Intiface).

1 Like

Thank you s lot for the response! In the end, the issue was that the Satisfyer was linked to the phone, and for security reasons that needs to be reset before it can link with anything else.

I found an explanation here: Satisfyer Devices | Buttplug and Intiface FAQ

Anyways, now it works on Linux, still trying to get it to work in windows. Will try your tips, bht ultimately my super cheap Bluetooth dongle on my windows desktop may be at fault. The Linux laptop has Bluetooth built in, and it works better in general.