来自蓝牙扫描cordova插件的信标数据 [英] Beacon data from bluetooth scan cordova plugin

查看:106
本文介绍了来自蓝牙扫描cordova插件的信标数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆