Mam urządzenie BEPOKE Bluetooth, które mogę sparować i łączyć się z użyciem Windows 10 i tworzy 2 porty COM - jeden jest wymieniony jako przychodzący, a jeden jest wymieniony na wychodzącym.

Po podłączeniu za pomocą bibliotek Bluetooth 32Fet C # jestem w stanie odkryć i sparować urządzenie i włącz profil SPP, ale Alas, dostaję tylko jeden port COM i jest wymieniony jako "wychodzący".

Jestem zobowiązany do interfejsu do urządzenia za pomocą kodu innej osoby i musi być dostarczony numer portu COM. Niestety chce połączyć się z portem "przychodzącym".

Stąd moje pytanie brzmi, że magia muszę stworzyć ten przychodzący port COM? Spojrzałem na kod 32FEEET i podstawowe połączenie API Bluetoothsetervicestate (...) i nie wydaje się mieć żadnych parametrów do kontrolowania sposobu tworzenia portów. Czy jest inny profil dla tej funkcji?

1
Paul Coldrey 4 czerwiec 2018, 11:07

3 odpowiedzi

Najlepsza odpowiedź
private const UInt16 BLUETOOTH_MAX_SERVICE_NAME_SIZE = 256;
private const UInt16 BLUETOOTH_DEVICE_NAME_SIZE  = 256;

private static Guid SerialPortServiceClass_UUID = new Guid("{00001101-0000-1000-8000-00805F9B34FB}");

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct BLUETOOTH_LOCAL_SERVICE_INFO
{
            public Boolean Enabled;
            public Int64 btAddr;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = BLUETOOTH_MAX_SERVICE_NAME_SIZE)]
            public String szName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = BLUETOOTH_DEVICE_NAME_SIZE)]
            public String szDeviceString;
};

[DllImport("BluetoothAPIs.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern UInt32 BluetoothSetLocalServiceInfo(IntPtr hRadioIn, ref Guid pClassGuid, UInt32 ulInstance, ref BLUETOOTH_LOCAL_SERVICE_INFO pServiceInfoIn);

private void CreateComPort(Boolean Create)
{
            BLUETOOTH_LOCAL_SERVICE_INFO s = new BLUETOOTH_LOCAL_SERVICE_INFO();
            s.btAddr = 0;
            s.Enabled = Create;
            s.szName = "MyComPort";
            s.szDeviceString = "COM10";

            UInt32 Res = BluetoothSetLocalServiceInfo(IntPtr.Zero,
                ref SerialPortServiceClass_UUID, 1, ref s);
            MessageBox.Show(Res.ToString());
}
2
Mike Petrichenko 6 czerwiec 2018, 07:22

Musisz użyć nieudokumentowanej funkcji InstallinComingComport z bluetoothapis.dll

2
Mike Petrichenko 4 czerwiec 2018, 08:27

Jeśli chcesz użyć biblioteki Inthehand BT i uzyskać przychodzący port COM, możesz dodać następujący kod na dole funkcji

public void SetServiceState(Guid service, bool state, bool throwOnError)

W systemie WindowsbloltoroothDeviceinfo.cs.

if (service == BluetoothService.SerialPort)
{
    NativeMethods.BLUETOOTH_LOCAL_SERVICE_INFO s = new NativeMethods.BLUETOOTH_LOCAL_SERVICE_INFO();
    s.btAddr = deviceInfo.Address;
    s.Enabled = state;
    s.szName = "RemScan";
    s.szDeviceString = "COM10";
    UInt32 Res = NativeMethods.BluetoothSetLocalServiceInfo(IntPtr.Zero, ref NativeMethods.SerialPortServiceClass_UUID, 1, ref s);
}
0
Paul Coldrey 12 czerwiec 2018, 04:34