首页 > 编程语言 >c# 搜索蓝牙,获取信号强度

c# 搜索蓝牙,获取信号强度

时间:2024-12-17 17:45:07浏览次数:7  
标签:SearchStopped DeviceWatcher return string c# args 蓝牙 信号强度

WinForm低功耗蓝牙通信BlueToothLE C# - mycls - 博客园

1.创建一个.net framework 4.6.1的wpf项目,4.6的不行,win7不支持蓝牙,网上很多方法都搞不定突然发现自己是4.6,改成4.6.1就成了,可能其他方法也是可以的

搜索到的蓝牙信号都是很奇怪的名字,也不支持搜索到手机蓝牙,后面再说吧

2.nuget安装  microsoft.windows.sdk.contracts,可以任意版本

3.将packages.config 迁移到 PackageReference

4.

using Windows.Devices.Enumeration;
using System.Threading;

上代码

public class BluetoothLEDev
    {
        private string _SearchBTName;
        /// <summary>
        /// 要查找的蓝牙名称
        /// </summary>
        public string SearchBTName
        {
            get { return _SearchBTName; }
            set { _SearchBTName = value; }
        }

        private int _SearchBTRssi;
        /// <summary>
        /// 查找的蓝牙名称对应的信号强度
        /// </summary>
        public int SearchBTRssi
        {
            get { return _SearchBTRssi; }
            set { _SearchBTRssi = value; }
        }

        /// <summary>
        /// 是否搜索停止了
        /// </summary>
        private bool _SearchStopped;
        public bool SearchStopped
        {
            get { return _SearchStopped; }
            set { _SearchStopped = value; }
        }

        public void ScanBluetooth(string BTName, int timeOut = 10)
        {
            SearchBTName = BTName;
            SearchStopped = false;

            string[] requestedProperties = { "System.Devices.Aep.IsConnected", "System.Devices.Aep.DeviceAddress",
                "System.Devices.Aep.Bluetooth.Le.IsConnectable", "System.Devices.Aep.SignalStrength",
                "System.Devices.Aep.IsPresent" };
            string aqsAllBluetoothLEDevices = "(System.Devices.Aep.ProtocolId:=\"{bb7bb05e-5972-42b5-94fc-76eaa7084d49}\")";

            DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher(aqsAllBluetoothLEDevices, requestedProperties,
                        DeviceInformationKind.AssociationEndpoint);

            deviceWatcher.Added += DeviceWatcher_Added;
            deviceWatcher.Updated += DeviceWatcher_Updated;
            deviceWatcher.Stopped += DeviceWatcher_Stopped;
            long TickTime = Environment.TickCount + timeOut * 1000;//系统经过的毫秒数
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    if (Environment.TickCount > TickTime || SearchStopped)//找n秒或已经找到
                    {
                        string strTemp;
                        if (!SearchStopped)
                        {
                            strTemp = string.Format("时间到了呀-->{0}", timeOut);
                            //LogHelper.WriteLogInfo(strTemp);
                        }
                        strTemp = string.Format("结束搜索蓝牙");
                        //LogHelper.WriteLogInfo(strTemp);
                        deviceWatcher.Stop();
                        return;
                    }
                    else
                    {
                        Thread.Sleep(50);
                    }
                }
            });
            deviceWatcher.Start();
            //LogHelper.WriteLogInfo("开始搜索蓝牙");
        }

        private void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation args)
        {
            if (string.IsNullOrEmpty(args.Name))
            {
                return;
            }

            var rssi = args.Properties.Single(d => d.Key == "System.Devices.Aep.SignalStrength").Value;
            if (rssi == null)
            {
                return;
            }
            int IRssi = int.Parse(rssi.ToString());
            if (IRssi < -80)
            {
                return;
            }

            string strBTInfo = $"信号强度:[{IRssi}] 蓝牙名称:{(args.Name).PadRight(30, ' ')} 地址:{args.Id}";
            Console.WriteLine(strBTInfo);
            //LogHelper.WriteLogInfo(strBTInfo);

            if (args.Name.Contains(SearchBTName))
            {
                string strTemp = string.Format("搜索到蓝牙:{0},要查找的蓝牙名称:{1},信号强度:{2}找到了呀", args.Name, SearchBTName, IRssi);
               //LogHelper.WriteLogInfo(strTemp);
                SearchBTRssi = IRssi;
                SearchStopped = true;
            }
        }

        private void DeviceWatcher_Stopped(DeviceWatcher sender, object args)
        {
            SearchStopped = true;
        }

        private void DeviceWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args)
        {
        }
    }

 

调用

        public static int SearchBluetoothGetRssi(string strBTName, int OutTime)
        {
            BluetoothLEDev BT = new BluetoothLEDev();
            BT.ScanBluetooth(strBTName, OutTime);

            long TickTime = Environment.TickCount + ((OutTime + 3) * 1000);//多3秒,防止另一个死机了这个退不出来  系统经过的毫秒数
            while (true)
            {
                if (Environment.TickCount > TickTime || BT.SearchStopped)//找n秒或已经找到
                {
                    LogHelper.WriteLogInfo("返回值:" + BT.SearchBTRssi.ToString());
                    return BT.SearchBTRssi;
                }
                else
                {
                    Thread.Sleep(50);
                }
            }
        }

 运行结果如图

 

标签:SearchStopped,DeviceWatcher,return,string,c#,args,蓝牙,信号强度
From: https://www.cnblogs.com/ckrgd/p/18613059

相关文章

  • .NET Core 异常(Exception)底层原理浅谈
    中断与异常模型图内中断内中断是由CPU内部事件引起的中断,通常是在程序执行过程中由于CPU自身检测到某些异常情况而产生的。例如,当执行除法运算时除数为零,或者访问了不存在的内存地址,CPU就会产生内中断。硬件异常CPU内部产生的异常事件故障Fault故障是在指令执行过......
  • cscode 颜色定制
    保存一个C代码阅读的颜色方案。如何却动scope?按F1,搜索 developer:inspecteditortokensandscopes之后点击代码中你要修改颜色的地方,查看【foreground】处的作用域,复制下来粘贴到【settings.json】"scope"后的引号里,就可以定制指定位置的颜色方案了。 {"cmak......
  • 零基础学习人工智能—Python—Pytorch学习(十三)
    前言最近学习了一新概念,叫科学发现和科技发明,科学发现是高于科技发明的,而这个说法我觉得还是挺有道理的,我们总说中国的科技不如欧美,但我们实际感觉上,不论建筑,硬件还是软件,理论,我们都已经高于欧美了,那为什么还说我们不如欧美呢?科学发现是高于科技发明就很好的解释了这个问题,即,我......
  • 掌握高效能计算(HPC):企业数字化转型的核心
    掌握高效能计算(HPC):企业数字化转型的核心引言在当今快速发展的科技时代,企业面临着前所未有的挑战和机遇。随着数据量的爆炸式增长、复杂业务需求的增加以及对实时分析能力的需求提升,企业需要寻求更高效、更智能的方式来处理这些挑战。其中,高效能计算(HighPerformanceComputing,......
  • Clion使用GLFW
    GLFW点击跳转  在GLFW下载页中,有两个下载项64-bit文件:当你准备制作64位的程序时,下载这个选项。需注意:只有64位操作系统才能运行32-bit文件:当你准备制作32位的程序时,下载这个选项。该选项可运行在32、64、x86系统下本教程为32-bit文件包 Clion配置glfw文件在cl......
  • QGraphicsScene保存图片
    QGraphicsScene保存图片1importsys2importtime3fromPySide6.QtCoreimport*4fromPySide6.QtGuiimport*5fromPySide6.QtWidgetsimport*67classMyQWidget(QWidget):8def__init__(self,parent=...,f=...):9super().__init......
  • 详解AQS二:ReentrantLock公平锁原理
    ReentrantLock作为我们使用频率最高的显式锁,它是AQS的经典实现,本篇文章将以ReentrantLock公平锁为例讲解AQS的实现。一、ReentrantLock在之前的文章《线程同步机制一:内部锁和显式锁》中已经提到过关于显式锁ReentrantLock的简单使用privatefinalLocklock=newReentrantLock(......
  • S3 benchmarking tool
    DownloadFrombinaryDownloadBinaryReleasesforvariousplatforms.BuildwithsourceWarprequiresminimumGogo1.21,pleaseensureyouhavecompatibleversionforthisbuild.YoucanfolloweasystepbelowtobuildprojectCloneprojectλgitcloneh......
  • c语言链表头插法再汇总
    建议回顾c链表一系列操作(主要是尾插法)c链表头插法遍历函数在这里先把尾插法的遍历函数稍作修改拿过来。voidForeach(NODE*h){if(NULL==h){return;}//辅助指针变量(帽子)NODE*pC=h;//这里改动是因为没有第一个空节点了......
  • 大数据新视界 -- Hive 事务与 ACID 特性的实现(2 - 16 - 7)
           ......