苹果蓝牙怎么定位?

苹果蓝牙怎么定位?,第1张

您是想用苹果手机的蓝牙来实现室内定位吗?现在是可以的,但是需要借助蓝牙ibeacon来实现。

蓝牙定位基于RSSI(Received Signal Strength Indication,信号场强指示)定位原理。一套完整的终端侧蓝牙定位系统是由已嵌入或下载好SDK软件包的智能终端设备(安卓/iOS手机、平板电脑等)和蓝牙beacon设备组成。

当终端设备进入Beacon设备信号覆盖的范围,测出其在不同信标(不同ID号的Beacon硬件设备)下的RSSI值,然后再通过手机内置的定位算法测算出具体位置(一般至少需要3个信标点的RSSI)。

移动终端设备通过下载到手机的定位算法和地图,以及和后台地图引擎数据库的交互,就可以再终端设备的地图上标记出当前位置。

在需要定位的室内环境内布局蓝牙Beacon,至少要3个,蓝牙beacon开始广播数据包,广播间隔时间可以根据实际需求设置!

具体布局思路如下:水平间距控制在5-10m,部署要尽量均匀、竖直高度控制在3m左右;

6

适用场景:商超、景点、停车场定位导航(反向寻车)、医院、养老院、展会、机场火车站、展馆博物馆等。

创建项目,设置plist 实现delegate方法,判断蓝牙状态,如成功则扫描指定UUID设备(如不指定UUID,则无法后台持续连接) 实现delegate方法,当发现指定设备后,连接该设备 实现delegate方法,当连接指定外围设备成功,编写定时器,每秒读取1次RSSI 实现delegate方法,当监听到失去和外围设备连接,重新建立连接 实现delegate方法,当读取到RSSI值,打印出它的值

蓝牙定位基于RSSI(Received Signal Strength Indication,信号场强指示)定位原理。蓝牙定位大致分为三个类别,基于蓝牙Beacon的终端侧定位方案,基于蓝牙网关的网络侧定位方案,基于GNSS+蓝牙的室内外一体化定位方案。

蓝牙终端侧室内定位方案

终端侧定位方案由终端设备(如安装了特定APP的手机)和蓝牙Beacon,指纹定位技术,无线局域网及后端数据服务器构成。用户终端侦测到周边蓝牙设备的场强信息,通过与指纹库比对并调用定位引擎计算当前位置,定位引擎计算终端坐标并在矢量地图模块进行展现配合导航模块,实现连续定位及路径导航。广泛应用于商场,停车场,机场,景区等场所。

蓝牙终端侧定位方案

定位原理:首先在区域内铺设Beacon定位设备,Beacon室内定位设备作为蓝牙信标不断的向周围广播信号和数据包。当终端设备进入Beacon设备信号覆盖的范围,测出其在不同信标(不同ID号的Beacon硬件设备)下的RSSI值,然后再通过手机内置的定位算法测算出具体位置(一般至少需要3个信标点的RSSI)。

蓝牙网络侧室内定位方案

网络侧定位方案通过基于蓝牙网关(TD03/TD05/TD05A)的定位系统配合蓝牙手环来对处于室内的人员位置信息做实时监控,并且可以实时遥控由蓝牙手环上传的心率、体温、步数等数据,定位精度达到2~3米,广泛应用于学校、养老院、医院、监狱等场所。

蓝牙网络侧定位方案

定位原理:蓝牙网关(TD05/TD05A/TD05B)通过有线(以太网)或者无线(WiFi)的方式进行与定位服务器的连接,用电源适配器(5V)或者POE的方式对每个蓝牙网关进行供电,蓝牙网关会将扫描到的防拆卸蓝牙手环收据通过现有有线网络或者是无线WiFi网络覆盖直接上传至定位服务器,从而实现蓝牙网络侧定位。

整套系统能监测实时位置、历史轨迹、实时心率、实时体温、实时步数、人员分布密度。

室内外一体化定位解决方案,室外依然应用成熟的GPS/BDS卫星定位+移动基站辅助定位,室内则是利用蓝牙定位技术;

室内外一体化定位解决方案

室外定位部分:

1 TD04接收到室外卫星信号,将经纬度信息通过GPRS发送到后台服务器。

2 后台服务器通过经纬度信息确定TD04的位置。

3 当TD04上的蓝牙模块接收到蓝牙Beacon信号时,通过蓝牙Beacon的信息进行定位,此时为了降低功耗,关闭GPS/BDS定位。当TD04上的蓝牙模块没有接收到蓝牙Beacon时,打开GPS/BDS定位。

室内定位部分:

1 在室内布置蓝牙Beacon(VG02),在室内地图上标识每个蓝牙Beacon(VG02)的位置。

2 TD04接收到多个蓝牙Beacon(VG02)的广播信息,通过GPRS将多个蓝牙BEACON的MAC地址、RSSI信息发送到后台服务器。

3 后台服务器结合MAC地址、RSSI的信号强度、蓝牙Beacon在地图上的位置通过三角定位算法计算TD04在室内的位置。

我正在开发一个应用程序有连接到蓝牙设备的 Android 43。
我可以连接到 BLE 设备和从设备中读取 RSSI,通过使用 BluetoothGattreadRemoteRssi()。
我想要读的多个设备一次我已连接,但我可以只读 BLE RSSI 设备 RSSI 的最后一次,我连接的设备。
如果有两个 BLE 设备 A 和 B。我连接到A 的设备,并读取该 RSSI。之后,我连接到B 的设备,和我可以从设备 B读取 RSSI。但它并不读取设备 A的 RSSI,它只能从设备 B读取 RSSI。
在Mainjava ,它列出已连接的位置的所有设备。
当我单击该设备,在列表上,它把传送的设备的名称和地址到DeviceControljava。
final Intent qintent = new Intent(this, DeviceControlclass);
devicelistsetOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
HashMap<String, Object> select = (HashMap<String, Object>) devicelistgetItemAtPosition(arg2);
String name = (String) selectget(“name”);
String address = (String) selectget(“address”);
qintentputExtra(DeviceControlEXTRAS_DEVICE_NAME, name);
qintentputExtra(DeviceControlEXTRAS_DEVICE_ADDRESS, address);
startActivity(qintent);
}
});
DeviceControljava将调用BluetoothLeServicejava和连接到设备。
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
// TODO Auto-generated method stub
mBluetoothLeService = ((BluetoothLeServiceLocalBinder) service)。getService();
if(!mBluetoothLeServiceinitialize()) {
Loge(TAG, “Unable to initialize Bluetooth”);
finish();
}
registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
mBluetoothLeServiceconnect(mDeviceAddress);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
// TODO Auto-generated method stub
mBluetoothLeService = null;
}
};
BluetoothLeServicejava将连接到该设备。
public boolean connect(final String address) {
if (mBluetoothAdapter == null || address == null) {
Logw(TAG, “BluetoothAdapter not initialized or unspecified address”);
return false;
}
if(mBluetoothDeviceAddress != null && addressequals(mBluetoothDeviceAddress)
&& mBluetoothGatt != null) {
Logd(TAG, “Trying to use an existing mBluetoothGatt for connection”);
if(mBluetoothGattconnect()) {
mConnectionState = STATE_CONNECTING;
return true;
}else {
return false;
}
}
final BluetoothDevice device = mBluetoothAdaptergetRemoteDevice(address);
if(device == null) {
Logw(TAG, “Device not found Unable to connect”);
return false;
}
mBluetoothGatt = deviceconnectGatt(this, false, mGattCallback);
Logd(TAG, “Try to create a new connection”);
mBluetoothDeviceAddress = address;
mConnectionState =STATE_CONNECTING;
return true;
}
它连接到设备后,我可以使用 readRemoteRssi 来从设备中读取 RSSI。
public void readRemoteRssi() {
mBluetoothGattreadRemoteRssi();
}
但它只能读取 RSSI 的最后一个设备的我已连接。
当我看到日志时,它总是发送onCharacteristicWrite和readRemoteRssi()到我连接的最后一个设备。
我应该重新连接关贸总协定 》 或之前我想 RSSI 对读取或写入的 CharacteristicWrite 值的第一个设备重新连接到的第一个地址的设备概览
它不会有其他的方法来读取我已连接的所有设备的 RSSI 概览
解决方法 1:
使多个 BluetoothGatt 对象来连接多个设备分开,并调用 readRemoteRssi 一个接一个。
懒的和坏的示例中,您应该能够将那些 BluetoothGatt 对象放入数组
BluetoothGatt mBluetoothGatt1 = device1connectGatt(this, false, mGattCallback);
BluetoothGatt mBluetoothGatt2 = device2connectGatt(this, false, mGattCallback);

蓝牙定位基于RSSI(Received Signal Strength Indication,信号场强指示)定位原理。搭建方式很简单,借助蓝牙网关或者是蓝牙Beacon就可以实现。

蓝牙室内定位方案的实现必然是建立在蓝牙室内定位产品的基础上,主要定位硬件包括蓝牙网关、蓝牙Beacon、手环、手表等蓝牙标签以及智能手机、无线局域网及后端数据服务器等。根据定位端的不同,蓝牙定位方式分为网络侧定位和终端侧定位。

终端侧定位以蓝牙Beacon(VG01/VG02)主导,主要依托于蓝牙技术;网络侧定位以蓝牙网关(TD05/TD05A)为主导,集成了WiFi和蓝牙BLE两种无线通信方式;

蓝牙室内定位方案工作原理:

终端侧定位是蓝牙Beacon室内定位设备作为蓝牙信标不断的向周围广播信号和数据包。当终端设备进入Beacon设备信号覆盖的范围,测出其在不同信标(不同ID号的Beacon硬件设备)下的RSSI值,然后再通过手机内置的定位算法测算出具体位置(一般至少需要3个信标点的RSSI);

网络侧定位是蓝牙网关(TD03/TD05)里面的蓝牙模块收集蓝牙终端的蓝牙设备信息,包括Mac地址、RSSI等信息,通过UART串口发给蓝牙网关里面的WiFi模块,WiFi模块把信息传输到指定的UDP服务器,并能接收服务器返回的信息。UDP服务器接收到来自某个IP的蓝牙网关数据后,通过数据解析和计算,得到蓝牙信标的位置信息。希望能够帮助到您!

这个如果framework里面没有的话, 需要从底层直接获取数据。这就是数据通路的问题了, 谁去做底层的话, 让他给你开个接口。当然最好的情况是framework里面有, 而且底层也实现了这个接口。

iOS 蓝牙开发(二)
iOS 蓝牙开发(三)
iOS 蓝牙开发(四)

在iOS中蓝牙相关实现都是在CoreBluetooth这个framework中的,所以我们创建一个单例类中需要先导入 #import <CoreBluetooth/CoreBluetoothh> ,再后即可使用这个单例类进行管理我们蓝牙的扫描、连接、状态等实现。

当 centralstate 为CBManagerStatePoweredOn即可开始扫描, 具体方法 [selfcentralManager scanForPeripheralsWithServices:nil options:nil] 当调用 scanForPeripheralsWithServices:options: 函数时就会实时调用其代理方法 - (void)centralManager:(CBCentralManager )central didDiscoverPeripheral:(CBPeripheral )peripheral advertisementData:(NSDictionary )advertisementData RSSI:(NSNumber )RSSI

peripheral 是外设类 advertisementData 是广播的值,一般携带设备名, serviceUUID 等信息。 RSSI 绝对值越大,表示信号越差,设备离的越远。如果想装换成百分比强度, (RSSI+100)/1001 (这是一个约数,蓝牙信号值并不一定是-100 - 0的值)

蓝牙的连接是当中心设备扫描到可用外设后, 利用函数 [selfcentralManager connectPeripheral:peripheral options:nil]; 进行链接, 当函数被调用后, 就会回调其对应的代理函数。

本篇笔记主要是记录如何初始化蓝牙的 CBCentralManager 的中心管理类,并记录如何实现扫描周边外设、如何链接、获取蓝牙当前状态。


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

原文地址: http://outofmemory.cn/yw/13403862.html

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

发表评论

登录后才能评论

评论列表(0条)

保存