安卓通过蓝牙通信小案例
安卓通过自身的蓝牙模块(驱动)与接入了HC-06蓝牙模块的20路机器人专用舵机控制板通信,具体是向控制板发送指令,控制板控制舵机完成相应动作后再回发指令给安卓,安卓再接收到信息并确认完成指令。
简介
本猿是一个实习生,前一段时间刚刚来到公司,被要求学习安卓用蓝牙通信的方式和USB串口的通信方式与Arduino的20路机器人专用舵机控制板通信,从而控制控制板实现机器人做出相应的动作。这篇文章主要是简单介绍我是如何成功实现安卓与HC-06蓝牙模块通信的。
这是本猿第一次写文章,不会写,写的不好请见谅;也觉得不会有人看我的文章,毕竟现在关于这方面的文章一大堆,我也是网找了许多再整理出来的,引用不是很记得了,可能引用的不正确,还是见谅;变量命名不规范还是请见谅,本猿喜欢大驼峰加下划线命名方式,以后尽量改,没办法,毕竟要提高程序猿的修养。
权限
安卓通过蓝牙通信是需要权限的
权限如下:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
XML布局
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ListView
android:id="@+id/ListView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"></ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#FF000000"
android:orientation="horizontal">
<TextView
android:id="@+id/TextView"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:textSize="30dp"
android:textColor="#FFFFFFFF"
android:gravity="center|start"
android:background="#FF000000" />
<Button
android:id="@+id/Button"
android:layout_width="150dp"
android:layout_height="match_parent"
android:text="断 开 蓝 牙"
android:textSize="20dp"/>
</LinearLayout>
</LinearLayout>
声明全局变量
代码如下:
// 获取到蓝牙适配器
private BluetoothAdapter BlueToothAdapter;
private BluetoothManager BlueToothManager;
// 用来保存搜索到的设备信息
private List<String> BlueToothDevices = new ArrayList<String>();
// ListView组件
private ListView ListView;
// ListView的字符串数组适配器
private ArrayAdapter<String> ArrayAdapter;
// UUID,蓝牙建立链接需要的
private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// 为其链接创建一个名称
private final String NAME = "BlueTooth_Socket";
// 选中发送数据的蓝牙设备,全局变量
private BluetoothDevice BlueToothDevice;
// 获取到选中设备的客户端串口,全局变量
private BluetoothSocket BlueToothSocket;
// 获取到向设备写的输入流,全局变量
private InputStream InputStream;
// 获取到向设备写的输出流,全局变量
private OutputStream OutputStream;
private Button Button = null;
private TextView TextView = null;
private Handler Handler = new Handler() {
@Override
public void handleMessage(Message msg) {
TextView.setText(msg.obj.toString());
super.handleMessage(msg);
}
};
初始化一些数据
代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initListener();
}
//获取控件资源ID
private void initView() {
ListView = findViewById(R.id.ListView);
TextView = findViewById(R.id.TextView);
Button = findViewById(R.id.Button);
}
//初始化部分需要初始数据的控件
private void initData() {
checkSelfPermission();
BlueToothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BlueToothAdapter = BlueToothManager.getAdapter();
if (BlueToothAdapter == null) {
Toast.makeText(getBaseContext(), "当前设备不支持蓝牙", Toast.LENGTH_LONG).show();
finish();
return;
}
myRegisterReceiver();
startScan();
ArrayAdapter = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, android.R.id.text1, BlueToothDevices);
// 为listView绑定适配器
ListView.setAdapter(ArrayAdapter);
TextView.setText("请选择蓝牙");
}
//每个控件的监听方法
private void initListener() {
ListView.setOnItemClickListener(List_ItemClick);
Button.setOnClickListener(Button_Click);
}
private void checkSelfPermission() {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED || ContextCompat.