Ошибка элемента не найдена в StreamSocket.ConnectAsync()
Я застрял на много часов сейчас, пытаясь связаться с устройством Bluetooth (не BLE).
Я использую приложение Windows Phone 8.1 Silverlight.
Я установил раздел DeviceCapability с помощью serviceid в appxmanifest:
<!-- bluetooth -->
<m2:DeviceCapability Name="bluetooth.rfcomm">
<m2:Device Id="any">
<m2:Function Type="serviceId:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" />
</m2:Device>
</m2:DeviceCapability>
Я включил ID_CAP_PROXIMITY и ID_CAP_NETWORKING в WPAppManifest и близость в appxmanifest.
Я искал свое устройство двумя возможными способами (и каждый раз получал PeerInformation), либо с парным фильтром, либо с serviceid:
if(serviceId.HasValue)
{
// Filter devices with serviceId
PeerFinder.AlternateIdentities["Bluetooth:SDP"] = "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}";
}
else
{
// Filter devices (all paired)
PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
}
// Search
var peers = await PeerFinder.FindAllPeersAsync();
// Make some filtering to get right PeerInformation
var peer = GetGoodPeerInformation();
Когда я пытаюсь записать данные на свое устройство, появляется сообщение об ошибке "Элемент не найден":
try
{
//PeerFinder.Start();
//using (var streamSocket = await PeerFinder.ConnectAsync(Peer))
using (var streamSocket = new StreamSocket())
{
// I have to put manually the serviceid because the ServiceId property in the PeerInformation object is always empty...
await streamSocket.ConnectAsync(PeerInformation.HostName, "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}");
// data is a byte[] filled earlier
await streamSocket.OutputStream.WriteAsync(data.AsBuffer());
}
return true;
}
catch
{
return false;
}
finally
{
//PeerFinder.Stop();
}
Когда я удаляю фигурные скобки из ServiceId в ConnectAsync(), у меня появляется другая ошибка (неверное имя файла 0x8007007B).
Если у вас есть идеи, спасибо за помощь!
[Редактировать: 04.06.2015]
Я протестировал приложение WinRT (WP 8.1) и успешно подключился к своему устройству, изменив способ его выполнения:
var devices = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.FromUuid(new Guid("00001101-0000-1000-8000-00805F9B34FB"))));
var device = devices.First();
var service = await RfcommDeviceService.FromIdAsync(device.Id);
byte[] data = new byte[] { 0xB0, 0x11, 0x11, 0x01, 0xAA, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6 };
try
{
using (StreamSocket socket = new StreamSocket())
{
await socket.ConnectAsync(service.ConnectionHostName, service.ConnectionServiceName);
await socket.OutputStream.WriteAsync(data.AsBuffer());
}
}
catch (Exception)
{
throw;
}
Итак, я переместил этот кусок кода в свое приложение WP8.1 Silverlight, но служба переменных всегда равна нулю...