zoukankan      html  css  js  c++  java
  • 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("不存在蓝牙");  
                }  
      
            }  
      
        }  
      
    }

  • 相关阅读:
    [Android6.0][RK3399] 双屏异显代码实现流程分析(二)【转】
    uboot中添加自己的命令【转】
    android压力测试命令monkey详解【转】
    T-sql语句修改数据库逻辑名、数据库名、物理名(sql2000)
    sql查询与修改数据库逻辑文件名,移动数据库存储路径
    如何修改SQL Server 2000的数据库逻辑与物理名称
    你是否也忘了刷新视图?
    单点登录CAS-Demo
    SQL Case when 的使用方法 (转)
    因为数据库正在使用,所以无法获得对数据库的独占访问权(转)
  • 原文地址:https://www.cnblogs.com/xieping/p/4714156.html
Copyright © 2011-2022 走看看