AndroidStudio_android藍(lán)牙開發(fā)總結(jié)_連接硬件設(shè)備_測量_血壓(安卓藍(lán)牙測試)

關(guān)于硬件設(shè)備的藍(lán)牙連接一般都有給的demo,一般情況下按照demo去寫就可以了,但是實(shí)際情況下,

有時(shí)候,實(shí)際應(yīng)用,要比demo要復(fù)雜一些,比如設(shè)備使用過程中,直接就斷開,斷電等異常情況比較多.

我看網(wǎng)上處理藍(lán)牙操作,有主動(dòng)連接硬件設(shè)備的,這樣的連接方式應(yīng)該穩(wěn)定一些,因?yàn)槲疫@邊用,藍(lán)牙掃描的方式,實(shí)現(xiàn)了

所以我就沒有再去改代碼,看了一下網(wǎng)上的代碼,也沒有太難,記錄一下自己的實(shí)現(xiàn)方式,以后可以復(fù)制粘貼使用.

實(shí)現(xiàn)方式:藍(lán)牙要先開啟,然后,程序去掃描附近藍(lán)牙設(shè)備,如果找到的藍(lán)牙設(shè)備中,發(fā)現(xiàn)有和自己提前設(shè)置的mac地址

一樣的就主動(dòng)去連接這個(gè)設(shè)備,就相當(dāng)于找到這個(gè)設(shè)備了,然后就可以去操作設(shè)備了.

android中使用藍(lán)牙的時(shí)候,需要引入藍(lán)牙使用權(quán)限:

需要在AndroidManifest.xml 文件中添加藍(lán)牙權(quán)限 <!--藍(lán)牙權(quán)限--> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

AndroidStudio_android藍(lán)牙開發(fā)總結(jié)_連接硬件設(shè)備_測量_血壓(安卓藍(lán)牙測試)

然后,如果對(duì)接的硬件,還需要其他權(quán)限,會(huì)有說明文檔,也需要添加上

然后需要定義些,藍(lán)牙需要的變量

0.定義藍(lán)牙相關(guān)變量

private String mac_address=""; private BluetoothAdapter bluetoothAdapter; private BluetoothGatt mBluetoothGatt; private BluetoothGattService bluetoothGattService; private BluetoothGattCharacteristic writeCharacteristic; private BluetoothGattCharacteristic notifyCharacteristic; private ReentrantLock commLock =new ReentrantLock(); private BluetoothDevice currentDevice;

AndroidStudio_android藍(lán)牙開發(fā)總結(jié)_連接硬件設(shè)備_測量_血壓(安卓藍(lán)牙測試)

1.然后,去初始化藍(lán)牙,這個(gè)在onCreate方法中調(diào)用,就可以了.

private void lk_xyj_initBloodPressure() { bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { Toast.makeText(this, "說明此設(shè)備不支持藍(lán)牙操作", Toast.LENGTH_LONG).show(); return; } }

AndroidStudio_android藍(lán)牙開發(fā)總結(jié)_連接硬件設(shè)備_測量_血壓(安卓藍(lán)牙測試)

2.然后再去,搜索設(shè)備

//1.搜索樂康血壓計(jì) private void lk_xyj_searchDevice() { // 注冊(cè)Receiver來獲取藍(lán)牙設(shè)備相關(guān)的結(jié)果 IntentFilter intent = new IntentFilter("android.bluetooth.device.action.UUID"); intent.addAction(BluetoothDevice.ACTION_FOUND); // 用BroadcastReceiver來取得搜索結(jié)果 intent.addAction(BluetoothDevice.EXTRA_UUID); intent.addAction(BluetoothDevice.ACTION_UUID); intent.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); intent.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); intent.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(lk_xyj_searchDevices, intent); bluetoothAdapter.startDiscovery(); BaseApplication.context().showDialog(FaceBodyCheckActivity.this, "正在連接設(shè)備..."); }

AndroidStudio_android藍(lán)牙開發(fā)總結(jié)_連接硬件設(shè)備_測量_血壓(安卓藍(lán)牙測試)

可以看到上面,注冊(cè)了一個(gè)廣播接收器,來接收藍(lán)牙的信息

注冊(cè)完藍(lán)牙廣播接收器,以后然后bluetoothAdapter,startDiscovery() 這個(gè)是開啟藍(lán)牙掃描

3.然后看到藍(lán)牙掃描中

//2.樂康血壓計(jì)搜索,廣播類 private BroadcastReceiver lk_xyj_searchDevices = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(BluetoothDevice.ACTION_FOUND)) { //found device currentDevice = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);// BluetoothDevice device = intent// .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (mac_address.equals(currentDevice.getAddress())) { bluetoothAdapter.cancelDiscovery(); mBluetoothGatt = currentDevice.connectGatt(FaceBodyCheckActivity.this, false, lk_xyj_GattCallback); } } else if (BluetoothDevice.ACTION_UUID.equals(action)) { currentDevice = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);// BluetoothDevice device = intent// .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (mac_address.equals(currentDevice.getAddress())) { bluetoothAdapter.cancelDiscovery(); mBluetoothGatt = currentDevice.connectGatt(FaceBodyCheckActivity.this, false, lk_xyj_GattCallback); } } } };

AndroidStudio_android藍(lán)牙開發(fā)總結(jié)_連接硬件設(shè)備_測量_血壓(安卓藍(lán)牙測試)

這個(gè)方法,是只要收到藍(lán)牙的廣播信息就走這個(gè)方法,并且,會(huì)把當(dāng)前掃描的藍(lán)牙設(shè)備賦值給currentDevice 然后獲取currentDevice的mac地址

然后判斷這個(gè)掃描到的設(shè)備的mac和我們要連接的設(shè)備的mac是否一樣,如果一樣,就取消bluetoothAdapter.cancelDiscovery() 取消藍(lán)牙繼續(xù)掃描

然后,去連接這個(gè)設(shè)備currentDevice.connectGatt(FaceBodyCheckActivity.this,false,lk_xyj_GattCallback);

這個(gè)是去連接,掃描到的這個(gè)藍(lán)牙設(shè)備,連接以后,去回調(diào),lk_xyj_GattCallback這個(gè)對(duì)象.

4.然后連接設(shè)備以后的回調(diào)

//3.樂康血壓計(jì),handler類 Handler lk_xyj_mainHandler = new Handler(); private BluetoothGattCallback lk_xyj_GattCallback = new BluetoothGattCallback() { // 這里有9個(gè)要實(shí)現(xiàn)的方法,看情況要實(shí)現(xiàn)那些,用到那些就實(shí)現(xiàn)那些 //當(dāng)連接狀態(tài)發(fā)生改變的時(shí)候 @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, final int newState) { mBluetoothGatt.discoverServices(); lk_xyj_mainHandler.post(new Runnable() { @Override public void run() { if (newState == BluetoothProfile.STATE_CONNECTED) { BaseApplication.context().closeDialog(); ToastUtils.toast(FaceBodyCheckActivity.this,"設(shè)備啟動(dòng)成功"); } else { Toast.makeText(FaceBodyCheckActivity.this, "設(shè)備連接已斷開", Toast.LENGTH_SHORT).show(); } } }); }; //回調(diào)響應(yīng)特征寫操作的結(jié)果。 @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { System.out.println(222222); } ; //回調(diào)響應(yīng)特征讀操作的結(jié)果。 @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { System.out.println(3333333); } //當(dāng)服務(wù)被發(fā)現(xiàn)的時(shí)候回調(diào)的結(jié)果 @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { try { //設(shè)置serviceUUID,原型是:BluetoothGattService bluetoothGattService = bluetoothGatt.getService(UUID.fromString(SERVICESUUID)); bluetoothGattService = mBluetoothGatt.getService(UUID.fromString(DeviceFinal.LK_XYJ_SERVICESUUID)); //設(shè)置寫入特征UUID,原型是:BluetoothGattCharacteristic writeCharacteristic = bluetoothGattService.getCharacteristic(UUID.fromString(WRITEUUID)); writeCharacteristic = bluetoothGattService.getCharacteristic(UUID.fromString(DeviceFinal.LK_XYJ_WRITEUUID)); //設(shè)置監(jiān)聽特征UUID,原型是:BluetoothGattCharacteristic notifyCharacteristic = bluetoothGattService.getCharacteristic(UUID.fromString(NOTIFYUUID)); notifyCharacteristic = bluetoothGattService.getCharacteristic(UUID.fromString(DeviceFinal.LK_XYJ_NOTIFYUUID)); //開啟監(jiān)聽 boolean re = gatt.setCharacteristicNotification(notifyCharacteristic, true); System.out.println(re); } catch (Exception e) { e.printStackTrace(); lk_xyj_mainHandler.post(new Runnable() { @Override public void run() { ToastUtils.toast(FaceBodyCheckActivity.this,"所選設(shè)備不是血壓計(jì),請(qǐng)確認(rèn)后再試!");// xyj_start.setVisibility(View.GONE);// xyj_sub.setVisibility(View.GONE);// lk_xyj_msg.setText("所選設(shè)備不是血壓計(jì),請(qǐng)確認(rèn)后再試!"); } }); } } //接受數(shù)據(jù)回調(diào) @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { byte[] value = characteristic.getValue(); final String str = lk_xyj_bytesToHex(value); System.out.println(lk_xyj_bytesToHex(value)); lk_xyj_mainHandler.post(new Runnable() { @Override public void run() { if (str.indexOf("0240dd0200") != -1) { BigInteger amount = new BigInteger(String.valueOf(str.charAt(10)) String.valueOf(str.charAt(11)), 16);// lk_xyj_msg.setText(amount ""); lk_xyj_subTempData(amount.intValue()); } else if (str.indexOf("0240dd0c") != -1) { String sb = String.valueOf(str.charAt(12)) String.valueOf(str.charAt(13)); String db = String.valueOf(str.charAt(16)) String.valueOf(str.charAt(17)); String pr = String.valueOf(str.charAt(24)) String.valueOf(str.charAt(25)); BigInteger SBPvalue = new BigInteger(sb, 16); BigInteger DBPvalue = new BigInteger(db, 16); BigInteger PRPvalue = new BigInteger(pr, 16); if (!sb.equals("ff")) { lk_xyj_spvalue=SBPvalue ""; lk_xyj_dpvalue=DBPvalue ""; lk_xyj_prvalue=PRPvalue "";// lk_xyj_sp.setText(SBPvalue "");// lk_xyj_dp.setText(DBPvalue "");// lk_xyj_pr.setText(PRPvalue ""); //xyj_sub.setVisibility(View.VISIBLE); //發(fā)送血壓數(shù)據(jù) lk_xyj_subData(); } else { String err = String.valueOf(str.charAt(24)) String.valueOf(str.charAt(25)); String errStr = ""; switch (new BigInteger(err, 16).intValue()) { case 1: errStr = "傳感器震蕩異常"; break; case 2: errStr = "檢測不到足夠的心跳或算不出血壓"; break; case 3: errStr = "測量結(jié)果異常"; break; case 4: errStr = "袖帶過松或漏氣(10 秒內(nèi)加壓不到 30mmHg)"; break; case 5: errStr = "氣管被堵住"; break; case 6: errStr = "測量時(shí)壓力波動(dòng)大"; break; case 7: errStr = "壓力超過上限"; break; case 8: errStr = "標(biāo)定數(shù)據(jù)異常或未標(biāo)定"; break; default: errStr = "血壓計(jì)異常"; } Toast.makeText(FaceBodyCheckActivity.this, errStr, Toast.LENGTH_LONG).show(); Toast.makeText(FaceBodyCheckActivity.this, "請(qǐng)重新測量", Toast.LENGTH_LONG).show();// lk_xyj_msg.setText(errStr); } } } });// System.out.println("ReceiveSuccess" new BytesHexStrTranslate().bytesToHexFun1(value)); } //當(dāng)連接能被被讀的操作 @Override public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { super.onDescriptorRead(gatt, descriptor, status); System.out.println(555555); } };

AndroidStudio_android藍(lán)牙開發(fā)總結(jié)_連接硬件設(shè)備_測量_血壓(安卓藍(lán)牙測試)

可以看到上面回調(diào)函數(shù)就可以判斷設(shè)備連接成功還是連接失敗.

并且連接成功以后,如果收到藍(lán)牙的測量數(shù)據(jù)會(huì)回調(diào)對(duì)應(yīng)的方法.

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

(0)
上一篇 2023年5月13日 上午10:43
下一篇 2023年5月13日 上午10:59

相關(guān)推薦

  • 科研項(xiàng)目研究方法和步驟

    科研項(xiàng)目研究方法和步驟 科研項(xiàng)目是科學(xué)研究的一個(gè)重要組成部分,它可以幫助我們深入了解研究對(duì)象,并為未來的決策提供依據(jù)。在科研項(xiàng)目中,研究方法和步驟是非常重要的,它們可以幫助我們更好…

    科研百科 2025年4月19日
    3
  • 投后項(xiàng)目管理系統(tǒng)開源

    投后項(xiàng)目管理系統(tǒng)開源:為項(xiàng)目經(jīng)理和團(tuán)隊(duì)提供高效協(xié)作工具 近年來,隨著企業(yè)競爭加劇和業(yè)務(wù)增長的迅速,項(xiàng)目管理變得更加復(fù)雜和重要。傳統(tǒng)的手動(dòng)管理方式已經(jīng)無法滿足現(xiàn)代項(xiàng)目管理的需求,因此…

    科研百科 2025年6月19日
    5
  • 清華大學(xué)暑期科研項(xiàng)目

    清華大學(xué)暑期科研項(xiàng)目 清華大學(xué)作為我國頂尖的高等教育機(jī)構(gòu)之一,一直致力于推動(dòng)學(xué)術(shù)研究和科技創(chuàng)新。今年,清華大學(xué)的暑期科研項(xiàng)目吸引了來自全球各地的頂尖學(xué)者和研究人員,共同探索前沿研究…

    科研百科 2024年10月11日
    8
  • 科研項(xiàng)目有沒有原始數(shù)據(jù)

    科研項(xiàng)目有沒有原始數(shù)據(jù)是衡量一個(gè)項(xiàng)目成功與否的關(guān)鍵因素之一。原始數(shù)據(jù)是指未經(jīng)過處理、加工或篡改的數(shù)據(jù),可以提供項(xiàng)目研究的重要信息,幫助研究人員更好地理解項(xiàng)目的結(jié)果和發(fā)現(xiàn)。然而,在一…

    科研百科 2025年2月4日
    2
  • 東方理工聯(lián)培值得讀嗎

    東方理工聯(lián)培值得讀嗎? 近年來,隨著國內(nèi)高等教育的快速發(fā)展,許多高校為了提高其在國際上的競爭力,紛紛開始推出聯(lián)培計(jì)劃。其中,東方理工聯(lián)培是指由中國的一所著名高校和日本的一所著名高校…

    科研百科 2024年10月1日
    9
  • 曲阜師范社會(huì)實(shí)踐申請(qǐng)表

    曲阜師范社會(huì)實(shí)踐申請(qǐng)表 尊敬的領(lǐng)導(dǎo): 我是XXX,是曲阜師范大學(xué)的一名學(xué)生。我希望能夠申請(qǐng)參加社會(huì)實(shí)踐活動(dòng),為當(dāng)?shù)刈龀鲐暙I(xiàn)。 本次社會(huì)實(shí)踐活動(dòng)的目的是通過實(shí)踐,讓學(xué)生了解當(dāng)?shù)厣鐣?huì),…

    科研百科 2024年10月24日
    2
  • 低代碼開發(fā)能力測評(píng)怎么考

    低代碼開發(fā)能力測評(píng)是一種評(píng)估開發(fā)人員在低代碼開發(fā)環(huán)境下的技能和能力的方法。隨著低代碼開發(fā)平臺(tái)的興起,越來越多的企業(yè)開始采用低代碼開發(fā)來快速構(gòu)建應(yīng)用程序。而對(duì)于企業(yè)來說,擁有一支具備…

    科研百科 2024年3月2日
    148
  • 注安網(wǎng)上報(bào)名8月開始!還不快進(jìn)網(wǎng)報(bào)模擬系統(tǒng)演練一下?!#注安(注安網(wǎng)上報(bào)名流程)

    注安網(wǎng)上報(bào)名8月開始,快進(jìn)網(wǎng)報(bào)模擬系統(tǒng)演練一下吧! 7月已經(jīng)過半,大家都知道8月有一個(gè)很重要的事情,就是2023年中級(jí)注冊(cè)安全工程師報(bào)名就要開始了。注安師報(bào)名總感覺有一絲緊張的氣氛…

    科研百科 2023年8月30日
    237
  • 車輛管理系統(tǒng)項(xiàng)目合作書

    車輛管理系統(tǒng)項(xiàng)目合作書 尊敬的項(xiàng)目經(jīng)理: 我們榮幸地邀請(qǐng)您參與我們的車輛管理系統(tǒng)項(xiàng)目。該項(xiàng)目旨在開發(fā)一個(gè)高效、可靠、易于使用的系統(tǒng),以提高我們的車輛管理和運(yùn)營效率。我們相信您的專業(yè)…

    科研百科 2025年7月6日
    1
  • 產(chǎn)品研發(fā)管理體系(產(chǎn)品研發(fā)項(xiàng)目管理系統(tǒng))

    產(chǎn)品研發(fā)項(xiàng)目管理系統(tǒng)產(chǎn)品研發(fā)項(xiàng)目管理系統(tǒng)制定本條主要內(nèi)容,包括上游產(chǎn)品和下游產(chǎn)品(產(chǎn)品)的分類、 產(chǎn)品經(jīng)濟(jì)學(xué)、 消費(fèi)者心理學(xué)、 市場學(xué)、 產(chǎn)品經(jīng)濟(jì)學(xué)、 市場經(jīng)濟(jì)學(xué)、 市場經(jīng)濟(jì)學(xué)、 …

    科研百科 2024年5月17日
    42
久久午夜福利无码1000合集| 免费高清a级毛片在线播放| 91caoprom| 国产精品欧美视频另类专区| a级特黄的片子| 少妇被躁爽到高潮无码人狍大战| 亚洲欧美日韩精品久久| 男生的肌肌桶女生的肌肌| 国产成人va亚洲电影| 香港aa三级久久三级老师| 女人被免费网站视频在线| 久久久精品2019中文字幕之3| 日韩欧美在线播放视频| 乱人伦人妻精品一区二区| 日本老妇人乱xxy| 亚洲一级毛片在线观| 欧美成人观看免费完全| 亚洲欧美一区二区久久| 本子库全彩时间暂停| 五月婷婷激情网| 无码精品a∨在线观看无广告 | 小雪老师又嫩又紧的| 久久久99精品成人片| 日本又粗又长一进一出抽搐| 久久久国产精品亚洲一区| 成人免费在线视频| 一本一本久久aa综合精品| 女性高爱潮视频| aⅴ免费在线观看| 国产精品久线在线观看| xxxxx野外性xxxx| 小明天天看成人免费看| www.av在线| 国产精品无码专区在线观看| 91色综合综合热五月激情| 国内国产真实露脸对白| ww亚洲ww在线观看国产| 国产精品自产拍在线观看| 91麻豆国产福利在线观看| 国产精品欧美一区二区三区不卡| 97人人在线视频|