AndroidBLE与终端通信(三)-客户端与服务端通信过程以及实现数据通信资料_第1页
AndroidBLE与终端通信(三)-客户端与服务端通信过程以及实现数据通信资料_第2页
AndroidBLE与终端通信(三)-客户端与服务端通信过程以及实现数据通信资料_第3页
AndroidBLE与终端通信(三)-客户端与服务端通信过程以及实现数据通信资料_第4页
AndroidBLE与终端通信(三)-客户端与服务端通信过程以及实现数据通信资料_第5页
已阅读5页,还剩8页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论