Looking to write Bluetooth 'hcitool' equivelant in Windows

試著忘記壹切 提交于 2019-12-09 01:06:01

问题


I have used Bluez Bluetooth stack in Linux which comes with a handy utility 'hcitool'. Looking to build something like that in Windows with same or equivalent functionality. Specifically, 'hcitool name < MAC >', which shows if the specified device is within range. Any guidance will be appreciated.

I have Windows SDK v7 with Visual Studio 2010, using C/C++

thanks.


回答1:


Using my 32feet.NET library something like the following.

EDIT 3rd March: I've now added code to directly lookup the device by address rather than by using device discovery; so that's a simple 'new BluetoothDeviceInfo(...)'.

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.)

EDIT 8th March: Now does a connect (using the SDP API) to check that the device is in range (and in connectable mode).

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 < 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 < 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<BluetoothDeviceInfo> 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;
        }

    }
}


来源:https://stackoverflow.com/questions/15036364/looking-to-write-bluetooth-hcitool-equivelant-in-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!