Несколько предостережений, я предполагаю, что вы не имеете дело с HID-устройствами, они обычно обрабатываются ОС. Я также только начал использовать 32feet, и я использую его для создания соединений со службой последовательного порта на сканерах штрих-кодов Bluetooth, так что могут быть более эффективные способы для ваших нужд, но это может указать вам верное направление для начала .
Вам необходимо выполнить сопряжение устройства, да. Если вы используете его в приложении WinForms, на самом деле вы можете отобразить форму, которая обрабатывает сканирование устройств и позволяет выбрать одно из них, например:
bool PairDevice()
{
using (var discoverForm = new SelectBluetoothDeviceDialog())
{
if (discoverForm.ShowDialog(this) != DialogResult.OK)
{
// no device selected
return false;
}
BluetoothDeviceInfo deviceInfo = discoverForm.SelectedDevice;
if (!deviceInfo.Authenticated) // previously paired?
{
// TODO: show a dialog with a PIN/discover the device PIN
if (!BluetoothSecurity.PairDevice(deviceInfo.DeviceAddress, myPin))
{
// not previously paired and attempt to pair failed
return false;
}
}
// device should now be paired with the OS so make a connection to it asynchronously
var client = new BluetoothClient();
client.BeginConnect(deviceInfo.DeviceAddress, BluetoothService.SerialPort, this.BluetoothClientConnectCallback, client);
return true;
}
}
void BluetoothClientConnectCallback(IAsyncResult result)
{
var client = (BluetoothClient)result.State;
client.EndConnect();
// get the client's stream and do whatever reading/writing you want to do.
// if you want to maintain the connection then calls to Read() on the client's stream should block when awaiting data from the device
// when you're done reading/writing and want to close the connection or the device servers the connection control flow will resume here and you need to tidy up
client.Close();
}
Безусловно, лучший способ, если ваши устройства вещают, что они доступны для соединения, - это установить BluetoothListener
, который будет непрерывно прослушивать вещательные устройства, и когда оно будет найдено, вы получите BluetoothClient
экземпляр, который вы можете использовать так же, как в первый раз, когда вы создали пару:
void SetupListener()
{
var listener = new BluetoothListener(BluetoothService.SerialPort);
listener.Start();
listener.BeginAcceptBluetoothClient(this.BluetoothListenerAcceptClientCallback, listener);
}
void BluetoothListenerAcceptClientCallback(IAsyncResult result)
{
var listener = (BluetoothListener)result.State;
// continue listening for other broadcasting devices
listener.BeginAcceptBluetoothClient(this.BluetoothListenerAcceptClientCallback, listener);
// create a connection to the device that's just been found
BluetoothClient client = listener.EndAcceptBluetoothClient();
// the method we're in is already asynchronous and it's already connected to the client (via EndAcceptBluetoothClient) so there's no need to call BeginConnect
// TODO: perform your reading/writing as you did in the first code sample
client.Close();
}
Менее привлекательный, но полезный, если ваше устройство не транслирует соединения, вы можете создать новый BluetoothClient
и попросить вернуть все найденные устройства:
void ScanForBluetoothClients()
{
var client = new BluetoothClient();
BluetoothDeviceInfo[] availableDevices = client.DiscoverDevices(); // I've found this to be SLOW!
foreach (BluetoothDeviceInfo device in availableDevices)
{
if (!device.Authenticated)
{
continue;
}
var peerClient = new BluetoothClient();
peerClient.BeginConnect(deviceInfo.DeviceAddress, BluetoothService.SerialPort, this.BluetoothClientConnectCallback, peerClient);
}
}