Создание входящего порта последовательного порта Bluetooth (SPP) - PullRequest
0 голосов
/ 04 июня 2018

У меня есть специальное устройство Bluetooth, с которым я могу подключиться и подключиться к нему с помощью windows 10, и оно создает 2 com-порта - один указан как входящий, а другой - на исходящем.

Когда я подключаюсь с помощьюБиблиотеки Bluetooth 32Feet C # Я могу обнаружить и выполнить сопряжение устройства и включить профиль SPP, но, увы, я получаю только один COM-порт, и он указан как «исходящий».

Мне необходимо подключиться кустройство использует чужой код, и ему необходимо предоставить номер com-порта.К сожалению, он хочет подключиться к «входящему» порту.

Следовательно, мой вопрос: какое волшебство мне нужно для создания этого входящего com-порта?Я рассмотрел код 32Feet и базовый вызов API BluetoothSetServiceState (...), и у него, похоже, нет никаких параметров для управления созданием портов.Есть ли другой профиль для этой функции ??

Ответы [ 3 ]

0 голосов
/ 06 июня 2018
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());
}
0 голосов
/ 12 июня 2018

Если вы хотите использовать библиотеку InTheHand BT и получить входящий com-порт, вы можете добавить следующий код в конец функции

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

в WindowsBlurtoothDeviceInfo.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 голосов
/ 04 июня 2018

Вы должны использовать недокументированную функцию InstallIncomingComPort из BluetoothAPIs.dll

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...