当前位置: 首页 > 知识库问答 >
问题:

starLeScan()是否超时?

郝永思
2023-03-14

我想开发一个android应用程序,它总是在收听可播放的广告,对信标有用。该应用程序具有活动和后台服务。所有BLE操作都在服务中完成,此服务在找到特定mac时执行REST post:

... mBluetoothAdapter.startLeScan(this);...

public void onLeScan(最终BluetoothDevice设备,最终int rssi,字节[]扫描记录)。。。

如果我运行应用程序并将智能手机分开,屏幕会关闭,但应用程序会继续工作,因为我可以在REST服务日志中看到有呼叫。然而,大约3小时后,android应用程序停止调用rest服务。

由于android服务是Sticky,a再次盯着应用程序并关闭应用程序。3秒钟后,服务启动,我看到Rest呼叫已完成。但是,15分钟后,服务停止调用Rest服务器

所有逻辑都在onLeScan()回调中。所以我可以推断,即使周围有很多BLE设备在不断地做广告,这个回调也不会被调用。。。

拜托,有什么建议吗?

真是多谢了

共有2个答案

华佐
2023-03-14

据我所知,扫描过程没有时间限制。开发人员需要调用stopScan()来停止扫描过程。某些BLE设备需要scan()进程后台才能获取设备通知。我认为,你的信标属于这一类。我可以和你分享三个常见的建议

>

  • 如果您需要继续扫描进程,最好在工作线程中执行扫描进程。

    在Android 6以后的版本中,服务发生了巨大的变化。因此,不要使用服务,而是使用作业服务或WorkManager。

    我的扫描实现如下(Kotlin版本)

         /**
             * Scan The BLE Device
             * Check the available BLE devices in the Surrounding
             * If the device is Already scanning then stop Scanning
             * Else start Scanning and check 10 seconds
             * Send the available devices as a callback to the system
             * Finish Scanning after 10 Seconds
             */
            fun scanBLEDevice(isContinuesScan: Boolean) {
                try {
                    mIsContinuesScan = isContinuesScan
    
                    if (mScanThread != null) {
                        /**
                         * Already Running - No need to rescan
                         */
                        return
                    }
    
                    mScanThread = Thread(mScanRunnable)
                    mScanThread.start()
    
                    /**
                     * Stop Scanning after a Period of Time
                     * Set a 10 Sec delay time and Stop Scanning
                     * collect all the available devices in the 10 Second
                     */
                    if (!isContinuesScan) {
                        mHandler?.postDelayed({
                            // Set a delay time to Scanning
                            stopScan(mDeviceObject)
                        }, BLEConstants.SCAN_PERIOD) // Delay Period
                    }
                } catch (e: Exception) {
                    Log.e(TAG, e.message)
                }
    
            }
    
       private val mScanRunnable = Runnable {
            if (mBluetoothAdapter != null && mBluetoothAdapter!!.isEnabled) {
                scan()
            }
        }
    
        private fun scan() {
            if (isLollyPopOrAbove()) {// Start Scanning For Lollipop devices
                mBluetoothAdapter?.bluetoothLeScanner?.startScan(/*scanFilters(),
                scanSettings(),*/scanCallback) // Start BLE device Scanning in a separate thread
            } else {
                mBluetoothAdapter?.startLeScan(mLeScanCallback) // Start Scanning for Below Lollipop device
            }
        }
    

    如果你需要更多的信息你可以访问我的博客

    https://medium.com/@nithinjith. p/bl-in-android-kotlin-c485f0e83c16

  • 谷梁裕
    2023-03-14

    首先,不要使用旧的扫描API。使用新推出的Lollipop。原因是您需要执行筛选扫描,以使其永远继续。过滤器需要根据广告数据包含的内容进行设置。

    其次,使用前台服务确保应用程序进程不会在一段时间后终止。或者使用新的API设置匹配发生时执行的PendingEvent。

     类似资料:
    • 问题内容: 我正在使用Wget通过cron通过以下命令运行PHP脚本: 该脚本最多需要5-6分钟来进行处理。WGet是否会等待它并一直提供它所需的时间,还是会超时? 问题答案: 根据wget的手册页,有两个与超时有关的选项-默认读取超时为900s-所以我说是的,它可能会超时。 这是有问题的选项: 将网络超时设置为秒秒。这等效于同时指定, 和和 。 对于这三个选项: 将DNS查找超时设置为秒秒。 在

    • 问题内容: 你如何提示用户进行一些输入,但在N秒后超时? Google指向上与此有关的邮件线程,但似乎无法正常工作。无论是还是,发生超时的语句总是可以得到: 不知何故,除了失败。 问题答案: 你链接到的示例是错误的,并且异常实际上是在调用警报处理程序而不是读取块时发生的。最好试试这个:

    • 问题内容: 如果RPC没有超时机制,如果它试图调用已关闭服务器的RPC方法,该如何“杀死” RPC调用? 问题答案: 您可以使用渠道实施超时模式: 该会阻塞,直到返回或经过。

    • 问题内容: 我正在利用的魔力。 但是,我想知道是否有人玩过超时设置? 我知道这基本上是决定请求的本地时间,但是如果达到超时时间,它可以触发任何内容吗?还是只是停止听别人的回应? 通过阅读jQuery网站,我可以看到没有传递任何参数,因此这似乎是一种具有一种功能的简单设置。没关系 但是,如果超时,我想触发警报或某些功能。在这种情况下,我可以看到错误设置没有被触发。 这是我的片段: 有谁知道如何超时工

    • 您可以在下面的问题中看到:(liquibase-lock-reasons)当Liquibase操作中断时客户端Liquibase锁定,使Liquibase处于锁定状态。 我想知道是否有一种方法可以配置Liquibase,使其从列中的日期和时间自动检测这种情况。我想如果你已经拿着锁一个小时了--你应该把它叫做过期锁。

    • 问题内容: 具体来说,问题是编写这样的方法: 如果数据在“超时”毫秒内可用,则返回值与in.read()相同,否则为-2。在方法返回之前,所有产生的线程必须退出。 为避免自变量,此处的主题为java.io.InputStream,如Sun(任何Java版本)所记录。请注意,这并不像看起来那么简单。以下是Sun的文档直接支持的一些事实。 in.read()方法可能是不可中断的。 将InputStre