1. 程式人生 > >微信小程式-BLE藍芽實現demo

微信小程式-BLE藍芽實現demo

終於實現了藍芽的功能,也找到了合適的硬體,記錄一下自己需要注意和總結的地方
具體的搜尋、連線、斷開、訊息傳輸都已經實現了,作為專案的一個頁面完成了

相應的程式碼地址,具體的藍芽程式碼在pages/bluetooth當中

一.硬體部分

  1. HC-08 藍芽模組 4.0BLE主從一體 CC2540 無線串列埠透傳模組 BLE串列埠通訊
  2. 硬體官網
    匯承官網
  3. 基本連線教程
    連線測試過程
    注意:串列埠模組和usb to ttl的連線方式

二. Windows串列埠除錯助手

  1. 下載串列埠除錯助手
  2. 設定預設波特率為9600

三.手機App測試

  1. LightBlue和Windows的除錯
    bluetooth1bluetooth2
    bluetooth3
    bluetooth4注意:由圖4可以看出串列埠通訊的serviceId的UUID為FFE0(讀寫UUID)

四.微信小程式初始化連線(重頭戲來了)

  1. 初始化藍芽介面卡
        wx.openBluetoothAdapter({
          success: function (res) {
            console.log('初始化藍芽介面卡成功' + JSON.stringify(res))
            that.msg = '初始化藍芽介面卡成功'
            wx.showModal({
              title: '藍芽適配情況',
              content: '初始化藍芽介面卡成功'
            })
          },
          fail: function () {
            that.msg = '初始化藍芽介面卡失敗'
            wx.showModal({
              title: '藍芽適配情況',
              content: '藍芽適配失敗,請檢查手機藍芽和定位功能是否開啟'
            })
          },
          complete: function () {
            console.log('初始化藍芽介面卡完成')
          }
        })
  1. 開啟藍芽搜尋,並獲取藍芽裝置列表 wx.getBluetoothAdapterState --> wx.onBluetoothAdapterStateChange --> wx.startBluetoothDevicesDiscovery --> wx.onBluetoothDeviceFound --> getBluetoothDevices
  2. 選擇藍芽裝置獲取相應的deviceId
  3. 連線藍芽裝置 wx.createBLEConnection --> wx.getBLEDeviceService(獲取裝置的ServiceId)
wx.createBLEConnection({
          deviceId: deviceId,
          success: function (res) {
            console.log('藍芽裝置連線成功')
            wx.hideLoading()
            wx.getBLEDeviceServices({
              deviceId: deviceId,
              success: function (res) {
                that.deviceService = res.services
                for (var t = 0; t < that.deviceService.length; t++) {
                  var service = that.deviceService[t]
                  var serviceId = service.uuid.substring(4, 8)
                  if (serviceId === 'FFE0') {                  //‘FFE0’為裝置定義的讀寫UUID
                    that.serviceId = service.uuid
                  }
                }
                that.nowDevice = !that.nowDevice
                that.nowService = !that.nowService
                console.log('獲取藍芽裝置Service' + res.errMsg)
              },
              fail: function (res) {
                wx.showModal({
                  title: '裝置Service資訊',
                  content: '藍芽裝置連線成功' + '\n' + '裝置資訊獲取錯誤' + res.errMsg
                })
              }
            })
          },
          fail: function (res) {
            console.log('藍芽裝置連線失敗,請稍後重試')
            wx.hideLoading()
            wx.showModal({
              title: '提示',
              content: '藍芽裝置連線失敗,請稍後重試',
              duration: 2000
            })
          },
          complete: function () {
            console.log('藍芽裝置連線完成')
            wx.hideLoading()
          }
        })
  1. 連線裝置同時關閉藍芽搜尋 wx.stopBluetoothDevicesDiscovery
  2. 向串列埠傳送資料(重要)
    wx.getBLEDeviceCharacteristics --> success: wx.notifyBLECharacteristicValueChang (啟用notify功能) --> success:wx.writeBLECharacteristicValue --> success:wx.readBLECharacteristicValue(必須讀取,否則Android裝置無法正常向串列埠傳送資料
wx.getBLEDeviceCharacteristics({
          deviceId: that.deviceId,
          serviceId: that.serviceId,
          success: function (res) {
            console.log(res.characteristics)
            that.deviceCharacteristics = res.characteristics
            for (var i = 0; i < that.deviceCharacteristics.length; i++) {
              that.characteristic = that.deviceCharacteristics[i]
              that.characteristicProperties = that.characteristic.properties
              if (that.characteristicProperties.notify === true) {
                that.characteristicId = that.characteristic.uuid
                wx.notifyBLECharacteristicValueChange({
                  state: true, // 啟用 notify 功能
                  deviceId: that.deviceId,
                  serviceId: that.serviceId,
                  characteristicId: that.characteristicId,
                  success: function (res) {
                    console.log('開啟notify成功' + that.characteristic.uuid)
                    for (let i = 0; i < dataView.byteLength; i++) {
                      var writeData = '0x' + dataView.getUint8(i).toString(16)
                      that.writeDatas = that.writeDatas + '\n' + writeData
                    }
                    wx.writeBLECharacteristicValue({
                      deviceId: that.deviceId,
                      serviceId: that.serviceId,
                      characteristicId: that.characteristicId,
                      value: dataBuffer,
                      success: function (res) {
                        console.log('傳送的資料:' + that.writeDatas)
                        console.log('message傳送成功')
                        wx.showModal({
                          title: '資料傳送成功',
                          content: that.writeDatas
                        })
                        wx.readBLECharacteristicValue({
                          deviceId: that.deviceId,
                          serviceId: that.serviceId,
                          characteristicId: that.characteristicId,
                          success: function (res) {
                            console.log('讀取資料成功')
                          }
                        })
                      },
                      fail: function (res) {
                        // fail
                        console.log('message傳送失敗' + that.characteristicIdw)
                        wx.showToast({
                          title: '資料傳送失敗,請稍後重試',
                          icon: 'none'
                        })
                      },
                      complete: function (res) {
                        // fail
                        console.log('message傳送完成')
                      }
                    })
                  },
                  fail: function () {
                    console.log('開啟notify失敗' + that.characteristicId)
                  }
                })
                // that.writeMessage(that.deviceId, that.serviceId, that.characteristicIdw, that.characteristicIdr, that.characteristicIdn)
              }
            }
          },
          fail: function () {
            console.log('獲取characteristic失敗')
          }
        })
  1. 讀取串列埠傳送的資料 (重要)
    wx.getBLEDeviceCharacteristics --> success:wx.notifyBLECharacteristicValueChange --> success:wx.readBLECharacteristicValue --> wx.onBLECharacteristicValueChange

五.微信小程式藍芽未啟動,離開小程式開啟藍芽後再啟動小程式

  1. 在onLoad中wx.openBluetoothAdapter
  2. 在onShow中判斷當前藍芽介面卡的狀態wx.onBluetoothAdapterStateChange --> 若更改成功,則wx.openBluetoothAdapter

六.微信小程式開發注意

  1. Android裝置在readBLECharacteristicValu後可能會出現顯示message傳輸成功但是串列埠除錯助手收不到資料的情況
    解決方法:在writeBLECharacteristicValu後新增readBLECharacteristicValue
  2. 串列埠讀寫裝置的時候注意轉換資料格式,傳輸的資料格式為ArrayBuffer,需要轉換才可以顯示,直接console返回的res.value為空
    用到的轉換格式程式碼
let data = that.sendData.split(',')
        let dataBuffer = new ArrayBuffer(data.length)
        let dataView = new DataView(dataBuffer)
        for (let j = 0; j < data.length; j++) {
          dataView.setUint8(j, '0x' + data[j])
        }

var writeData = '0x' + dataView.getUint8(i).toString(16)
ab2hex: function (buffer) {
        var hexArr = Array.prototype.map.call(
          new Uint8Array(buffer), function (bit) {
            return ('00' + bit.toString(16)).slice(-2)
          }
        )
        return hexArr.join('')
      }
  1. 根據serviceId獲取characteristicId時需要採用for迴圈獲取,不使用for迴圈會無法開啟notify,使用for迴圈會開啟兩遍,兩次開啟UUID相同,但是第一次顯示開啟成功,第二次顯示開啟失敗
  2. 實際讀取串列埠傳送資料的位置為wx.onBLECharacteristicValueChang,wx.readBLECharacteristicValue返回的res中只有接受資訊是否成功的資訊
  3. 問題:若手機藍芽未啟動,初始化頁面無法成功開啟藍芽介面卡,重新開啟藍芽後,頁面無法重新開啟藍芽介面卡
    解決:因為只在onLoad中定義了開始藍芽介面卡,沒有在onShow中定義,通過《六》中來解決
    注意:必須在onShow中先進行判斷,再選擇是否呼叫wx.openBluetoothAdapter,否則在第一次啟動頁面的時候呼叫兩次wx.openBluetoothAdapter,wx.showModal會顯示兩次(初始化頁面的時候onLoad後會呼叫onShow)

相關推薦

程式-BLE實現demo

終於實現了藍芽的功能,也找到了合適的硬體,記錄一下自己需要注意和總結的地方 具體的搜尋、連線、斷開、訊息傳輸都已經實現了,作為專案的一個頁面完成了 相應的程式碼地址,具體的藍芽程式碼在pages/bluetooth當中 一.硬體部分 HC-08 藍芽模組 4

程式BLE連線10003問題分析及解決

10003是微信藍芽連線經常碰到的問題,微信官方給出的文件中就簡單的描述為“connection fail”,備註為“連線失敗”。然而,實際上出現10003的狀況有很多,比如根據deviceId連線藍芽時,藍芽裝置未開啟或異常導致無法連線;藍芽裝置被佔用或者上次藍芽連線未斷開導致無法

程式連線裝置

最近再弄小程式連線藍芽,分享一下。 首先值得注意的是,微信小程式只支援連線低功耗藍芽裝置 部分oppo和vivo手機要把定位也開啟,否則搜尋不到附近藍芽裝置(比如我坑爹的oppoR11就必須把定位和藍芽都開啟才行) 下面直接上程式碼,複製貼上就行,然後點選“開始掃描”(目前我知道蘋果手錶

程式(看文件寫例項十)程式課堂寶APP實現我的模組相關介面及邏輯

繼上篇博文,這篇完成最後一個模組,即我的模組。 一、頁面效果 這個模組是和使用者型別相關的,因此老師賬號和學生賬號能看的功能不一樣,老師端效果如下: 點選頭像到達個人資訊如下: 點選後可以做相應的修改。學生端的介面如下: 修改密碼的頁面如下: &nbs

程式(看文件寫例項八)程式課堂寶APP實現練習模組前臺

接上篇博文,這篇主要描述練習模組的前臺顯示,其中包括test頁面,答題detail頁面以及提交答題後答卷answer頁面。 一、練習模組test頁面 練習頁面主要展示的是當前使用者的頭像,暱稱以及學校資訊,另外還有答題資訊,以及每個章節的練習資訊,先來看看效果: grid用的是樣式

程式(看文件寫例項七)程式課堂寶APP實現線上課堂測試

接著上篇博文已經完成簽到功能,這篇來完成課堂測試功能。 一、需求描述 1、在後臺選擇題、主觀題表中上傳測試題 2、客戶端獲取題目資訊 3、把題目資訊格式化載入顯示 4、客戶端答題,主觀題每題能上傳一張答題圖片 5、客戶端答題結束提交到伺服器 二、前臺頁面 提交大量資料

程式(看文件寫例項六)程式課堂寶APP實現簽到邏輯

繼上篇博文,這篇寫下籤到實現的邏輯。 一、實現邏輯 發起簽到 1、先上傳當前自己的定位經緯度 2、學生查詢老師的最後一次簽到記錄,如果發現簽到記錄signComplete為false說明有新的簽到 3、得到簽到的第幾次課 4、系統獲得學生的定位經緯度 5、判斷兩點經緯度轉

程式(看文件寫例項五)程式課堂寶APP實現獲取簽到列表

根據上篇博文,這篇主要實現獲取簽到列表邏輯。 獲得簽到列表主要有以下步驟: (1)查詢老師的ID (2)查詢老師的簽到記錄 (3)如果當前使用者是老師,直接顯示所有記錄,因為簽到記錄都是老師發起的,肯定每次都簽到 (4)如果當前使用者是學生,以老師的簽到列表作為長度,然後以ite

程式(看文件寫例項四)程式課堂寶APP實現簽到子頁面佈局及課程視訊播放頁面

一、簽到子頁面佈局 子頁面主要是一個簽到按鈕,然後下方是簽到記錄列表。 1、簽到按鈕 佈局程式碼: <button class='sign-button' bindtap='sign'>簽到</button>

程式(看文件寫例項三)程式課堂寶APP實現整體介面框架及首頁佈局

一、首頁佈局簡單思路 回顧上一篇博文,首頁的內容主要有輪播圖,橫向滑動選單以及選單對應的view,橫向滑動選單有簽到、課堂測試、模擬測試、課堂提問、答問記錄五個選項,當點選選項時更新顯示view。由於素材和時間有限,所以佈局做得相對簡單,主要是側重思路及程式碼邏輯。 二、輪播圖 檢視文件

程式之下拉列表實現(附完整原始碼)

目錄 一、效果圖 二、實現原理 三、原始碼 四、專案下載 同類文章推薦: 更多幹貨關注公眾號:   一、效果圖 二、實現原理 跟網頁的下拉列表實現是一樣的,剛剛開始預設下拉的內容的是不顯示的(display:none),然後通過點選的時

程式】公共方法實現實時捕捉input輸入

專案中,一個表單中經常有好幾個input,但是微信小程式並不像vue那樣實現雙向繫結,所以我們要自己去實現當用戶輸入的時候,實時獲取使用者輸入的值。 方法比較簡單,就兩個步驟。 1.wxml <input data-name='form.base.name

程式+SpringBoot+mybatis+MySQL實現簡單的登入

微信小程式+SpringBoot+mybatis+MySQL實現簡單的登入 當下微信小程式和springboot都是比較火的。今天我們來用springboot和微信小程式來實現簡單的登入。 1.首先來完成微信小程式端,新建一個微信小程式。 如果不會的可以檢視我的上一篇文章開發微信小程式簡

程式 image圖片元件實現寬度固定 高度自適應

新增mode屬性 <image class="empty-icon" src="/pages/image/list-emptyx2.png" mode="widthFix"></image> mode 有效值: mode 有 13 種模式,其中 4 種是縮放模式

程式如何使用Git實現版本管理

在微信小程式開發的過程中,程式碼版本管理往往需要使用第三方工具進行管理。雖然微信Web開發工具提供了對Git檔案版本狀態的提示,但實際的使用體驗依然不盡人意。 隨著微信Web開發工具的更新,最新的內測版本已經支援Git的直接管理,本文將就在微信Web開發工具中使用Git做版

程式~雲開發的實現的一個社群 Demo(即將完結~)

微信雲開發 官方介紹 開發者可以使用雲開發開發微信小程式、小遊戲,無需搭建伺服器,即可使用雲端能力。雲開發為開發者提供完整的雲端支援,弱化後端和運維概念,無需搭建伺服器,使用平臺提供的 API 進行核

程式中使用Animation實現簡約Loading效果

效果圖: wxml內容: <!-- loading.wxml --> <view class="loading"> <view class="dot" anim

程式自定義元件實現地址單級連續選擇(拼多多APP地址選擇樣式)

最終效果在 首先在page資料夾下建立components資料夾,在components資料夾下建立region-picker的資料夾,然後在region-picker資料夾下建立Component名稱為region-picker。 region-picke

程式側滑選單實現

效果圖: page.wxml程式碼: 主頁程式碼: <view class="home" style="{{translate}}>Home</view> 側滑選單程式碼: <view class="page_tab">Page_tab<

程式怎麼接入直播功能,程式直播功能如何實現

蘑菇街通過直播商城帶來了的資料,給許多電商及其其他行業帶來了許多生機,那麼到底小程式要怎麼接入直播功能,小程式直播功能要如何實現。 小程式直播功能的開放,其實就是微信官方允許第三方直播平臺可以直接接入微信,以小程式的形式出現,大家可以在微信的小程式直播視窗互動,無需轉換到另一個APP去下載。