1. 程式人生 > >Unity實現Android源生平臺藍芽BLE4.0資料傳輸(三)

Unity實現Android源生平臺藍芽BLE4.0資料傳輸(三)

上篇我說到如何開啟系統藍芽 掃描裝置 連線 具體連線我們在這裡說

 AndroidJavaObject wfzBluetoothGattCallback = new AndroidJavaObject("com.wfz.bletounity.WFZBluetoothGattCallback”);//連線的事件回撥物件
        BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback();//unity事件回撥介面的實現類

//特徵值資料變化的事件委託
        bluetoothGattCallback.onCharacteristicChangedDelegate = (g, c) =>
        {
            var data = c.Call<byte[]>("getValue");
            string d = "";
            for (int i = 0; i < data.Length; i++)
            {
                d += data[i];
            }
            Debug.Log(d);
        };

//裝置連線狀態變化的事件委託
        bluetoothGattCallback.onConnectionStateChangeDelegate = (g, s, n) =>
        {
            switch (n)
            {
                case 0:
                    Debug.Log("斷開連線");
                    break;
                case 1:
                    Debug.Log("連線中");
                    break;
                case 2:
                    Debug.Log("連線成功");

                    Debug.Log("獲取到gatt物件"+g.Call<AndroidJavaObject>("getDevice").Call<string>("getName"));
                   var isFind= g.Call<bool>("discoverServices");
                    break;
                case 3:
                    Debug.Log("斷開中");
                    break;
                default:
                    break;
            }
        };
//發現裝置服務事件委託
        bluetoothGattCallback.onServicesDiscoveredDelegate = (g, c) =>
        {
          var  gattServices = g.Call<AndroidJavaObject>("getServices");
            Debug.Log("發現新服務..." + gattServices.Get<int>("size"));

            if (gattCharacteristic==null)
            {
                gattCharacteristic = GetCharacteristic(GetService(g, serviceID), characteristicID);
                NotificationData(g, gattCharacteristic, descriptorID);
            }
        };

回撥物件寫好了我們就可以連線裝置了

wfzBluetoothGattCallback.Call("AddUnityCallback", bluetoothGattCallback);//把實現的介面新增到回撥物件
        buetoothGatt = device.Call<AndroidJavaObject>("connectGatt", AndroidCall.unityActivity, true, wfzBluetoothGattCallback);//開始連線
下面是獲取服務 特徵值的函式實現
  /// <summary>
    /// Gets the service.
    /// </summary>
    /// <returns>The service.</returns>
    /// <param name="gatt">Gatt.</param>
    /// <param name="uuid">UUID.</param>
    public AndroidJavaObject GetService(AndroidJavaObject gatt, string uuid)
    {
        return gatt.Call<AndroidJavaObject>("getService", ToAndroidUUID(uuid));
    }

    /// <summary>
    /// Gets the characteristic.
    /// </summary>
    /// <returns>The characteristic.</returns>
    /// <param name="Service">Service.</param>
    /// <param name="uuid">UUID.</param>
    public  AndroidJavaObject GetCharacteristic(AndroidJavaObject Service,string uuid)
    {
        return Service.Call<AndroidJavaObject>("getCharacteristic", ToAndroidUUID(uuid));
    }


開啟特徵值的通知
  /// <summary>
    /// Notifications the data.
    /// </summary>
    /// <param name="gatt">Gatt.</param>
    /// <param name="characteristic">Characteristic.</param>
    /// <param name="uuid">UUID.</param>
    public void NotificationData(AndroidJavaObject gatt,AndroidJavaObject characteristic,string uuid)
    {
        var b = gatt.Call<bool>("setCharacteristicNotification", characteristic, true);
        if (b)
        {
            var bluetoothGattDescriptor = new AndroidJavaClass("android.bluetooth.BluetoothGattDescriptor");
            var descriptor= characteristic.Call<AndroidJavaObject>("getDescriptor",ToAndroidUUID(uuid));

            var  isSet=  descriptor.Call<bool>("setValue", bluetoothGattDescriptor.GetStatic<byte[]>("ENABLE_NOTIFICATION_VALUE"));
            if (isSet)
            {
                var iSwrite=  gatt.Call<bool>("writeDescriptor", descriptor);
                if (iSwrite)
                {
                    Debug.Log("開啟特性通知");
                }
            }
        }
    }
開啟通知之後 就可以在onCharacteristicChanged 事件裡面獲取到傳送過來的資料了

有問題的朋友可以關注我的微信訂閱號給我留言



相關推薦

Unity實現Android生平BLE4.0資料傳輸()

上篇我說到如何開啟系統藍芽 掃描裝置 連線 具體連線我們在這裡說 AndroidJavaObject wfzBluetoothGattCallback = new AndroidJavaObject("com.wfz.bletounity.WFZBluetoothGat

androidble4.0開發

1、許可權配置 AndroidManifest.xml裡配置,“android:required="true"表示apk只有在具有bluetooth_le屬性的系統裡執行。 <uses-feature android:name="android.hardwa

AndroidBLE4.0踩過的坑

一直都負責專案的藍芽模組,期間踩過很多坑,說出來跟大家分享一下。 1. 從簡單的開始,首先是許可權的問題,在Android6.0以上,部分機型需要開啟定位許可權,部分機型需要同時開啟GPS。所以使用藍芽之前,你可以動態申請定位許可權,或者直接將targetSdkVersio

android 4.0 分包傳輸資料 問題

最近一直被這個藍芽4.0資料傳輸問題的困擾,安卓版本這麼多,發現一樣的資料傳輸程式碼在不同手機上效果截然不同。 目前發現在5.1的系統上,藍芽4.0每次傳送256byte資料可行,但是在4.4的系統上每次傳輸資料最多為20byte。 下次傳輸時還未到BLE的

一文讀懂低功耗BLE4.2 資料

BLE = BTLE = Bluetooth Low Energy (低功耗藍芽) 1. 怎樣抓取(偵聽)BLE4.2 空中資料包 (全頻道抓取:37,38,39 同時)    * 硬體:           1) 一臺BLE4.2 裝置 (如: Nordic 52832,

如何設定CC2541的資料傳輸速率?-TI論壇的問答

檢視http://www.ti.com.cn/cn/lit/ug/swru191e/swru191e.pdf 296頁 通過MDMCTRL0.MODULATION 來設定 BLE data rate 是固定在1MBps的。如果您要使用其他 data rate 需要在 proprietary 模式下。

nRF52832 — 提高BLE的資料傳輸速率

文章出處:可不可以不取名(轉載文章,如有不妥,通知後我會立即刪除)講解2點:       為什麼 nordic的4.0協議棧中ble只能傳送20位元組的應用負載資料。       大量資料傳送時如何提高發送速率1:為何上層應用負載每次最多20位元組首先了解 4.0中鏈路層的包

Android開發之通過耳機實現訊飛語音識別的功能

近階段在開發一款app,實現通過藍芽耳機進行訊飛語音識別,獲取識別結果之後再通過語音合成從藍芽耳機播報出識別結果。上網也查了很多資料,大多是說通過一下兩行程式碼:      mAudioManager.setBluetoothScoOn(true);           

Android 4.0實現,自動匹配裝置

        今天開始寫部落格來記錄我的工作學習成長,作為一個初學者,近期的一個工作是通過Android藍芽4.0來實現與藍芽裝置的資料交換,下面就通過程式碼和文字來解釋一下整個過程。         首先我要說明的是,我再專案中使用了一個開源庫,我覺得不錯,所有程式碼都

android ble 4.0多機通訊客戶端實現

自從進入軟體開發行業,都是一直在CSDN上索取無數資料,一直沒有貢獻過,今天突然想寫點什麼,第一次寫,寫點簡單的吧,不知道有沒有人看。 藍芽從4.0開始,支援了多裝置通訊,android 4.3開始支援了藍芽4.0,即 android ble關於ble 網上資料很多,也講的

Android如何監聽耳機的按鍵事件

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android命令列下使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android進階3step2:Android App通訊——經典通訊

  Android經典藍芽案例   - 一、Android中藍芽裝置的使用 - 1.藍芽許可權 - 2.藍芽功能開啟 - 3.搜尋藍芽裝置 - 4.建立RFCOMM通道 - 5.藍芽裝置雙向資料傳輸 1.開啟藍芽許可權:And

Android開發之低功耗(4.0)開發全記錄

主要內容概況 前面我記錄了開發藍芽2.0的過程,今天準備介紹現在的主流藍芽技術,藍芽4.0的開發,該藍芽技術是在Android4.3(API級別18)版本引入的API。 官方文件 具體的區別主要以下幾點: 1.新的藍芽技術提供了連線服務的方法,以前是沒有提供連線藍芽的方法

Android開發之經典2.0)開發全記錄

前言部分 最近因為需要開始藍芽相關開發,所以在網上搜索了很多內容,並且結合自己的開發過程做了一個總結,先儲備上,也許可能幫到正在做藍芽開發的同學。 藍芽很早就是android裝置上基本通訊功能了,只是以前的沒有那麼多藍芽裝置,現在藍芽裝置種類繁多,所以經常會有人遇到藍芽相關的開發

Android BLE4.0開發—Android手機與BLE終端通訊

轉載自: https://blog.csdn.net/fu908323236/article/details/76208997 這篇部落格主要講解AndroidBLE藍芽4.0的基本概念,以及基礎用法。  BLE 即 Bluetooth Low Energy,藍芽低功耗技術,是藍芽

Android連續的獲取的RSSI

 基於藍芽的RSSI可以有很多應用,要獲得藍芽的RSSI無外乎兩種方法,一種就是基於掃瞄的方法,優點是Android本身支援,缺點是scan的時間比較長,並且中間過程不受控制,為了連續的測量,需要不斷的scan;第二種就是,基於連線的方法,前提是要建立兩個藍芽裝置的連線後,再測量RSSI,

安卓4.0以上連線多裝置並接收裝置資料

前沿: 在我之前寫的程式碼中都沒有實現藍芽連線多個裝置,由於時間的原因沒有進行更改。 iOS端實現 藍芽多個連線確實比安卓的方便,本身利用官方的Demo就可以實現多臺連線,只不過自己利用view加以區分就可以。 到此藍芽4.0之前是通過scoket連線多臺

Android4.0 關閉重開無法根據地址連線問題

在藍芽專案的末尾,在個別手機上出來,手動關閉手機藍芽,和再次啟動,開啟app發現無法連線上,經過檢視log最後確定錯誤是: onClientConnectionState()- status=133 clientIf=5 device=地址 133的一個錯誤,前面試過很

Android獲取本機地址

從Android6.0開始,通過BluetoothAdapter.getDefaultAdapter().getAddress()獲取的地址是一個固定值02:00:00:00:00:00,部分從低版本