iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android适配安卓6.0蓝牙通讯实现过程
  • 582
分享到

Android适配安卓6.0蓝牙通讯实现过程

android适配Android蓝牙 2022-06-06 07:06:49 582人浏览 薄情痞子
摘要

事先说明: 安卓蓝牙需要定位权限申请,在安卓6.0需要用户手动确认权限后才能使用,各位可以自行查询资料实现,如果嫌麻烦,可以用第三方Bmob集成好的工具类进行实现,详细可以看H

事先说明:
安卓蓝牙需要定位权限申请,在安卓6.0需要用户手动确认权限后才能使用,各位可以自行查询资料实现,如果嫌麻烦,可以用第三方Bmob集成好的工具类进行实现,详细可以看Http://blog.csdn.net/qq_30379689/article/details/52223244

蓝牙连接过程:
1、查询用户是否开启蓝牙。
2、搜索附近的可用的蓝牙。
3、进行蓝牙配对。
4、进行蓝牙连接。
5、获取输入流和输出流。
6、发送消息。

晒上我自己画的美图:


实验效果图:

实现需要的权限:由于安卓4.x以上的版本使用蓝牙,需要开启定位权限才能搜索到附近的蓝牙设备


<uses-permission Android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

服务端

实现思路:
1、拿到本地蓝牙设备。
2、蓝牙之间的通讯需要一个唯一识别UUID来匹配正确的设备,使用UUID获取蓝牙的通讯Socket
3、开启获取数据的线程


public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
 BluetoothSocket BTSocket; 
 BluetoothAdapter BTAdapter; 
 Button bt_start; 
 TextView tv_msg; 
 StringBuilder sb; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 bt_start = (Button) findViewById(R.id.bt_start); 
 tv_msg = (TextView) findViewById(R.id.tv_msg); 
 bt_start.setOnClickListener(this); 
 sb = new StringBuilder(); 
 //拿到本地蓝牙设备 
 BTAdapter = BluetoothAdapter.getDefaultAdapter(); 
 } 
  
 public void show(String msg) { 
 sb.append(msg + "\n"); 
 runOnUiThread(new Runnable() { 
 @Override 
 public void run() { 
 tv_msg.setText(sb.toString()); 
 } 
 }); 
 } 
 @Override 
 public void onClick(View v) { 
 //开启服务器 
 ServerThread startServerThread = new ServerThread(); 
 startServerThread.start(); 
 } 
  
 private class ServerThread extends Thread { 
 public void run() { 
 try { 
 BluetoothServerSocket mserverSocket = BTAdapter.listenUsingRfcommWithServiceRecord("btspp", 
  UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
 show("服务端:等待连接"); 
 BTSocket = mserverSocket.accept(); 
 show("服务端:连接成功"); 
 readThread mreadThread = new readThread(); 
 mreadThread.start(); 
 show("服务端:启动接受数据"); 
 } catch (IOException e) { 
 e.printStackTrace(); 
 } 
 } 
 } 
  
 private class readThread extends Thread { 
 public void run() { 
 byte[] buffer = new byte[1024]; 
 int bytes; 
 InputStream mmInStream = null; 
 try { 
 mmInStream = BTSocket.getInputStream(); 
 show("服务端:获得输入流"); 
 } catch (IOException e1) { 
 e1.printStackTrace(); 
 } 
 while (true) { 
 try { 
  if ((bytes = mmInStream.read(buffer)) > 0) { 
  byte[] buf_data = new byte[bytes]; 
  for (int i = 0; i < bytes; i++) { 
  buf_data[i] = buffer[i]; 
  } 
  String s = new String(buf_data); 
  show("服务端:读取数据了~~" + s); 
  } 
 } catch (IOException e) { 
  try { 
  mmInStream.close(); 
  } catch (IOException e1) { 
  e1.printStackTrace(); 
  } 
  break; 
 } 
 } 
 } 
 } 
} 

客户端

实现思路:
1、检查是否开启蓝牙。
2、注册一系列蓝牙的广播。
3、由于蓝牙每经过一个阶段都会发送一个广播,根据广播来实现对应的方法。
4、蓝牙配对->蓝牙连接->发送消息(UUID必须相同)


public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
 private TextView tv_msg; 
 private Button bt_search, bt_send; 
 private BluetoothSocket BTSocket; 
 private BluetoothAdapter BTAdapter; 
 private BluetoothDevice device; 
 private StringBuilder sb; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 bt_search = (Button) findViewById(R.id.bt_search); 
 bt_send = (Button) findViewById(R.id.bt_send); 
 tv_msg = (TextView) findViewById(R.id.tv_msg); 
 bt_search.setOnClickListener(this); 
 bt_send.setOnClickListener(this); 
 sb = new StringBuilder(); 
 show("客户端:检查BT"); 
 checkBT(this); 
 show("客户端:注册接收者"); 
 reGISterBTReceiver(); 
 } 
  
 public void show(String msg) { 
 sb.append(msg + "\n"); 
 runOnUiThread(new Runnable() { 
 @Override 
 public void run() { 
 tv_msg.setText(sb.toString()); 
 } 
 }); 
 } 
 @Override 
 public void onClick(View v) { 
 switch (v.getId()) { 
 case R.id.bt_search: 
 show("客户端:开始寻找设备"); 
 BTAdapter.startDiscovery(); 
 break; 
 case R.id.bt_send: 
 sendMessage(); 
 break; 
 } 
 } 
  
 public void checkBT(Context context) { 
 BTAdapter = BluetoothAdapter.getDefaultAdapter(); 
 if (BTAdapter != null) { 
 if (!BTAdapter.isEnabled()) { 
 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
 // 设置蓝牙可见性,最多300秒 
 intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
 context.startActivity(intent); 
 } 
 } else { 
 System.out.println("本地设备驱动异常!"); 
 } 
 } 
  
 private class clientThread extends Thread { 
 public void run() { 
 try { 
 //创建一个Socket连接:只需要服务器在注册时的UUID号 
 BTSocket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
 //连接 
 show("客户端:开始连接..."); 
 BTSocket.connect(); 
 show("客户端:连接成功"); 
 //启动接受数据 
 show("客户端:启动接受数据"); 
 readThread mreadThread = new readThread(); 
 mreadThread.start(); 
 } catch (IOException e) { 
 show("客户端:连接服务端异常!断开连接重新试一试"); 
 e.printStackTrace(); 
 } 
 } 
 } 
  
 private class readThread extends Thread { 
 public void run() { 
 byte[] buffer = new byte[1024]; 
 int bytes; 
 InputStream is = null; 
 try { 
 is = BTSocket.getInputStream(); 
 show("客户端:获得输入流"); 
 } catch (IOException e1) { 
 e1.printStackTrace(); 
 } 
 while (true) { 
 try { 
  if ((bytes = is.read(buffer)) > 0) { 
  byte[] buf_data = new byte[bytes]; 
  for (int i = 0; i < bytes; i++) { 
  buf_data[i] = buffer[i]; 
  } 
  String s = new String(buf_data); 
  show("客户端:读取数据了" + s); 
  } 
 } catch (IOException e) { 
  try { 
  is.close(); 
  } catch (IOException e1) { 
  e1.printStackTrace(); 
  } 
  break; 
 } 
 } 
 } 
 } 
  
 public void sendMessage() { 
 if (BTSocket == null) { 
 Toast.makeText(this, "没有连接", Toast.LENGTH_SHORT).show(); 
 return; 
 } 
 try { 
 OutputStream os = BTSocket.getOutputStream(); 
 os.write("我爱你dahsid132456@#%¥*".getBytes()); 
 os.flush(); 
 show("客户端:发送信息成功"); 
 } catch (IOException e) { 
 e.printStackTrace(); 
 } 
 } 
  
 public void registerBTReceiver() { 
 // 设置广播信息过滤 
 IntentFilter intentFilter = new IntentFilter(); 
 intentFilter.addAction(BluetoothDevice.ACTION_FOUND); 
 intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
 intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
 intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); 
 intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); 
 // 注册广播接收器,接收并处理搜索结果 
 registerReceiver(BTReceive, intentFilter); 
 } 
  
 public void unregisterBTReceiver() { 
 unregisterReceiver(BTReceive); 
 } 
 @Override 
 protected void onDestroy() { 
 super.onDestroy(); 
 unregisterBTReceiver(); 
 } 
  
 private BroadcastReceiver BTReceive = new BroadcastReceiver() { 
 @Override 
 public void onReceive(Context context, Intent intent) { 
 String action = intent.getAction(); 
 if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
 device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
 show("客户端:找到的BT名:" + device.getName()); 
 // 如果查找到的设备符合要连接的设备,处理 
 if (device.getName().equalsIgnoreCase("xu")) { 
  show("客户端:配对xu蓝牙:"); 
  // 搜索蓝牙设备的过程占用资源比较多,一旦找到需要连接的设备后需要及时关闭搜索 
  BTAdapter.cancelDiscovery(); 
  // 获取蓝牙设备的连接状态 
  int connectState = device.getBondState(); 
  switch (connectState) { 
  // 未配对 
  case BluetoothDevice.BOND_NONE: 
  show("客户端:开始配对:"); 
  try { 
  Method createBondMethod = BluetoothDevice.class.getMethod("createBond"); 
  createBondMethod.invoke(device); 
  } catch (Exception e) { 
  e.printStackTrace(); 
  } 
  break; 
  // 已配对 
  case BluetoothDevice.BOND_BONDED: 
  try { 
  show("客户端:开始连接:"); 
  clientThread clientConnectThread = new clientThread(); 
  clientConnectThread.start(); 
  } catch (Exception e) { 
  e.printStackTrace(); 
  } 
  break; 
  } 
 } 
 } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { 
 // 获取蓝牙设备的连接状态 
 int connectState = device.getBondState(); 
 // 已配对 
 if (connectState == BluetoothDevice.BOND_BONDED) { 
  try { 
  show("客户端:开始连接:"); 
  clientThread clientConnectThread = new clientThread(); 
  clientConnectThread.start(); 
  } catch (Exception e) { 
  e.printStackTrace(); 
  } 
 } 
 } 
 show(action); 
 } 
 }; 
} 

蓝牙广播内容:

ACTION_STATE_CHANGED   当你蓝牙开启或者关闭的时候发送
ACTION_FOUND  当你匹配到附近蓝牙设备时发送
ACTION_DISCOVERY_STARTED  当你开始搜索附近蓝牙设备时发送
ACTION_DISCOVERY_FINISHED  当你结束搜索附近蓝牙设备时发送
ACTION_BOND_STATE_CHANGED  当你蓝牙设备匹配状态发生变化时发送

源码下载:http://xiazai.jb51.net/201609/yuanma/Androidrobot(jb51.net).rar

您可能感兴趣的文章:native.js获取手机硬件基本信息实例代码android版Dcloud的native.js直接拨打电话Android实例代码DCloud的native.js调用系统分享实例Android版代码Android蓝牙开发深入解析详解Android——蓝牙技术 带你实现终端间数据传输Android Bluetooth蓝牙技术使用流程详解Android单片机与蓝牙模块通信实例代码分享Android 蓝牙4.0(ble)开发的解决方案android实现蓝牙文件发送的实例代码,支持多种机型Android手机通过蓝牙连接佳博打印机的实例代码Android系统中的蓝牙连接程序编写实例教程Android蓝牙通信聊天实现发送和接受功能Android编程之蓝牙测试实例Android 获取蓝牙Mac地址的正确方法Android 蓝牙2.0的使用方法详解Android实现蓝牙客户端与服务器端通信示例Android 蓝牙连接 ESC/POS 热敏打印机打印实例(蓝牙连接篇)Android 取消蓝牙配对框实现自动配对功能Android提高之蓝牙传感应用实例Android开发实现实时检测蓝牙连接状态的方法【附源码下载】Native.js获取监听开关等操作Android蓝牙设备实例代码


--结束END--

本文标题: Android适配安卓6.0蓝牙通讯实现过程

本文链接: https://www.lsjlt.com/news/23753.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作