openBluetoothAdapter() {
uniopenBluetoothAdapter({
success: e => {
// consolelog('初始化蓝牙成功:' + eerrMsg);
thisonBluetoothDeviceFound()
unigetBluetoothAdapterState({
success: function(res) {
// 初始化完毕开始搜索
if (resavailable) {
if (resdiscovering) {
// consolelog('停止连接');
thiscloseBluetooth()
}
unistartBluetoothDevicesDiscovery({
success: res => {
},
fail: res => {
onsolelog("查找设备失败!");
unishowToast({
icon: "none",
title: "查找设备失败!",
duration: 3000,
})
}
})
} else {
consolelog('本机蓝牙不可用')
}
}
})
},
fail: e => {
if (eerrCode == 10001) {
unishowModal({
title: "提示",
content: "您的蓝牙没有打开,请打开蓝牙",
success: function(res) {
if (resconfirm == true) {
if (unigetSystemInfoSync()platform == 'ios') {
} else if (unigetSystemInfoSync()platform === 'android') {
}
} else {
uninavigateBack({
url: '//detail3/detail3'
})
}
},
});
}
consolelog('初始化蓝牙失败,错误码:' + (eerrCode || eerrMsg));
}
});
},
onBluetoothDeviceFound() {
// consolelog("监听寻找新设备");
unionBluetoothDeviceFound(devices => {
// consolelog('开始监听寻找到新设备的事件');
// consolelog(deviceslength);
thisgetBluetoothDevices();
});
},
getBluetoothDevices() {
// consolelog("获取蓝牙设备");
unigetBluetoothDevices({
success: res => {
// consolelog('获取蓝牙设备');
thisresdic = res
// consolelog(res)
// consolelog('deviceslength===='+thisresdicdeviceslength);
for (let i = 0; i < thisresdicdeviceslength; i++) {
let devicesDic = thisresdicdevices[i];
if (devicesDicname && devicesDicname == '<Dobiy>' && devicesDicadvertisServiceUUIDs) {
thisdeviceIdStr = devicesDicdeviceId
thisstopBluetooth()
thiscreateBLEConnection(devicesDicdeviceId)
}
}
}
});
},
createBLEConnection(deviceIds) {
consolelog("连接蓝牙---------------" + deviceIds)
// setTimeout(function(){
// thatcloseBLEConnection();
// thatcreateBLEConnection(deviceIds)
// },5000)
unicreateBLEConnection({
deviceId: deviceIdstoString(),
success: (res) => {
consolelog('蓝牙连接成功');
// thisgetBLEDeviceServices(deviceIds)
thisstopBluetooth()
var that = this
unigetSystemInfo({
success(res) {
if (resplatform == 'ios') {
setTimeout(() => {
thatgetBLEDeviceServices(deviceIds)
}, 2000)
} else {
setTimeout(() => {
thatnogetBLEDeviceServices(deviceIds)
}, 3000)
}
},
fail(res) {
consolelog(777777777777777)
}
})
},
fail: (res) => {
consolelog('蓝牙连接失败:' + reserrCode)
thatcloseBLEConnection();
thatcreateBLEConnection(deviceIds)
},
});
},
async getBLEDeviceServices(deviceIds) {
var that = this
let deviceServices = await unigetBLEDeviceServices({
deviceId: deviceIds
})
if (deviceServices[0] == null) {
let services = deviceServices[1]services
if (serviceslength == 0) {
setTimeout(() => {
thatgetBLEDeviceServices(deviceIds)
}, 1500)
} else {
consolelog(services, 88888888888)
for (let i = 0; i < serviceslength; i++) {
let serviceId = services[i]uuid
// consolelog('serviceId====' + serviceId);
let characteristicsDic = await unigetBLEDeviceCharacteristics({
deviceId: deviceIds,
serviceId: serviceId,
})
then(data => {
// consolelog(JSONstringify(data))
if (data[0] == null) {
let characteristicsArr = data[1]characteristics
let properties = characteristicsArr[0]properties
consolelog(properties)
if (propertieswrite == true) {
thatserviceIdStr = serviceId;
thatcharacteristicsIdStr = data[1]characteristics[0]uuid;
thatnotifyBLECharacteristicValueChange(thatcharacteristicsIdStr)
// consolelog(deviceIds)
// consolelog(thatserviceIdStr)
// consolelog(thatcharacteristicsIdStr)
thatwriteBLECharacteristic(deviceIds, serviceId, thatcharacteristicsIdStr)
} else {
consolelog('不可编辑', data[1]characteristics[0]uuid)
}
}
})
}
}
} else {
unishowModal({
title: "提示",
content: "获取设备服务信息失败,请重新获取",
showCancel: false,
success(res) {
uninavigateBack({
url: '/uploadImg/uploadImg'
})
}
})
}
},
nogetBLEDeviceServices(deviceIds) {
var that = this
consolelog(777777)
unigetBLEDeviceServices({
deviceId: deviceIds,
success(res) {
let services = resservices
consolelog(services, 55555)
if (serviceslength == 0) {
setTimeout(() => {
thatnogetBLEDeviceServices(deviceIds)
}, 3000)
} else {
for (let i = 0; i < serviceslength; i++) {
let serviceId = services[i]uuid
//这个比对serviceId,设备厂家会告诉,因为安卓获取特征值都是不可写入的,iOS 的可以写入的,所以安卓直接判断serviceId是不是厂家发的serviceId
if (serviceId == '') {
unigetBLEDeviceCharacteristics({
deviceId: deviceIds,
serviceId: serviceId,
success(result) {
let propertiesDic = resultcharacteristics[0]
consolelog(propertiesDic, 55555)
// if (propertiesDicpropertieswrite == true) {
thatserviceIdStr = serviceId;
thatcharacteristicsIdStr = propertiesDicuuid;
thatnotifyBLECharacteristicValueChange(thatcharacteristicsIdStr)
setTimeout(() =>{
thatwriteBLECharacteristic(deviceIds, serviceId, thatcharacteristicsIdStr)
}, 2000)
// } else {
// consolelog('不可编辑', propertiesDicuuid)
// }
},
fail(result) {
consolelog(result, 2222222)
}
})
}
}
}
},
fail(res) {
consolelog(res, 8888888)
}
})
},
一定要调用这个方法,否则无法监听设备返回的数据,之前一直以为在uniwriteBLECharacteristicValue的回调里能得到返回的值,这个方法没有用,结果试了几天都不行,
notifyBLECharacteristicValueChange(characteristicId) {
consolelog(characteristicId, 'characteristicId')
uninotifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
deviceId: thisdeviceIdStr,
serviceId: thisserviceIdStr,
characteristicId: thischaracteristicsIdStr,
success: (res) => {
// consolelog(res)
// consolelog(thischaracteristicId)
consolelog('notifyBLECharacteristicValueChange success', res)
// thatwriteBLECharacteristic(deviceIds, serviceId, thatcharacteristicsIdStr)
thisonBLECharacteristicValue()
},
fail: (res) => {
consolelog('notifyBLECharacteristicValueChange success2', reserrMsg)
}
})
},
onBLECharacteristicValue() {
var that = this
unionBLECharacteristicValueChange(function(res) {
// consolelog(`characteristic ${rescharacteristicId} has changed, now is ${resvalue}`)
let resultStr = thatbufferString(resvalue)
// consolelog(resultStr,111)
if (resultStr && resultStr != '') {
//resultStr就是设备上返回的数据,根据设备不同,获取的设备格式也就不同,自己筛选吧
}
})
},
writeBLECharacteristic(deviceId, serviceId, characteristicId) {
var that = this
consolelog(1111111111)
let sgInt = thatstring2buffer('<sAg>')
// consolelog(sgIntbyteLength)
uniwriteBLECharacteristicValue({
deviceId: thatdeviceIdStr,
serviceId: thatserviceIdStr,
characteristicId: thatcharacteristicsIdStr,
value: sgInt,
success: function(res) {
consolelog(typeof(res))
consolelog('writeBLECharacteristicValue success', reserrMsg)
// thatcloseBluetooth()
},
fail: function(res) {
consolelog(typeof(res))
consolelog('writeBLECharacteristicValue fail==', reserrCode, reserrMsg)
}
})
},
//字符串转arraybuffer
string2buffer: function(str) {
// 首先将字符串转为16进制
let val = ""
for (let i = 0; i < strlength; i++) {
if (val === '') {
val = strcharCodeAt(i)toString(16)
} else {
val += ',' + strcharCodeAt(i)toString(16)
}
}
// consolelog(val)
// 将16进制转化为ArrayBuffer
return new Uint8Array(valmatch(/[\da-f]{2}/gi)map(function(h) {
return parseInt(h, 16)
}))buffer
},
//arraybuffer 转字符串
bufferString: function(str) {
// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
const hexArr = Arrayprototypemapcall(
new Uint8Array(buffer),
function(bit) {
return ('00' + bittoString(16))slice(-2)
}
)
return hexArrjoin('')
}
//16进制
let systemStr = ab2hex(str)
// consolelog(hexCharCodeToStr(systemStr),99)
function hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStrtrim();
var rawStr =
trimedStrsubstr(0, 2)toLowerCase() === "0x"
trimedStrsubstr(2) :
trimedStr;
var len = rawStrlength;
if (len % 2 !== 0) {
alert("Illegal Format ASCII Code!");
return "";
}
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStrsubstr(i, 2), 16); // ASCII Code Value
let str5 = StringfromCharCode(curCharCode)
if (str5startsWith('\n') == false) {
resultStrpush(StringfromCharCode(curCharCode));
}
}
return resultStrjoin("");
}
// consolelog(hexCharCodeToStr(systemStr),888)
return hexCharCodeToStr(systemStr)
},
//监听低功耗蓝牙连接状态的改变事件
onBLEConnectionStateChange() {
unionBLEConnectionStateChange(function(res) {
if (!resconnected) {
// consolelog('蓝牙断开链接')
thiscloseBluetooth()
}
})
},
stopBluetooth() {
unistopBluetoothDevicesDiscovery({
success: e => {
// consolelog('停止搜索蓝牙设备:' + eerrMsg);
},
fail: e => {
// consolelog('停止搜索蓝牙设备失败,错误码:' + eerrCode);
}
});
},
//关闭蓝牙模块
closeBluetooth() {
unicloseBluetoothAdapter({
success(res) {
consolelog(res)
}
})
}
},
#使用mpvue 开发小程序过程中 简单介绍一下微信小程序蓝牙连接过程
#在蓝牙连接的过程中部分api需要加定时器延时1秒到2秒左右再执行,原因为何不知道,小程序有这样的要求
#1首先是要初始化蓝牙:openBluetoothAdapter()
```js
if (wxopenBluetoothAdapter) {
wxopenBluetoothAdapter({
success: function(res) {
/ 获取本机的蓝牙状态 /
setTimeout(() => {
getBluetoothAdapterState()
}, 1000)
},
fail: function(err) {
// 初始化失败
}
})
} else {
}
```
#2检测本机蓝牙是否可用:
# 要在上述的初始化蓝牙成功之后回调里调用
```js
getBluetoothAdapterState() {
var that= this;
thattoastTitle= '检查蓝牙状态'
wxgetBluetoothAdapterState({
success: function(res) {
startBluetoothDevicesDiscovery()
},
fail(res) {
consolelog(res)
}
})
}
```
#3 开始搜索蓝牙设备:
```js
startBluetoothDevicesDiscovery() {
var that= this;
setTimeout(() => {
wxstartBluetoothDevicesDiscovery({
success: function(res) {
/ 获取蓝牙设备列表 /
thatgetBluetoothDevices()
},
fail(res) {
}
})
}, 1000)
}
```
#4 获取搜索到的蓝牙设备列表
# / thatdeviceName 是获取到的蓝牙设备的名称, 因为蓝牙设备在安卓和苹果手机上搜到的蓝牙地址显示是不一样的,所以根据设备名称匹配蓝牙/
```js
getBluetoothDevices() {
var that= this;
setTimeout(() => {
wxgetBluetoothDevices({
services: [],
allowDuplicatesKey: false,
interval: 0,
success: function(res) {
if (resdeviceslength> 0) {
if (JSONstringify(resdevices)indexOf(thatdeviceName) !== -1) {
for (let i = 0; i < resdeviceslength; i++) {
if (thatdeviceName === resdevices[i]name) {
/ 根据指定的蓝牙设备名称匹配到deviceId /
thatdeviceId = thatdevices[i]deviceId;
setTimeout(() => {
thatconnectTO();
}, 2000);
};
};
} else {
}
} else {
}
},
fail(res) {
consolelog(res, '获取蓝牙设备列表失败=====')
}
})
}, 2000)
},
```
#5连接蓝牙
# 匹配到的蓝牙设备ID 发送连接蓝牙的请求, 连接成功之后 应该断开蓝牙搜索的api,然后去获取所连接蓝牙设备的service服务
```js
connectTO() {
wxcreateBLEConnection({
deviceId: deviceId,
success: function(res) {
thatconnectedDeviceId = deviceId;
/ 4获取连接设备的service服务 /
thatgetBLEDeviceServices();
wxstopBluetoothDevicesDiscovery({
success: function(res) {
consolelog(res, '停止搜索')
},
fail(res) {
}
})
},
fail: function(res) {
}
})
}
```
#6 获取蓝牙设备的service服务,获取的serviceId有多个要试着连接最终确定哪个是稳定版本的service 获取服务完后获取设备特征值
```js
getBLEDeviceServices() {
setTimeout(() => {
wxgetBLEDeviceServices({
deviceId: thatconnectedDeviceId,
success: function(res) {
thatservices= resservices
/ 获取连接设备的所有特征值 /
thatgetBLEDeviceCharacteristics()
},
fail: (res) => {
}
})
}, 2000)
},
```
#7获取蓝牙设备特征值
# 获取到的特征值有多个,最后要用的事能读,能写,能监听的那个值的uuid作为特征值id,
```js
getBLEDeviceCharacteristics() {
setTimeout(() => {
wxgetBLEDeviceCharacteristics({
deviceId: connectedDeviceId,
serviceId: services[2]uuid,
success: function(res) {
for (var i = 0; i < rescharacteristicslength; i++) {
if ((rescharacteristics[i]propertiesnotify || rescharacteristics[i]propertiesindicate) &&
(rescharacteristics[i]propertiesread && rescharacteristics[i]propertieswrite)) {
consolelog(rescharacteristics[i]uuid, '蓝牙特征值 ==========')
/ 获取蓝牙特征值 /
thatnotifyCharacteristicsId = rescharacteristics[i]uuid
// 启用低功耗蓝牙设备特征值变化时的 notify 功能
thatnotifyBLECharacteristicValueChange()
}
}
},
fail: function(res) {
}
})
}, 1000)
},
```
#8启动notify 蓝牙监听功能 然后使用 wxonBLECharacteristicValueChange用来监听蓝牙设备传递数据
#接收到的数据和发送的数据必须是二级制数据, 页面展示的时候需要进行转换
```js
notifyBLECharacteristicValueChange() { // 启用低功耗蓝牙设备特征值变化时的 notify 功能
var that= this;
consolelog('6启用低功耗蓝牙设备特征值变化时的 notify 功能')
wxnotifyBLECharacteristicValueChange({
state: true,
deviceId: thatconnectedDeviceId,
serviceId: thatnotifyServicweId,
characteristicId: thatnotifyCharacteristicsId,
complete(res) {
/用来监听手机蓝牙设备的数据变化/
wxonBLECharacteristicValueChange(function(res) {
//
thatbalanceData += thatbuf2string(resvalue)
thathexstr += thatreceiveData(resvalue)
})
},
fail(res) {
consolelog(res, '启用低功耗蓝牙设备监听失败')
thatmeasuringTip(res)
}
})
},
/转换成需要的格式/
buf2string(buffer) {
var arr = Arrayprototypemapcall(new Uint8Array(buffer), x => x)
return arrmap((char, i) => {
return StringfromCharCode(char);
})join('');
},
receiveData(buf) {
return thishexCharCodeToStr(thisab2hex(buf))
},
/转成二进制/
ab2hex (buffer) {
var hexArr = Arrayprototypemapcall(
new Uint8Array(buffer), function (bit) {
return ('00' + bittoString(16))slice(-2)
}
)
return hexArrjoin('')
},
/转成可展会的文字/
hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStrtrim();
var rawStr = trimedStrsubstr(0, 2)toLowerCase() === '0x' trimedStrsubstr(2) : trimedStr;
var len = rawStrlength;
var curCharCode;
var resultStr= [];
for (var i = 0; i < len; i = i+ 2) {
curCharCode = parseInt(rawStrsubstr(i, 2), 16);
resultStrpush(StringfromCharCode(curCharCode));
}
return resultStrjoin('');
},
```
# 向蓝牙设备发送数据
```js
sendData(str) {
let that= this;
let dataBuffer = new ArrayBuffer(strlength)
let dataView = new DataView(dataBuffer)
for (var i = 0; i < strlength; i++) {
dataViewsetUint8(i, strcharAt(i)charCodeAt())
}
let dataHex = thatab2hex(dataBuffer);
thiswriteDatas = thathexCharCodeToStr(dataHex);
wxwriteBLECharacteristicValue({
deviceId: thatconnectedDeviceId,
serviceId: thatnotifyServicweId,
characteristicId: thatnotifyCharacteristicsId,
value: dataBuffer,
success: function (res) {
consolelog('发送的数据:' + thatwriteDatas)
consolelog('message发送成功')
},
fail: function (res) {
},
complete: function (res) {
}
})
},
```
# 当不需要连接蓝牙了后就要关闭蓝牙,并关闭蓝牙模块
```js
// 断开设备连接
closeConnect() {
if (thatconnectedDeviceId) {
wxcloseBLEConnection({
deviceId: thatconnectedDeviceId,
success: function(res) {
thatcloseBluetoothAdapter()
},
fail(res) {
}
})
} else {
thatcloseBluetoothAdapter()
}
},
// 关闭蓝牙模块
closeBluetoothAdapter() {
wxcloseBluetoothAdapter({
success: function(res) {
},
fail: function(err) {
}
})
},
```
#在向蓝牙设备传递数据和接收数据的过程中,并未使用到read的API 不知道有没有潜在的问题,目前线上运行为发现任何的问题
#今天的蓝牙使用心得到此结束,谢谢
下面给你一个获取android meid的例子,请看截图:
例子 来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码。虽然Android系统中提供了这样设备识别码,但是由于Android系统版本、厂商定制系统中的Bug等限制,稳定性和唯一性并不理想。而通过其他硬件信息标识也因为系统版本、手机硬件等限制存在不同程度的问题。
下面收集了一些“有能力”或“有一定能力”作为设备标识的串码。
DEVICE_ID
这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且唯一性良好。
这个DEVICE_ID可以同通过下面的方法获取:
TelephonyManager tm = (TelephonyManager)getSystemService(ContextTELEPHONY_SERVICE); String DEVICE_ID = tmgetDeviceId();
它会根据不同的手机设备返回IMEI,MEID或者ESN码,但在使用的过程中有以下问题:
非手机设备:最开始搭载Android系统都手机设备,而现在也出现了非手机设备:如平板电脑、电子书、电视、音乐播放器等。这些设备没有通话的硬件功能,系统中也就没有TELEPHONY_SERVICE,自然也就无法通过上面的方法获得DEVICE_ID。
权限问题:获取DEVICE_ID需要READ_PHONE_STATE权限,如果只是为了获取DEVICE_ID而没有用到其他的通话功能,申请这个权限一来大才小用,二来部分用户会怀疑软件的安全性。
厂商定制系统中的Bug:少数手机设备上,由于该实现有漏洞,会返回垃圾,如:zeros或者asterisks
MAC ADDRESS
可以使用手机Wifi或蓝牙的MAC地址作为设备标识,但是并不推荐这么做,原因有以下两点:
硬件限制:并不是所有的设备都有Wifi和蓝牙硬件,硬件不存在自然也就得不到这一信息。
获取的限制:如果Wifi没有打开过,是无法获取其Mac地址的;而蓝牙是只有在打开的时候才能获取到其Mac地址。
获取Wifi Mac地址:
获取蓝牙 Mac地址:
Sim Serial Number
装有SIM卡的设备,可以通过下面的方法获取到Sim Serial Number:
TelephonyManager tm = (TelephonyManager)getSystemService(ContextTELEPHONY_SERVICE); String SimSerialNumber = tmgetSimSerialNumber();
注意:对于CDMA设备,返回的是一个空值!
ANDROID_ID
在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。可以通过下面的方法获取:
import androidproviderSettings; String ANDROID_ID = SettingsSystemgetString(getContentResolver(), SettingsSystemANDROID_ID);
ANDROID_ID可以作为设备标识,但需要注意:
厂商定制系统的Bug:不同的设备可能会产生相同的ANDROID_ID:9774d56d682e549c。
厂商定制系统的Bug:有些设备返回的值为null。
设备差异:对于CDMA设备,ANDROID_ID和TelephonyManagergetDeviceId() 返回相同的值。
Serial Number
Android系统23版本以上可以通过下面的方法得到Serial Number,且非手机设备也可以通过该接口获取。
String SerialNumber = androidosBuildSERIAL;
Installtion ID
以上几种方式都或多或少存在一定的局限性或者Bug,如果并不是确实需要对硬件本身进行绑定,使用自己生成的UUID也是一个不错的选择,因为该方法无需访问设备的资源,也跟设备类型无关。
这种方式的原理是在程序安装后第一次运行时生成一个ID,该方式和设备唯一标识不一样,不同的应用程序会产生不同的ID,同一个程序重新安装也会不同。所以这不是设备的唯一ID,但是可以保证每个用户的ID是不同的。可以说是用来标识每一份应用程序的唯一ID(即Installtion ID),可以用来跟踪应用的安装数量等。
Google Developer Blog提供了这样的一个框架:
public class Installation { private static String sID = null; private static final String INSTALLATION = "INSTALLATION"; public synchronized static String id(Context context) { if (sID == null) { File installation = new File(contextgetFilesDir(), INSTALLATION); try { if (!installationexists()) writeInstallationFile(installation); sID = readInstallationFile(installation); } catch (Exception e) { throw new RuntimeException(e); } } return sID; } private static String readInstallationFile(File installation) throws IOException { RandomAccessFile f = new RandomAccessFile(installation, "r"); byte[] bytes = new byte[(int) flength()]; freadFully(bytes); fclose(); return new String(bytes); } private static void writeInstallationFile(File installation) throws IOException { FileOutputStream out = new FileOutputStream(installation); String id = UUIDrandomUUID()toString(); outwrite(idgetBytes()); outclose(); } }
设备唯一ID
上文可以看出,Android系统中并没有可以可靠获取所有厂商设备唯一ID的方法,各个方法都有自己的使用范围和局限性,这也是目前流行的Android系统版本过多,设备也是来自不同厂商,且没有统一标准等原因造成的。
从目前发展来看,Android系统多版本共存还会持续较长的时间,而Android系统也不会被某个设备生产厂商垄断,长远看Android基础系统将会趋于稳定,设备标识也将会作为系统基础部分而标准化,届时这一问题才有望彻底解决。
目前的解决办法,比较可行的是一一适配,在保证大多数设备方便的前提下,如果获取不到,使用其他备选信息作为标识,即自己再封装一个设备ID出来,通过内部算法保证尽量和设备硬件信息相关,以及标识的唯一性。
android 底层是 Linux,我们还是用Linux的方法来获取:
1 cpu号:
文件在: /proc/cpuinfo
通过Adb shell 查看:
adb shell cat /proc/cpuinfo
2 mac 地址
文件路径 /sys/class/net/wlan0/address
adb shell cat /sys/class/net/wlan0/address
xx:xx:xx:xx:xx:aa
这样可以获取两者的序列号,
方法确定,剩下的就是写代码了
以Mac地址为例:
String getMac() {
String macSerial = null;
String str = "";
try {
Process pp = RuntimegetRuntime()exec(
"cat /sys/class/net/wlan0/address ");
InputStreamReader ir = new InputStreamReader(ppgetInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (; null != str;) {
str = inputreadLine();
if (str != null) {
macSerial = strtrim();// 去空格
break;
}
}
} catch (IOException ex) {
// 赋予默认值
exprintStackTrace();
}
return macSerial;
}
Android 手机上获取物理唯一标识码
唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的。
import androidproviderSettingsSecure;
private String android_id = SecuregetString(getContext()getContentResolver(), SecureANDROID_ID);
我们在项目过程中或多或少会使用到设备的唯一识别码,我们希望能够得到一个稳定、可靠的设备唯一识别码。今天我们将介绍几种方式。
1 DEVICE_ID
假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。在以前,我们的Android设备是手机,这个DEVICE_ID可以同通过TelephonyManagergetDeviceId()获取,它根据不同的手机设备返回IMEI,MEID或者ESN码,但它在使用的过程中会遇到很多问题:
非手机设备: 如果只带有Wifi的设备或者音乐播放器没有通话的硬件功能的话就没有这个DEVICE_ID
权限: 获取DEVICE_ID需要READ_PHONE_STATE权限,但如果我们只为了获取它,没有用到其他的通话功能,那这个权限有点大才小用
bug:在少数的一些手机设备上,该实现有漏洞,会返回垃圾,如:zeros或者asterisks的产品
2 MAC ADDRESS
我们也可以通过手机的Wifi或者蓝牙设备获取MAC ADDRESS作为DEVICE ID,但是并不建议这么做,因为并不是所有的设备都有Wifi,并且,如果Wifi没有打开,那硬件设备无法返回MAC ADDRESS
3 Serial Number
在Android 23可以通过androidosBuildSERIAL获取,非手机设备可以通过该接口获取。
4 ANDROID_ID
ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,当设备被wipe后该数重置
ANDROID_ID似乎是获取Device ID的一个好选择,但它也有缺陷:
它在Android <=21 or Android >=23的版本是可靠、稳定的,但在22的版本并不是100%可靠的
在主流厂商生产的设备上,有一个很经常的bug,就是每个设备都会产生相同的ANDROID_ID:9774d56d682e549c
5 Installtion ID : UUID
以上四种方式都有或多或少存在的一定的局限性或者bug,在这里,有另外一种方式解决,就是使用UUID,该方法无需访问设备的资源,也跟设备类型无关。
这种方式是通过在程序安装后第一次运行后生成一个ID实现的,但该方式跟设备唯一标识不一样,它会因为不同的应用程序而产生不同的ID,而不是设备唯一ID。因此经常用来标识在某个应用中的唯一ID(即Installtion ID),或者跟踪应用的安装数量。很幸运的,Google Developer Blog提供了这样的一个框架:
public class Installation {
private static String sID = null;
private static final String INSTALLATION = "INSTALLATION";
public synchronized static String id(Context context) {
if (sID == null) {
File installation = new File(contextgetFilesDir(), INSTALLATION);
try {
if (!installationexists())
writeInstallationFile(installation);
sID = readInstallationFile(installation);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return sID;
}
private static String readInstallationFile(File installation) throws IOException {
RandomAccessFile f = new RandomAccessFile(installation, "r");
byte[] bytes = new byte[(int) flength()];
freadFully(bytes);
fclose();
return new String(bytes);
}
private static void writeInstallationFile(File installation) throws IOException {
FileOutputStream out = new FileOutputStream(installation);
String id = UUIDrandomUUID()toString();
outwrite(idgetBytes());
outclose();
}
}
如何获取Android手机的唯一标识?
代码: 这里是你在Android里读出 唯一的 IMSI-ID / IMEI-ID 的方法。
Java:
String myIMSI = androidosSystemPropertiesget(androidtelephonyTelephonyPropertiesPROPERTY_IMSI);
// within my emulator it returns: 310995000000000
String myIMEI = androidosSystemPropertiesget(androidtelephonyTelephonyPropertiesPROPERTY_IMEI);
// within my emulator it returns: 000000000000000
注:androidosSystemProperties的标签被打上@hide了,所以sdk中并不会存在。如果需要使用,需要有android的source code支持。
最近在做蓝牙相关的项目。方案公司给的文档是他们之前的文档,而给我们的方案是在他们修改之后的。所以文档对于我们来说,错漏很多。开发的过程不是很愉快。安卓的同事之前没做过蓝牙的项目,我也才发现很多东西自己知道但是解释不出来。比如我的UUIDString是"FFAE",安卓的同事也用"FFA1",结果有问题,我就叫他用"0000FFA1-0000-1000-8000-00805F9B34FB ",但是我也不知道为什么。
所以收集了一些资料整理如下:
蓝牙广播中对UUID的格式定义有三种16bit,32bit和12bit。
16bit和32bit和128bit之间的转换关系
128_bit_UUID = 16_bit_UUID 2^96 + Bluetooth_Base_UUID
128_bit_UUID = 32_bit_UUID 2^96 + Bluetooth_Base_UUID
其中 Bluetooth_Base_UUID定义为 00000000-0000-1000-8000-00805F9B34FB
所以用ios设备和安卓设备搜索出来的结果显示的是不一样的,但是结果并不妨碍我们的开发,比如:
安卓 ios
UUID=0000fff1-0000-1000-8000-00805f9b34fb fff1
UUID=0000fff2-0000-1000-8000-00805f9b34fb fff2
UUID=0000ffa1-0000-1000-8000-00805f9b34fb ffa1
UUID=0000ffa2-0000-1000-8000-00805f9b34fb ffa2
另外 蓝牙的相关服务名称及ID 可以查询:
//基础ID
服务名称:Base GUID
服务编码:{00000000-0000-1000-8000-00805F9B34FB}
// GATT 配置
服务名称:GAP
服务编码:{00001800-0000-1000-8000-00805F9B34FB}
服务名称:GATT
服务编码:{00001801-0000-1000-8000-00805F9B34FB}
服务名称:IMMEDIATE ALERT
服务编码:{00001802-0000-1000-8000-00805F9B34FB}
服务名称:LINK LOSS
服务编码:{00001803-0000-1000-8000-00805F9B34FB}
服务名称:TX POWER
服务编码:{00001804-0000-1000-8000-00805F9B34FB}
// GAP 服务
服务名称:HEALTH THERMOMETER
服务编码:{00001809-0000-1000-8000-00805F9B34FB}
服务名称:DEVICE INFORMATION
服务编码:{0000180A-0000-1000-8000-00805F9B34FB}
服务名称:HEART RATE
服务编码:{0000180D-0000-1000-8000-00805F9B34FB}
服务名称:Phone Alert Status Service
服务编码:{0000180E-0000-1000-8000-00805F9B34FB}
服务名称:Battery Service
服务编码:{0000180F-0000-1000-8000-00805F9B34FB}
服务名称:Blood Pressure
服务编码:{00001810-0000-1000-8000-00805F9B34FB}
服务名称:Human Interface Device
服务编码:{00001812-0000-1000-8000-00805F9B34FB}
服务名称:Scan Parameters
服务编码:{00001813-0000-1000-8000-00805F9B34FB}
服务名称:Running Speed and Cadence
服务编码:{00001814-0000-1000-8000-00805F9B34FB}
服务名称:Automation IO
服务编码:{00001815-0000-1000-8000-00805F9B34FB}
服务名称:CYCLING Speed and Cadence
服务编码:{00001816-0000-1000-8000-00805F9B34FB}
服务名称:Pulse Oximeter
服务编码:{00001817-0000-1000-8000-00805F9B34FB}
服务名称:CYCLING Power
服务编码:{00001818-0000-1000-8000-00805F9B34FB}
服务名称:Location and Navigation Service 服务编码:{00001819-0000-1000-8000-00805F9B34FB}
服务名称:Continous Glucose Measurement Service
服务编码:{0000181A-0000-1000-8000-00805F9B34FB}
服务名称:USER DATA
服务编码:{0000181C-0000-1000-8000-00805F9B34FB}
服务名称:TEMPERATURE MEASUREMENT
服务编码:{00002A1C-0000-1000-8000-00805F9B34FB}
服务名称:TEMPERATURE TYPE
服务编码:{00002A1D-0000-1000-8000-00805F9B34FB}
服务名称:INTERMEDIATE TEMPERATURE
服务编码:{00002A1E-0000-1000-8000-00805F9B34FB}
服务名称:TEMPERATURE in Celsius
服务编码:{00002A1F-0000-1000-8000-00805F9B34FB}
服务名称:TEMPERATURE in Fahrenheit
服务编码:{00002A20-0000-1000-8000-00805F9B34FB}
服务名称:MEASUREMENT INTERVAL
服务编码:{00002A21-0000-1000-8000-00805F9B34FB}
服务名称:Boot Keyboard Input Report
服务编码:{00002A22-0000-1000-8000-00805F9B34FB}
服务名称:System ID
服务编码:{00002A23-0000-1000-8000-00805F9B34FB}
服务名称:Model Number String
服务编码:{00002A24-0000-1000-8000-00805F9B34FB}
服务名称:Serial Number String
服务编码:{00002A25-0000-1000-8000-00805F9B34FB}
服务名称:Firmware Revision String
服务编码:{00002A26-0000-1000-8000-00805F9B34FB}
服务名称:Hardware Revision String
服务编码:{00002A27-0000-1000-8000-00805F9B34FB}
服务名称:Software Revision String
服务编码:{00002A28-0000-1000-8000-00805F9B34FB}
服务名称:Manufacturer Name String
服务编码:{00002A29-0000-1000-8000-00805F9B34FB}
服务名称:IEEE 11073-20601 Regulatory
服务编码:{00002A2A-0000-1000-8000-00805F9B34FB}
服务名称:Current Time
服务编码:{00002A2B-0000-1000-8000-00805F9B34FB}
服务名称:Elevation
服务编码:{00002A2C-0000-1000-8000-00805F9B34FB}
服务名称:Latitude
服务编码:{00002A2D-0000-1000-8000-00805F9B34FB}
服务名称:Longitude
服务编码:{00002A2E-0000-1000-8000-00805F9B34FB}
服务名称:Position 2D
服务编码:{00002A2F-0000-1000-8000-00805F9B34FB}
服务名称:Position 3D
服务编码:{00002A30-0000-1000-8000-00805F9B34FB}
服务名称:Scan Refresh
服务编码:{00002A31-0000-1000-8000-00805F9B34FB}
服务名称:Boot Keyboard Output Report
服务编码:{00002A32-0000-1000-8000-00805F9B34FB}
服务名称:Boot Mouse Input Report
服务编码:{00002A33-0000-1000-8000-00805F9B34FB}
服务名称:Glucose Measurement Context
服务编码:{00002A34-0000-1000-8000-00805F9B34FB}
服务名称:Blood Pressure Measurement
服务编码:{00002A35-0000-1000-8000-00805F9B34FB}
服务名称:Intermediate Cuff Pressure
服务编码:{00002A36-0000-1000-8000-00805F9B34FB}
服务名称:HEART RATE MEASUREMENT
服务编码:{00002A37-0000-1000-8000-00805F9B34FB}
服务名称:BODY SENSOR LOCATION
服务编码:{00002A38-0000-1000-8000-00805F9B34FB}
服务名称:HEART RATE CONTROL POINT
服务编码:{00002A39-0000-1000-8000-00805F9B34FB}
服务名称:Removable
服务编码:{00002A3A-0000-1000-8000-00805F9B34FB}
服务名称:Service Required
服务编码:{00002A3B-0000-1000-8000-00805F9B34FB}
服务名称:Scientific Temperature in Celsius
服务编码:{00002A3C-0000-1000-8000-00805F9B34FB}
服务名称:String
服务编码:{00002A3D-0000-1000-8000-00805F9B34FB}
服务名称:Network Availability
服务编码:{00002A3E-0000-1000-8000-00805F9B34FB}
服务名称:Alert Status
服务编码:{00002A3F-0000-1000-8000-00805F9B34FB}
服务名称:Ringer Control Point
服务编码:{00002A40-0000-1000-8000-00805F9B34FB}
服务名称:Ringer Setting
服务编码:{00002A41-0000-1000-8000-00805F9B34FB}
服务名称:Alert Category ID Bit Mask
服务编码:{00002A42-0000-1000-8000-00805F9B34FB}
服务名称:Alert Category ID
服务编码:{00002A43-0000-1000-8000-00805F9B34FB}
服务名称:Alert Notification Control Point
服务编码:{00002A44-0000-1000-8000-00805F9B34FB}
服务名称:Unread Alert Status
服务编码:{00002A45-0000-1000-8000-00805F9B34FB}
服务名称:New Alert
服务编码:{00002A46-0000-1000-8000-00805F9B34FB}
服务名称:Supported New Alert Category
服务编码:{00002A47-0000-1000-8000-00805F9B34FB}
服务名称:Supported Unread Alert Category
服务编码:{00002A48-0000-1000-8000-00805F9B34FB}
服务名称:Blood Pressure Feature
服务编码:{00002A49-0000-1000-8000-00805F9B34FB}
服务名称:HID Information
服务编码:{00002A4A-0000-1000-8000-00805F9B34FB}
服务名称:Report Map
服务编码:{00002A4B-0000-1000-8000-00805F9B34FB}
服务名称:HID Control Point
服务编码:{00002A4C-0000-1000-8000-00805F9B34FB}
服务名称:Report
服务编码:{00002A4D-0000-1000-8000-00805F9B34FB}
服务名称:Protocol Mode
服务编码:{00002A4E-0000-1000-8000-00805F9B34FB}
服务名称:Scan Interval Window
服务编码:{00002A4F-0000-1000-8000-00805F9B34FB}
服务名称:PnP ID
服务编码:{00002A50-0000-1000-8000-00805F9B34FB}
服务名称:Glucose Features
服务编码:{00002A51-0000-1000-8000-00805F9B34FB}
服务名称:Record Access Control Point
服务编码:{00002A52-0000-1000-8000-00805F9B34FB}
服务名称:RSC Measurement
服务编码:{00002A53-0000-1000-8000-00805F9B34FB}
服务名称:RSC Feature
服务编码:{00002A54-0000-1000-8000-00805F9B34FB}
服务名称:SC CONTROL POINT
服务编码:{00002A55-0000-1000-8000-00805F9B34FB}
服务名称:Digital Input
服务编码:{00002A56-0000-1000-8000-00805F9B34FB}
服务名称:Digital Output
服务编码:{00002A57-0000-1000-8000-00805F9B34FB}
服务名称:Analog Input
服务编码:{00002A58-0000-1000-8000-00805F9B34FB}
服务名称:Analog Output
服务编码:{00002A59-0000-1000-8000-00805F9B34FB}
服务名称:Aggregate Input
服务编码:{00002A5A-0000-1000-8000-00805F9B34FB}
服务名称:CSC MEASUREMENT
服务编码:{00002A5B-0000-1000-8000-00805F9B34FB}
服务名称:CSC FEATURE
服务编码:{00002A5C-0000-1000-8000-00805F9B34FB}
服务名称:SENSOR LOCATION
服务编码:{00002A5D-0000-1000-8000-00805F9B34FB}
服务名称:Pulse Oximetry Spot-check Measurement
服务编码:{00002A5E-0000-1000-8000-00805F9B34FB}
服务名称:Pulse Oximetry Continuous Measurement
服务编码:{00002A5F-0000-1000-8000-00805F9B34FB}
服务名称:Pulse Oximetry Pulsatile Event
服务编码:{00002A60-0000-1000-8000-00805F9B34FB}
服务名称:Pulse Oximetry Features
服务编码:{00002A61-0000-1000-8000-00805F9B34FB}
服务名称:Pulse Oximetry Control Point
服务编码:{00002A62-0000-1000-8000-00805F9B34FB}
服务名称:Cycling Power Measurement Characteristic
服务编码:{00002A63-0000-1000-8000-00805F9B34FB}
服务名称:Cycling Power Vector Characteristic
服务编码:{00002A64-0000-1000-8000-00805F9B34FB}
服务名称:Cycling Power Feature Characteristic
服务编码:{00002A65-0000-1000-8000-00805F9B34FB}
服务名称:Cycling Power Control Point Characteristic
服务编码:{00002A66-0000-1000-8000-00805F9B34FB}
服务名称:Location and Speed Characteristic
服务编码:{00002A67-0000-1000-8000-00805F9B34FB}
服务名称:Navigation Characteristic
服务编码:{00002A68-0000-1000-8000-00805F9B34FB}
服务名称:Position Quality Characteristic
服务编码:{00002A69-0000-1000-8000-00805F9B34FB}
服务名称:LN Feature Characteristic
服务编码:{00002A6A-0000-1000-8000-00805F9B34FB}
服务名称:LN Control Point Characteristic
服务编码:{00002A6B-0000-1000-8000-00805F9B34FB}
服务名称:CGM Measurement Characteristic
服务编码:{00002A6C-0000-1000-8000-00805F9B34FB}
服务名称:CGM Features Characteristic
服务编码:{00002A6D-0000-1000-8000-00805F9B34FB}
服务名称:CGM Status Characteristic
服务编码:{00002A6E-0000-1000-8000-00805F9B34FB}
服务名称:CGM Session Start Time Characteristic
服务编码:{00002A6F-0000-1000-8000-00805F9B34FB}
服务名称:Application Security Point Characteristic
服务编码:{00002A70-0000-1000-8000-00805F9B34FB}
服务名称:CGM Specific Ops Control Point Characteristic
服务编码:{00002A71-0000-1000-8000-00805F9B34FB}
服务名称:Glass Identity
服务编码:{F96647CF-7F25-4277-843D-F407B4192F8B}
// GATT 属性类型
服务名称:Primary Service
服务编码:{00002800-0000-1000-8000-00805F9B34FB}
服务名称:Secondary Service
服务编码:{00002801-0000-1000-8000-00805F9B34FB}
服务名称:Include
服务编码:{00002802-0000-1000-8000-00805F9B34FB}
服务名称:Characteristic
服务编码:{00002803-0000-1000-8000-00805F9B34FB}
// GATT CHARACTERISTIC 描述符
服务名称:Characteristic Extended Properties
服务编码:{00002900-0000-1000-8000-00805F9B34FB}
服务名称:Characteristic User Description
服务编码:{00002901-0000-1000-8000-00805F9B34FB}
服务名称:Client Characteristic Configuration
服务编码:{00002902-0000-1000-8000-00805F9B34FB}
服务名称:Server Characteristic Configuration
服务编码:{00002903-0000-1000-8000-00805F9B34FB}
服务名称:Characteristic Format
服务编码:{00002904-0000-1000-8000-00805F9B34FB}
服务名称:Characteristic Aggregate Format
服务编码:{00002905-0000-1000-8000-00805F9B34FB}
服务名称:Valid Range
服务编码:{00002906-0000-1000-8000-00805F9B34FB}
服务名称:External Report Reference
服务编码:{00002907-0000-1000-8000-00805F9B34FB}
服务名称:Report Reference
服务编码:{00002908-0000-1000-8000-00805F9B34FB}
// GATT CHARACTERISTIC 类型
服务名称:Device Name
服务编码:{00002A00-0000-1000-8000-00805F9B34FB}
服务名称:Appearance
服务编码:{00002A01-0000-1000-8000-00805F9B34FB}
服务名称:Peripheral Privacy Flag
服务编码:{00002A02-0000-1000-8000-00805F9B34FB}
服务名称:Reconnection Address
服务编码:{00002A03-0000-1000-8000-00805F9B34FB}
服务名称:Peripheral Preferred Connection Parameters
服务编码:{00002A04-0000-1000-8000-00805F9B34FB}
服务名称:Service Changed
服务编码:{00002A05-0000-1000-8000-00805F9B34FB}
服务名称:Alert Level
服务编码:{00002A06-0000-1000-8000-00805F9B34FB}
服务名称:Tx Power Level
服务编码:{00002A07-0000-1000-8000-00805F9B34FB}
服务名称:Date Time
服务编码:{00002A08-0000-1000-8000-00805F9B34FB}
服务名称:Day of Week
服务编码:{00002A09-0000-1000-8000-00805F9B34FB}
服务名称:Day Date Time
服务编码:{00002A0A-0000-1000-8000-00805F9B34FB}
服务名称:Exact Time 100
服务编码:{00002A0B-0000-1000-8000-00805F9B34FB}
服务名称:Exact Time 256
服务编码:{00002A0C-0000-1000-8000-00805F9B34FB}
服务名称:DST Offset
服务编码:{00002A0D-0000-1000-8000-00805F9B34FB}
服务名称:Time Zone
服务编码:{00002A0E-0000-1000-8000-00805F9B34FB}
服务名称:Local Time Information
服务编码:{00002A0F-0000-1000-8000-00805F9B34FB}
服务名称:Secondary Time Zone
服务编码:{00002A10-0000-1000-8000-00805F9B34FB}
服务名称:Time with DST
服务编码:{00002A11-0000-1000-8000-00805F9B34FB}
服务名称:Time Accuracy
服务编码:{00002A12-0000-1000-8000-00805F9B34FB}
服务名称:Time Source
服务编码:{00002A13-0000-1000-8000-00805F9B34FB}
服务名称:Reference Time Information
服务编码:{00002A14-0000-1000-8000-00805F9B34FB}
服务名称:Time Broadcast
服务编码:{00002A15-0000-1000-8000-00805F9B34FB}
服务名称:Time Update Control Point
服务编码:{00002A16-0000-1000-8000-00805F9B34FB}
服务名称:Time Update State
服务编码:{00002A17-0000-1000-8000-00805F9B34FB}
服务名称:Glucose Measurement
服务编码:{00002A18-0000-1000-8000-00805F9B34FB}
服务名称:Battery Level
服务编码:{00002A19-0000-1000-8000-00805F9B34FB}
服务名称:Battery Power State
服务编码:{00002A1A-0000-1000-8000-00805F9B34FB}
服务名称:Battery Level State
服务编码:{00002A1B-0000-1000-8000-00805F9B34FB}
服务名称:Key Service
服务编码:{0000FFE0-0000-1000-8000-00805F9B34FB}
服务名称:Key Service Characteristic
服务编码:{0000FFE1-0000-1000-8000-00805F9B34FB}
// TI Sensor TAG Device
服务名称:UUID_IRT_SERV
服务编码:{F000AA00-0451-4000-B000-000000000000}
服务名称:UUID_IRT_DATA
服务编码:{F000AA01-0451-4000-B000-000000000000} // ObjectLSB:ObjectMSB:AmbientLSB:AmbientMSB
服务名称:UUID_IRT_CONF
服务编码:{F000AA02-0451-4000-B000-000000000000} // 0: disable, 1: enable
服务名称:UUID_IRT_PERI
服务编码:{F000AA03-0451-4000-B000-000000000000} // Period in tens of milliseconds
服务名称:UUID_ACC_SERV
服务编码:{F000AA10-0451-4000-B000-000000000000}
服务名称:UUID_ACC_DATA
服务编码:{F000AA11-0451-4000-B000-000000000000}
服务名称:UUID_ACC_CONF
服务编码:{F000AA12-0451-4000-B000-000000000000} // 0: disable, 1: enable
服务名称:UUID_ACC_PERI
服务编码:{F000AA13-0451-4000-B000-000000000000} // Period in tens of milliseconds
服务名称:UUID_HUM_SERV
服务编码:{F000AA20-0451-4000-B000-000000000000}
服务名称:UUID_HUM_DATA
服务编码:{F000AA21-0451-4000-B000-000000000000}
服务名称:UUID_HUM_CONF
服务编码:{F000AA22-0451-4000-B000-000000000000} // 0: disable, 1: enable
服务名称:UUID_HUM_PERI
服务编码:{F000AA23-0451-4000-B000-000000000000} // Period in tens of milliseconds
服务名称:UUID_MAG_SERV
服务编码:{F000AA30-0451-4000-B000-000000000000}
服务名称:UUID_MAG_DATA
服务编码:{F000AA31-0451-4000-B000-000000000000}
服务名称:UUID_MAG_CONF
服务编码:{F000AA32-0451-4000-B000-000000000000} // 0: disable, 1: enable
服务名称:UUID_MAG_PERI
服务编码:{F000AA33-0451-4000-B000-000000000000} // Period in tens of milliseconds
服务名称:UUID_BAR_SERV
服务编码:{F000AA40-0451-4000-B000-000000000000}
服务名称:UUID_BAR_DATA
服务编码:{F000AA41-0451-4000-B000-000000000000}
服务名称:UUID_BAR_CONF
服务编码:{F000AA42-0451-4000-B000-000000000000} // 0: disable, 1: enable
服务名称:UUID_BAR_CALI
服务编码:{F000AA43-0451-4000-B000-000000000000} // Calibration characteristic
服务名称:UUID_BAR_PERI
服务编码:{F000AA44-0451-4000-B000-000000000000} // Period in tens of milliseconds
服务名称:UUID_GYR_SERV
服务编码:{F000AA50-0451-4000-B000-000000000000}
服务名称:UUID_GYR_DATA
服务编码:{F000AA51-0451-4000-B000-000000000000}
服务名称:UUID_GYR_CONF
服务编码:{F000AA52-0451-4000-B000-000000000000} // 0: disable, bit 0: enable x, bit 1: enable y, bit 2: enable z
服务名称:UUID_GYR_PERI
服务编码:{F000AA53-0451-4000-B000-000000000000} // Period in tens of milliseconds
服务名称:TEST_SERVICE
服务编码:{F000AA60-0451-4000-B000-000000000000}
服务名称:TEST_DATA
服务编码:{F000AA61-0451-4000-B000-000000000000}
服务名称:TEST_CONFIG
服务编码:{F000AA62-0451-4000-B000-000000000000} // Bit 7: Enable Test Mode; Bit 0-1 LED BitMask
服务名称:Connection Control Service
服务编码:{F000CCC0-0451-4000-B000-000000000000}
服务名称:Connection Parameters
服务编码:{F000CCC1-0451-4000-B000-000000000000}
服务名称:Request Connection Parameters
服务编码:{F000CCC2-0451-4000-B000-000000000000}
服务名称:Disconnect Request
服务编码:{F000CCC3-0451-4000-B000-000000000000}
服务名称:OAD Service
服务编码:{F000FFC0-0451-4000-B000-000000000000}
服务名称:OAD Image Identify
服务编码:{F000FFC1-0451-4000-B000-000000000000}
服务名称:OAD Image Block
服务编码:{F000FFC2-0451-4000-B000-000000000000}’)
转自 >
连接蓝牙设备,需要使用微信的wxcreateBLEConnection接口,参数为蓝牙设备的deviceId(这个参数在搜索的设备信息里面可以直接拿到)。
2 在blejs里面新增connect、disconnect、getDevConStatus三个接口,用以统一管理设备连接和设备断开,因为在安卓平台上,重复去连接会导致设备没有办法断开连接。所以在blejs里面还维护了一个连接/正在连接的设备数组,方便统一管理设备。当调用connect的时候,会先去这个数组里面查找是否有该设备,如果有就不再去调用连接了。当调用disconnect或者设备被动断开,会把该设备从这个数组里面删除。
以上就是关于uniapp 通过蓝牙连接设备并发送命令全部的内容,包括:uniapp 通过蓝牙连接设备并发送命令、微信小程序蓝牙教程--完整版亲测、android meid存到哪里等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)