I'm developing a Windows 10 Universal Application to communicate with an embedded system via a HM-10 chip.
What I did try and other circumstances
The chip is set up, there is no problem connecting to it. From an iPhone application for these devices, I can due two-way messaging via Arduino Serial window, and the iPhone application. My computer can also see it, and can connect to it from a sample application provided by Microsoft.
Before running, it is paired and connected in Bluetooth Settings. I also tried without pairing and connecting, but it was not discovered by DeviceInformation then.
The MainPage.xaml.cs
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Devices.Enumeration;
using Windows.Devices.Bluetooth;
using Windows.Devices.Bluetooth.GenericAttributeProfile;
using System.Threading.Tasks;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace App1
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
///
public sealed partial class MainPage : Page
{
public List<string> deviceList = new List<string>();
public MainPage()
{
this.InitializeComponent();
Debug.WriteLine("A");
var taskDevices = getDevices();
Task.WaitAll(taskDevices);
Debug.WriteLine("B");
}
public async Task<List<string>> getDevices()
{
Debug.WriteLine("C");
foreach (DeviceInformation di in await DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(GattServiceUuids.GenericAccess), null))
{
Debug.WriteLine("D");
Debug.WriteLine(di.Name);
Debug.WriteLine(di.Id);
Debug.WriteLine(di.IsEnabled);
var bleDevice = await GattDeviceService.FromIdAsync(di.Id);
Debug.WriteLine("E");
// Add the dvice name into the list.
// deviceList.Add(bleDevice.Name);
}
return deviceList;
}
private void button_Click(object sender, RoutedEventArgs e)
{
}
private void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
}
I did my search and I realised the manifest needs an addition to have Bluetooth capability.
Package.appxmanifest
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:m2="http://schemas.microsoft.com/appx/manifest/foundation/windows10" IgnorableNamespaces="uap mp">
<Identity Name="acbf6f03-e62b-4d1e-8c25-9f649ca5af4c" Publisher="CN=Boomkin" Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="acbf6f03-e62b-4d1e-8c25-9f649ca5af4c" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
<Properties>
<DisplayName>App1</DisplayName>
<PublisherDisplayName>Boomkin</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="App1.App">
<uap:VisualElements DisplayName="Histamine Control Panel" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="App1" BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
</uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<m2:DeviceCapability Name="bluetooth.genericAttributeProfile">
<m2:Device Id="any">
<m2:Function Type="serviceId:00001800-0000-1000-8000-00805f9b34fb"/>
</m2:Device>
</m2:DeviceCapability>
</Capabilities>
</Package>
I have tried many other versions, added and deleted internetclient and bluetooth capabilities, without any success. My current guess that the problem is around here.
The problem
As the question states the FromIdAsync part doesn't return anything. Not even null (as I saw in many other questions here), it just does not finish and the thread exists eventually.
Log
A
C
D
HIST
\\?\BTHLEDevice#{00001800-0000-1000-8000-00805f9b34fb}_f45eabaaf694#8&2782425b&13&0006#{6e3bb679-4372-40c8-9eaa-4509df260cd8}
True
Then after waiting for a while
The thread 0x3c6c has exited with code 0 (0x0).
Thank you and I really appreciate any help.
Your problem is here:
Task.WaitAll(taskDevices);
Blocking on asynchronous code causes a deadlock. The proper resolution is to use async all the way.
In your specific case, you need to (synchronously, immediately) create your view in a "loading" state - however you want that to look. Then, when the asynchronous code completes, update your view to a "loaded" state. See my MSDN article on async data binding for more information.