欧美综合天天夜夜久久|精品亚洲一区二区不卡|亚川色精品一区二区三区|国产做无码视频在线观看|中文国产成人精品久久无码|国产高清精品福利私拍国产|国产精品自在线拍国产手机版|亚洲国产日韩一区无码—夜夜嗨

手機藍牙app開發(fā)教程(手機藍牙app開發(fā)教程視頻)

小程序開發(fā) 4387
本篇文章給大家談談手機藍牙app開發(fā)教程,以及手機藍牙app開發(fā)教程視頻對應的知識點,希望對各位有所幫助,不要忘了收藏本站喔。 如何使用Android藍牙開發(fā) Android平臺支持藍牙網(wǎng)絡協(xié)議棧,實現(xiàn)藍牙設備之間數(shù)據(jù)的無線傳輸。本文檔描述了怎樣利用android平臺提供的藍牙API去實現(xiàn)藍壓設備之間的通信。藍牙具有point-to-point 和 multipoint兩種連接功能。使用藍牙API,可以做到:

本篇文章給大家談談手機藍牙app開發(fā)教程,以及手機藍牙app開發(fā)教程視頻對應的知識點,希望對各位有所幫助,不要忘了收藏本站喔。

如何使用Android藍牙開發(fā)

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

使用藍牙API,可以做到:

* 搜索藍牙設備

* 從本地的Bluetooth adapter中查詢已經(jīng)配對的設備

* 建立RFCOMM通道

* 通過service discovery連接到其它設備

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

* 管理多個連接

基礎知識

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

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

BluetoothAdapter

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

BluetoothDevice

代表了一個遠端的藍牙設備, 使用它請求遠端藍牙設備連接或者獲取 遠端藍牙設備的名稱、地址、種類和綁定狀態(tài)。 (其信息是封裝在 bluetoothsocket 中) 。

BluetoothSocket

代表了一個藍牙套接字的接口(類似于 tcp 中的套接字) ,他是應用程 序通過輸入、輸出流與其他藍牙設備通信的連接點。

BluetoothServerSocket

代表打開服務連接來監(jiān)聽可能到來的連接請求 (屬于 server 端) , 為了連接兩個藍牙設備必須有一個設備作為服務器打開一個服務套接字。 當遠端設備發(fā)起連 接連接請求的時候,并且已經(jīng)連接到了的時候,Blueboothserversocket 類將會返回一個 bluetoothsocket。

BluetoothClass

描述了一個設備的特性(profile)或該設備上的藍牙大致可以提供哪些服務(service),但不可信。比如,設備是一個電話、計算機或手持設備;設備可以提供audio/telephony服務等??梢杂盟鼇磉M行一些UI上的提示。

BluetoothProfile

BluetoothHeadset

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

BluetoothA2dp

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

BluetoothHealth

代表了醫(yī)療設備配置代理控制的藍牙服務

BluetoothHealthCallback

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

BluetoothHealthAppConfiguration

代表一個應用程序的配置,藍牙醫(yī)療第三方應用注冊與遠程藍牙醫(yī)療設備交流。

BluetoothProfile.ServiceListener

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

藍牙權限

為了在你的應用中使用藍牙功能,至少要在AndroidManifest.xml中聲明兩個權限:BLUETOOTH(任何藍牙相關API都要使用這個權限) 和 BLUETOOTH_ADMIN(設備搜索、藍牙設置等)。

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

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

注釋:要請求BLUETOOTH_ADMIN的話,必須要先有BLUETOOTH。

在你的應用manifest 文件中聲明藍牙權限。例如:

manifest ...

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

...

/manifest

通過查看uses-permission資料來聲明應用權限獲取更多的信息。

藍牙設置

在你的應用通過藍牙進行通信之前,你需要確認設備是否支持藍牙,如果支持,確信它被打開。

如果不支持,則不能使用藍牙功能。如果支持藍牙,但不能夠使用,你剛要在你的應用中請求使用藍牙。這個要兩步完成,使用BluetoothAdapter。

微信小程序藍牙教程--完整版親測

#使用mpvue 開發(fā)小程序過程中 簡單介紹一下微信小程序藍牙連接過程

#在藍牙連接的過程中部分api需要加定時器延時1秒到2秒左右再執(zhí)行,原因為何不知道,小程序有這樣的要求

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

```js

if (wx.openBluetoothAdapter) {

wx.openBluetoothAdapter({

? ? ? ? success: function(res) {

????????????/* 獲取本機的藍牙狀態(tài) */

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

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

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

????????},

? ? ? ? fail: function(err) {

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

????????}

????})

????} else {????

????}

```

#2.檢測本機藍牙是否可用:

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

```js

getBluetoothAdapterState() {

? ? var that= this;

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

wx.getBluetoothAdapterState({

? ? ? ? success: function(res) {

startBluetoothDevicesDiscovery()

},

? ? ? ? fail(res) {

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

}

})

}

```

#3. 開始搜索藍牙設備:

```js

startBluetoothDevicesDiscovery() {

? ? var that= this;

? ? setTimeout(() = {

wx.startBluetoothDevicesDiscovery({

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

/* 獲取藍牙設備列表 */

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

},

? ? ? ? ? ? fail(res) {

}

})

}, 1000)

}

```

#4. 獲取搜索到的藍牙設備列表

# /* that.deviceName 是獲取到的藍牙設備的名稱, 因為藍牙設備在安卓和蘋果手機上搜到的藍牙地址顯示是不一樣的,所以根據(jù)設備名稱匹配藍牙*/

```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ù)指定的藍牙設備名稱匹配到deviceId */

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

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

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

}, 2000);

};

};

} else {

}

} else {

}

},

? ? ? ? ? ? fail(res) {

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

}

})

}, 2000)

},

```

#5.連接藍牙

# 匹配到的藍牙設備ID 發(fā)送連接藍牙的請求, 連接成功之后 應該斷開藍牙搜索的api,然后去獲取所連接藍牙設備的service服務

```js

connectTO() {

wx.createBLEConnection({

? ? ? ? deviceId: deviceId,

? ? ? ? success: function(res) {

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

/* 4.獲取連接設備的service服務 */

that.getBLEDeviceServices();

wx.stopBluetoothDevicesDiscovery({

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

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

},

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

}

})

},

? ? ? ? fail: function(res) {

}

})

}

```

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

```js

getBLEDeviceServices() {

? ? setTimeout(() = {

wx.getBLEDeviceServices({

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

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

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

/* 獲取連接設備的所有特征值 */

that.getBLEDeviceCharacteristics()

},

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

}

})

}, 2000)

},

```

#7.獲取藍牙設備特征值

# 獲取到的特征值有多個,最后要用的事能讀,能寫,能監(jiān)聽的那個值的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, '藍牙特征值 ==========')

/* 獲取藍牙特征值 */

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

// 啟用低功耗藍牙設備特征值變化時的 notify 功能

that.notifyBLECharacteristicValueChange()

}

}

},

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

}

})

}, 1000)

},

```

#8.啟動notify 藍牙監(jiān)聽功能 然后使用 wx.onBLECharacteristicValueChange用來監(jiān)聽藍牙設備傳遞數(shù)據(jù)

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

```js

notifyBLECharacteristicValueChange() { // 啟用低功耗藍牙設備特征值變化時的 notify 功能

? ? ? ? ? ? var that= this;

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

wx.notifyBLECharacteristicValueChange({

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

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

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

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

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

/*用來監(jiān)聽手機藍牙設備的數(shù)據(jù)變化*/

wx.onBLECharacteristicValueChange(function(res) {

/**/

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

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

})

},

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

? ? ? ? ? ? ? ? ? ? console.log(res, '啟用低功耗藍牙設備監(jiān)聽失敗')

? ? ? ? ? ? ? ? ? ? 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)成二進制*/

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)成可展會的文字*/

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('');

},

```

# 向藍牙設備發(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) {

}

})

},

```

# 當不需要連接藍牙了后就要關閉藍牙,并關閉藍牙模塊

```js

// 斷開設備連接

closeConnect() {

if (that.connectedDeviceId) {

wx.closeBLEConnection({

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

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

that.closeBluetoothAdapter()

},

? ? ? ? ? ? fail(res) {

}

})

} else {

that.closeBluetoothAdapter()

}

},

// 關閉藍牙模塊

closeBluetoothAdapter() {

wx.closeBluetoothAdapter({

? ? ? ? success: function(res) {

},

? ? ? ? fail: function(err) {

}

})

},

```

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

#今天的藍牙使用心得到此結束,謝謝

android藍牙開發(fā),PC端模擬串口接收字符,該如何編程?

您好,android藍牙這方面還是很好搞的,因為大家的方式都是差不多的。先說說如何開啟藍牙設備和設置可見時間:

private void search() {

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

if (!adapter.isEnabled()) {

adapter.enable();

}

Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600); //3600為藍牙設備可見時間

startActivity(enable);

Intent searchIntent = new Intent(this, ComminuteActivity.class);

startActivity(searchIntent);

}

首先,需要獲得一個BluetoothAdapter,可以通過getDefaultAdapter()獲得系統(tǒng)默認的藍牙適配器,當然我們也可以自己指定,但這個真心沒有必要,至少我是不需要的。然后我們檢查手機的藍牙是否打開,如果沒有,通過enable()方法打開。接著我們再設置手機藍牙設備的可見,可見時間可以自定義。

完成這些必要的設置后,我們就可以正式開始與藍牙模塊進行通信了:

public class ComminuteActivity extends Activity {

private BluetoothReceiver receiver;

private BluetoothAdapter bluetoothAdapter;

private ListString devices;

private ListBluetoothDevice deviceList;

private Bluetooth client;

private final String lockName = "BOLUTEK";

private String message = "000001";

private ListView listView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.search_layout);

listView = (ListView) this.findViewById(R.id.list);

deviceList = new ArrayListBluetoothDevice();

devices = new ArrayListString();

bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

bluetoothAdapter.startDiscovery();

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

receiver = new BluetoothReceiver();

registerReceiver(receiver, filter);

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView? parent, View view, int position, long id) {

setContentView(R.layout.connect_layout);

BluetoothDevice device = deviceList.get(position);

client = new Bluetooth(device, handler);

try {

client.connect(message);

} catch (Exception e) {

Log.e("TAG", e.toString());

}

}

});

}

@Override

protected void onDestroy() {

unregisterReceiver(receiver);

super.onDestroy();

}

private final Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case Bluetooth.CONNECT_FAILED:

Toast.makeText(ComminuteActivity.this, "連接失敗", Toast.LENGTH_LONG).show();

try {

client.connect(message);

} catch (Exception e) {

Log.e("TAG", e.toString());

}

break;

case Bluetooth.CONNECT_SUCCESS:

Toast.makeText(ComminuteActivity.this, "連接成功", Toast.LENGTH_LONG).show();

break;

case Bluetooth.READ_FAILED:

Toast.makeText(ComminuteActivity.this, "讀取失敗", Toast.LENGTH_LONG).show();

break;

case Bluetooth.WRITE_FAILED:

Toast.makeText(ComminuteActivity.this, "寫入失敗", Toast.LENGTH_LONG).show();

break;

case Bluetooth.DATA:

Toast.makeText(ComminuteActivity.this, msg.arg1 + "", Toast.LENGTH_LONG).show();

break;

}

}

};

private class BluetoothReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (BluetoothDevice.ACTION_FOUND.equals(action)) {

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

if (isLock(device)) {

devices.add(device.getName());

}

deviceList.add(device);

}

showDevices();

}

}

private boolean isLock(BluetoothDevice device) {

boolean isLockName = (device.getName()).equals(lockName);

boolean isSingleDevice = devices.indexOf(device.getName()) == -1;

return isLockName isSingleDevice;

}

private void showDevices() {

ArrayAdapterString adapter = new ArrayAdapterString(this, android.R.layout.simple_list_item_1,

devices);

listView.setAdapter(adapter);

}

}

手機藍牙app開發(fā)教程的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關于手機藍牙app開發(fā)教程視頻、手機藍牙app開發(fā)教程的信息別忘了在本站進行查找喔。

掃碼二維碼