package com.example.blcommunicate;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
/**
*该类的工作:建立和管理蓝牙连接。
*共有三个线程。mAcceptThread线程用来监听socket连接(服务端使用).
*mConnectThread线程用来连接serversocket(客户端使用)。
*mConnectedThread线程用来处理socket发送、接收数据。(客户端和服务端共用)
*/
public class BluetoothChatUtil {
private static final String TAG = "BluetoothChatClient";
private static final boolean D = true;
// 服务名 SDP
private static final String SERVICE_NAME = "BluetoothChat";
// uuid SDP
private static final UUID SERVICE_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// 蓝牙适配器
private final BluetoothAdapter mAdapter;
private Handler mHandler;
private AcceptThread mAcceptThread;
private ConnectThread mConnectThread;
private ConnectedThread mConnectedThread;
private int mState;
private static BluetoothChatUtil mBluetoothChatUtil;
private BluetoothDevice mConnectedBluetoothDevice;
//常数,指示当前的连接状态
public static final int STATE_NONE = 0; // 当前没有可用的连接
public static final int STATE_LISTEN = 1; // 现在侦听传入的连接
public static final int STATE_CONNECTING = 2; // 现在开始连接
public static final int STATE_CONNECTED = 3; // 现在连接到远程设备
public static final int STATAE_CONNECT_FAILURE = 4; //连接失败
public static final int MESSAGE_DISCONNECTED = 5; //断开连接
public static final int STATE_CHANGE = 6; //连接状态改变
public static final int MESSAGE_READ = 7;
public static final int MESSAGE_WRITE = 8;
public static final String DEVICE_NAME = "device_name";
public static final String READ_MSG = "read_msg";
/**
* 构造函数。准备一个新的bluetoothchat会话。
* @param context
*/
private BluetoothChatUtil(Context context) {
mAdapter = BluetoothAdapter.getDefaultAdapter();
mState = STATE_NONE;
}
public static BluetoothChatUtil getInstance(Context c) {
if (null == mBluetoothChatUtil) {
mBluetoothChatUtil = new BluetoothChatUtil(c);
}
return mBluetoothChatUtil;
}
public void registerHandler(Handler handler) {
mHandler = handler;
}
public void unregisterHandler() {
mHandler = null;
}
/**
* 设置当前状态的聊天连接
* @param state 整数定义当前连接状态
*/
private synchronized void setState(int state) {
if (D) Log.d(TAG, "setState() " + mState + " -> " + state);
mState = state;
// 给新状态的处理程序,界面活性可以更新
mHandler.obtainMessage(STATE_CHANGE, state, -1).sendToTarget();
}
/**
* 返回当前的连接状态。 */
public synchronized int getState() {
return mState;
}
public BluetoothDevice getConnectedDevice() {
return mConnectedBluetoothDevice;
}
/**
* 开始聊天服务。特别acceptthread开始
* 开始服务器模式。 */
public synchronized void startListen() {
if (D) Log.d(TAG, "start");
// 取消任何线程正在运行的连接
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
// 启动线程来监听一个bluetoothserversocket
if (mAcceptThread == null) {
mAcceptThread = new AcceptThread();
mAcceptThread.start();
}
setState(STATE_LISTEN);
}
/**
* 开始connectthread启动连接到远程设备。
* @param device 连接的蓝牙设备
*/
public synchronized void connect(BluetoothDevice device) {
if (D) Log.d(TAG, "connect to: " + device);
// 取消任何线程试图建立连接
if (mState == STATE_CONNECTING) {
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
}
// 取消任何线程正在运行的连接
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
//启动线程连接到远程设备
mConnectThread = new ConnectThread(device);
mConnectThread.start();
setState(STATE_CONNECTING);
}
/**
* 开始ConnectedThread开始管理一个蓝牙连接,传输、接收数据.
* @param socket socket连接
* @param device 已连接的蓝牙设备
*/
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) {
if (D) Log.d(TAG, "connected");
//取消任何线程正在运行的连接
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
// 启动线程管理连接和传输
mConnectedThread = new ConnectedThread(socket);
mConnectedThread.start();
//把连接设备的名字传到 ui Activity
mConnectedBluetoothDevice = device;
Message msg = mHandler.obtainMessage(STATE_CONNECTED);
Bundle bundle = new Bundle();
bundle.putString(DEVICE_NAME, device.getName());
msg.setData(bundle);
mHandler.sendMessage(msg);
setState(STATE_CONNECTED);
}
/**
* 停止所有的线程
*/
public synchronized void disconnect() {
if (D) Log.d(TAG, "disconnect");
if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread = null;}
setState(STATE_NONE);
}
/**
* Write to the ConnectedThread in an unsynchronized manner
* @param out The bytes to write
* @see ConnectedThread#write(byte[])
*/
public void write(byte[] out) {
//创建临时对象
ConnectedThread r;
// 同步副本的connectedthread
synchronized (this) {
if (mState != STATE_CONNECTED) return;
r = mConnectedThread;
}
// 执行写同步
r.write(out);
}
/**
* Indicate that the connection attempt failed and notify the UI Activity.
*/
private void connectionFailed() {
// 发送失败的信息带回活动
Message msg = mHandler.obtainMessage(STATAE_CONNECT_FAILURE);
mHandler.sendMessage(msg);
mConnectedBluetoothDevice = null;
setState(STATE_NONE);
}
/**
* Indicate that the connection was lost and notify the UI Activity.
*/
public void connectionLost() {
// 发送失败的信息带回Activity
Message msg = mHandler.obtainMessage(MESSAGE_DISCONNECTED);
mHandler.sendMessage(msg);
mConnectedBluetoothDevice = null;
setState(STATE_NONE);
}
/**
*本线程 侦听传入的连接。
*它运行直到连接被接受(或取消)。
*/
private class AcceptThread extends Thread {
// 本地服务器套接字
private final Bl
手机应用开发之如何利用蓝牙与HC-05通信?-工程代码
需积分: 0 91 浏览量
更新于2023-04-16
1
收藏 111KB ZIP 举报
代码使用说明参见:手机应用开发之如何利用蓝牙与HC-05通信?https://blog.csdn.net/qq_40640910/article/details/130186172?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22130186172%22%2C%22source%22%3A%22qq_40640910%22%7D
cacrle
- 粉丝: 525
- 资源: 4
最新资源
- 基于Vue.js高校学生选课系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于Vue的米家商城的设计与实现-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于Web的视频及游戏管理平台的设计及实现_0816q-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于Spring Boot的阳光音乐厅订票系统_9z622-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于java语言的考试信息报名系统_5n9zn--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于Java的小区物业管理系统设计与实现--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- WORD办公教程网站模板 (H5自适应) WPS办公资源源码
- 基于改进遗传算法的风电场优化调度策略验证,改善风电场整体输出功率,达到最大功率输出,采用matlab编写,内容非常详实和完整
- 基于Layui和SpringBoot动漫商城管理的设计与实现--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于spring boot的疫情信息管理系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于Spring boot的名城小区物业管理系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于Spring Boot的企业员工薪酬关系系统的设计-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于Spring Boot在线远程考试系统的设计与实现-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- springboot生活分享共享平台(源码+论文)-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- springboot健身房管理系统006(源码+sql)-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于python+django+mysql实现教师评价系统设计与开发