所以我的问题出现在前几天通过iPhone配置实用程序查看一些iOS 7.0.x设备的控制台输出.我很困惑地看到几个迹象表明WiFi守护进程无缘无故地注册WiFi rssi活动(没有后台应用程序活动/推送消息待处理等等).这些都在控制台中以耦合记录的形式出现:
Mar xx xx:xx:xx iDevice wifid[xx] <Notice>: WiFi:[406330748.823677]:
Mar xx xx:xx:xx iDevice wifid[xx] <Notice>: Too frequent(1.822344 secs) rssi event from driver
Mar xx xx:xx:xx iDevice wifid[xx] <Notice>: WiFi:[406330748.895756]:
Mar xx xx:xx:xx iDevice wifid[xx] <Notice>: Too frequent(0.835468 secs) rssi event from driver, ignoring
Run Code Online (Sandbox Code Playgroud)
...等等.令我担心的是,上面的行每隔一秒左右重复一次,似乎永远不会结束.
现在我不是任何形式的程序员,但了解UNIX的一些基础知识,我已经设法得出结论,WiFi守护程序占用了大量的CPU时间,如使用终端的最高分解所示,这可能表明这可能(或不是)是我最近在这些设备中遇到电池寿命不佳的原因.
接下来,我显然会问你们所有人是否熟悉上面提到的行为,如果有的话,那么"噪音"的来源是什么呢?
我正在尝试编写一个非常简单的Android应用程序来检查当前单元格的信号强度.到目前为止,我只找到了一些叫做的东西getNeighboringCellInfo()
,但我不确定它是否包含当前的单元格.
如何在Android中获得CURRENT单元信号强度?
是否getNeighborCellInfo()
得到当前单元格?它似乎不是基于我能够得到它的结果.这是我目前的代码:
List<NeighboringCellInfo> n = tm.getNeighboringCellInfo();
//Construct the string
String s = "";
int rss = 0;
int cid = 0;
for (NeighboringCellInfo nci : n)
{
cid = nci.getCid();
rss = -113 + 2*nci.getRssi();
s += "Cell ID: " + Integer.toString(cid) + " Signal Power (dBm): " +
Integer.toString(rss) + "\n";
}
mainText.setText(s);
Run Code Online (Sandbox Code Playgroud) 我有一个简单的iOS应用程序,显示它使用诸如"立即","近"等表达式检测到的蓝牙LE信标的接近度.我需要在Android上编写类似的东西.
我已经按照Android开发人员的教程进行了操作,我能够列出检测到的设备,现在想要估算距离/接近度 - 这就是它成为问题的地方.根据这个SO线程,它只是一些数学计算.但是,它们要求我提供txPower值.
根据Dave Smith的本教程(以及与此蓝牙SIG声明的交叉引用),它应该由信标设备广播为类型的"AD结构" 0x0A
.所以我所做的是解析AD结构并查找与该类型匹配的有效负载.
问题:我有4个信标 - 2个estimotes和2个appflares.estimotes根本不播放txPower,appflares将它们广播为0.
这里有什么我想念的吗?iOS应用程序似乎没有任何问题处理它,但使用iOS SDK它在幕后做,所以我不知道如何产生完全相同或类似的行为.还有其他方法可以解决我的问题吗?
如果您想查看我用来解析AD结构的代码,可以从前面提到的Dave Smith的github中获取,可以在这里找到.我对该类所做的唯一更改是添加以下方法:
public byte[] getData() {
return mData;
}
Run Code Online (Sandbox Code Playgroud)
这就是我处理扫描回调的方法:
// Prepare the callback for BLE device scan
this.leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
if (!deviceList.contains(device)) {
MyService.this.deviceList.add(device);
Log.e("Test", "Device: " + device.getName());
List<AdRecord> adRecords = AdRecord.parseScanRecord(scanRecord);
for (AdRecord adRecord : adRecords) {
if …
Run Code Online (Sandbox Code Playgroud) android bluetooth rssi bluetooth-lowenergy android-bluetooth
精简版:
在我使用Android 5.0 Lollipop的测试中,我注意到android.bluetooth.le.BluetoothLeScanner
检测BLE设备的频率低于Android 4.4 KitKat.为什么这样,还有其他选择吗?
长版:
我正在开发一款Android应用程序,专门用于Nexus 7平板电脑,专注于检测蓝牙低功耗(BLE)设备.该应用程序主要感兴趣的是信标的RSSI值,以确定它们与平板电脑的接近程度.这意味着我不需要连接到BLE设备,因为在检测到设备时RSSI值会传递给扫描回调.
在Android 4.4 KitKat中,当我调用时BluetoothAdapter.startLeScan(LeScanCallback)
,对于每个检测到的BLE设备,我的回调仅被调用ONCE.(我已经看到一些讨论声称每个设备的行为可能不同)但是,我对不断变化的RSSI值感兴趣,所以目前推荐的方法是以设定的间隔(在我的情况下为250ms)连续执行startLeScan和stopLeScan:
public class TheOldWay {
private static final int SCAN_INTERVAL_MS = 250;
private Handler scanHandler = new Handler();
private boolean isScanning = false;
public void beginScanning() {
scanHandler.post(scanRunnable);
}
private Runnable scanRunnable = new Runnable() {
@Override
public void run() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (isScanning) {
adapter.stopLeScan(leScanCallback);
} else if (!adapter.startLeScan(leScanCallback)) {
// an error occurred during startLeScan
}
isScanning = …
Run Code Online (Sandbox Code Playgroud) rssi bluetooth-lowenergy ibeacon-android android-ibeacon android-5.0-lollipop
我需要知道我使用Android 2.1手机连接到远程设备的蓝牙连接的信号强度.从SDK中,我可以看到我可以在发现远程设备时确定RSSI.但我无法看到如何随着时间的推移更新RSSI值.
有人可以帮我一把吗?谢谢!!
您好有什么办法可以通过linux中的bluetooth le设备获得近乎信号强度?或者nodejs,php或mono的任何好的库(我确实知道一些c ++或python但更愿意说它们),如果一个工具不存在但是很容易写
谢谢
我目前在WiFi定位上做硕士论文,为了测试我的算法,我需要收集一些数据.
为此,我编写了一个简短而简单的Android程序,它只是为每次扫描找到的所有可用访问点收集RSSI并将它们保存到文件中.我已经设置了一个BroadcastReceiver
侦听事件WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
,我使用一个Timer
名为tim的,用一个WifiManager
叫做wifi的扫描来启动扫描,如下所示:
tim.schedule(new TimerTask(){
@Override
public void run(){
wifi.startScan();
}
}, 0, 1000);
Run Code Online (Sandbox Code Playgroud)
我现在遇到的问题是,即使我成功启动它们,启动的扫描似乎也不会每秒都发生,并且偶尔会有其他扫描从其他应用程序启动并进行记录.
是否有任何简单的方法可以在设定的时间间隔内扫描而不接收其他应用程序发起的扫描?
整个应用程序可以在https://github.com/while/RSSIMiner上找到,如果它有任何帮助.
对于我的项目,我需要估计智能手机和蓝牙模块之间的距离.估算不一定非常精确.我只需要确定距离,误差幅度约为50cm
.
我测试了两个蓝牙模块的RSSI,距离为10厘米.我为每一步测量了RSSI 5次,得到了5次测量的平均值.平均值如下图所示:
红色和蓝色线条类似于两个蓝牙模块.您可以看到结果不是很线性.其中一个原因是干扰,所以我寻找解决干扰问题的方法.我发现的两种方式是:
信噪比(SNR):了解ibeacon间隔
iBeacon信号强度(rssi
)与校准发射机功率(txPower
)之比.的txPower
是在已知的测量的信号强度rssi
在1 meter
远:http://www.princeton.edu/~achaney/tmve/wiki100k/docs/Signal-to-noise_ratio.html
但是我真的不明白如何使用上述技术来获得更高的准确性.对于SNR我需要噪声值,我怎么得到噪声值?
对于ratio rssi
/ txPower
,我可以txPower
通过简单地从模块测量rssi
at 1 meter
来获得.所以我知道所有需要的价值观.但我不知道该怎么办.如何使用这些值来获得更准确的距离估计?
我还可以使用其他任何技术来提高准确性吗?
我知道有关我的问题的stackoverflow有很多问题,但我想知道是否有任何方法可以获得与RSSI的确切距离.
我已经按照这个链接和一些其他git库方法进行距离计算以及本教程.但我无法得到正确的解决方案.
这就是我用来测量距离的方法:
protected double calculateDistance(float txPower, double rssi) {
if (rssi == 0) {
return -1.0; // if we cannot determine distance, return -1.
}
double ratio = rssi * 1.0 / txPower;
if (ratio < 1.0) {
return Math.pow(ratio, 10);
} else {
double accuracy = (0.89976) * Math.pow(ratio, 7.7095) + 0.111;
return accuracy;
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用这个方法时,我通过标准和rssi从我的mLeScanCallBack()得到的
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, …
Run Code Online (Sandbox Code Playgroud) 蓝牙低功耗使用40个信道,每个信道宽2 MHz,跨越未经许可的2.4 GHz无线电频段.在40个频道中,BLE广告在三个频道上播出.这些广告信道名义上标记为37,38和39,并且分别在2402MHz,2426MHz和2480MHz处间隔很宽.
在iOS的Core位置,所有扫描的BLE信标都列在NSArray中,并且可以轻松访问每个信标的RSSI值.例如.
CLBeacon* beacon1 = [beacons firstObject]; NSNumber *RSSI = [NSNumber numberwithFloat:beacon1.RSSI];
Run Code Online (Sandbox Code Playgroud)
这里,RSSI值是CoreLocation提供的'averaged'值.此外,该RSSI实时波动很大.
现在,我的查询是,iOS(Objective-C)中是否有任何方法/框架访问每个广告渠道,以便我们可以从每个渠道获得RSSI值?
已发表的期刊[ http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7103024&tag=1]已经提供了来自所有三个广告渠道的RSSI结果.该论文称,iOS 7.0之后可以使用此功能(单独访问三个广告频道).但是,我无法弄清楚在iOS中访问三个广告频道的确切方式.
先感谢您.