久久久久久人妻一区精品,西西人体444www大胆无码视频,好大好深好猛好爽视频,youjizz中国熟女,在线а√天堂中文官网

藍(lán)牙app開(kāi)發(fā)教程(藍(lán)牙app開(kāi)發(fā)教程視頻)

小程序開(kāi)發(fā) 3449
今天給各位分享藍(lán)牙app開(kāi)發(fā)教程的知識(shí),其中也會(huì)對(duì)藍(lán)牙app開(kāi)發(fā)教程視頻進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!微信小程序藍(lán)牙教程--完整版親測(cè) #使用mpvue 開(kāi)發(fā)小程序過(guò)程中 簡(jiǎn)單介紹一下微信小程序藍(lán)牙連接過(guò)程 #在藍(lán)牙連接的過(guò)程中部分api需要加定時(shí)器延時(shí)1秒到2秒左右再執(zhí)行,原因?yàn)楹尾恢?,小程序有這樣的要求 #1.首先是要初始化藍(lán)牙:openBluetoothAdapter()

今天給各位分享藍(lán)牙app開(kāi)發(fā)教程的知識(shí),其中也會(huì)對(duì)藍(lán)牙app開(kāi)發(fā)教程視頻進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!

微信小程序藍(lán)牙教程--完整版親測(cè)

#使用mpvue 開(kāi)發(fā)小程序過(guò)程中 簡(jiǎn)單介紹一下微信小程序藍(lán)牙連接過(guò)程

#在藍(lán)牙連接的過(guò)程中部分api需要加定時(shí)器延時(shí)1秒到2秒左右再執(zhí)行,原因?yàn)楹尾恢?,小程序有這樣的要求

#1.首先是要初始化藍(lán)牙:openBluetoothAdapter()

```js

if (wx.openBluetoothAdapter) {

wx.openBluetoothAdapter({

? ? ? ? success: function(res) {

????????????/* 獲取本機(jī)的藍(lán)牙狀態(tài) */

? ? ? ? ? ? setTimeout(() = {

????????????????getBluetoothAdapterState()

????????????}, 1000)

????????},

? ? ? ? fail: function(err) {

????????????// 初始化失敗

????????}

????})

????} else {????

????}

```

#2.檢測(cè)本機(jī)藍(lán)牙是否可用:

#? 要在上述的初始化藍(lán)牙成功之后回調(diào)里調(diào)用

```js

getBluetoothAdapterState() {

? ? var that= this;

? ? that.toastTitle= '檢查藍(lán)牙狀態(tài)'

wx.getBluetoothAdapterState({

? ? ? ? success: function(res) {

startBluetoothDevicesDiscovery()

},

? ? ? ? fail(res) {

? ? ? ? ? ? console.log(res)

}

})

}

```

#3. 開(kāi)始搜索藍(lán)牙設(shè)備:

```js

startBluetoothDevicesDiscovery() {

? ? var that= this;

? ? setTimeout(() = {

wx.startBluetoothDevicesDiscovery({

? ? ? ? ? ? success: function(res) {

/* 獲取藍(lán)牙設(shè)備列表 */

? ? ? ? ? ? ? ? that.getBluetoothDevices()

},

? ? ? ? ? ? fail(res) {

}

})

}, 1000)

}

```

#4. 獲取搜索到的藍(lán)牙設(shè)備列表

# /* that.deviceName 是獲取到的藍(lán)牙設(shè)備的名稱(chēng), 因?yàn)樗{(lán)牙設(shè)備在安卓和蘋(píng)果手機(jī)上搜到的藍(lán)牙地址顯示是不一樣的,所以根據(jù)設(shè)備名稱(chēng)匹配藍(lán)牙*/

```js

getBluetoothDevices() {

? ? var that= this;

? ? setTimeout(() = {

wx.getBluetoothDevices({

? ? ? ? ? ? services: [],

? ? ? ? ? ? allowDuplicatesKey: false,

? ? ? ? ? ? interval: 0,

? ? ? ? ? ? success: function(res) {

? ? ? ? ? ? ? ? if (res.devices.length 0) {

? ? ? ? ? ? ? ? ? ? if (JSON.stringify(res.devices).indexOf(that.deviceName) !== -1) {

? ? ? ? ? ? ? ? ? ? ? ? for (let i = 0; i res.devices.length; i++) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? if (that.deviceName === res.devices[i].name) {

/* 根據(jù)指定的藍(lán)牙設(shè)備名稱(chēng)匹配到deviceId */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.deviceId = that.devices[i].deviceId;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setTimeout(() = {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.connectTO();

}, 2000);

};

};

} else {

}

} else {

}

},

? ? ? ? ? ? fail(res) {

? ? ? ? ? ? ? ? console.log(res, '獲取藍(lán)牙設(shè)備列表失敗=====')

}

})

}, 2000)

},

```

#5.連接藍(lán)牙

# 匹配到的藍(lán)牙設(shè)備ID 發(fā)送連接藍(lán)牙的請(qǐng)求, 連接成功之后 應(yīng)該斷開(kāi)藍(lán)牙搜索的api,然后去獲取所連接藍(lán)牙設(shè)備的service服務(wù)

```js

connectTO() {

wx.createBLEConnection({

? ? ? ? deviceId: deviceId,

? ? ? ? success: function(res) {

? ? ? ? ? ? that.connectedDeviceId = deviceId;

/* 4.獲取連接設(shè)備的service服務(wù) */

that.getBLEDeviceServices();

wx.stopBluetoothDevicesDiscovery({

? ? ? ? ? ? ? ? success: function(res) {

? ? ? ? ? ? ? ? ? ? console.log(res, '停止搜索')

},

? ? ? ? ? ? ? ? fail(res) {

}

})

},

? ? ? ? fail: function(res) {

}

})

}

```

#6. 獲取藍(lán)牙設(shè)備的service服務(wù),獲取的serviceId有多個(gè)要試著連接最終確定哪個(gè)是穩(wěn)定版本的service 獲取服務(wù)完后獲取設(shè)備特征值

```js

getBLEDeviceServices() {

? ? setTimeout(() = {

wx.getBLEDeviceServices({

? ? ? ? ? ? deviceId: that.connectedDeviceId,

? ? ? ? ? ? success: function(res) {

? ? ? ? ? ? ? ? that.services= res.services

/* 獲取連接設(shè)備的所有特征值 */

that.getBLEDeviceCharacteristics()

},

? ? ? ? ? ? fail: (res) = {

}

})

}, 2000)

},

```

#7.獲取藍(lán)牙設(shè)備特征值

# 獲取到的特征值有多個(gè),最后要用的事能讀,能寫(xiě),能監(jiān)聽(tīng)的那個(gè)值的uuid作為特征值id,

```js

getBLEDeviceCharacteristics() {

? ? ? ? ? ? setTimeout(() = {

wx.getBLEDeviceCharacteristics({

? ? ? ? ? ? ? ? ? ? deviceId: connectedDeviceId,

? ? ? ? ? ? ? ? ? ? serviceId: services[2].uuid,

? ? ? ? ? ? ? ? ? ? success: function(res) {

? ? ? ? ? ? ? ? ? ? ? ? for (var i = 0; i res.characteristics.length; i++) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? if ((res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (res.characteristics[i].properties.read res.characteristics[i].properties.write)) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? console.log(res.characteristics[i].uuid, '藍(lán)牙特征值 ==========')

/* 獲取藍(lán)牙特征值 */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.notifyCharacteristicsId = res.characteristics[i].uuid

// 啟用低功耗藍(lán)牙設(shè)備特征值變化時(shí)的 notify 功能

that.notifyBLECharacteristicValueChange()

}

}

},

? ? ? ? ? ? ? ? ? ? fail: function(res) {

}

})

}, 1000)

},

```

#8.啟動(dòng)notify 藍(lán)牙監(jiān)聽(tīng)功能 然后使用 wx.onBLECharacteristicValueChange用來(lái)監(jiān)聽(tīng)藍(lán)牙設(shè)備傳遞數(shù)據(jù)

#接收到的數(shù)據(jù)和發(fā)送的數(shù)據(jù)必須是二級(jí)制數(shù)據(jù), 頁(yè)面展示的時(shí)候需要進(jìn)行轉(zhuǎn)換

```js

notifyBLECharacteristicValueChange() { // 啟用低功耗藍(lán)牙設(shè)備特征值變化時(shí)的 notify 功能

? ? ? ? ? ? var that= this;

? ? ? ? ? ? console.log('6.啟用低功耗藍(lán)牙設(shè)備特征值變化時(shí)的 notify 功能')

wx.notifyBLECharacteristicValueChange({

? ? ? ? ? ? ? ? state: true,

? ? ? ? ? ? ? ? deviceId: that.connectedDeviceId,

? ? ? ? ? ? ? ? serviceId: that.notifyServicweId,

? ? ? ? ? ? ? ? characteristicId: that.notifyCharacteristicsId,

? ? ? ? ? ? ? ? complete(res) {

/*用來(lái)監(jiān)聽(tīng)手機(jī)藍(lán)牙設(shè)備的數(shù)據(jù)變化*/

wx.onBLECharacteristicValueChange(function(res) {

/**/

? ? ? ? ? ? ? ? ? ? ? ? that.balanceData += that.buf2string(res.value)

? ? ? ? ? ? ? ? ? ? ? ? that.hexstr += that.receiveData(res.value)

})

},

? ? ? ? ? ? ? ? fail(res) {

? ? ? ? ? ? ? ? ? ? console.log(res, '啟用低功耗藍(lán)牙設(shè)備監(jiān)聽(tīng)失敗')

? ? ? ? ? ? ? ? ? ? that.measuringTip(res)

}

})

},

/*轉(zhuǎn)換成需要的格式*/

buf2string(buffer) {

? ? ? ? ? ? ? ? ? ? var arr = Array.prototype.map.call(new Uint8Array(buffer), x = x)

? ? ? ? ? ? ? ? ? ? return arr.map((char, i) = {

? ? ? ? ? ? ? ? ? ? ? ? return String.fromCharCode(char);

? ? ? ? ? ? ? ? ? ? }).join('');

},

receiveData(buf) {

return this.hexCharCodeToStr(this.ab2hex(buf))

},

/*轉(zhuǎn)成二進(jìn)制*/

ab2hex (buffer) {

? ? ? ? ? ? ? var hexArr = Array.prototype.map.call(

? ? ? ? ? ? ? ? ? new Uint8Array(buffer), function (bit) {

? ? ? ? ? ? ? ? ? ? ? return ('00' + bit.toString(16)).slice(-2)

}

)

? ? ? ? ? ? ? return hexArr.join('')

},

/*轉(zhuǎn)成可展會(huì)的文字*/

hexCharCodeToStr(hexCharCodeStr) {

? ? ? ? ? ? ? var trimedStr = hexCharCodeStr.trim();

? ? ? ? ? ? ? var rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;

? ? ? ? ? ? ? var len = rawStr.length;

? ? ? ? ? ? ? var curCharCode;

? ? ? ? ? ? ? var resultStr= [];

? ? ? ? ? ? ? for (var i = 0; i len; i = i+ 2) {

? ? ? ? ? ? ? ? ? curCharCode = parseInt(rawStr.substr(i, 2), 16);

? ? ? ? ? ? ? ? ? resultStr.push(String.fromCharCode(curCharCode));

}

? ? ? ? ? ? ? return resultStr.join('');

},

```

# 向藍(lán)牙設(shè)備發(fā)送數(shù)據(jù)

```js

sendData(str) {

? ? let that= this;

? ? let dataBuffer = new ArrayBuffer(str.length)

? ? let dataView = new DataView(dataBuffer)

? ? for (var i = 0; i str.length; i++) {

? ? ? ? dataView.setUint8(i, str.charAt(i).charCodeAt())

}

? ? let dataHex = that.ab2hex(dataBuffer);

? ? this.writeDatas = that.hexCharCodeToStr(dataHex);

wx.writeBLECharacteristicValue({

? ? ? ? deviceId: that.connectedDeviceId,

? ? ? ? serviceId: that.notifyServicweId,

? ? ? ? characteristicId: that.notifyCharacteristicsId,

? ? ? ? value: dataBuffer,

? ? ? ? success: function (res) {

? ? ? ? ? ? console.log('發(fā)送的數(shù)據(jù):' + that.writeDatas)

? ? ? ? ? ? console.log('message發(fā)送成功')

},

? ? ? ? fail: function (res) {

},

? ? ? ? complete: function (res) {

}

})

},

```

# 當(dāng)不需要連接藍(lán)牙了后就要關(guān)閉藍(lán)牙,并關(guān)閉藍(lán)牙模塊

```js

// 斷開(kāi)設(shè)備連接

closeConnect() {

if (that.connectedDeviceId) {

wx.closeBLEConnection({

? ? ? ? ? ? deviceId: that.connectedDeviceId,

? ? ? ? ? ? success: function(res) {

that.closeBluetoothAdapter()

},

? ? ? ? ? ? fail(res) {

}

})

} else {

that.closeBluetoothAdapter()

}

},

// 關(guān)閉藍(lán)牙模塊

closeBluetoothAdapter() {

wx.closeBluetoothAdapter({

? ? ? ? success: function(res) {

},

? ? ? ? fail: function(err) {

}

})

},

```

#在向藍(lán)牙設(shè)備傳遞數(shù)據(jù)和接收數(shù)據(jù)的過(guò)程中,并未使用到read的API 不知道有沒(méi)有潛在的問(wèn)題,目前線(xiàn)上運(yùn)行為發(fā)現(xiàn)任何的問(wèn)題

#今天的藍(lán)牙使用心得到此結(jié)束,謝謝

如何開(kāi)始藍(lán)牙軟件開(kāi)發(fā)

最快上手的方式:

淘寶買(mǎi)開(kāi)發(fā)板,ti nordic csr都可以

按教程先跑一次

開(kāi)始看藍(lán)牙協(xié)議的資料,藍(lán)牙芯片只是個(gè)mcu,協(xié)議棧一般廠(chǎng)商不開(kāi)放,別想太難,和stm32沒(méi)多少區(qū)別

如何使用Android藍(lán)牙開(kāi)發(fā)

Android平臺(tái)支持藍(lán)牙網(wǎng)絡(luò)協(xié)議棧,實(shí)現(xiàn)藍(lán)牙設(shè)備之間數(shù)據(jù)的無(wú)線(xiàn)傳輸。本文檔描述了怎樣利用android平臺(tái)提供的藍(lán)牙API去實(shí)現(xiàn)藍(lán)壓設(shè)備之間的通信。藍(lán)牙具有point-to-point 和 multipoint兩種連接功能。

使用藍(lán)牙API,可以做到:

* 搜索藍(lán)牙設(shè)備

* 從本地的Bluetooth adapter中查詢(xún)已經(jīng)配對(duì)的設(shè)備

* 建立RFCOMM通道

* 通過(guò)service discovery連接到其它設(shè)備

* 在設(shè)備之間傳輸數(shù)據(jù)

* 管理多個(gè)連接

基礎(chǔ)知識(shí)

本文檔介紹了如何使用Android的藍(lán)牙API來(lái)完成的四個(gè)必要的主要任務(wù),使用藍(lán)牙進(jìn)行設(shè)備通信,主要包含四個(gè)部分:藍(lán)牙設(shè)置、搜索設(shè)備(配對(duì)的或可見(jiàn)的)、連接、傳輸數(shù)據(jù)。

所有的藍(lán)牙API在android.bluetooth包中。實(shí)現(xiàn)這些功能主要需要下面這幾個(gè)類(lèi)和接口:

BluetoothAdapter

代表本地藍(lán)牙適配器(藍(lán)牙發(fā)射器),是所有藍(lán)牙交互的入口。通過(guò)它可以搜索其它藍(lán)牙設(shè)備,查詢(xún)已經(jīng)配對(duì)的設(shè)備列表,通過(guò)已知的MAC地址創(chuàng)建BluetoothDevice,創(chuàng)建BluetoothServerSocket監(jiān)聽(tīng)來(lái)自其它設(shè)備的通信。

BluetoothDevice

代表了一個(gè)遠(yuǎn)端的藍(lán)牙設(shè)備, 使用它請(qǐng)求遠(yuǎn)端藍(lán)牙設(shè)備連接或者獲取 遠(yuǎn)端藍(lán)牙設(shè)備的名稱(chēng)、地址、種類(lèi)和綁定狀態(tài)。 (其信息是封裝在 bluetoothsocket 中) 。

BluetoothSocket

代表了一個(gè)藍(lán)牙套接字的接口(類(lèi)似于 tcp 中的套接字) ,他是應(yīng)用程 序通過(guò)輸入、輸出流與其他藍(lán)牙設(shè)備通信的連接點(diǎn)。

BluetoothServerSocket

代表打開(kāi)服務(wù)連接來(lái)監(jiān)聽(tīng)可能到來(lái)的連接請(qǐng)求 (屬于 server 端) , 為了連接兩個(gè)藍(lán)牙設(shè)備必須有一個(gè)設(shè)備作為服務(wù)器打開(kāi)一個(gè)服務(wù)套接字。 當(dāng)遠(yuǎn)端設(shè)備發(fā)起連 接連接請(qǐng)求的時(shí)候,并且已經(jīng)連接到了的時(shí)候,Blueboothserversocket 類(lèi)將會(huì)返回一個(gè) bluetoothsocket。

BluetoothClass

描述了一個(gè)設(shè)備的特性(profile)或該設(shè)備上的藍(lán)牙大致可以提供哪些服務(wù)(service),但不可信。比如,設(shè)備是一個(gè)電話(huà)、計(jì)算機(jī)或手持設(shè)備;設(shè)備可以提供audio/telephony服務(wù)等??梢杂盟鼇?lái)進(jìn)行一些UI上的提示。

BluetoothProfile

BluetoothHeadset

提供手機(jī)使用藍(lán)牙耳機(jī)的支持。這既包括藍(lán)牙耳機(jī)和免提(V1.5)模式。

BluetoothA2dp

定義高品質(zhì)的音頻,可以從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)藍(lán)牙連接。 “A2DP的”代表高級(jí)音頻分配模式。

BluetoothHealth

代表了醫(yī)療設(shè)備配置代理控制的藍(lán)牙服務(wù)

BluetoothHealthCallback

一個(gè)抽象類(lèi),使用實(shí)現(xiàn)BluetoothHealth回調(diào)。你必須擴(kuò)展這個(gè)類(lèi)并實(shí)現(xiàn)回調(diào)方法接收更新應(yīng)用程序的注冊(cè)狀態(tài)和藍(lán)牙通道狀態(tài)的變化。

BluetoothHealthAppConfiguration

代表一個(gè)應(yīng)用程序的配置,藍(lán)牙醫(yī)療第三方應(yīng)用注冊(cè)與遠(yuǎn)程藍(lán)牙醫(yī)療設(shè)備交流。

BluetoothProfile.ServiceListener

當(dāng)他們已經(jīng)連接到或從服務(wù)斷開(kāi)時(shí)通知BluetoothProfile IPX的客戶(hù)時(shí)一個(gè)接口(即運(yùn)行一個(gè)特定的配置文件,內(nèi)部服務(wù))。

藍(lán)牙權(quán)限

為了在你的應(yīng)用中使用藍(lán)牙功能,至少要在A(yíng)ndroidManifest.xml中聲明兩個(gè)權(quán)限:BLUETOOTH(任何藍(lán)牙相關(guān)API都要使用這個(gè)權(quán)限) 和 BLUETOOTH_ADMIN(設(shè)備搜索、藍(lán)牙設(shè)置等)。

為了執(zhí)行藍(lán)牙通信,例如連接請(qǐng)求,接收連接和傳送數(shù)據(jù)都必須有BLUETOOTH權(quán)限。

必須要求BLUETOOTH_ADMIN的權(quán)限來(lái)啟動(dòng)設(shè)備發(fā)現(xiàn)或操縱藍(lán)牙設(shè)置。大多數(shù)應(yīng)用程序都需要這個(gè)權(quán)限能力,發(fā)現(xiàn)當(dāng)?shù)氐乃{(lán)牙設(shè)備。此權(quán)限授予其他的能力不應(yīng)該使用,除非應(yīng)用程序是一個(gè)“電源管理”,將根據(jù)用戶(hù)要求修改的藍(lán)牙設(shè)置

注釋?zhuān)阂?qǐng)求BLUETOOTH_ADMIN的話(huà),必須要先有BLUETOOTH。

在你的應(yīng)用manifest 文件中聲明藍(lán)牙權(quán)限。例如:

manifest ...

uses-permission android:name="android.permission.BLUETOOTH" /

...

/manifest

通過(guò)查看uses-permission資料來(lái)聲明應(yīng)用權(quán)限獲取更多的信息。

藍(lán)牙設(shè)置

在你的應(yīng)用通過(guò)藍(lán)牙進(jìn)行通信之前,你需要確認(rèn)設(shè)備是否支持藍(lán)牙,如果支持,確信它被打開(kāi)。

如果不支持,則不能使用藍(lán)牙功能。如果支持藍(lán)牙,但不能夠使用,你剛要在你的應(yīng)用中請(qǐng)求使用藍(lán)牙。這個(gè)要兩步完成,使用BluetoothAdapter。

關(guān)于藍(lán)牙app開(kāi)發(fā)教程和藍(lán)牙app開(kāi)發(fā)教程視頻的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

掃碼二維碼