来自蓝牙扫描cordova插件的信标数据 [英] Beacon data from bluetooth scan cordova plugin
问题描述
Hi
我的目标是从广告数据中获取信标数据,即uuid +制造数据+ Major_Minor + txpower,
我在Visual Studio 2015中使用了cordova Ble扫描插件,
我无法从ble.start扫描中获取整个信标数据,
请帮助我这方面,
以下是代码,这里我解析了从ble.startscan获得的扫描记录
------------------------------------------ ---
if (device.advertisementData){返回跨度>; }
if (!device.scanRecord){ return ; }
var byteArray = evothings.util.base64DecToArr(device.scanRecord);
var pos = 0 ;
var advertisementData = {};
var serviceUUIDs;
var serviceData;
while (pos < byteArray.length){
var length = byteArray [pos ++];
if (length == 0 ){
断裂跨度>;
}
length - = 1 ;
var type = byteArray [pos ++];
var BLUETOOTH_BASE_UUID = ' - 0000-1000-8000-00805f9b34fb'跨度>;
// 将16字节的Uint8Array转换为RFC-4122格式的UUID。
函数arrayToUUID(数组,偏移量){
var k = 0 ;
var string = ' ';
var UUID_format = [ 4 , 2 , 2 , 2 , 6 ];
for ( var l = 0 ; l < UUID_format.length; l ++){
if (l!= 0 ){
string + = ' - ';
}
for ( var j = 0 ; j < UUID_format [l]; j ++,k ++){
string + = evothings.util.toHexString(array [offset + k], 1 );
}
}
return string ;
}
if (type == 0x02 || type == 0x03) // 16位服务类UUID。
{
serviceUUIDs = serviceUUIDs? serviceUUIDs:[];
for ( var i = 0 ; i < length; i + = 2 ){
serviceUUIDs.push(
' 0000' +
evothings.util.toHexString(
evothings.util.littleEndianToUint16(byteArray,pos + i),
2 )+
BLUETOOTH_BASE_UUID);
}
}
if (type == 0x04 || type == 0x05) // 32位服务类UUID。
{
serviceUUIDs = serviceUUIDs? serviceUUIDs:[];
for ( var i = 0 ; i < length; i + = 4 ){
serviceUUIDs.push(
evothings.util.toHexString(
evothings.util.littleEndianToUint32(byteArray,pos + i),
4 )+
BLUETOOTH_BASE_UUID);
}
}
if (type == 0x06 || type == 0x07) // 128位服务类UUID。
{
serviceUUIDs = serviceUUIDs? serviceUUIDs:[];
for ( var i = 0 ; i < length; i + = 16 ){
serviceUUIDs.push( arrayToUUID(byteArray,pos + i));
}
}
if (type == 0x08 || type == 0x09) // 本地名称。
{
advertisementData.kCBAdvDataLocalName = evothings.ble.fromUtf8(
new Uint8Array(byteArray.buffer,pos,length));
}
if (type == 0x0a) // TX Power Level。
{
advertisementData.kCBAdvDataTxPowerLevel =
evothings.util.littleEndianToInt8(byteArray,pos);
}
if (type == 0x16) // 服务数据,16位UUID。
{
serviceData = serviceData? serviceData:{};
var uuid =
' 0000' +
evothings.util.toHexString(
evothings.util.littleEndianToUint16(byteArray,pos),
2 )+
BLUETOOTH_BASE_UUID;
var data = new Uint8Array(byteArray.buffer,pos + 2 ,length - 2 );
serviceData [uuid] = base64.fromArrayBuffer(data);
}
if (type == 0x20) // 服务数据,32位UUID。
{
serviceData = serviceData? serviceData:{};
var uuid =
evothings.util.toHexString(
evothings.util.littleEndianToUint32(byteArray,pos),
4 )+
BLUETOOTH_BASE_UUID;
var data = new Uint8Array(byteArray.buffer,pos + 4 ,length - 4 );
serviceData [uuid] = base64.fromArrayBuffer(data);
}
if (type == 0x21) // 服务数据,128位UUID。
{
serviceData = serviceData? serviceData:{};
var uuid = arrayToUUID(byteArray,pos);
var data = new Uint8Array(byteArray.buffer,pos + 16 ,length - 16 );
serviceData [uuid] = base64.fromArrayBuffer(data);
}
if (type == 0xff) // 制造商特定数据。
{
// 很烦人必须来回转换base64,
// 但必须要完成为了维护API。
advertisementData.kCBAdvDataManufacturerData =
base64.fromArrayBuffer( new Uint8Array(byteArray.buffer,pos,长度));
}
pos + = length;
}
advertisementData.kCBAdvDataServiceUUIDs = serviceUUIDs;
advertisementData.kCBAdvDataServiceData = serviceData;
device.advertisementData = advertisementData;
等待您的回复,
谢谢和问候,
Murali
我的尝试:
我从evothings.com尝试了Evothings ble scan插件,
以上是使用的代码,
谢谢和问候,
Murali
在 Evothings |为物联网制作移动应用程序既简单,快速又有趣! [ ^ ]
Hi
My objective is to get the beacon data from advertising data i.e. uuid+Manfacturing data+Major_Minor+txpower,
I used cordova Ble scan plugin in Visual studio 2015,
I am unable to get whole beacon data from ble.start scan,
Please help me in this regard,
The following is the code,Here I parsed the scan record got from ble.startscan
---------------------------------------------
if (device.advertisementData) { return; }
if (!device.scanRecord) { return; }
var byteArray = evothings.util.base64DecToArr(device.scanRecord);
var pos = 0;
var advertisementData = {};
var serviceUUIDs;
var serviceData;
while (pos < byteArray.length) {
var length = byteArray[pos++];
if (length == 0) {
break;
}
length -= 1;
var type = byteArray[pos++];
var BLUETOOTH_BASE_UUID = '-0000-1000-8000-00805f9b34fb';
// Convert 16-byte Uint8Array to RFC-4122-formatted UUID.
function arrayToUUID(array, offset) {
var k = 0;
var string = '';
var UUID_format = [4, 2, 2, 2, 6];
for (var l = 0; l < UUID_format.length; l++) {
if (l != 0) {
string += '-';
}
for (var j = 0; j < UUID_format[l]; j++, k++) {
string += evothings.util.toHexString(array[offset + k], 1);
}
}
return string;
}
if (type == 0x02 || type == 0x03) // 16-bit Service Class UUIDs.
{
serviceUUIDs = serviceUUIDs ? serviceUUIDs : [];
for (var i = 0; i < length; i += 2) {
serviceUUIDs.push(
'0000' +
evothings.util.toHexString(
evothings.util.littleEndianToUint16(byteArray, pos + i),
2) +
BLUETOOTH_BASE_UUID);
}
}
if (type == 0x04 || type == 0x05) // 32-bit Service Class UUIDs.
{
serviceUUIDs = serviceUUIDs ? serviceUUIDs : [];
for (var i = 0; i < length; i += 4) {
serviceUUIDs.push(
evothings.util.toHexString(
evothings.util.littleEndianToUint32(byteArray, pos + i),
4) +
BLUETOOTH_BASE_UUID);
}
}
if (type == 0x06 || type == 0x07) // 128-bit Service Class UUIDs.
{
serviceUUIDs = serviceUUIDs ? serviceUUIDs : [];
for (var i = 0; i < length; i += 16) {
serviceUUIDs.push(arrayToUUID(byteArray, pos + i));
}
}
if (type == 0x08 || type == 0x09) // Local Name.
{
advertisementData.kCBAdvDataLocalName = evothings.ble.fromUtf8(
new Uint8Array(byteArray.buffer, pos, length));
}
if (type == 0x0a) // TX Power Level.
{
advertisementData.kCBAdvDataTxPowerLevel =
evothings.util.littleEndianToInt8(byteArray, pos);
}
if (type == 0x16) // Service Data, 16-bit UUID.
{
serviceData = serviceData ? serviceData : {};
var uuid =
'0000' +
evothings.util.toHexString(
evothings.util.littleEndianToUint16(byteArray, pos),
2) +
BLUETOOTH_BASE_UUID;
var data = new Uint8Array(byteArray.buffer, pos + 2, length - 2);
serviceData[uuid] = base64.fromArrayBuffer(data);
}
if (type == 0x20) // Service Data, 32-bit UUID.
{
serviceData = serviceData ? serviceData : {};
var uuid =
evothings.util.toHexString(
evothings.util.littleEndianToUint32(byteArray, pos),
4) +
BLUETOOTH_BASE_UUID;
var data = new Uint8Array(byteArray.buffer, pos + 4, length - 4);
serviceData[uuid] = base64.fromArrayBuffer(data);
}
if (type == 0x21) // Service Data, 128-bit UUID.
{
serviceData = serviceData ? serviceData : {};
var uuid = arrayToUUID(byteArray, pos);
var data = new Uint8Array(byteArray.buffer, pos + 16, length - 16);
serviceData[uuid] = base64.fromArrayBuffer(data);
}
if (type == 0xff) // Manufacturer-specific Data.
{
// Annoying to have to transform base64 back and forth,
// but it has to be done in order to maintain the API.
advertisementData.kCBAdvDataManufacturerData =
base64.fromArrayBuffer(new Uint8Array(byteArray.buffer, pos, length));
}
pos += length;
}
advertisementData.kCBAdvDataServiceUUIDs = serviceUUIDs;
advertisementData.kCBAdvDataServiceData = serviceData;
device.advertisementData = advertisementData;
Waiting for your response,
Thanks and Regards,
Murali
What I have tried:
I tried Evothings ble scan plugin from evothings.com,
The above is the code used,
Thanks and Regards,
Murali
Try the developer forum at Evothings | Making mobile apps for IoT easy, fast and fun to build![^].
这篇关于来自蓝牙扫描cordova插件的信标数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!