Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Using my <a href="https://github.com/inthehand/32feet" rel="nofollow noreferrer">32feet.NET</a> library something like the following.</p> <p><strong>EDIT 3rd March:</strong> I've now added code to <em>directly</em> lookup the device by address rather than by using device discovery; so that's a simple 'new BluetoothDeviceInfo(...)'.</p> <p>See if that finds the device you want. This requires the remote device to only be in "Connectable" mode whereas the former requires it to be in "Discoverable" mode. (BTW I've left the discovery code in place.)</p> <p><strong>EDIT 8th March:</strong> Now does a connect (using the SDP API) to check that the device is in range (and in connectable mode).</p> <pre class="lang-cs prettyprint-override"><code>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using InTheHand.Net.Bluetooth; using InTheHand.Net; using InTheHand.Net.Sockets; using System.Diagnostics; using System.Net.Sockets; namespace hcitool { partial class Program { static bool infoRatherThanName; static BluetoothAddress _searchAddress; static int Main(string[] args) { if (args.Length &lt; 1) { Console.WriteLine("Please specify command."); return 2; } var cmd = args[0]; switch (cmd) { case "name": infoRatherThanName = false; break; case "info": infoRatherThanName = true; break; //- case "dev": return ShowRadios(); //case "auth": // return CauseAuth(GETADDRESS()); default: throw new NotImplementedException("Command: '" + cmd + "'"); } if (args.Length &lt; 2) { Console.WriteLine("Please specify device address."); return 2; } var addrS = args[1]; _searchAddress = BluetoothAddress.Parse(addrS); // var dev = new BluetoothDeviceInfo(_searchAddress); bool isInRange = GetCanConnectTo(dev); if (isInRange) { PrintDevice(dev); } else { Console.WriteLine("Can't see that device."); } // Console.WriteLine("simple"); return Simple(); //return Fancier(); } //---- private static int ShowRadios() { BluetoothRadio[] list; try { list = BluetoothRadio.AllRadios; } catch (Exception) { return 1; } Debug.Assert(list.Length != 0, "Expect zero radios case to raise an error."); foreach (var curR in list) { Console.WriteLine("* {0} '{1}'", curR.LocalAddress, curR.Name); Console.WriteLine("{0}", curR.SoftwareManufacturer); Console.WriteLine("{0}", curR.Manufacturer); Console.WriteLine("{0}", curR.Mode); }//for return 0; } private static int CauseAuth(BluetoothAddress addr) { BluetoothSecurity.PairRequest(addr, null); return 0; } //---- static int Simple() { BluetoothDeviceInfo[] devices; BluetoothDeviceInfo foundDev = null; var cli = new BluetoothClient(); // Fast: Remembered/Authenticated devices = cli.DiscoverDevices(255, true, true, false, false); SimpleCheckDevice(devices, ref foundDev); if (foundDev == null) { // Slow: Inquiry cli.DiscoverDevices(255, false, false, true, false); SimpleCheckDevice(devices, ref foundDev); } // if (foundDev != null) { return 0; } else { return 1; } } private static void SimpleCheckDevice(IEnumerable&lt;BluetoothDeviceInfo&gt; devices, ref BluetoothDeviceInfo foundDev) { foreach (var cur in devices) { if (cur.DeviceAddress == _searchAddress) { foundDev = cur; PrintDevice(cur); } }//for } private static void PrintDevice(BluetoothDeviceInfo cur) { Console.WriteLine("* Found device: '{0}' ", cur.DeviceName); if (infoRatherThanName) { try { var vs = cur.GetVersions(); Console.WriteLine(vs.Manufacturer); Console.WriteLine(vs.LmpVersion); Console.WriteLine(vs.LmpSubversion); Console.WriteLine(vs.LmpSupportedFeatures); } catch (Exception ex) { Console.WriteLine("Failed to get remote device versions info: " + ex.Message); } } } //---- private static bool GetCanConnectTo(BluetoothDeviceInfo device) { bool inRange; Guid fakeUuid = new Guid("{F13F471D-47CB-41d6-9609-BAD0690BF891}"); try { ServiceRecord[] records = device.GetServiceRecords(fakeUuid); Debug.Assert(records.Length == 0, "Why are we getting any records?? len: " + records.Length); inRange = true; } catch (SocketException) { inRange = false; } return inRange; } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload