android:手机之间蓝牙通信(四)
来源:互联网 发布:dapaolu域名更换 编辑:程序博客网 时间:2024/05/21 09:34
功能:蓝牙设备通信连接。
蓝牙连接分为两种情况。
一、手机与手机间通信
二、手机与蓝牙模块通信。
注意:蓝牙通信使用了多线程,必须掌握线程的创建使用才能使用蓝牙进行通信。
手机与手机间通信:
手机间蓝牙通信使用客户端和服务端。
客户端:搜索设备找到服务端,和服务端配对,连接服务端。
服务端:等待客户端与其配对并来连接。(配对和连接由同一端发起)
申明:
private BluetoothSocket btSocket; // 客户端socketprivate BluetoothServerSocket mServerSocket; private ReadThread mReadThread; // 服务端获取客户端传输的数据private ReadThread2 mReadThread2;// 客户端获取服务器传输的数据private ClientThread mClientThread; // 客户端运行线程private ServerThread mServerThread; // 服务端线程private BluetoothDevice device1;private BluetoothSocket socket; // 服务器socketprivate TToast MessageBox;//显示是否连接成功private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");private BluetoothAdapter mBluetoothAdapter;//蓝牙适配器
在ListView中点击配对完成后,在后面添加:
//主动配对方为客户端,配对完成后调用客户端线程,根据设备地址进行连接device1 = mBluetoothAdapter.getRemoteDevice(al[arg2]);mClientThread = new ClientThread(); //开启客户端的线程mClientThread.start();
服务端线程在程序运行时就启动了
@Overrideprotected void onResume() {super.onResume();mServerThread = new ServerThread();//开启服务段线程mServerThread.start();}
客户端和服务端代码
//客户端private class ClientThread extends Thread //线程 { @Override public void run() { if (device1 != null) //蓝牙设备 { //连接try { btSocket = device1.createRfcommSocketToServiceRecord(MY_UUID); btSocket.connect();//后面不能添加提示框 (后面可以显示已连接上) //显示是否连接成功 MessageBox = new TToast(); MessageBox.start(); //显示传输过来的数据 mReadThread2 = new ReadThread2(); mReadThread2.start(); } catch (IOException e) { } } }}//服务器private class ServerThread extends Thread {public void run() {try {/* 创建一个蓝牙服务器 参数分别:服务器名称、UUID */mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("btspp",MY_UUID);/* 接受客户端的连接请求 */// 这是一个阻塞过程,直到建立一个连接或者连接失效// 通过BluetoothServerSocket得到一个BluetoothSocket对象,管理这个连接socket = mServerSocket.accept();//显示是否成功连接MessageBox = new TToast(); <span style="white-space:pre"></span>MessageBox.start(); //显示传输过来的数据mReadThread = new ReadThread();mReadThread.start();} catch (IOException e) {e.printStackTrace();}}};
添加一个编辑框,两个按钮,在编辑框中输入数据,按钮为客户端和服务端,本机为客户端,就点击客户端将编辑框中数据发送到服务端。同理服务端按钮。
编辑框为et2,按钮为mt11和mt12
mt11.setOnClickListener(new OnClickListener()//客户端{public void onClick(View v){String add = et2.getText().toString();//获取编辑框数据if (add.length() > 0) {if (btSocket == null) {toast("没有可用的连接1");return;}try {OutputStream os = btSocket.getOutputStream();os.write(add.getBytes());//获取所有的自己然后往外发送toast("成功1");} catch (IOException e) {e.printStackTrace();}}else{toast("没有数据");}}});
mt12.setOnClickListener(new OnClickListener()//服务器端{public void onClick(View v){String add = et2.getText().toString();//获取编辑框数据if (add.length() > 0) {if (socket == null) <span style="white-space:pre"></span>{toast("没有可用的连接2");return;}try {OutputStream os = socket.getOutputStream();os.write(add.getBytes());toast("成功2");} catch (IOException e) {e.printStackTrace();}}else{toast("没有数据");}}});
//作为服务器端时。读取客户端发来的数据private class ReadThread extends Thread { public void run() { byte[] buffer = new byte[1024]; int bytes; InputStream mmInStream = null; try {mmInStream = socket.getInputStream();} 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);Message msg = new Message();msg.obj = s;msg.what = 1;LinkDetectedHandler.sendMessage(msg); } } catch (IOException e) { try {mmInStream.close();} catch (IOException e1) {e1.printStackTrace();} break; } } } } private class ReadThread2 extends Thread//作为客户端端时。读取服务端发来的数据{ @Override public void run() { byte[] buffer = new byte[1024]; int bytes; InputStream is = null; try {is = btSocket.getInputStream(); //获取服务器发过来的所有字节} catch (IOException e) {e.printStackTrace();} while(true) { try {//读取过程,将数据信息保存在ListView中...if ((bytes = is.read(buffer)) > 0) {byte[] data = new byte[bytes];for (int i = 0; i < data.length; i++) {data[i] = buffer[i];}String s = new String(data);Message msg = new Message();msg.obj = s;msg.what = 1; //这里的meg.what=1...表示的是服务器发送过来的数据信息..LinkDetectedHandler.sendMessage(msg);} } catch (IOException e) {try {is.close();} catch (IOException e1) {e1.printStackTrace();}break;} } }}//显示数据private Handler LinkDetectedHandler = new Handler() { @Override public void handleMessage(Message msg) { toast((String)msg.obj); }};
public class TToast extends Thread//如果连接成功就会显示{public void run(){Looper.prepare();toast("连接成功");Looper.loop();}}断开连接:这个关闭的线程不全,需要继续补充
private void closeServer() {<span style="white-space:pre"></span>new Thread() { public void run() { if (mServerThread != null) {mServerThread.interrupt();mServerThread = null;} try {if (socket != null) {socket.close();socket = null;}if (mServerSocket != null) {mServerSocket.close();mServerSocket = null;}} catch (IOException e) {} } }.start();}
0 0
- android:手机之间蓝牙通信(四)
- android:手机之间蓝牙通信(一)
- android:手机之间蓝牙通信(二)
- android:手机之间蓝牙通信(三)
- android 手机与单片机之间的蓝牙通信
- Android手机之间的蓝牙通信的代码和原理
- Android蓝牙遥控器(通过手机蓝牙与蓝牙模块通信)
- Android手机之间Socket通信
- android手机与蓝牙模块的通信
- Android与蓝牙Ble之间的通信
- 【Android开发 蓝牙通信】手机蓝牙与下位机HC-05蓝牙模块通信系统
- Android----蓝牙通信使用 不同手机下同一应用通信
- Android 蓝牙开发(一)蓝牙通信
- Android 蓝牙开发(一)蓝牙通信
- Android 蓝牙开发(一)蓝牙通信
- Android 蓝牙开发(一)蓝牙通信
- android手机之间用wifi direct通信
- android 蓝牙通信(一)
- 如何将css,js压缩成jar包maven发布后引用!
- jabc开发基本流程步骤
- 安卓开发之使用双进程守护和进程提权来实现服务进程保活
- Python学习笔记:由range获取列表
- jsp:forward的问题。。。。
- android:手机之间蓝牙通信(四)
- 神的启示(一):Knowing John
- CodingNet - Learning - 17
- CDN
- SurfaceView的使用方法
- 男神一般都很低调很低调的!!
- 序列模式挖掘——GSP算法
- android studio 更新 Gradle错误解决方法
- The processing instruction target matching "[xX][mM][lL]" is not allowed