1. 程式人生 > >Android實現一個apk連線兩個ble裝置

Android實現一個apk連線兩個ble裝置

宣告:程式碼基於網上某個小工程改的,如果涉及侵權,請聯絡本人,立馬刪除。

曾經做過一個小玩意,嘗試把兩個ble微控制器裝置都連在一個apk上,同時通訊。網上可以找到類似的,但我找到的程式碼不夠完整,還是自己折騰出來的,希望能幫到有需要的人。

思想簡單,一個BluetoothGatt結構管理一個device,兩個BluetoothGatt放在一個佇列裡:

private ArrayList<BluetoothGatt> connectionQueue = new ArrayList<BluetoothGatt>();
同時,另一個東西也要跟上來:裝置列表,如果不設個list,則後面可能搞不清是哪個device,導致一個裝置蓋了另一個:
private ArrayList<BluetoothDevice> mDeviceList = new ArrayList<BluetoothDevice>();
程式碼片段按照流程表示如下:
1 老一套,初始化:
    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
        Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
        finish();
    }

    // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to
// BluetoothAdapter through BluetoothManager. final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); // Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null
) { Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show(); finish(); return; } new Thread(new Runnable() { public void run() { if (mBluetoothAdapter.isEnabled()) { scanLeDevice(true); mScanning = true; }else { ... } } }).start();
...

2 掃描連線:
scanLeDevice--> mBluetoothAdapter.startLeScan(mLeScanCallback)-->mLeScanCallback:
private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {
            @Override
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord)
            {


                runOnUiThread(new Runnable()
                {
                    @Override
public void run()
                    {
                        if (!mDeviceContainer.isEmpty())
                        {
                            if(!isEquals(device))
                            {
                                mDeviceList.add(device);//新增到裝置列表,原始碼中少了這句,導致後連線的裝置蓋了前面的裝置
                                connectBle(device);//新增gatt到列表
                            }
                        }else
{
                            mDeviceList.add(device);
                            connectBle(device);

                        }
                    }
                });
            }
        };
private void connectBle(BluetoothDevice device) {
    mDeviceContainer.add(device);
    while (true) {
        if (mBluetoothLeService != null) {
            mBluetoothLeService.connect(device.getAddress()); //real connect
            break;
        } else {
            ...
        }
    }
}
public boolean connect(final String address) {
   ...
    

    BluetoothGatt bluetoothGatt;
    bluetoothGatt = device.connectGatt(this, false, mGattCallback);
    if(checkGatt(bluetoothGatt)){
        connectionQueue.add(bluetoothGatt);
    }
    
    ...
    return true;
}
	經過以上處理,多個device才算是較完善地進入apk的管理佇列中了。後續的處理基本都是要麼以gatt為輸入做處理,要麼有裝置名字,所以這時候基本就不
需要特別考慮是哪個裝置了,比如findService(BluetoothGatt gatt)這樣的,多個裝置的管理在此之前處理,因為這時 輸入已經是某個具體的gatt了。在我的小程式裡,
有個顯示不同裝置的框,這裡我根據devicelist的名字的區別在BroadcastReceiver()做了處理:
...
if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action))
{
String data = intent.getStringExtra(BluetoothLeService.EXTRA_DATA);


   if(strName.contains("NO.1"))
    {
display(str1);
}
else
{
display(str2);
}
...
搞法比較土,還好可以用,呵呵。
3 斷開連線:
 public void disconnect() {
        if (mBluetoothAdapter == null || connectionQueue.isEmpty()) 
{
...
        }
//        mBluetoothGatt.disconnect();
for(BluetoothGatt bluetoothGatt:connectionQueue){
            bluetoothGatt.disconnect();
        }
    }
如果涉及到close等處理,也要把所有佇列的東西該關閉的都關了。
還不熟悉編輯程式碼和文字的混合體。。。

相關推薦

Android實現一個apk連線ble裝置

宣告:程式碼基於網上某個小工程改的,如果涉及侵權,請聯絡本人,立馬刪除。 曾經做過一個小玩意,嘗試把兩個ble微控制器裝置都連在一個apk上,同時通訊。網上可以找到類似的,但我找到的程式碼不夠完整,還是自己折騰出來的,希望能幫到有需要的人。 思想簡單,一個Bluetooth

python ——佇列實現一個棧&實現一個佇列

1、兩個佇列實現一個棧 進棧:元素入佇列A 出棧:判斷如果佇列A只有一個元素,則直接出隊。否則,把隊A中的元素出隊併入隊B,直到隊A中只有一個元素,再直接出隊。為了下一次繼續操作,互換隊A和隊B。 python實現如下: class StackWithTwoQueues(object

05、實現一個佇列,佇列實現一個

題目描述: 1. 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 2. 用兩個佇列來實現一個棧,完成棧的Push和Pop操作。 佇列中的元素為int型別。 解題思路: 1. 入隊時,直接壓入stack1中;出隊時,判斷stack2是

實現一個佇列,佇列實現一個

1、兩個棧實現一個佇列            入隊時,直接壓入stack1中。            出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素。 //入隊操作 void EnQu

實現一個佇列&用佇列實現一個

做題之前,我們先來回顧一下“棧和佇列的相同點以及不同點”,便於做題時的應用!1.區別與聯絡相同點:(1)棧和佇列都是控制訪問點的線性表;              (2)棧和佇列都是允許在端點處進行資料的插入和刪除的資料結構;不同點:(1)棧遵循“後進先出(LIFO)”的原則

qt-一個連線介面

在實際開發中,肯定不會是一個介面寫到死,都是會新新增一些介面來使用, 昨天弄了一下,如果不是通過一個介面工程來建立一整套class+ui的話,在一個class中呼叫別的ui還是很麻煩的, 首先我們建立一個介面。 建立新建檔案->qt->Qt d

實現一個佇列以及佇列實現一個棧(Java)

兩個棧實現一個佇列 import java.util.Stack; public class Demo07 { Stack<Integer> stack1 = new Sta

linux下socket程式設計實現一個伺服器連線客戶端

使用socekt通訊一般步驟     1)伺服器端:socker()建立套接字,繫結(bind)並

ROIPooling的意義?全連線層輸入需要固定尺度?全連線層的實現?為什麼需要連線層?

ROIPooling的作用,就是resize到統一尺寸,這樣才能利用預訓練的全連線層引數,大多是7*7大小, 這是因為全連結層需要固定的輸入尺寸.那麼為什麼需要固定尺寸呢? 全連線層的計算其實相當於輸入的特徵圖資料矩陣和全連線層權值矩陣進行內積 以vgg16,512*7*7

Android Studio 一個工程打包多不同包名的APK

公司最近有個特別的需求,同一套程式碼,稍做修改(如包名不一樣,圖示不一樣,應用名不一樣等),編譯出幾個不同的應用。剛好用AS重構完專案,在網上查閱了一些資料,終於搞定!!在這記錄一下。 AS主要是利用gradle來實現這個需求的,具體做法如下: 修改ap

實現佇列和用佇列實現一個

題目:用兩個棧實現一個佇列。佇列的生命如下,請實現它的兩個函式appendTail和deleteHead,分別完成在佇列尾部插入結點和在佇列頭部刪除結點的功能。 template <typename T>class CQueue { public:   C

SSM專案實現連線mysql資料庫

最近做專案需要用到另一個數據庫的內容,多方查詢終於實現了功能。 我們都知道,在SSM框架中,我們在applicationContext.xml配置檔案中新增資料來源就可以實現資料庫增刪改查,但是隻能連線一個數據庫,這個時候我們就要從spring提供的原始碼下手看看有沒有有關

android、Java下判斷String是否相等 、EditText輸入是否為空,限定輸入數字的實現 總結

              str1.equals(str2)來判斷,不能用==或者!=來判斷,原因: 因為String是引用型別的,不是基本資料型別,所以它們的比較是使用地址和值(相當於C中的指標)來比較的,因為它們是不同的物件,有不同的地址,所以str1!=str2永遠

SpringMVC配置雙資料來源,一個java專案同時連線資料庫

資料來源在配置檔案中的配置 [java] view plain copy  print? <pre name=“code”class=“java”><?xml version=“1.0” encoding=“UTF-8”?>   <beans xml

spring容器注入一個介面的實現

spring容器中能擁有兩個同種型別的bean嗎?我有兩個dao類同時實現一個介面,這兩個介面注入時報了異常如下。 org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique be

Android實現一個自己定義相機的界面

content pic 圖片 log das img lis boolean xtend 我們先實現拍照button的圓形效果哈。Android開發中,當然能夠找美工人員設計圖片,然後直接拿進來。只是我們能夠自己寫代碼實現這個效果哈。最經常使用的的是用layout-

IOS 在一個應用裏打開另一個應用 及其 應用互相調用

程序 get cocos cat mark fin 屬性列表 RKE forkey 在IOS應用中打開另外一個應用的解決方案 最近要在IOS中實現一個應用啟動另外一個應用的功能,搜了一些資料,使用UIApplication的openURL:的方法就能實現,現在整理和大家分

關於偽類選擇器中一個冒號和冒號的區別

fault 兼容 content 中一 radi view get top AD 只要兼容現代瀏覽器如 webkit、firefox、opera等瀏覽器,對於偽元素采用雙冒號的寫法,要是非要兼容IE瀏覽器,用CSS2的單冒號寫法比較安全。 首先,閱讀 w3c 對兩者的定義:

apache實現一個域名訪問多服務器問題與解決

csdn 文件中 2.4 apache2.2 kill 如果 進行 域名 命令行啟動 1. apache安裝後no service install解決辦法 在在運行中鍵入:cmd ,出來DOS窗口 切換到apache所在目錄的bin文件夾, cd\apache\bin 運