藍牙app開發(fā)編程(安卓 藍牙編程)
本篇文章給大家談?wù)勊{牙app開發(fā)編程,以及安卓 藍牙編程對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站喔。
微信小程序藍牙模塊開發(fā)
//index.js
//獲取應(yīng)用實例
const app = getApp()
const util = require('../../utils/util.js')
const bletool = require('../../utils/bletool.js')
Page({
data: {
// lists: [{ 'order_no': '1111', 'car_no': '321', 'car_type': '尚好捷', 'order_date': '2018-01-02 08:00', 'order_money': '16.00', 'order_time': '4' }],
car_no: '',
order_no: '',
lists: [],
bleList: [], //藍牙設(shè)備數(shù)組
serviceId: '',//592B3370-3900-9A71-4535-35D4212D2837
serviceMac: '',//C9:9B:4C:E7:DE:10
service_psd: '',//855525B837253705595800000329
service_uuid: '',
deviceId:'',
characteristics:[] //特征值
},
onLoad: function (options) {
this.initBle();
},
onReady: function () {
// 頁面渲染完成
},
onShow: function () {
if (app.globalData.car_no.length0){
this.getDeviceInfo();
}
},
onHide: function () {
// 頁面隱藏
},
onUnload: function () {
// 頁面關(guān)閉
app.globalData.car_no=''
},
//藍牙相關(guān)
//初始化藍牙
initBle: function () {
var that = this;
wx.onBluetoothAdapterStateChange(function (res) {
console.log('adapterState changed, now is', res)
app.globalData.ble_state = res.available;
if (res.available) {
that.initBle();
} else {
util.showToast('手機藍牙已關(guān)閉');
app.globalData.ble_isonnectting = false;
}
})
//打開藍牙適配器
wx.openBluetoothAdapter({
success: function (res) {
console.log('打開藍牙適配器成功');
that.getBluetoothAdapterState();
app.globalData.ble_state = true;
that.onBluetoothDeviceFound();
},
fail: function (res) {
// fail
console.log(res)
util.showToast('請打開手機藍牙');
},
complete: function (res) {
// complete
}
})
},
onBluetoothDeviceFound:function(){
var that = this;
//監(jiān)聽掃描
wx.onBluetoothDeviceFound(function (res) {
// res電腦模擬器返回的為數(shù)組;手機返回的為藍牙設(shè)備對象
console.log('監(jiān)聽搜索新設(shè)備:', res);
that.updateBleList([res])
})
},
getBluetoothAdapterState: function () {
var that = this;
wx.getBluetoothAdapterState({
success: function (res) {
var available = res.available;
var discovering = res.discovering;
if (!available) {
util.showToast('藍牙不可用');
} else {
if (!discovering) {
// that.startBluetoothDevicesDiscovery();
}
}
}
})
},
startBluetoothDevicesDiscovery: function () {
var that = this;
var services = [];
services.push(this.data.serviceId);
wx.showLoading({
title: '設(shè)備搜索中'
});
setTimeout(function () {
wx.hideLoading();
if (app.globalData.deviceId.length==0){
util.showModal('設(shè)備搜索失敗,請重試');
}
}, 10000)
if(bletool.isIOS()){
wx.startBluetoothDevicesDiscovery({
services: services,
allowDuplicatesKey: true,
success: function (res) {
console.log('ios搜索成功');
console.log(res);
},
fail: function (err) {
console.log(err);
}
});
}else{
wx.startBluetoothDevicesDiscovery({
// services: services,
allowDuplicatesKey: true,
success: function (res) {
console.log('Android搜索成功');
console.log(res);
},
fail: function (err) {
console.log(err);
wx.hideLoading();
that.startBluetoothDevicesDiscovery();
// that.getBluetoothAdapterState();
util.showToast('搜索失敗');
}
});
}
},
startConnectDevices: function (ltype, array) {
var that = this;
clearTimeout(that.getConnectedTimer);
that.getConnectedTimer = null;
wx.stopBluetoothDevicesDiscovery({
success: function (res) {
// success
}
})
app.globalData.ble_isonnectting = true;
console.log('連接前:'+that.deviceId);
wx.createBLEConnection({
deviceId: that.deviceId,
success: function (res) {
if (res.errCode == 0) {
console.log('連接成功:');
that.getService(that.deviceId);
}
},
fail: function (err) {
console.log('連接失敗:', err);
wx.hideLoading();
util.showModal('設(shè)備連接失敗,請重試');
// if (ltype == 'loop') {
// that.connectDeviceIndex += 1;
// that.loopConnect(array);
// } else {
// that.startBluetoothDevicesDiscovery();
// that.getConnectedBluetoothDevices();
// }
app.globalData.ble_isonnectting = false;
},
complete: function () {
}
});
},
getService: function (deviceId) {
var that = this;
// 監(jiān)聽藍牙連接
wx.onBLEConnectionStateChange(function (res) {
console.log(res);
app.globalData.ble_isonnectting = res.connected
if (!res.connected) {
util.showToast('連接斷開');
}
});
// 獲取藍牙設(shè)備service值
wx.getBLEDeviceServices({
deviceId: deviceId,
success: function (res) {
console.log('獲取藍牙設(shè)備service值');
console.log(res);
that.getCharacter(deviceId, res.services);
}
})
},
getCharacter: function (deviceId, services) {
var that = this;
services.forEach(function (value, index, array) {
if (value.isPrimary) {
that.setData({
service_uuid: value.uuid,
deviceId: deviceId
})
app.globalData.service_uuid= value.uuid;
app.globalData.deviceId=deviceId;
}
});
//監(jiān)聽通知
wx.onBLECharacteristicValueChange(function (res) {
// callback
console.log('value change', res)
const hex = bletool.buf2char(res.value)
console.log('返回的數(shù)據(jù):', hex)
//配對密碼
if (hex.indexOf('855800000106') != -1) {
wx.hideLoading();
var charact_write = that.data.characteristics[1]
bletool.writeDataToDevice(that.data.deviceId, that.data.service_uuid, charact_write, that.data.service_psd);
wx.showToast({
title: '設(shè)備已連接',
icon: 'success',
duration: 3000
})
setTimeout(function () {
bletool.writeDataToDevice(that.data.deviceId, that.data.service_uuid, charact_write, '235525B837253705590400000273');
}, 2000)
} else if (hex.indexOf('23040000') != -1) {
//啟動成功
that.starRenting();
}
})
wx.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: that.getServiceUUID(),
success: function (res) {
wx.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: that.getServiceUUID(),
success: function (res) {
console.log('特征', res)
that.setData({
characteristics:res.characteristics
})
app.globalData.characteristics = res.characteristics;
var charact_read = res.characteristics[0]
},
loopConnect: function (devicesId) {
var that = this;
var listLen = devicesId.length;
if (devicesId[this.connectDeviceIndex]) {
this.deviceId = devicesId[this.connectDeviceIndex];
this.startConnectDevices('loop', devicesId);
} else {
console.log('已配對的設(shè)備小程序藍牙連接失敗');
that.startBluetoothDevicesDiscovery();
that.getConnectedBluetoothDevices();
}
},
//更新數(shù)據(jù) devices為數(shù)組類型
updateBleList: function (devices) {
console.log('設(shè)備數(shù)據(jù):',devices);
var newData = this.data.bleList
var that = this
var tempDevice = null;
for (var i = 0; i devices.length; i++) {
//ios設(shè)備
if (devices[i].devices != null) {
if (devices[i].devices.length 0) {
tempDevice = devices[i].devices[0];
}
else {
continue
}
}
//安卓
else {
tempDevice = devices[i];
}
if (!this.isExist(tempDevice)) {
newData.push(tempDevice)
}
}
console.log('數(shù)據(jù):');
console.log(newData)
this.setData({
bleList: newData
})
if (!app.globalData.ble_isonnectting) {
var that = this;
this.data.bleList.forEach(function (value, index, array) {
//找到對應(yīng)id的設(shè)備,ios判斷服務(wù)id安卓判斷mac地址
var deviceId = value['deviceId'];
if(bletool.isIOS()){
let advertisServiceUUID = value['advertisServiceUUIDs'][0];
if (advertisServiceUUID == that.data.serviceId.toUpperCase()){
that.deviceId = deviceId;
console.log(that.deviceId);
that.startConnectDevices();
}
}else{
if (deviceId == that.data.serviceMac) {
that.deviceId = deviceId;
console.log(that.deviceId);
that.startConnectDevices();
}
}
});
}
},
//是否已存在 存在返回true 否則false
isExist: function (device) {
var tempData = this.data.bleList
for (var i = 0; i tempData.length; i++) {
if (tempData[i].deviceId == device.deviceId) {
return true
}
}
return false
},
//服務(wù)uuid
getServiceUUID: function () {
return bletool.stringTransition(this.data.service_uuid);
},
getDeviceInfo: function () {
let car_no = app.globalData.car_no;
var that = this;
wx.request({
url: app.globalData.serverURL + '?c=cara=getDeviceInfoopen_id=' + app.globalData.open_id + 'car_no=' + car_no,
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: { 'content-type': 'application/json' }, // 設(shè)置請求的 header
success: function (res) {
// success
var data = res.data;
console.log(data);
if (data.result == 1) {
app.globalData.serviceId = data.data.service_id;
app.globalData.serviceMac = data.data.service_mac,
app.globalData.service_psd = '85' + data.data.service_psd + '5800000329';
that.setData({
serviceId: data.data.service_id,
serviceMac: data.data.service_mac,
service_psd: '85' + data.data.service_psd+'5800000329',
})
app.startBluetoothDevicesDiscovery();
// that.onBLECharacteristicValueChange();
} else {
util.showModal(data.msg);
}
},
fail: function () {
},
complete: function () {
// complete
}
});
},
})
如何開發(fā)簡單的調(diào)試藍牙app
分兩種情況:
你懂技術(shù),安卓JAVA或蘋果OC。有一定的技術(shù)基礎(chǔ),并且愿意去學習和嘗試,簡單的藍牙app其實真的簡單,就是通過藍牙協(xié)議進行軟硬件聯(lián)調(diào),指令也就那幾條,只要調(diào)通就好了。
不懂技術(shù)。那就百度一家app技術(shù)公司去咨詢,然后把項目外包給他們,當然一定要貨比三家。
如何使用Android藍牙開發(fā)
Android平臺支持藍牙網(wǎng)絡(luò)協(xié)議棧,實現(xiàn)藍牙設(shè)備之間數(shù)據(jù)的無線傳輸。本文檔描述了怎樣利用android平臺提供的藍牙API去實現(xiàn)藍壓設(shè)備之間的通信。藍牙具有point-to-point 和 multipoint兩種連接功能。
使用藍牙API,可以做到:
* 搜索藍牙設(shè)備
* 從本地的Bluetooth adapter中查詢已經(jīng)配對的設(shè)備
* 建立RFCOMM通道
* 通過service discovery連接到其它設(shè)備
* 在設(shè)備之間傳輸數(shù)據(jù)
* 管理多個連接
基礎(chǔ)知識
本文檔介紹了如何使用Android的藍牙API來完成的四個必要的主要任務(wù),使用藍牙進行設(shè)備通信,主要包含四個部分:藍牙設(shè)置、搜索設(shè)備(配對的或可見的)、連接、傳輸數(shù)據(jù)。
所有的藍牙API在android.bluetooth包中。實現(xiàn)這些功能主要需要下面這幾個類和接口:
BluetoothAdapter
代表本地藍牙適配器(藍牙發(fā)射器),是所有藍牙交互的入口。通過它可以搜索其它藍牙設(shè)備,查詢已經(jīng)配對的設(shè)備列表,通過已知的MAC地址創(chuàng)建BluetoothDevice,創(chuàng)建BluetoothServerSocket監(jiān)聽來自其它設(shè)備的通信。
BluetoothDevice
代表了一個遠端的藍牙設(shè)備, 使用它請求遠端藍牙設(shè)備連接或者獲取 遠端藍牙設(shè)備的名稱、地址、種類和綁定狀態(tài)。 (其信息是封裝在 bluetoothsocket 中) 。
BluetoothSocket
代表了一個藍牙套接字的接口(類似于 tcp 中的套接字) ,他是應(yīng)用程 序通過輸入、輸出流與其他藍牙設(shè)備通信的連接點。
BluetoothServerSocket
代表打開服務(wù)連接來監(jiān)聽可能到來的連接請求 (屬于 server 端) , 為了連接兩個藍牙設(shè)備必須有一個設(shè)備作為服務(wù)器打開一個服務(wù)套接字。 當遠端設(shè)備發(fā)起連 接連接請求的時候,并且已經(jīng)連接到了的時候,Blueboothserversocket 類將會返回一個 bluetoothsocket。
BluetoothClass
描述了一個設(shè)備的特性(profile)或該設(shè)備上的藍牙大致可以提供哪些服務(wù)(service),但不可信。比如,設(shè)備是一個電話、計算機或手持設(shè)備;設(shè)備可以提供audio/telephony服務(wù)等??梢杂盟鼇磉M行一些UI上的提示。
BluetoothProfile
BluetoothHeadset
提供手機使用藍牙耳機的支持。這既包括藍牙耳機和免提(V1.5)模式。
BluetoothA2dp
定義高品質(zhì)的音頻,可以從一個設(shè)備傳輸?shù)搅硪粋€藍牙連接。 “A2DP的”代表高級音頻分配模式。
BluetoothHealth
代表了醫(yī)療設(shè)備配置代理控制的藍牙服務(wù)
BluetoothHealthCallback
一個抽象類,使用實現(xiàn)BluetoothHealth回調(diào)。你必須擴展這個類并實現(xiàn)回調(diào)方法接收更新應(yīng)用程序的注冊狀態(tài)和藍牙通道狀態(tài)的變化。
關(guān)于藍牙app開發(fā)編程和安卓 藍牙編程的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。