Android Bluetooth蓝牙开发:Bluetooth蓝牙设备之间的连接建立(3)

简介: Android Bluetooth蓝牙开发:Bluetooth蓝牙设备之间的连接建立(3)Android Bluetooth蓝牙设备的连接编程模型和Java socket网络连接编程模型类型。


Android Bluetooth蓝牙开发:Bluetooth蓝牙设备之间的连接建立(3)

Android Bluetooth蓝牙设备的连接编程模型和Java socket网络连接编程模型类型。Android不同设备间的蓝牙连接,首先在编程模型上分为“服务器端(server)”和“客户端(client)”。

一,Android Bluetooth蓝牙设备的“服务器端”。
在蓝牙的服务端,类似Java网络编程中的ServerSocket,Android的蓝牙服务端叫做BluetoothServerSocket,蓝牙的BluetoothServerSocket作为服务器端,在一个线程中,绑定一个熟知的UUID(注意,此UUID是类似Java编程中的熟知端口号:80),然后等待客户端的连接请求(listenUsingRfcommWithServiceRecord),当BluetoothServerSocket接受客户端的连接请求后(accept),意味不同蓝牙设备间的数据传输连接建立,此时返回一个类似Java 网络编程的套接字,Android Bluetooth蓝牙的套接字:BluetoothSocket。
综上,Android Bluetooth蓝牙的服务器连接阶段的编程,大体上可以简化为三个步骤:
(a)Android Bluetooth蓝牙的BluetoothServerSocket首先需要监听:listenUsingRfcommWithServiceRecord 。注意,简单期间,可以绑定熟知的蓝牙特殊UUID:00001101-0000-1000-8000-00805F9B34FB
(b)然后就是静静的accept等待传入的蓝牙客户端连接请求。由于是作为服务器端,极可能要接收若干客户端连接,所以一般在while循环里面accept。蓝牙accept类似Java的accept。
(c)accept阻塞的等待传入的客户端连接请求,直到一个蓝牙连接请求传入,然后返回一个BluetoothSocket。此BluetoothSocket类似Java的socket。
(a)(b)(c)三阶段的伪代码核心摘要:

BluetoothServerSocket serverSocket;

serverSocket=mBluetoothAdapter.listenUsingRfcommWithServiceRecord(tag, UUID);

   while (true) {
     BluetoothSocket socket = serverSocket.accept();
     if (socket.isConnected()) {
      Log.d(tag, "已建立与客户连接.");
     }
   }
  

由于服务器端代码是在阻塞性的等待、接受客户端连接,所以需要把服务接收客户连接的代码放入单独的线程中处理。

完整的服务器端代码:

package zhangphil.bluetooth;

import java.util.UUID;

import android.app.ListActivity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends ListActivity {

	private BluetoothAdapter mBluetoothAdapter;

	private final String tag = "zhangphil";
	private final String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB";

	private class ServerThread extends Thread {

		private BluetoothServerSocket serverSocket;

		@Override
		public void run() {

			try {
				serverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(tag, UUID.fromString(MY_UUID));
			} catch (Exception e) {
				e.printStackTrace();
			}

			Log.d(tag, "等待客户连接...");
			while (true) {
				try {
					BluetoothSocket socket = serverSocket.accept();
					
					BluetoothDevice device = socket.getRemoteDevice();
					Log.d(tag, "接受客户连接 , 远端设备名字:" + device.getName() + " , 远端设备地址:" + device.getAddress());

					if (socket.isConnected()) {
						Log.d(tag, "已建立与客户连接.");
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		if (mBluetoothAdapter != null)
			new Thread(new ServerThread()).start();
	}
}
AI 代码解读


二,Android Bluetooth蓝牙的“客户端”。

Android Bluetooth蓝牙“客户端”发起对服务器端的连接,首先要获得服务器蓝牙设备BluetoothDevice,该BluetoothDevice代表着服务器端的蓝牙设备,所以客户端可以先启动蓝牙扫描,扫描获得目标蓝牙设备BluetoothDevice,然后通过BluetoothDevice的createRfcommSocketToServiceRecord( UUID )返回BluetoothSocket,调用BluetoothSocket的连接方法connect,connect就是对蓝牙服务器的连接,当connect正常返回后,也就意味着两个点到点的不同蓝牙设备数据传输连接建立了。
Android Bluetooth蓝牙的“客户端”对“服务器端”的连接请求建立,大体上可以简化为三个过程:
(a)首先要获得蓝牙“服务器端”的BluetoothDevice,至于如何获得服务器蓝牙设备BluetoothDevice,可以是附录文章1那样的扫描获得,也可以是附录文章2中的配对获得。
(b)得到蓝牙服务器端的BluetoothDevice后,调用createRfcommSocketToServiceRecord,这个过程可以简单的理解为创建一个类似Java的socket套接字对象一样,为后续的网络建立建立做准备。简单期间,此处也绑定一个蓝牙连接的熟知UUID:00001101-0000-1000-8000-00805F9B34FB
(c)接下来就是重点的connect。connect也是阻塞性质的蓝牙连接,直到和蓝牙服务器端设备的连接建立为止(如果发生连接异常则将跳出)。
(a)(b)(c)三阶段的伪代码核心摘要:


BluetoothDevice device;

BluetoothSocket socket;

socket = device.createRfcommSocketToServiceRecord(UUID);

socket.connect();
    

完整的Android Bluetooth蓝牙客户端代码:

package zhangphil.client;

import java.util.UUID;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

	private BluetoothAdapter mBluetoothAdapter;

	private final String tag = "zhangphil";
	private final String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB";

	// 广播接收发现蓝牙设备
	private BroadcastReceiver mReceiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if (BluetoothDevice.ACTION_FOUND.equals(action)) {

				BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

				String name = device.getName();
				if (name != null)
					Log.d(tag, "发现设备:" + name);

				if (name != null && name.equals("phil-pad")) {
					Log.d(tag, "发现目标设备,开始线程连接!");

					// 蓝牙搜索是非常消耗系统资源开销的过程,一旦发现了目标感兴趣的设备,可以考虑关闭扫描。
					mBluetoothAdapter.cancelDiscovery();

					new Thread(new ClientThread(device)).start();
				}
			}
		}
	};

	private class ClientThread extends Thread {

		private BluetoothDevice device;

		public ClientThread(BluetoothDevice device) {
			this.device = device;
		}

		@Override
		public void run() {

			BluetoothSocket socket = null;

			try {
				socket = device.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));

				Log.d(tag, "连接服务端...");
				socket.connect();
				Log.d(tag, "连接建立.");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

		// 注册广播接收器。接收蓝牙发现讯息
		IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
		registerReceiver(mReceiver, filter);

		if (mBluetoothAdapter.startDiscovery()) {
			Log.d(tag, "启动蓝牙扫描设备...");
		}
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		unregisterReceiver(mReceiver);
	}
}
AI 代码解读


三,Android Bluetooth蓝牙设备服务器端与客户端连接的过程。
(a)首先要准备两个不同的Android设备,当然,这两个Android设备必须都有蓝牙。然后将服务器端安装在一个Android设备上,客户端则安装在另外一个不同的Android设备上。
(b)注意设备的名字,在我写的这个Android Bluetooth蓝牙连接的例子中,根据服务器端蓝牙设备的名字进行过滤和匹配。我把服务器端的蓝牙设备名字设置成:phil-pad。在不同的蓝牙设备作为服务器端时候这个名字不同,必须做出相应的调整,否则匹配不到,将无法连接。
(c)最好先运行服务器端代码,然后再启动客户端代码。代码为了更简洁的说明Android Bluetooth蓝牙连接功能,未做繁复的异常检测。启动代码前,请务必打开蓝牙。最好将两台设备进行配对好。


蓝牙权限:

 <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
AI 代码解读


附录文章:

1,《Android Bluetooth蓝牙开发:发现Bluetooth蓝牙设备(1)》链接地址:http://blog.csdn.net/zhangphil/article/details/50524809
2,《Android Bluetooth蓝牙开发:Bluetooth蓝牙设备配对Paired Bluetooth Devices(2)》链接地址:http://blog.csdn.net/zhangphil/article/details/50537796
3,Android Bluetooth蓝牙开发Google官方文档链接地址:http://developer.android.com/intl/zh-cn/guide/topics/connectivity/bluetooth.html

目录
打赏
0
0
0
0
15
分享
相关文章
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
41 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
54 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
170 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
103 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【Android 应用开发】BluetoothDevice详解(三)
【Android 应用开发】BluetoothDevice详解(三)
224 0
【Android 应用开发】BluetoothDevice详解(一)
【Android 应用开发】BluetoothDevice详解(一)
1206 0
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
42 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
189 3

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
    13
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    23
  • 3
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    15
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    2
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    4
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    6
  • 7
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    2
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    6
  • 9
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    4
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    1
  • 1
    android FragmentManager 删除所有Fragment 重建
    18
  • 2
    Android实战经验之Kotlin中快速实现MVI架构
    31
  • 3
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    36
  • 4
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    144
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    46
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    59
  • 8
    Android历史版本与APK文件结构
    161
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    48
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    41
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等