2012-11-29 164 views
4

原始數據我有我試圖連接到使用32feet.net這樣我就可以從中讀取輸入數據和處理我的應用程序的輸出數字人機接口設備。我以前從來沒有用藍牙編程,而且我正在學習。讀通過藍牙

我能使用Microsoft /博通堆棧沒有問題我的設備連接到Windows 7。我也可以發現使用32feet.net的設備,但是當我嘗試連接它時,出現錯誤。我確信使用BluetoothRadio.IsSupported這裏我的籌碼得到了支持的代碼片段:

var client = new BluetoothClient(); 
var dlg = new SelectBluetoothDeviceDialog(); 
DialogResult result = dlg.ShowDialog(this); 
if (result != DialogResult.OK) 
{ 
    return; 
} 
BluetoothDeviceInfo device = dlg.SelectedDevice; 
BluetoothAddress addr = device.DeviceAddress; 
Console.WriteLine(device.DeviceName); 
Guid serviceClass = BluetoothService.HumanInterfaceDevice; 
client.Connect(new BluetoothEndPoint(addr, serviceClass)); 

最後一行導致以下錯誤: 類型的第一次機會異常「System.Net.Sockets.SocketException」發生在System.dll中

我已經嘗試了一些其他方法,以及與client.Connect。我試過使用DiscoverDevices來獲取DeviceInfo數組,並手動從該數組中選擇設備並連接到它。我已經嘗試將serviceClass設置爲Empty,因爲這是使用DeviceInfo.ClassOfDevice.Service時顯示的內容。我已經能夠使用DeviceInfo.SetServiceState(BluetoothService.HumanInterfaceDevice,true)將設備連接到窗口,但無法從中獲取流。

即使我可以從它被連接在Windows後設備的數據流,這將是罰款。我的目標很簡單,就是能夠像按下按鈕一樣從設備讀取輸入。

回答

1

試試這個:

var client = new BluetoothClient(); 
var dlg = new SelectBluetoothDeviceDialog(); 
DialogResult result = dlg.ShowDialog(this); 
if (result != DialogResult.OK) 
{ 
    return; 
} 
BluetoothDeviceInfo device = dlg.SelectedDevice; 
BluetoothAddress addr = device.DeviceAddress; 
Console.WriteLine(device.DeviceName); 
BluetoothSecurity.PairRequest(addr, "Whatever pin"); 
device.SetServiceState(BluetoothService.HumanInterfaceDevice, true); 
Thread.Sleep(100); // Just in case 
if (device.InstalledServices.Length == 0) 
{ 
    // I wouldn't know why it doesn't install the service 
} 
client.Connect(addr, BluetoothService.HumanInterfaceDevice); 

我以任何方式方面的專家,但對我來說:

  1. 我需要對設備如果設備不藍牙顯示設備。您只需要使用藍牙無線電發現的每個新設備執行一次操作,或者如果卸載該設備,則無論如何我都會這樣做,以防萬一選擇了新設備。
  2. 啓動服務,一旦我做這個設備將顯示一個串行端口(在你的情況HID)是根據在設備的屬性「服務」可用。
  3. 連接

在每個階段有什麼需要發生:

  1. 確保設備出現在「藍牙設備」中的「控制面板」。
  2. 在設備的「屬性」中的「服務」選項卡下,應該顯示「人機界面」或其他內容。
  3. 該服務應打勾。

在另一方面,不同的是,你得到的是真正的神祕,但它只是讓我覺得如果設備尚未連接到一些東西。如果您選中「device.Connected」,它必須返回false,否則您將無法連接。

+0

感謝您的幫助,但仍然發生異常。配對代碼是不需要的,我已經嘗試了它,沒有線,線和線與空字符串作爲引腳。 SetServiceState函數將它連接到Windows堆棧,是否應該發生? – SoloDeveloper

+0

我真的不知道「連接到Windows堆棧」是什麼意思。看看我的答案中的更新,他們可能會有所幫助 –

1

阿圖羅的答案是正確的。使用SetServiceState(或可能BluetoothSecurity。PairRequest將自動執行此操作)讓藍牙堆棧處理低級別HID通信並通過Windows的HID API公開HID事件。然後你的代碼可以使用該API。

在更多的細節:

一)藍牙HID不使用RFCOMM,這就是BluetoothClient使用。有關每個配置文件/服務使用的協議的詳細信息,請參閱Bluetooth Profiles and 32feet.NET。沒有簡單的L2CAP API與Microsoft堆棧一起使用,因此在那裏不支持L2CapClient(還?)。 b)如果其中一個(可能)使用L2CapClient,那麼需要讀取和寫入原始HID數據並解碼和解析HID幀。相反,您應該將藍牙堆棧連接到設備,並使用Windows HID API來查看按鈕按下。在我的文檔32feet.NET這點在3 http://32feet.codeplex.com/documentation

三)是顯然一些故障例如PS3藍牙控制器,這意味着Windows HID服務無法使用它。在這種情況下,人們必須直接連接到設備。 顯然...