Подключите устройства Bluetooth к компьютеру с помощью библиотеки.feet .NET Bluetooth
Если вы хотите узнать, как использовать библиотеку 32feet.NET для связи с устройствами Bluetooth, прочтите решение
В настоящее время я пытаюсь установить связь между компьютером и прототипом.NET Gadgeteer через Bluetooth.
Прототип Gadgeteer состоит из материнской платы, блока питания и модуля Bluetooth. Модуль находится в режиме обнаружения.
На компьютере запущена специальная Bluetooth-программа на основе 32 футов.NET Bluetooth. Программа обнаруживает все Bluetooth-устройства в радиусе действия и пытается выполнить сопряжение с ними. Однако на данный момент это не выполняется автоматически, мне нужно ввести код сопряжения для устройства.
Как выполнить сопряжение устройств без ввода кода сопряжения?
Устройства найдены, проблема в сопряжении. Я много экспериментировал, но не нашел решения...
foreach (BluetoothDeviceInfo device in this.deviceList)
{
try
{
//BluetoothClient client = new BluetoothClient(this.CreateNewEndpoint(localAddress));
//BluetoothEndPoint ep = this.CreateNewEndpoint(device.DeviceAddress);
EventHandler<BluetoothWin32AuthenticationEventArgs> handler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(HandleRequests);
BluetoothWin32Authentication auth = new BluetoothWin32Authentication(handler);
BluetoothSecurity.PairRequest(device.DeviceAddress, null);
}
}
Этот блок кода инициирует соединение, и оно работает, но Windows просит меня ввести код подключения для устройства. Я прочитал об аутентификации BluetoothWin32, чтобы предотвратить этот случай, но я не понял его правильно.
private void HandleRequests(object that, BluetoothWin32AuthenticationEventArgs e)
{
e.Confirm = true;
}
Это код обработчика события ( http://32feet.codeplex.com/wikipage?title=BluetoothWin32Authentication)
Если вы просто хотите разрешить сопряжение, когда подключаются устройства SSP, тогда обработки обратного вызова и установки e.Confirm=True будет достаточно, но это немного небезопасно...
Я запутался -.- Цель состоит в том, чтобы приложение и модуль гаджета могли отправлять данные в обоих направлениях без какого-либо вмешательства пользователя.
Правда ли, что я не могу автоматически подключать устройства без участия пользователя?
Правда ли, что если два устройства уже были соединены, они могут обмениваться данными без взаимодействия с пользователем?
1 ответ
Я понял, как решить свои проблемы, и мои знания о Bluetooth-соединениях теперь немного больше. Если у кого-то есть проблемы с этим, я предоставлю свое решение. Примеры кода представляют реализацию C# контроллера Bluetooth с библиотекой 32feet Bluetooth.
сканирование
Это означает, что устройства в радиусе действия обнаружены. Мой код:
// mac is mac address of local bluetooth device
BluetoothEndPoint localEndpoint = new BluetoothEndPoint(mac, BluetoothService.SerialPort);
// client is used to manage connections
BluetoothClient localClient = new BluetoothClient(localEndpoint);
// component is used to manage device discovery
BluetoothComponent localComponent = new BluetoothComponent(localClient);
// async methods, can be done synchronously too
localComponent.DiscoverDevicesAsync(255, true, true, true, true, null);
localComponent.DiscoverDevicesProgress += new EventHandler<DiscoverDevicesEventArgs>(component_DiscoverDevicesProgress);
localComponent.DiscoverDevicesComplete += new EventHandler<DiscoverDevicesEventArgs>(component_DiscoverDevicesComplete);
private void component_DiscoverDevicesProgress(object sender, DiscoverDevicesEventArgs e)
{
// log and save all found devices
for (int i = 0; i < e.Devices.Length; i++)
{
if (e.Devices[i].Remembered)
{
Print(e.Devices[i].DeviceName + " (" + e.Devices[i].DeviceAddress + "): Device is known");
}
else
{
Print(e.Devices[i].DeviceName + " (" + e.Devices[i].DeviceAddress + "): Device is unknown");
}
this.deviceList.Add(e.Devices[i]);
}
}
private void component_DiscoverDevicesComplete(object sender, DiscoverDevicesEventArgs e)
{
// log some stuff
}
спаривание
Это означает, что устройства связаны с локальным устройством Bluetooth. Это нужно сделать один раз, введя код с обеих сторон. Это можно сделать с помощью кода, чтобы пользователь даже не заметил, что устройство было добавлено. Мой код для этой цели:
// get a list of all paired devices
BluetoothDeviceInfo[] paired = localClient.DiscoverDevices(255, false, true, false, false);
// check every discovered device if it is already paired
foreach (BluetoothDeviceInfo device in this.deviceList)
{
bool isPaired = false;
for (int i = 0; i < paired.Length; i++)
{
if (device.Equals(paired[i]))
{
isPaired = true;
break;
}
}
// if the device is not paired, pair it!
if (!isPaired)
{
// replace DEVICE_PIN here, synchronous method, but fast
isPaired = BluetoothSecurity.PairRequest(device.DeviceAddress, DEVICE_PIN);
if (isPaired)
{
// now it is paired
}
else
{
// pairing failed
}
}
}
соединительный
Это означает установление соединения и обмен данными. Опять код:
// check if device is paired
if (device.Authenticated)
{
// set pin of device to connect with
localClient.SetPin(DEVICE_PIN);
// async connection method
localClient.BeginConnect(device.DeviceAddress, BluetoothService.SerialPort, new AsyncCallback(Connect), device);
}
// callback
private void Connect(IAsyncResult result)
{
if (result.IsCompleted)
{
// client is connected now :)
}
}
Если вы сохраняете порядок сканирования, сопряжения, подключения, все должно работать нормально. Для отправки или получения данных используйте GetStream()
метод BluetoothClient
, Он обеспечивает сетевой поток, которым можно манипулировать.
Получение соединения
Если вы хотите, чтобы другое устройство подключалось к вашему устройству, вам необходимо прослушивать входящие запросы на подключение. Это работает, только если устройство уже было сопряжено ранее. Мой код:
BluetoothListener l = new BluetoothListener(LOCAL_MAC, BluetoothService.SerialPort);
l.Start(10);
l.BeginAcceptBluetoothClient(new AsyncCallback(AcceptConnection), l);
void AcceptConnection(IAsyncResult result){
if (result.IsCompleted){
BluetoothClient remoteDevice = ((BluetoothListener)result.AsyncState).EndAcceptBluetoothClient(result);
}
}
замещать LOCAL_MAC
с действительным адресом Bluetooth (например, с помощью BluetoothAddress.Parse();
). После подключения устройств они могут обмениваться сообщениями через основной поток. Если соединение не работает, могут быть проблемы с аутентификацией, поэтому попробуйте установить контакт локального устройства в приемнике (l.SetPin(LOCAL_MAC, MY_PASSWORD);