Android的蓝牙部分暂且分为2.0,4.0,虽然苹果已经出了5.0版本了,咱先不说这个。
简单讲解一下,4.0是兼容2.0的功能的,今天讲的bluetoothSocket通信是在2.0上面就已经有了。

Android手机蓝牙跟硬件蓝牙交互一般都是用的bluetoothGatt.
Android手机跟手机蓝牙通信一般用的是bluetoothSocket.

这里我暂且把要连接的设备叫客户端,扫描以及请求配对都由客户端操作,被连接的设备叫做服务端。

流程:(双方蓝牙都在打开并且服务端在可检测的情况下)

客户端–>扫描到服务端–>通过扫描到bluetoothDevice获取bluetoothSocket(UUID);再用
bluetoothSocket.connect();连接服务端,这里的UUID是服务端指定的UUID

服务端–>通过蓝牙适配器获取BluetoothServerSocket(Name,UUID);–Name跟UUID都有自己指定;客户端通过这个UUID连接服务端,建立双方通信。

服务端:

OutputStream outputStream;BluetoothServerSocket serverSocket;private void startServer(){//新建线程,并且使服务端做好接收准备new Thread(new Runnable() {@Overridepublic void run() {try {//name以及UUID由服务端指定serverSocket= bluetoothAdapter.listenUsingRfcommWithServiceRecord("Server" ,UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));Log.i("bluetooth" , "蓝牙服务器开始等待...");BluetoothSocket socket = serverSocket.accept();Log.i("bluetooth" , "蓝牙客户端连接上来了!");outputStream = socket.getOutputStream();InputStream inputStream = socket.getInputStream();byte[] bytes = new byte[1024];int n ;while((n = inputStream.read(bytes)) != -1) {String b = new String(bytes , 0 , n , "UTF-8");Log.i("bluetooth" , "蓝牙服务器接收到数据" + b);}outputStream.close();inputStream.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}).start();}/*** 发送数据给客户端*/private void sendSocketData(){if (outputStream !=null) {Log.i("bluetooth" , "蓝牙服务器发送数据!");try {//指定发送的数据已经数据编码,编码统一,不然会乱码outputStream.write("数据".getBytes("UTF-8"));outputStream.flush();} catch (IOException e) {e.printStackTrace();}}

客户端:

BluetoothAdapter adapter;BluetoothDevice device;private BluetoothSocket socket;private OutputStream outputStream;private InputStream inputStream;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_operator_login);sendBroadcast();adapter = BluetoothAdapter.getDefaultAdapter();}/*** 发送数据给服务端*/private void sendData(){if (outputStream != null) {try {outputStream.write("数据".getBytes("UTF-8"));outputStream.flush();} catch (IOException e) {e.printStackTrace();}}}//发出蓝牙扫描的接受广播private void sendBroadcast(){BluetoothReceiver receiver = new BluetoothReceiver();IntentFilter filter = new IntentFilter();filter.addAction(BluetoothDevice.ACTION_FOUND);filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);//状态改变filter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);//行动扫描模式改变了filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);//动作状态发生了变化registerReceiver(receiver , filter);}class BluetoothReceiver extends BroadcastReceiver{@RequiresApi(api = Build.VERSION_CODES.KITKAT)@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)){//获取蓝牙设备device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (device.getName().equals("OPPO A31")){adapter.cancelDiscovery();LogUtils.i("bluetoothInfo"  , "扫描到的蓝牙设备名称" + device.getName());try {//这里的UUID必须跟服务端的UUID一样socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));socket.connect();LogUtils.i("bluetoothInfo"  , "连接服务器成功");outputStream = socket.getOutputStream();inputStream = socket.getInputStream();new Thread(new Runnable() {@Overridepublic void run() {try {byte[] b = new byte[1024];int n;while ((n = inputStream.read(b)) != -1) {String s = new String(b,0 , n ,"UTF-8");LogUtils.i("bluetoothInfo" , "客户端收到服务器的数据了" + s);}} catch (IOException e) {e.printStackTrace();}}}).start();} catch (IOException e) {e.printStackTrace();}}} //状态改变时else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) {BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);switch (device.getBondState()) {case BluetoothDevice.BOND_BONDING://正在配对LogUtils.i("bluetoothInfo", "正在配对......");break;case BluetoothDevice.BOND_BONDED://配对结束LogUtils.i("bluetoothInfo", "完成配对");break;case BluetoothDevice.BOND_NONE://取消配对/未配对LogUtils.i("bluetoothInfo", "取消配对");default:break;}}}}

最后:

别忘了加权限

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

最后大家回想,你这个都没有配对啊,只是扫描了一下啊;其实在客户端扫描到服务端的时候;
bluetoothSocket.connect();的时候这步操作就已经包含了配对操作,会提前提示双方手机配对,当然已经配对过的就不会有。

操作基本上跟平时的tcp的Socket的用法都差不多。

Android蓝牙Socket通信相关推荐

  1. python安卓开发实例_python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: #server.p ...

  2. android 手机 与 python服务器_python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: #server.p ...

  3. Android 蓝牙串口通信工具类 SeriaPortUtil 2.0.+

    原文地址:https://www.shanya.world/archives/2fd981ea.html SerialPortUtil 提示 最新版本 3.0.+ 已发布,其对比 2.0.+ 版本,A ...

  4. Android中socket通信简单实现

    Android中socket通信简单实现 socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP. 先上个图: 这里以一个APP作为服务器跟客户端为示例 ...

  5. 关于Android蓝牙串口通信那点破事

    Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用.单片机的蓝牙模块连接与程序暂且略过,此文主要 ...

  6. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时建立连接通道,当客户端向服 ...

  7. Android蓝牙无法通信,android.bluetooth.BluetoothSocket无法连接

    我已经尝试了其他评论中的所有建议,但都没有效果,我希望有人能帮助我.我已经为这个问题挣扎了三天了.我确信我的uuid是正确的,并且我知道清单中启用了蓝牙访问. 我正在尝试将我的android应用程序连 ...

  8. Android TCP socket通信

    转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/74896575 之前做过的一个局域网内TCP通信.聊天的demo(当然不是局域网 ...

  9. android蓝牙连接通信的实现

    看了很多的博客文章的技术,今天也写一写自己的第一篇博客文章,我只说说如何用,具体实现的原理,原谅我不太清楚,但对于大多数人来说,知道怎么做出来就很不错了哈哈!不多说了,开始吧. 首先要知道几个类,Bl ...

最新文章

  1. AngularJs应用页面切换优化方案
  2. 【数学建模】MATLAB应用实战系列(七十九)-因子分析法(附MATLAB 和Python代码实现)
  3. unity快捷放置物体操作
  4. 企业资源计划软件 业务知识点汇编整理
  5. 雨滴桌面时间插件_只需要五步,让你的桌面变得干净漂亮
  6. STM32工作笔记0009---认识FSMC和TTL电路
  7. Windows Server 2003证书服务配置与管理
  8. C#实现CAD数据转shape或mdb
  9. 排序——选择排序、快速排序
  10. 将一个JDBC的ResultSet转成XML并输出到文件
  11. SVM入门(五)线性分类器的求解——问题的描述Part2
  12. python绘图之散点图
  13. 第3章第1节:使用图片来活跃整张幻灯片版面的气氛 [PowerPoint精美幻灯片实战教程]
  14. 小米电视怎么样?五大标准最有发言权
  15. php资产管理,php固定资产管理系统
  16. xshell6个人版解除窗口限制(亲测可用,需卸载当前xshell6)
  17. 2.8.1 矩阵的合同
  18. perl 处理 回车 换行符
  19. 经典时间片轮转RR算法C语言实现
  20. 微信公众号开发---自定义菜单的创建及菜单事件响应(java)

热门文章

  1. 【博学谷学习记录】超强总结,用心分享 | 狂野大数据shell脚本个人学习复习记录—PART-02
  2. 【ASP.NET Web】项目实践—网上宠物店3:创建主页、主题
  3. 页面头部和banner图遮罩效果
  4. python期中考试试卷分析_期中考试考试试卷分析与反思
  5. 计算机翻译turtle,turtle是什么意思_turtle翻译_读音_用法_翻译
  6. GraalVM-Polyglot虚拟机
  7. 【游戏开发引擎】 实验2:Chaos Ball 街机风格游戏
  8. 中睿天下实力入选2022信创产业独角兽TOP100
  9. 华夏学院计算机专业,厦门华夏学院2017年计算机等级考试报名「通知」
  10. STM32F103RCT6换GD32F103RCT6的问题