Android使用蓝牙与PC端进行通信 分类: Android 2015-07-30 09:45 15人阅读 评论(0) 收藏
目前Android只支持BluetoothSocket连接,而要对PC进行通信,直接使用BluetoothSocket是无法通信的,因为PC端使用java开发没有BluetoohSocket,所以PC端开发的时候必须采用J2ME的jar包进行开发
PC端作为服务端,Android作为客户端,目前只 能做到这一种方法连接,并且要有相同的UUID进行连接
PC客户端完整代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.Vector; import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DeviceClass; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.DiscoveryListener; import javax.bluetooth.LocalDevice; import javax.bluetooth.RemoteDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; import javax.microedition.io.StreamConnectionNotifier; import com.intel.bluetooth.BluetoothServerConnection; /** * 实现蓝牙客户端,搜索蓝牙设备 * * @author Administrator * */ public class BluetoothClientService implements DiscoveryListener, Runnable { private final static UUID TARGET_UUID = new UUID( "0000110100001000800000805F9B34FB", false); private StreamConnectionNotifier myPCConnNotifier = null; private Map<RemoteDevice, String> devicesMap = new HashMap<RemoteDevice, String>(); private Vector<ServiceRecord> records = new Vector<ServiceRecord>(); private DiscoveryAgent discoveryAgent = null;// 发现蓝牙设备 private UUID[] uuidSet ; // 流连接 private StreamConnection streamConn = null; // 接受数据字节流 private byte[] acceptedByteArray = new byte[12]; // 读取(输入)流 private InputStream inputStream = null; private int activeIndex=-1; //存活的服务索引 private int transIDs[]; // 服务搜索的事务id集合 /** * 发现设备,搜索设备时候每发现一个设备时回调,(包含上次蓝牙模块自动记录的设备以及新发现的设备) */ @Override public void deviceDiscovered(RemoteDevice btDevice, DeviceClass code) { String deviceName = null; try { deviceName = btDevice.getFriendlyName(false); } catch (IOException e) { e.printStackTrace(); } if (devicesMap.get(btDevice) == null) { devicesMap.put(btDevice, deviceName); } } /** * 搜索完毕,搜索设备结束时回调 */ @Override public void inquiryCompleted(int arg0) { synchronized (this) { notify(); } } /** * 搜索完毕,服务搜索完毕的时候回调 */ @Override public void serviceSearchCompleted(int transID, int respCode) { for (int i = 0; i < transIDs.length; i++) { if (transIDs[i] == transID) { transIDs[i] = -1; } } // 如果对所有的设备的服务都搜索完毕 boolean finished = false; for (int i = 0; i < transIDs.length; i++) { if (transIDs[i] == -1) { finished = true; break; } } if (finished) { synchronized (this) { notify(); } } } /** * 服务发现,搜索服务时候回调 */ @Override public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { System.out.println("servRecord==="+servRecord); for (int i = 0; i < servRecord.length; i++) { records.addElement(servRecord[i]); } System.out.println("records="+records.size()); } /** * 启动线程,初始化设备 */ @Override public synchronized void run() { if (initLocalDevice()) { try { uuidSet=new UUID[2]; uuidSet[0]=new UUID(0x1101); //0x1101表示 采用btspp协议 uuidSet[1]=new UUID(0x1103); //目标服务标示 System.out.println(uuidSet[0]); discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);// 启动发现附近设备 wait(); //生成服务和属性的全球唯一标示符 transIDs = new int[devicesMap.size()]; int i = 0; for (Map.Entry<RemoteDevice, String> entry : devicesMap .entrySet()) { System.out.println("设备名称:" + entry.getValue()); System.out.println("设备mac:" + entry.getKey()); RemoteDevice rd = (RemoteDevice) entry.getKey(); transIDs[i] = discoveryAgent.searchServices(null, uuidSet, rd, this); i++; // LocalDevice.getLocalDevice().getDiscoveryAgent().searchServices(transIDs, uuidSet, rd, this); } wait(); activeIndex=getActiveService(); } catch (BluetoothStateException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 查询本地蓝牙设备 * * @return 是否有蓝牙设备 */ public boolean initLocalDevice() { boolean isReady = false; try { LocalDevice localDevice = LocalDevice.getLocalDevice();// 搜索本地设备 discoveryAgent = localDevice.getDiscoveryAgent();// 获取本地蓝牙设备 localDevice.setDiscoverable(DiscoveryAgent.GIAC);// 设置自身为不可发现状态,也就是搜索不到自己(状态待确定) isReady = true; } catch (BluetoothStateException e) { System.out.println("没有探测到蓝牙设备"); e.printStackTrace();// 没有探测到本地蓝牙设备 } return isReady; } /** * * @return */ private int getActiveService() { accessService("message............."); // for(int i=0;i<records.size();i++){ // ServiceRecord sr = (ServiceRecord) records.elementAt(i); // if(accessService(sr,"connect...")){ // System.out.println("connet\\\\\\\\\\\\\\"); // return i; // } // } return -1; } //ServiceRecord sr, private boolean accessService(String msg){ boolean result=false; String inSTR = null; try { // System.out.println("连接蓝牙....."); // 流连接通知 用于创建流连接 myPCConnNotifier = (StreamConnectionNotifier) Connector .open("btspp://localhost:0000110100001000800000805F9B34FB"); // System.out.println( "service="+ServiceRecord.NOAUTHENTICATE_NOENCRYPT); // String url = sr.getConnectionURL( // ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); // StreamConnection conn = (StreamConnection) Connector.open(url); // DataOutputStream dos=conn.openDataOutputStream(); // dos.writeUTF(msg); // dos.close(); // DataInputStream dis=conn.openDataInputStream(); // String echo=dis.readUTF(); // System.out.println(echo); // dis.close(); // StreamConnection con=(StreamConnection) Connector.open("btspp://localhost:0000110100001000800000805F9B34FB"); // RemoteDevice.getRemoteDevice(con); // while (true) { // System.out.println("等待读取消息....."); // 获取流连接 streamConn = myPCConnNotifier.acceptAndOpen(); // 获取流通道 inputStream = streamConn.openInputStream(); // 读取字节流 BufferedReader br = null; br = new BufferedReader(new InputStreamReader(inputStream)); System.out.println("得到的消息"+br.readLine()); // while (inputStream.read(acceptedByteArray) != -1) { // inSTR = new String(acceptedByteArray); // System.out.println(inSTR); // if (inSTR.contains("EXIT")) { // // 手机客户端退出则关闭连接通道。 // inputStream.close(); // if (streamConn != null) { // streamConn.close(); // } // break; // } // } // // } // } catch (IOException e) { System.out.println("exception here"); } return result; } public static void main(String arg[]) { BluetoothClientService b = new BluetoothClientService(); new Thread(b).start(); } }Android客户端完整代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class BluetoothActivity extends Activity implements OnClickListener { public static final String PROTOCOL_SCHEME_RFCOMM = "btspp"; private Button button = null; private BluetoothAdapter bluetoothAdapter = null; private BluetoothServerSocket mserverSocket = null; private BluetoothSocket socket =null; private InputStream inputStream = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button) findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { int id = v.getId(); if (button.getId() == id) { bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 获取蓝牙适配器 if (bluetoothAdapter != null) { System.out.println("手机包含蓝牙。。。。。。。。。。。。。"); if (!bluetoothAdapter.isEnabled()) { Intent intent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(intent); } bluetoothAdapter.enable(); Intent discoverableIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra( BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 150); try { UUID uuid=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); mserverSocket = bluetoothAdapter .listenUsingInsecureRfcommWithServiceRecord( PROTOCOL_SCHEME_RFCOMM,uuid); // Set<BluetoothDevice> devices=bluetoothAdapter.getBondedDevices(); // BluetoothDevice device=null; // System.out.println("......................."); // for(Iterator<BluetoothDevice> iterator=devices.iterator();iterator.hasNext();){ // device=iterator.next(); // System.out.println(device.getName()); // if("LIUYC-PC".equals(device.getName())){ // // socket= device.createRfcommSocketToServiceRecord(uuid); // socket.connect(); // // } // } socket=mserverSocket.accept(); BufferedReader br = null; PrintWriter pw=null; br = new BufferedReader(new InputStreamReader( socket.getInputStream())); pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),false); pw.write("android开始返回消息啦"); pw.flush(); pw.close(); System.out.println("收到的消息"+br.readLine()); socket.close(); } catch (IOException e) { System.out.println("错误"); e.printStackTrace(); } // Set<BluetoothDevice> // devices=bluetoothAdapter.getBondedDevices(); // if(devices.size()>0){ // for(Iterator<BluetoothDevice> // iterator=devices.iterator();iterator.hasNext();){ // BluetoothDevice device=iterator.next(); // System.out.println("蓝牙名称"+device.getName()); // System.out.println("蓝牙地址"+device.getAddress()); // } // }else{ // System.out.println("没有发现蓝牙设备"); // } } else { System.out.println("不存在蓝牙"); } } } }