web-dev-qa-db-ja.com

Bluetoothデバイスを32feet .NET Bluetoothライブラリを使用してコンピューターにペアリングする

32feet.NETライブラリを使用してBluetoothデバイスと通信する方法を知りたい場合は、解決策を読んでください


私は現在、コンピューターと自作の.NET Gadgeteerプロトタイプとの間でBluetooth経由で通信しようとしています。

Gadgeteerプロトタイプは、メインボード、電源、およびBluetoothモジュールで構成されています。モジュールは検出可能モードです。

コンピューターでは、32feet .NET Bluetoothに基づいたカスタム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はデバイスのペアリングコードの入力を求めています。このケースを防ぐためにBluetoothWin32Authenticationについて読みましたが、正しくありません。

private void HandleRequests(object that, BluetoothWin32AuthenticationEventArgs e)
{
    e.Confirm = true;
}

これは、イベントハンドラーのコードです( http://32feet.codeplex.com/wikipage?title=BluetoothWin32Authentication

SSPデバイスが接続しているときにペアリングを続行できるようにする場合は、コールバックを処理し、e.Confirm = Trueを設定するだけで十分ですが、それは少し安全ではありません。 。


私は混乱しています-.-目標は、アプリケーションとガジェットモジュールがユーザーの干渉なしに両方向にデータを送信できることです。

ユーザーの介入なしにデバイスを自動的にペアリングできないのは本当ですか?

2つのデバイスがすでにペアリングされている場合、ユーザーの操作なしでデータを交換できるというのは本当ですか?

26
xmashallax

私は自分の問題を解決する方法を考え出しました、そして、Bluetooth接続についての私の知識は少し大きくなりました。他の誰かが問題を抱えている場合は、解決策を提供します。コード例は、32feet Bluetoothライブラリを備えたbluetoothコントローラーのC#実装を表しています。

スキャン

これは、範囲内のデバイスが検出されることを意味します。私のコード:

_// 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デバイスと結合されることを意味します。これは、両側のコードを入力して1回行う必要があります。ユーザーがデバイスが追加されたことに気付かないように、コードを介して実行できます。この目的のための私のコード:

_// 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 :)
    }
}
_

注文のスキャン、ペアリング、接続を維持すれば、すべて正常に機能するはずです。データを送受信するには、BluetoothClientGetStream()メソッドを使用します。操作可能なネットワークストリームを提供します。

接続の受信

別のデバイスをデバイスに接続する場合は、着信接続要求をリッスンする必要があります。これは、デバイスが既にペアリングされている場合にのみ機能します。私のコード:

_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_を有効なBluetoothAddressに置き換えます(たとえば、BluetoothAddress.Parse();を使用して)。デバイスが接続された後、基本的なストリームを介してメッセージを交換できます。接続が機能しない場合、認証の問題がある可能性があるため、リスナーでローカルデバイスのピンを設定してみてください(l.SetPin(LOCAL_MAC, MY_PASSWORD);

42
xmashallax