Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Windows phone 8.1 streamsocket.connectAsync generate "No more data is available. (Exception from HRESULT: 0x80070103)"

I am developing Windows Phone 8.1 stores app (XAML) that must print on Bluetooth printer.

The device is found successfully with first two methods:

 PeerFinder.AllowBluetooth = True
            PeerFinder.Role = PeerRole.Client
            PeerFinder.AlternateIdentities.Item("Bluetooth:SDP") = "{00001101-0000-1000-8000-00805F9B34FB}"
            'PeerFinder.AlternateIdentities.Item("Bluetooth:Paired") = ""

            Dim devs = Await PeerFinder.FindAllPeersAsync()
            Dim dev As PeerInformation = devs(0)

            Dim btdevs = Await DeviceInformation.FindAllAsync(BluetoothDevice.GetDeviceSelector())
            Dim btdv = btdevs(0)

And not found in:

            Dim dfdevs1 = Await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort))
            ' same result with Await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.FromUuid(New Guid("00001101-0000-1000-8000-00805F9B34FB")))

Unfortunately, only the last method will give to me the "remoteServiceName" for using in StreamSocket.ConnectAsync

I have tried different combination for StreamSocket.ConnectAsync :

dim _soc = New StreamSocket()
Await _soc.ConnectAsync(dev.HostName, "1")

"No more data is available. (Exception from HRESULT: 0x80070103)"

Same for

 dim _soc = New StreamSocket()
 Await _soc.ConnectAsync(dev.HostName, "{00001101-0000-1000-8000-00805F9B34FB}"

And as you can imagine the same for

 dim _soc = New StreamSocket()
 Await _soc.ConnectAsync(btdv.HostName, "{00001101-0000-1000-8000-00805F9B34FB}"

I am really out of ideas after some days of banging my head. And what annoys me most is that the first combination of code work perfectly for Windows Phone 8.0

And Yes, in AppManifest everything is set:

 <DeviceCapability Name="proximity" />
    <m2:DeviceCapability Name="bluetooth.rfcomm">
      <m2:Device Id="any">
        <!--<m2:Function Type="name:serialPort" />-->
        <m2:Function Type="serviceId:00001101-0000-1000-8000-00805F9B34FB" />
      </m2:Device>
    </m2:DeviceCapability>

Any ideas will be highly appreciated.

like image 921
jspassov Avatar asked Nov 09 '22 09:11

jspassov


1 Answers

I am also working on this problem as we speak and I've made good progress. For me, the problem came about after I upgraded from WP8 to WP8.1 (silverlight).

Make sure your appxmanifest has the following permissions set:

<m2:DeviceCapability Name="bluetooth.rfcomm">
  <m2:Device Id="any">
    <m2:Function Type="serviceId:00001101-0000-1000-8000-00805f9b34fb" />
    <m2:Function Type="name:serialPort" />
  </m2:Device>
</m2:DeviceCapability>

Below is my sample code that appears to allow connections through (at least, so far in my testing!)

                PeerFinder.AlternateIdentities["Bluetooth:SDP"] = "{00001101-0000-1000-8000-00805f9b34fb}";

                //find the device from the device list we are trying to connect to
                var selector = RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort);
                var dev = await DeviceInformation.FindAllAsync(selector, null);
                var devA = dev.Where(f => f.Name.Equals(_item.Device.DisplayName)).FirstOrDefault();

                //get the service
                RfcommDeviceService service = await RfcommDeviceService.FromIdAsync(devA.Id);

                //create the connection
                await Common.Instance.Socket.ConnectAsync(service.ConnectionHostName, service.ConnectionServiceName);
                MetaData.Instance.BlueBoxRef = _item.Device.DisplayName.Substring(8);
                NavigationService.Navigate(new Uri("/OpenDevice.xaml", UriKind.RelativeOrAbsolute));

I still need to check if this works on other devices but please let me know how you get on!

like image 84
Will Johnson Avatar answered Dec 09 '22 21:12

Will Johnson