AndroidBLE与终端通信三客户端与服务端通信过程以及实现数据通信资料Word文档格式.docx
- 文档编号:22624505
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:19
- 大小:20.26KB
AndroidBLE与终端通信三客户端与服务端通信过程以及实现数据通信资料Word文档格式.docx
《AndroidBLE与终端通信三客户端与服务端通信过程以及实现数据通信资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《AndroidBLE与终端通信三客户端与服务端通信过程以及实现数据通信资料Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
搜索蓝牙设备"
/>
ListView
id="
@+id/lvDevices"
0dp"
layout_weight="
1"
/LinearLayout>
2.实现步骤
1.声明
我们需要的东西
//本地蓝牙适配器
privateBluetoothAdaptermBluetoothAdapter;
//列表
privateListViewlvDevices;
//存储搜索到的蓝牙
privateList<
String>
bluetoothDevices=newArrayList<
();
//listview的adapter
privateArrayAdapter<
arrayAdapter;
//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);
//获取已经配对的设备
Set<
BluetoothDevice>
pairedDevices=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);
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){
//添加到列表
arrayAdapter.notifyDataSetChanged();
//搜索完成
}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED
.equals(action)){
//关闭进度条
搜索完成!
};
5.客户端实现已经发送数据流
//客户端
publicvoidonItemClick(AdapterView<
?
>
parent,Viewview,intposition,
longid){
//先获得蓝牙的地址和设备名
Strings=arrayAdapter.getItem(position);
//单独解析地址
Stringaddress=s.substring(s.indexOf("
)+1).trim();
//主动连接蓝牙
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"
));
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;
//输入输出流
privateInputStreamis;
publicAcceptThread(){
serverSocket=mBluetoothAdapter
.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
publicvoidrun(){
//截获客户端的蓝牙消息
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,"
handler.sendMessage(msg);
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{
//线程类的实例
privateAcceptThreadac;
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
privatevoidinitView(){
//获取本地蓝牙适配器
bluetoothDices);
publicvoidbtnSearch(Viewv){
//广播接收器
privatefinalBroadcastReceiverreceiver=newBroadcastReceiver(){
if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AndroidBLE 终端 通信 客户端 服务端 过程 以及 实现 数据通信 资料
链接地址:https://www.bdocx.com/doc/22624505.html