版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AndroidBLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信一.蓝牙数据传输蓝牙数据传输其实跟我们的 Socket(套接字)有点类似,如果有不懂的,可以百度一下概念,我们只要知道是这么回事就可以了,在网络中使用 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的IPandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="btnSearch"android:text="搜索蓝牙设备"/><ListViewandroid:id="@+id/lvDevices"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout>2.实现步骤1.声明我们需要的东西本地蓝牙适配器privateBluetoothAdaptermBluetoothAdapter;列表privateListViewlvDevices;存储搜索到的蓝牙privateList<String>bluetoothDevices=newArrayList<String>();//listview的adapterprivateArrayAdapter<String>arrayAdapter;UUID.randomUUID()随机获取UUIDprivatefinalUUIDMY_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();}//初始化listviewlvDevices.setOnItemClickListener(this);获取已经配对的设备Set<BluetoothDevice>pairedDevices=mBluetoothAdapter.getBondedDevices();判断是否有配对过的设备if(pairedDevices.size()>0){for(BluetoothDevicedevice:pairedDevices){遍历到列表中bluetoothDevices.add(device.getName()+":"+device.getAddress()+"\n");}}//adapterlvDevices.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(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){收到的广播类型Stringaction=intent.getAction();发现设备的广播从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.客户端实现已经发送数据流客户端@OverridepublicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){先获得蓝牙的地址和设备名单独解析地址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(){Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};7.服务端读取数据流线程服务类privateclassAcceptThreadextendsThread{privateBluetoothServerSocketserverSocket;privateBluetoothSocketsocket;输入输出流privateOutputStreamos;privateInputStreamis;publicAcceptThread(){try{serverSocket=mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);}catch(IOExceptione){TODOAuto-generatedcatchblocke.printStackTrace();}}@Overridepublicvoidrun(){截获客户端的蓝牙消息try{socket=serverSocket.accept();//如果阻塞了,就会一直停留在这里is=socket.getInputStream();os=socket.getOutputStream();不断接收请求,如果客户端没有发送的话还是会阻塞while(true){每次只发送128个字节byte[]buffer=newbyte[128];读取intcount=is.read();//如果读取到了,我们就发送刚才的那个 ToastMessagemsg=newMessage();msg.obj=newString(buffer,0,count,"utf-8");handler.sendMessage(msg);}}catch(Exceptione){TODO:handleexception}}}8.开启服务首先要声明//启动服务ac=newAcceptThread();ac.start();MainActivity 完整代码publicclassMainActivityextendsActivityimplementsOnItemClickListener{本地蓝牙适配器privateBluetoothAdaptermBluetoothAdapter;列表privateListViewlvDevices;存储搜索到的蓝牙privateList<String>bluetoothDevices=newArrayList<String>();//listview的adapterprivateArrayAdapter<String>arrayAdapter;UUID.randomUUID()随机获取UUIDprivatefinalUUIDMY_UUID=UUID.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");连接对象的名称privatefinalStringNAME="LGL";这里本身即是服务端也是客户端,需要如下类privateBluetoothSocketclientSocket;privateBluetoothDevicedevice;输出流_客户端需要往服务端输出privateOutputStreamos;//线程类的实例privateAcceptThreadac;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);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();}//初始化listviewlvDevices.setOnItemClickListener(this);获取已经配对的设备Set<BluetoothDevice>pairedDevices=mBluetoothAdapter.getBondedDevices();判断是否有配对过的设备if(pairedDevices.size()>0){for(BluetoothDevicedevice:pairedDevices){遍历到列表中bluetoothDevices.add(device.getName()+":"+device.getAddress()+"\n");}}//adapterlvDevices.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(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){收到的广播类型Stringaction=intent.getAction();发现设备的广播从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("搜索完成!");}}};客户端@OverridepublicvoidonItemClick(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}}服务端,需要监听客户端的线程类privateHandlerhandler=newHandler(){Toast.makeText(MainActivity.this,Stri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 甘肃省临泽县流动式起重机(汽车吊)操作证考试参考题库-含答案
- 2026年中小学教师资格《综合素质》笔试真题解析卷(含答案)
- 材料基础课程试题及答案解析
- 偏瘫康复技能考核试题及答案
- 安徽卷试题呈现与答案公布
- 五年级语文竞赛综合试题及答案
- 3.3 海陆的变迁(教学课件40张)-新教材公开课课件
- 党史选择题与对应答案
- 2026年西安市第九医院基层服务中心招聘(3人)笔试参考题库及答案详解
- 2026厦门市集美区蔡林学校数学产假顶岗教师及非在编教师招聘3人笔试备考题库及答案详解
- 钢筋施工方案主体结构钢筋绑扎方案
- 国际空运货代知识培训课件
- DG-TJ08-2480-2025 建筑信息模型技术应用标准(民用建筑工程)
- 食品安全与消防安全培训课件
- SA8000-2026社会责任管理体系内审检查表完整内容
- 市政方向施工员培训课件
- 尊老敬老过重阳教学课件
- 客户维护的课件
- 2024年设备监理师真题与答案解析
- 防错漏装管理办法
- 第9课《天上有颗“南仁东星”》教学设计 2025-2026学年统编版八年级语文上册
评论
0/150
提交评论