Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx

上传人:b****7 文档编号:8790671 上传时间:2023-02-01 格式:DOCX 页数:19 大小:20.25KB
下载 相关 举报
Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx_第1页
第1页 / 共19页
Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx_第2页
第2页 / 共19页
Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx_第3页
第3页 / 共19页
Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx_第4页
第4页 / 共19页
Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx

《Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx》由会员分享,可在线阅读,更多相关《Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx(19页珍藏版)》请在冰豆网上搜索。

Android BLE与终端通信三客户端与服务端通信过程以及实现数据通信.docx

AndroidBLE与终端通信三客户端与服务端通信过程以及实现数据通信

AndroidBLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

一.蓝牙数据传输

蓝牙数据传输其实跟我们的Socket(套接字)有点类似,如果有不懂的,可以XX一下概念,我们只要知道是这么回事就可以了,在网络中使用Socket和ServerSocket控制客户端和服务端来数据读写。

而蓝牙通讯也是由客户端和服务端来完成的,蓝牙客户端Socket是BluetoothSocket,蓝牙服务端Socket是BluetoothServerSocket,这两个类都在Android.bluetooth包下,而且无论是BluetoothSocket还是BluetoothServerSocket,我们都需要一个UUID(标识符),这个UUID在上篇也是有提到,而且他的格式也是固定的:

UUID:

XXXXXXXX(8)-XXXX(4)-XXXX(4)-XXXX(4)-XXXXXXXXXXXX(12)

第一段是8位,中间三段式4位,最后一段是12位,UUID相当于Socket的端口,而蓝牙地址则相当于Socket的IP

1.activity_main.xml

android="

xmlns:

tools="

android:

layout_width="match_parent"

android:

layout_height="match_parent"

android:

orientation="vertical">

android:

layout_width="match_parent"

android:

layout_height="wrap_content"

android:

onClick="btnSearch"

android:

text="搜索蓝牙设备"/>

android:

id="@+id/lvDevices"

android:

layout_width="match_parent"

android:

layout_height="0dp"

android:

layout_weight="1"/>

2.实现步骤

1.声明

我们需要的东西

//本地蓝牙适配器

privateBluetoothAdaptermBluetoothAdapter;

//列表

privateListViewlvDevices;

//存储搜索到的蓝牙

privateListbluetoothDevices=newArrayList();

//listview的adapter

privateArrayAdapterarrayAdapter;

//UUID.randomUUID()随机获取UUID

privatefinalUUIDMY_UUID=UUID

.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");

//连接对象的名称

privatefinalStringNAME="LGL";

//这里本身即是服务端也是客户端,需要如下类

privateBluetoothSocketclientSocket;

privateBluetoothDevicedevice;

//输出流_客户端需要往服务端输出

privateOutputStreamos;

2.初始化

//获取本地蓝牙适配器

mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

//判断手机是否支持蓝牙

if(mBluetoothAdapter==null){

Toast.makeText(this,"设备不支持蓝牙",Toast.LENGTH_SHORT).show();

finish();

}

//判断是否打开蓝牙

if(!

mBluetoothAdapter.isEnabled()){

//弹出对话框提示用户是后打开

Intentintent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent,1);

//不做提示,强行打开

//mBluetoothAdapter.enable();

}

//初始化listview

lvDevices=(ListView)findViewById(R.id.lvDevices);

lvDevices.setOnItemClickListener(this);

//获取已经配对的设备

SetpairedDevices=mBluetoothAdapter

.getBondedDevices();

//判断是否有配对过的设备

if(pairedDevices.size()>0){

for(BluetoothDevicedevice:

pairedDevices){

//遍历到列表中

bluetoothDevices.add(device.getName()+":

"

+device.getAddress()+"\n");

}

}

//adapter

arrayAdapter=newArrayAdapter(this,

android.R.layout.simple_list_item_1,android.R.id.text1,

bluetoothDevices);

lvDevices.setAdapter(arrayAdapter);

/**

*异步搜索蓝牙设备——广播接收

*/

//找到设备的广播

IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);

//注册广播

registerReceiver(receiver,filter);

//搜索完成的广播

filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

//注册广播

registerReceiver(receiver,filter);

}

3.点击搜索

publicvoidbtnSearch(Viewv){

//设置进度条

setProgressBarIndeterminateVisibility(true);

setTitle("正在搜索...");

//判断是否在搜索,如果在搜索,就取消搜索

if(mBluetoothAdapter.isDiscovering()){

mBluetoothAdapter.cancelDiscovery();

}

//开始搜索

mBluetoothAdapter.startDiscovery();

}

4.搜索设备

privatefinalBroadcastReceiverreceiver=newBroadcastReceiver(){

@Override

publicvoidonReceive(Contextcontext,Intentintent){

//收到的广播类型

Stringaction=intent.getAction();

//发现设备的广播

if(BluetoothDevice.ACTION_FOUND.equals(action)){

//从intent中获取设备

BluetoothDevicedevice=intent

.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

//判断是否配对过

if(device.getBondState()!

=BluetoothDevice.BOND_BONDED){

//添加到列表

bluetoothDevices.add(device.getName()+":

"

+device.getAddress()+"\n");

arrayAdapter.notifyDataSetChanged();

}

//搜索完成

}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED

.equals(action)){

//关闭进度条

setProgressBarIndeterminateVisibility(true);

setTitle("搜索完成!

");

}

}

};

5.客户端实现已经发送数据流

//客户端

@Override

publicvoidonItemClick(AdapterView

>parent,Viewview,intposition,

longid){

//先获得蓝牙的地址和设备名

Strings=arrayAdapter.getItem(position);

//单独解析地址

Stringaddress=s.substring(s.indexOf(":

")+1).trim();

//主动连接蓝牙

try{

//判断是否在搜索,如果在搜索,就取消搜索

if(mBluetoothAdapter.isDiscovering()){

mBluetoothAdapter.cancelDiscovery();

}

try{

//判断是否可以获得

if(device==null){

//获得远程设备

device=mBluetoothAdapter.getRemoteDevice(address);

}

//开始连接

if(clientSocket==null){

clientSocket=device

.createRfcommSocketToServiceRecord(MY_UUID);

//连接

clientSocket.connect();

//获得输出流

os=clientSocket.getOutputStream();

}

}catch(Exceptione){

//TODO:

handleexception

}

//如果成功获得输出流

if(os!

=null){

os.write("HelloBluetooth!

".getBytes("utf-8"));

}

}catch(Exceptione){

//TODO:

handleexception

}

}

6.Handler服务

//服务端,需要监听客户端的线程类

privateHandlerhandler=newHandler(){

publicvoidhandleMessage(android.os.Messagemsg){

Toast.makeText(MainActivity.this,String.valueOf(msg.obj),

Toast.LENGTH_SHORT).show();

super.handleMessage(msg);

}

};

7.服务端读取数据流

//线程服务类

privateclassAcceptThreadextendsThread{

privateBluetoothServerSocketserverSocket;

privateBluetoothSocketsocket;

//输入输出流

privateOutputStreamos;

privateInputStreamis;

publicAcceptThread(){

try{

serverSocket=mBluetoothAdapter

.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

@Override

publicvoidrun(){

//截获客户端的蓝牙消息

try{

socket=serverSocket.accept();//如果阻塞了,就会一直停留在这里

is=socket.getInputStream();

os=socket.getOutputStream();

//不断接收请求,如果客户端没有发送的话还是会阻塞

while(true){

//每次只发送128个字节

byte[]buffer=newbyte[128];

//读取

intcount=is.read();

//如果读取到了,我们就发送刚才的那个Toast

Messagemsg=newMessage();

msg.obj=newString(buffer,0,count,"utf-8");

handler.sendMessage(msg);

}

}catch(Exceptione){

//TODO:

handleexception

}

}

}

8.开启服务

首先要声明

//启动服务

ac=newAcceptThread();

ac.start();

MainActivity完整代码

packagecom.lgl.bluetoothget;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.OutputStream;

importjava.util.ArrayList;

importjava.util.List;

importjava.util.Set;

importjava.util.UUID;

importandroid.app.Activity;

importandroid.bluetooth.BluetoothAdapter;

importandroid.bluetooth.BluetoothDevice;

importandroid.bluetooth.BluetoothServerSocket;

importandroid.bluetooth.BluetoothSocket;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.content.IntentFilter;

importandroid.os.Bundle;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.util.Log;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.AdapterView;

importandroid.widget.AdapterView.OnItemClickListener;

importandroid.widget.ArrayAdapter;

importandroid.widget.Button;

importandroid.widget.ListView;

importandroid.widget.TextView;

importandroid.widget.Toast;

publicclassMainActivityextendsActivityimplementsOnItemClickListener{

//本地蓝牙适配器

privateBluetoothAdaptermBluetoothAdapter;

//列表

privateListViewlvDevices;

//存储搜索到的蓝牙

privateListbluetoothDevices=newArrayList();

//listview的adapter

privateArrayAdapterarrayAdapter;

//UUID.randomUUID()随机获取UUID

privatefinalUUIDMY_UUID=UUID

.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");

//连接对象的名称

privatefinalStringNAME="LGL";

//这里本身即是服务端也是客户端,需要如下类

privateBluetoothSocketclientSocket;

privateBluetoothDevicedevice;

//输出流_客户端需要往服务端输出

privateOutputStreamos;

//线程类的实例

privateAcceptThreadac;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

privatevoidinitView(){

//获取本地蓝牙适配器

mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

//判断手机是否支持蓝牙

if(mBluetoothAdapter==null){

Toast.makeText(this,"设备不支持蓝牙",Toast.LENGTH_SHORT).show();

finish();

}

//判断是否打开蓝牙

if(!

mBluetoothAdapter.isEnabled()){

//弹出对话框提示用户是后打开

Intentintent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent,1);

//不做提示,强行打开

//mBluetoothAdapter.enable();

}

//初始化listview

lvDevices=(ListView)findViewById(R.id.lvDevices);

lvDevices.setOnItemClickListener(this);

//获取已经配对的设备

SetpairedDevices=mBluetoothAdapter

.getBondedDevices();

//判断是否有配对过的设备

if(pairedDevices.size()>0){

for(BluetoothDevicedevice:

pairedDevices){

//遍历到列表中

bluetoothDevices.add(device.getName()+":

"

+device.getAddress()+"\n");

}

}

//adapter

arrayAdapter=newArrayAdapter(this,

android.R.layout.simple_list_item_1,android.R.id.text1,

bluetoothDices);

lvDevices.setAdapter(arrayAdapter);

//启动服务

ac=newAcceptThread();

ac.start();

/**

*异步搜索蓝牙设备——广播接收

*/

//找到设备的广播

IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);

//注册广播

registerReceiver(receiver,filter);

//搜索完成的广播

filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

//注册广播

registerReceiver(receiver,filter);

}

publicvoidbtnSearch(Viewv){

//设置进度条

setProgressBarIndeterminateVisibility(true);

setTitle("正在搜索...");

//判断是否在搜索,如果在搜索,就取消搜索

if(mBluetoothAdapter.isDiscovering()){

mBluetoothAdapter.cancelDiscovery();

}

//开始搜索

mBluetoothAdapter.startDiscovery();

}

//广播接收器

privatefinalBroadcastReceiverreceiver=newBroadcastReceiver(){

@Override

publicvoidonReceive(Contextcontext,Intentintent){

//收到的广播类型

Stringaction=intent.getAction();

//发现设备的广播

if

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1