首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
安卓的蓝牙全面开发教程
--工业触摸一体机蓝牙解决方案
收藏本文     查看收藏

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

允许程序连接到已配对的蓝牙设备 <uses-permission android:name="android.permission.BLUETOOTH"/> 允许程序发现和配对蓝牙设备 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

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<BluetoothDevice> Bondedlist =mBluetoothAdapter.getBondedDevices();

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(); } } 客户端的读取跟发送与服务器的相同。

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


 

状 态: 离线

公司简介
产品目录
供应信息

公司名称: 广州市微嵌计算机科技有限公司
联 系 人: 李工
电  话: 020-32206882
传  真: 020-32207973
地  址: 广东广州黄埔永和新庄工业园B座
邮  编: 510630
主  页:
 
该厂商相关解决方案:
智能终端wince工业触摸控制屏的应用解决方案
嵌入式工业平板电脑应用智能家居解决方案
嵌入式工控触摸一体机在道路称重计费系统中的应用
支持can现场总线的工业触摸一体机应用案例
电力系统工业触摸屏一体机的应用
微嵌安卓系统工业平板电脑在车载行业应用
WindowsCE上usb驱动的.cab安装包
嵌入式工控机针对液晶屏生产线系统解决方案
更多方案...
立即发送询问信息在线联系该解决方案厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved