工控网首页
>

应用设计

>

安卓工控触摸一体机的蓝牙全面开发教程

安卓工控触摸一体机的蓝牙全面开发教程

2018/8/2 14:25:38

开发系统:Android4.4.2    运行平台:广州微嵌安卓工业平板  安卓的蓝牙打开包括获取蓝牙模块、搜索蓝牙设备、蓝牙设备间的配对、连接跟通信等部分。  1、安卓中使用蓝牙模块需要蓝牙的使用权限,需要在AndroidMainfest.xml中声明:

允许程序连接到已配对的蓝牙设备允许程序发现和配对蓝牙设备1234

2、获取蓝牙适配器并打开蓝牙

//获取蓝牙适配器mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if(mBluetoothAdapter ==null){ Toast.makeText(this, "不支持蓝牙设备",Toast.LENGTH_LONG).show();   bluetoothSwitch.setEnabled(false);    return; } 打开蓝牙设备//判断蓝牙设备是否处于关闭状态,如果是则打开蓝牙if(!mBluetoothAdapter.isEnabled()){              if(mBluetoothManager.enable()){//打开蓝牙设备//开启蓝牙后,需设置蓝牙为可发现状态,这样其它的蓝牙设备才能搜索到。Intent discoverableIntent = new Intent             (BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);     //最后的参数设置可见的时间,最长为300s,设为0表示一直可见discoverableIntent.putExtra(             BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);    startActivity(discoverableIntent);    //成功打开蓝牙后开始搜索附近的蓝牙设备     mBluetoothAdapter.startDiscovery();    //停止搜索:mBluetoothAdapter.cancelDiscovery();} }else{//关闭蓝牙设备     mBluetoothManager.disable(); }//获取已配对的蓝牙设备Set Bondedlist =mBluetoothAdapter.getBondedDevices();123456789101112131415161718192021222324252627

3、定义广播接收,在开始搜索附近的蓝牙设备,系统回发出三个搜索状态的广播

BluetoothDevice.ACTION_FOUND               //搜索到设备BluetoothAdapter.ACTION_DISCOVERY_STARTED  //开始搜索BluetoothAdapter.ACTION_DISCOVERY_FINISHED //搜索结束 定义广播接收相应的广播状态private class BluetoothReceive extends BroadcastReceiver{     @Override     public void onReceive(Context context, Intent intent) {        // TODO 自动生成的方法存根         String action = intent.getAction();        //判断广播内容         //搜索到蓝牙设备广播         if(action.equals(BluetoothDevice.ACTION_FOUND)){            //获取搜素到的蓝牙设备               BluetoothDevice device =intent.getParcelableExtra                             (BluetoothDevice.EXTRA_DEVICE);               if(device.getName()==null){                return;             }            //获取搜素到的蓝牙设备是否已经配对            if(device.getBondState() == BluetoothDevice.BOND_BONDED){                  deviceSet.add(device);                adapter.add(device.getName()+":可使用");             }           else {                deviceSet.add(device);                adapter.add(device.getName()+":可配对");            }         }            //搜索结束的广播                        else if(action.equals                 (BluetoothAdapter.ACTION_DISCOVERY_FINISHED)){             Toast.makeText(MainActivity.this,                     "扫描结束",Toast.LENGTH_LONG).show();         }     } }

4、蓝牙设备的配对

//获取搜索到的蓝牙设备列表中的蓝牙设备及其状态BluetoothDevice device = deviceSet.get(position);int state = deviceSet.get(position).getBondState();//判断蓝牙设备状态Switch(state){    //蓝牙设备没有配对       case BluetoothDevice.BOND_NONE:          //配对方法一:         Method createBondMethod=         device.getClass().getMethod("createBond");           Boolean returnValue =(Boolean)createBondMethod.invoke(device);           //配对方法二:         device.createBond();        break;    //蓝牙设备已经配对     case BluetoothDevice.BOND_BONDED:        //可选操作:删除配对信息、连接蓝牙设备         //删除配对信息:         Method createBondMethod=         device.getClass().getMethod("removeBond");           Boolean returnValue =(Boolean)createBondMethod.invoke(device);          //连接蓝牙设备:         //建立蓝牙客户端并连接服务器         mBluetoothClient = new BluetoothClient(MainActivity.this,device,uuid);         mBluetoothClient.connect();        break; }

上面的内容主要是获取蓝牙模块、打开蓝牙、搜素附近蓝牙设备跟进行配对。  下面的是蓝牙设备间建立连接并进行通信。  蓝牙设备的连接、通信跟网络通信TCP的类似,分别有服务器、客户端,先是新建一个服务器用于监听客户端的连接请求,客户端向服务器发送连接请求,连接成功后双方都获得BluetoothSocket的实例,双方可以通过BluetoothSocket的实例进行通信。  5、服务器:  新建一个蓝牙服务器并监听客户端的连接请求  在listenUsingRfcommWithServiceRecord中有一个参数叫做UUID,UUID(Universally    Unique Identifier)是一个128位的字符串ID,被用于唯一标识我们的蓝牙服务。

String name = mBluetoothAdapter.getName();try {//创建一个BluetoothServerSocket蓝牙服务器,并开启接收线程等待客户端的连接         mServerSocket = mBluetoothAdapter             .listenUsingRfcommWithServiceRecord(name, uuid);        new acceptThread().start();     } catch (IOException e) {            // TODO 自动生成的 catch 块             e.printStackTrace();      }; 等待客户端连接:public class acceptThread extends Thread{     @Override     public void run() {        // TODO 自动生成的方法存根         try {            //该方法是服务器阻塞等待客户端的连接,             //监听到有客户端连接返回一个BluetoothSocket的实例                    socket = mServerSocket.accept();             Log.d("Server", "以连接");            //开启读取线程读取客户端发来的数据             read = new readThread();             read.start();         } catch (IOException e) {            // TODO 自动生成的 catch 块             e.printStackTrace();         }                    super.run();     } } 读取数据:public class readThread extends Thread{     @Override     public void run() {        // TODO 自动生成的方法存根         if(socket.isConnected()){            try {                //获取socket的InputStream并不断读取数据                 InputStream in = socket.getInputStream();                byte[] buff = new byte[1024];                while(!isInterrupted()){                    int size = in.read(buff);;                    if(size>0){                         Log.d("RECVDATA", String.valueOf(buff));                     }                 }                 in.close();             } catch (IOException e) {                // TODO 自动生成的 catch 块                 e.printStackTrace();             }                        }        super.run();     } }    发送数据:public void write(String str){        if(socket.isConnected()){            try {//获取socket的OutputStream并写入数据                 OutputStream out = socket.getOutputStream();                 out.write(str.getBytes()); out.close();             } catch (IOException e) {                // TODO 自动生成的 catch 块                 e.printStackTrace();             }         } }//关闭服务器:mServerSocket.close();//关闭BluetoothSocket:Socket.close();

6、客户端:

获取一个BluetoothSocket的实例并向服务器发送连接请求public class ConnectThread extends Thread{     @Override     public void run() {        // TODO 自动生成的方法存根         try {            //获取BluetoothSocket实例并连接服务器,该处的uuid需与服务器短                //的uuid一致才能连接成功,connect()是回阻塞的。              socket = mBluetoothDevice                 .createRfcommSocketToServiceRecord(uuid);             socket.connect()             Log.d("TAG", "连接成功");             read = new ReadThread();             read.start();         } catch (IOException e) {                    // TODO 自动生成的 catch 块             e.printStackTrace();         }        super.run();     }    } 客户端的读取跟发送与服务器的相同。

至此安卓系统的蓝牙的基本功能就基本完成了,在两块都开启了蓝牙的安卓设备上分别建议服务器跟客户端,并进行连接,连接成功后双方就可以通过蓝牙进行通信了。

审核编辑(
王静
)
投诉建议

提交

查看更多评论
其他资讯

查看更多

医疗垃圾回收系统工业平板电脑应用解决方案

怎么样使用QT开发安卓工业平板电脑程序

安卓系统的远程数据库MySql操作

安卓设备的网络adb调试设置

组态王在WinCE工业平板电脑的安装使用