Автоматическое (Bluetooth-соединение) с Windows 7 и мобильным телефоном
В настоящее время я программирую USB-ключ Bluetooth на C# 2010. Я хочу запрограммировать его так, чтобы он автоматически связывался с найденным устройством Bluetooth. Я не хочу, чтобы пользователь вручную принимал запрос на сопряжение как в мобильном телефоне, так и в Windows 7. Я использую свой телефон (X Peria S) для проверки этого. Возможен ли этот метод программирования? Я пытался закодировать это с помощью библиотеки 32feet.net для Bluetooth, вот мой код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using InTheHand.Net;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Guid service = BluetoothService.BluetoothBase;
private BluetoothClient bluetoothClient;
public Form1()
{
InitializeComponent();
}
private void Search_Bluetooth(object sender, EventArgs e)
{
BluetoothRadio.PrimaryRadio.Mode = RadioMode.Discoverable;
bluetoothClient = new BluetoothClient();
Cursor.Current = Cursors.WaitCursor;
BluetoothDeviceInfo [] bluetoothDeviceInfo = bluetoothClient.DiscoverDevices(10);
comboBox1.DataSource = bluetoothDeviceInfo;
comboBox1.DisplayMember = "DeviceName";
comboBox1.ValueMember = "DeviceAddress";
comboBox1.Focus();
Cursor.Current = Cursors.Default;
}
private void Pair(object sender, EventArgs e)
{
if (comboBox1.SelectedValue != null)
{
try
{
bluetoothClient.Connect(new BluetoothEndPoint((BluetoothAddress)comboBox1.SelectedValue, service));
MessageBox.Show("Connected");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
}
Когда я запускаю этот проект, я вижу список устройств Bluetooth в окружении, но когда я хочу соединиться с ним, я получаю сообщение об ошибке "Попытка подключения не удалась, потому что подключенная сторона не отвечала должным образом в течение определенного периода времени"
Я думаю, что проблема в частной службе Guid = BluetoothService.BluetoothBase, но я не уверен, использую ли я правильный сервис.BluetoothBase для сопряжения с моим телефоном?
Есть ли какое-либо существующее решение для этого? Любая помощь и предложение высоко ценится.
Благодарю.
2 ответа
Вы должны знать ПИН-код для вашего ключа, который будет запрашиваться во время аутентификации.
Если вы хотите подключиться, например, к мобильному Bluetooth-ключу RS-232, вам нужно знать PIN-код, но вам не нужно принимать соединение на удаленном устройстве (RS-232) из-за отсутствия пользовательского интерфейса., Но на мобильном телефоне вы должны.
Я написал следующий интерфейс:
interface IStackAdapter
{
IList<IRemoteBTDevice> DiscoveredDevices { get; }
void LoadStack();
void DoInquiry();
void DoConnection(IRemoteBTDevice rd);
void ReleaseLink();
}
Затем я реализовал этот интерфейс для каждого отдельного стека Bluetooth. Вот соединение для стека Widcomm:
/// <summary>
/// Connects to a remote device.
/// </summary>
/// <param name="rd">Remote device that the adapter is supposed to connect to.</param>
public void DoConnection(IRemoteBTDevice rd)
{
BluetoothAddress remoteAddress = new BluetoothAddress(Convert.ToInt64(rd.Id, 16));
BluetoothDeviceInfo bdi = new BluetoothDeviceInfo(remoteAddress);
try
{
if (!bdi.Authenticated)
{
string pair = rd.Pin; /* PIN for your dongle */
bool paired = BluetoothSecurity.PairRequest(bdi.DeviceAddress, pair);
}
}
catch (Exception ex)
{
//Log and rethrow
}
}
Если вы используете Windows Phone, вы можете использовать PeerFinder в Windows Phone для подключения:
PeerFinder.AlternateIdentities["Bluetooth:PAIRED"] = "";
var available_devices = await PeerFinder.FindAllPeersAsync();
HostName hostName = null;
for (int i = 0; i < available_devices.Count; i++)
{
PeerInformation dispositivo = available_devices[i];
if (dispositivo.DisplayName.ToUpper() == /*Name of you device */)
{
hostName = dispositivo.HostName;
break;
}
}
if (hostName != null)
{
var socket = new StreamSocket();
await socket.ConnectAsync(hostName, "1");
}