⼿机蓝⽛检测蓝⽛设备信号强度(RSSI)
蓝⽛( Bluetooth® ):是⼀种⽆线技术标准,可实现固定设备、移动设备和楼宇个⼈域⽹之间的短距离数据交换(使⽤2.4—2.485GHz的ISM波段的UHF⽆线电波)。蓝⽛技术最初由电信巨头爱⽴信公司于1994年创制,当时是作为RS232数据线的替代⽅案。蓝⽛可连接多个设备,克服了数据同步的难题。
RSSI:Received Signal Strength Indication接收的信号强度指⽰,⽆线发送层的可选部分,⽤来判定链接质量,以及是否增⼤⼴播发送强度。通过接收到的信号强弱测定信号点与接收点的距离,进⽽根据相应数据进⾏定位计算的⼀种定位技术。
本例是通过⼿机蓝⽛对周围蓝⽛设备进⾏搜索,显⽰出域⽤户输⼊的蓝⽛设备名称相匹配的远程蓝⽛设备的信号强度(RSSI)。
所需权限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>
布局⽂件l:
<TextView
android:id="@+id/showRssi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello_man"/>
<Button
android:id="@+id/open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/showRssi"
android:layout_below="@+id/showRssi"
android:layout_marginTop="24dp"
android:onClick="open"
android:text="打开蓝⽛"/>
<Button
android:id="@+id/close"
android:onClick="close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/open"
android:layout_alignBottom="@+id/open"
android:layout_centerHorizontal="true"
android:text="关闭蓝⽛"/>
<EditText
android:id="@+id/bluetoothName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/open"
android:layout_marginTop="31dp"
android:ems="10"
android:hint="请输⼊蓝⽛名称">
<requestFocus />
</EditText>
<Button
android:id="@+id/show"
android:onClick="show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/close"
android:layout_alignBottom="@+id/close"
android:layout_alignParentRight="true"
android:text="信号强度"/>
布局图:
布局为三个按钮,⼀个textview,⼀个editview。
第⼀个按钮功能为打开蓝⽛,第⼆个按钮为关闭蓝⽛,第三个按钮为搜索蓝⽛设备,textview⽤于显⽰蓝⽛设备名称以及信号强
度,editview⽤于输⼊⽤户希望检测信号强度的蓝⽛设备名称。
MainActivity.java:
public class MainActivity extends Activity {
BluetoothAdapter bAdapter;//声明蓝⽛适配器
EditText nameView;//声明edittext
String blueName;//声明⽤户输⼊的蓝⽛设备名称变量
TextView showRssi;//声明textview⽤于显⽰信号强度信息
@Override
android layout布局protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
bAdapter = DefaultAdapter();//获取蓝⽛适配器
//设置过滤器,过滤因远程蓝⽛设备被到⽽发送的⼴播 BluetoothDevice.ACTION_FOUND
IntentFilter iFilter=new IntentFilter();
iFilter.addAction(BluetoothDevice.ACTION_FOUND);
//设置⼴播接收器和安装过滤器
registerReceiver(new foundReceiver(), iFilter);
//获取控件对象
nameView = (EditText) findViewById(R.id.bluetoothName);
showRssi = (TextView) findViewById(R.id.showRssi);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().u.main, menu);
return true;
}
/**
* 打开蓝⽛
* @param v
*/
public void open(View v) {
if(!bAdapter.isEnabled()){
Toast.makeText(getApplicationContext(), "蓝⽛打开成功", 0).show();
}else{
Toast.makeText(getApplicationContext(), "蓝⽛已经打开", 0).show();
}
}
/**
* 关闭蓝⽛
* @param v
*/
public void close(View v) {
if(bAdapter.isEnabled()){
bAdapter.disable();
Toast.makeText(getApplicationContext(), "蓝⽛关闭成功", 0).show();
}else{
Toast.makeText(getApplicationContext(), "蓝⽛已经关闭", 0).show();
}
}
/**
* 搜索远程蓝⽛设备,获取editview的值
* @param v
*/
public void show(View v) {
if(bAdapter.isEnabled()){
blueName = Text().toString().trim();
bAdapter.startDiscovery();
}else{
Toast.makeText(getApplicationContext(), "蓝⽛未打开", 0).show();;
}
}
/**
* 内部类:当到⼀个远程蓝⽛设备时执⾏的⼴播接收者
* @author Administrator
*
*/
class foundReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
BluetoothDevice device = ParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//获取此时到的远程设备对象if(blueName.Name())){//判断远程设备是否与⽤户⽬标设备相同
short Extras().getShort(BluetoothDevice.EXTRA_RSSI);//获取额外rssi值
showRssi.Name()+":"+rssi);//显⽰rssi到控件上
bAdapter.cancelDiscovery();//关闭搜索
}else{
showRssi.setText("未发现设备“"+blueName+"”");
}
}
}
Activity的代码总体分成两部分:①按钮功能的实现②获取设备rssi值并显⽰
1、获取本地蓝⽛适配器
BluetoothAdapter bAdapter = DefaultAdapter();//获取蓝⽛适配器
2、使⽤蓝⽛适配器操作蓝⽛
bAdapter.isEnabled()//判断蓝⽛是否打开
bAdapter.disenable();//关闭蓝⽛
bAdapter.startDiscovery();//搜索远程蓝⽛设备(需要消耗⼤量资源,不建议频繁开关)
bAdapter.cancelDiscovery();//关闭搜索
3、动态配置⼴播接收
//设置过滤器,过滤因远程蓝⽛设备被到⽽发送的⼴播 BluetoothDevice.ACTION_FOUND
IntentFilter iFilter=new IntentFilter();
iFilter.addAction(BluetoothDevice.ACTION_FOUND);
//设置⼴播接收器和安装过滤器
registerReceiver(new foundReceiver(), iFilter);
BluetoothDevice.ACTION_FOUND 是配置⼴播时的⼀个字符串常量,意思是当有蓝⽛设备被发现(未绑定)时发送⼴播,使⽤意图过滤器(IntentFilter)过滤。
4、获取rssi
short Extras().getShort(BluetoothDevice.EXTRA_RSSI);//获取额外rssi值
5、⼴播中获取远程蓝⽛设备对象(device)
BluetoothDevice device = ParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//获取此时到的远程设备对象
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论