Универсальное приложение + Bluetooth + SPP

В настоящее время я пытаюсь создать библиотеку для использования профиля последовательного порта (SPP) в универсальном приложении.

Насколько я понял, SPP работает поверх RFCOMM. Основы RFCOMM описаны в MSDN, и это нормально. Я также смог «найти» свое устройство и «подключиться» к нему. Я также смог создать StreamReader и StreamWriter для RFCOMM.

Теперь возникают неприятности. Я понимаю, что RFCOMM предоставляет какие-то каналы для различных функций/задач, одним из которых, вероятно, является SPP (я знаю, что устройство поддерживает SPP, и оно работает даже через «обычное» последовательное соединение).

Я хотел бы знать, был ли пример, какие байты я должен отправить через этот канал, чтобы получить однобайтовый вывод на другой стороне. Требуется ли какая-то настройка подключения (двунаправленный обмен)? Существуют ли примеры для этих пакетов данных, каковы их имена и есть ли для них конкретная спецификация. Я думаю, что был бы счастлив даже с некоторыми из правильных терминов для поиска.


person Tom L.    schedule 17.06.2015    source источник


Ответы (1)


Хорошо, то, что я предполагал, было в основном неправильным. Вот минималистичный код для очень простого (без обработки ошибок, без задач,...) общения.

Это входит в Package.appxmanifest:

<Capabilities>
  <m2:DeviceCapability Name="bluetooth.rfcomm">
    <m2:Device Id="any">
      <m2:Function Type="name:serialPort" />
    </m2:Device>
  </m2:DeviceCapability>
</Capabilities>

И это методом по вашему выбору (убедитесь, что ваше устройство Bluetooth было сопряжено, мое устройство имеет имя «HC-06»).

// Find the device
var bluetoothDevicesSpp = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));
var bluetoothDeviceHc06 = bluetoothDevicesSpp.SingleOrDefault(d => d.Name == "HC-06");
var serviceRfcomm = await RfcommDeviceService.FromIdAsync(bluetoothDeviceHc06.Id);
StreamSocket socket = new StreamSocket();
await socket.ConnectAsync(serviceRfcomm.ConnectionHostName, serviceRfcomm.ConnectionServiceName, SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
DataWriter writer = new DataWriter(socket.OutputStream);
DataReader reader = new DataReader(socket.InputStream);

Чтобы прочитать, используйте это:

await reader.LoadAsync(1);
byte b = reader.ReadByte();
Debug.WriteLine((char)b);

Чтобы написать, используйте это:

writer.WriteString("MaM\r\n");
writer.StoreAsync();

Байты будут передаваться как есть, никакого дополнительного протокола или чего-то подобного не требуется. Наслаждаться.

person Tom L.    schedule 18.06.2015
comment
Я хотел бы сделать то же самое, но в приложении wpf или winform. Не могли бы вы подсказать, как начать, я просматривал 32feet.NET для подключения и получения данных с HC-06 устройства, но я не могу заставить его работать - person edgarmtze; 25.10.2015
comment
Поскольку HC-06 просто использует SPP (профиль последовательного порта), вы должны увидеть виртуальный COM-порт в диспетчере устройств. Затем используйте класс SerialPort для связи. - person Tom L.; 25.10.2015
comment
У меня возникли проблемы с получением данных от HC-06, поскольку вы успешно решили проблему со связью. Не могли бы вы взглянуть на вопрос, который я задал здесь, на SO? stackoverflow.com/questions/33507665/ Спасибо. - person edgarmtze; 05.11.2015