1. 程式人生 > >android5.0(Lollipop) BLE Central(Scanner)牛刀小試

android5.0(Lollipop) BLE Central(Scanner)牛刀小試

轉載請表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46482073

昨天寫了android L BLE Peripheral的簡單使用,今天講一下BLE Central的更新。

搞過android4.4的人肯定對BluetoothAdapter的startLeScan函式不會陌生,但是在android L已經棄用此介面,但是為了相容以前的版本,這個介面還是可以使用的。但是谷歌已經單獨拿出來android.bluetooth.le類來處理BLE的操作,所以我建議還是用最新的介面開發。如果想要相容L之前的版本,可以用 android.os.Build.VERSION.SDK_INT或者

android.os.Build.VERSION.RELEA加一個版本判斷就可以。下面就來正式認識一下BLE Scanner的更新。

在android L Central一共添加了6個scan的相關類(4個advertise相關類),這6個類把scan相關部分分得很細。按照上一篇Peripheral的思路,我們還是按照啟動scan流程來學習這個類。

1、關於判斷是否支援藍芽、支援BLE的程式碼我就不寫了,下面我只貼一下支援BLE centrial的程式碼:

mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
這句程式碼和Peripheral的getBluetoothLeAdvertiser基本類似,一般手機支援BLE都會支援Central,除非是本身就只是外設裝置。這個不難,我就不浪費時間了。

2、這裡就直接進入scan動作了,新的介面把scan分為了兩類,一種為:

    /**
     * Start Bluetooth LE scan with default parameters and no filters. The scan results will be
     * delivered through {@code callback}.
     * <p>
     * Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
     *
     * @param callback Callback used to deliver scan results.
     * @throws IllegalArgumentException If {@code callback} is null.
     */
    public void startScan(final ScanCallback callback) {
        if (callback == null) {
            throw new IllegalArgumentException("callback is null");
        }
        startScan(null, new ScanSettings.Builder().build(), callback);
    }
從函式你肯定就懂,這個是直接搜尋全部周圍peripheral裝置,當然這裡你要填寫callback,具體的我下面會講。

第二種為:

    /**
     * Start Bluetooth LE scan. The scan results will be delivered through {@code callback}.
     * <p>
     * Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
     *
     * @param filters {@link ScanFilter}s for finding exact BLE devices.
     * @param settings Settings for the scan.
     * @param callback Callback used to deliver scan results.
     * @throws IllegalArgumentException If {@code settings} or {@code callback} is null.
     */
    public void startScan(List<ScanFilter> filters, ScanSettings settings,
            final ScanCallback callback) {
        startScan(filters, settings, callback, null);
    }
這一種明顯屬於定製化的函數了,因為他需要我們輸入過濾條件。這裡的ScanFilter和ScanSettings又是兩個scan類,當然這兩個類的目的主要是為了有些人想單獨為某個產品開發應用,把過濾條件加上,比如DeviceName或者某個Service UUID等等,就可以搜尋出只針對特定Peripheral特性的裝置。

拿著兩個條件我們怎麼用呢,我給大家寫一點,大家可以參考我寫的自己新增:

// add a filter to only scan for advertisers with the given service UUID
        List<ScanFilter> bleScanFilters = new ArrayList<>();
        bleScanFilters.add(
                new ScanFilter.Builder().setServiceUuid(SAMPLE_UUID).build()
        );

        ScanSettings bleScanSettings = mBleScanSettingsBuilder.build();

        Log.d(TAG, "Starting scanning with settings:" + bleScanSettings + " and filters:" + bleScanFilters);

        // tell the BLE controller to initiate scan
        mBluetoothLeScanner.startScan(bleScanFilters, bleScanSettings, mBleScanCallback);
單獨看這兩個新的介面,可能有些人會迷惑,本來不久應該是這樣嗎?其實Andoid L之前,scan介面不是這樣的,它只有一下兩種
    @Deprecated
    public boolean startLeScan(LeScanCallback callback) 
@Deprecated
    public boolean startLeScan(final UUID[] serviceUuids, final LeScanCallback callback) 
你會發現,原來的scan只能通過service UUID去搜索,其他條件都不行,所以新版本的介面為我們定製應用提供了很大的便利。

3、搜尋完了,那就要拿到scan的callback了。在這裡,我就拿第一種格式來講。
ScanCallBack有三個回撥,當然callback也單獨是一個類,這裡我只講講對我們有用的 onScanResult(int callbackType, ScanResult result),為了大家理解,我直接給大家看看我搜索出來的結果:

<span style="font-size:14px;">callbackType:1
ScanResult{mDevice=B4:52:7E:9A:41:A8,mScanRecord=ScanRecord [mAdvertiseFlags=6,mServiceUuids=[00001804-0000-1000-8000-00805f9b34fb,
00001802-0000-1000-8000-00805f9b34fb,00001803-0000-1000-8000-00805f9b34fb,00000200-37cb-11e3-8682-0002a5d5c51b],
mManufacturerSpecificData={}, mServiceData={},mTxPowerLevel=0, mDeviceName=××××],mRssi=-43, mTimestampNanos=352640634804615}</span>
從這個結果可以看出來,現在scan返回的結果明顯增加了,其實從結果大家應該也能理解,第二種設定過濾的話會有哪些引數可以讓你去設定。

你看到這些結果你肯定暈了,這要怎麼拿出來,這就用到了Scan相關類的最後兩個類ScanResult和ScanRecord。這兩個類主要是用來解析你scan後資料的,我這裡也貼一點程式碼,大家如果是需要其他結果,可以參考一下:

        BluetoothDevice device = result.getDevice();
        Log.d(TAG, "Device name: " + device.getName());
        Log.d(TAG, "Device address: " + device.getAddress());
        Log.d(TAG, "Device service UUIDs: " + device.getUuids());

        ScanRecord record = result.getScanRecord();
        Log.d(TAG, "Record advertise flags: 0x" + Integer.toHexString(record.getAdvertiseFlags()));
        Log.d(TAG, "Record Tx power level: " + record.getTxPowerLevel());
        Log.d(TAG, "Record device name: " + record.getDeviceName());
        Log.d(TAG, "Record service UUIDs: " + record.getServiceUuids());
        Log.d(TAG, "Record service data: " + record.getServiceData());
這裡的result就是onScanResult(int callbackType, ScanResult result)的返回值。

4、最後一步就是stop,這個大家應該很熟了,用一個postdelay如下:

        // post a future task to stop scanning after (default:25s)
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                stopScanning();
            }
        }, DEFAULT_SCAN_PERIOD);
或者直接呼叫stop,這裡的stopScanning實現如下:
    private void stopScanning() {
        if (mBluetoothLeScanner != null) {
            Log.d(TAG, "Stop scanning.");
            mBluetoothLeScanner.stopScan(mBleScanCallback);
        }
    }

剩下的就是connectGatt了。這個和以前還是一樣的,目前沒有變化。

ok,對於google新新增的android.bluetooth.le這個package算是解析完了,接下來幾天就要看看android L系統裡是怎麼實現的了。


相關推薦

android5.0(Lollipop) BLE CentralScanner牛刀小試

轉載請表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46482073 昨天寫了android L BLE Peripheral的簡單使用,今天講一下BLE Central的更新。 搞過android4.4的

android5.0協調佈局CoordinatorLayout第二篇CollapsingToolbarLayout效果實現原理講解原理

上一篇中已經講解了CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout之間的關係,這一篇探索一下CollapsingToolbarLayout內部是怎麼實現的,不熟悉CoordinatorLayout、AppBarLa

android5.0協調佈局CoordinatorLayout第一篇CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout之間的關係詳解原理

首先從協調佈局最簡單的例子為入口開始分析,由淺到深,看效果圖: 此效果如果不用5.0以下的自定義的效果的話,相對麻煩很多,而用5.0的協調佈局的話只需要簡單的寫一個佈局檔案就搞定了,看佈局檔案程式碼 <android.support.design.widget.C

new BigDecimal(0.01) 與 new BigDecimal(String.valueOf(0.01))的區別

賬單 rto sta egerp 存在 調整 nan com mod 轉自:http://blog.csdn.net/major1985/article/details/50210293 一般我們使用BigDecimal進行比較精密的計算,我這裏計算金額。註意使用d

Hyperledger Fabric 1.0 從零開始——公網環境構建

1.3 項目 htm move 自己 lvm2 fast 情況 tor 1:環境構建 在本文中用到的宿主機環境是Centos ,版本為Centos.x86_647.2,通過Docker 容器來運行Fabric的節點,版本為v1.0。因此,啟動Fabric網絡中的節點需要先安

Hyperledger Fabric 1.0 從零開始——創建Fabric多節點集群

_id 測試 es2017 xtra 去掉 compose 多個 服務 執行命令 4:創建Fabric多節點集群 4.1、配置說明 首先可以根據官方Fabric自帶的e2e_cli列子中的集群方案來生成我們自己的集群,與案例不同的是我們需要把容器都分配到不同的服務器上,彼此

ASP.net core 2.0.0 中 asp.net identity 2.0.0 的基本使用

使用 相對路徑 註意 apps 模型視圖 hand getc 技術分享 star 開發環境:vs2017 版本:15.3.5 項目環境:.net framework 4.6.1 模板asp.net core 2.0 Web應用程序(模型視圖控制器) 身份

Apache Spark 2.2.0新特性介紹轉載

端到端 clas flat ket 性能 保序回歸 rime day 工作 這個版本是 Structured Streaming 的一個重要裏程碑,因為其終於可以正式在生產環境中使用,實驗標簽(experimental tag)已經被移除。在流系統中支持對任意狀態進行操作;

關於weblogic 10.3.6.0 的漏洞復現1

iter oid sch AD 成功 str context blog env 最近小R 搭建了個weblogic, 因為之前在公司找系統漏洞的時候,發現了這個漏洞,所以為了特地專門搭建了個10.3.6.0版本。 漏洞編號: CVE-2017-10271 漏洞的描述:就是

Asp.Net Core 2.0 項目實戰6Redis配置、封裝幫助類RedisHelper及使用實例

命名 redis數據庫 remove per chang open htm lazy 鏈接 本文目錄 1. 摘要 2. Redis配置 3. RedisHelper 4.使用實例 5. 總結 1. 摘要   由於內存存取速度遠高於磁盤讀取的特

區塊鏈之Hyperledger超級賬本Fabric v1.0 的環境搭建更新

mirror linu stat iyu wget glob 保存 url oba 參考鏈接:https://blog.csdn.net/so5418418/article/details/78355868 https://blog.csdn.net/wgh101539

spring boot 2.0 源碼分析

pen div shutdown down etc messages servle started fec 在上一篇文章中我們詳細分析了spring boot是如何準備上下文環境的,今天我們來看一下run函數剩余的內容。還是先把run函數貼出來: /**

0開始搭建網站1

能夠 應用 架構 但是 clear 分鐘 cin ecs 上傳 一共就五步 1.註冊域名 註冊域名很簡單,只要花錢就好了,也不貴,點靠姆的域名首年是45塊,最新出來的top域名首年10塊都不到,域名註冊請點擊,有圖有真相 2.購買空間 購買空間也比較

spring boot 2.0.3+spring cloud Finchley6、配置中心Spring Cloud Config

repo 相互 class AS 默認 分布式系 配置信息 上傳 RR Spring Cloud Config 是用來為分布式系統中的基礎設施和微服務應用提供集中化的外部配置支持,它分為服務端與客戶端兩個部分。其中服務端也稱為分布式配置中心,它是一個獨立的微服務應用,用來連

Asp.Net Core 2.0 項目實戰2NCMVC一個基於Net Core2.0搭建的角色權限管理開發框架

ML 用戶 解密 https redis json uil AI 不足 本文目錄 1. 摘要 2. 框架介紹 3. 權限管理之多一點說明 4. 總結 1. 摘要   NCMVC角色權限管理框架是由最近練習Net Core時抽時間整理的

android6.0指紋識別學習 --------阿冬專欄!!!

轉載自:http://blog.csdn.net/baniel01/article/details/51991764 在Android 6.0中google終於給android系統加上了指紋識別的支援,這個功能在iPhone上早就已經實現了,並且在很多廠商的定製的R

0開始學pyspark:使用pyspark.ml.clustering模組對商場顧客聚類

資料下載: 資料為kaggle上的關於商場客戶的資料,地址:https://www.kaggle.com/vjchoudhary7/customer-segmentation-tutorial-in-python 資料準備: 資料集很小,四個特徵值:性別,年齡,收入能力,消費

Redis3.0.4基礎操作

    安裝: Centos7,裝好GCC(yum install gcc),解壓redis.tar.gz ,進redis目錄,make   然後 makeinstall       1 ‘redis-serve

Python3.0 基礎系列教程目錄

準備寫一篇python的系列教程,目錄暫定如下,如果有更好的建議,麻煩下方留言,如無意外,大約一週2-3篇,敬請期待~ 環境安裝篇 下載並安裝Python3.0 第一個python程式 安裝整合開發環境ide 基礎知識篇 基本資料型別初識

0開始學架構複雜度來源:低成本、安全、規模

低成本 一般中小公司基本都是靠引入新技術來達到低成本的目標;而大公司更有可能自己去創造新的技術來達到低成本的目標,因為大公司才有足夠的資源、技術和時間去創造新技術。 安全 安全本身是一個龐大而又複雜的技術領域,並且一旦出問題,對業務和企業形象影響非常大。 從技術的角