uniapp 通过蓝牙连接设备并发送命令

uniapp 通过蓝牙连接设备并发送命令,第1张

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存到哪里等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9827591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存