2015-02-06 147 views
4

這聽起來很基本,但我是Android BLE開發的初學者。 到目前爲止,我能夠創建我的Nexus 9設備作爲外圍設備,Moto G作爲中心設備。另外,我正在成功連接設備。但我無法弄清楚,當我從中央設備發送一個特性,它將從外設接收哪裏?如果廣告已成功啓動的不是(在我的情況是成功的)Android BLE外圍設備數據接收

這是我的外設代碼

 btleGattCallback = new BluetoothGattCallback() { 

     @Override 
      // Result of a characteristic read operation 
      public void onCharacteristicRead(BluetoothGatt gatt, 
        BluetoothGattCharacteristic characteristic, 
        int status) { 
       if (status == BluetoothGatt.GATT_SUCCESS) { 
        broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
       } 
      }   
     @Override 
     public void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) { 
      // this will get called when a device connects or disconnects 
     } 

     @Override 
     // New services discovered 
     public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
      if (status == BluetoothGatt.GATT_SUCCESS) { 
       broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); 
      } else { 
       Log.w("doscover", "onServicesDiscovered received: " + status); 
      } 
     } 
     }; 

BeaconParser bp = new BeaconParser().setBeaconLayout("m:2-3=0,i:4-19,p:20-20"); 

     mBeaconTransmitter = new BeaconTransmitter(this, bp); 

     // Transmit a beacon with Identifiers 2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 2 
     Long li = new Long(-0l); 
     ArrayList<Long> l = new ArrayList<Long>(); 
     l.add(li); 
     Beacon beacon = new Beacon.Builder() 

        .setId1("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6") 
        .setId2("1") 
        .setId3("2") 
        .setManufacturer(0x00ff) // Choose a number of 0x00ff or less as some devices cannot detect beacons with a manufacturer code > 0x00ff 
        .setTxPower(-59) 
        .setDataFields(l) 
        .build(); 

     mBeaconTransmitter.startAdvertising(beacon); 

和中央代碼當然啦

btManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE) ; 
    madapter = btManager.getAdapter(); 
    if (madapter != null && !madapter.isEnabled()) { 
     Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableIntent,1); 
    } 
    mHandler = new Handler(); 

    btleGattCallback = new BluetoothGattCallback() { 

     @Override 
      // Result of a characteristic read operation 
      public void onCharacteristicRead(BluetoothGatt gatt, 
        BluetoothGattCharacteristic characteristic, 
        int status) { 
       if (status == BluetoothGatt.GATT_SUCCESS) { 
        broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
       } 
      }   
     @Override 
     public void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) { 
      Log.w("doscover", "Connected " + status); 
     } 

     @Override 
     public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
      Log.w("discover", "onServicesDiscovered received: " + status); 
      if (status == BluetoothGatt.GATT_SUCCESS) { 
       broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); 
      } else { 
       Log.w("doscover", "onServicesDiscovered received: " + status); 
      } 
     } 






    }; 


    devicefound = new ArrayList<BluetoothDevice>(); 
    devices = new ArrayAdapter<String>(this , R.layout.device_name); 
    ListView pairedListView = (ListView) findViewById(R.id.textView3); 
    pairedListView.setAdapter(devices); 

    mleScanCallback = new BluetoothAdapter.LeScanCallback() { 
      @Override 
      public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { 
        devicefound.add(device); 

         //UUID = device.getAddress().toString(); 
         //Log.e("Search", "" + device.getName().toString()); 
         //Toast`.makeText(context,device.getName().toString(), 1).show(); 
         Log.e("Search", "" + device.toString()); 
         Log.e("Search", "" + String.valueOf(rssi) ); 


          devices.add("Nex" + device.getName()); 

          //mBluetoothGatt = device.connectGatt(getActivity(), true, btleGattCallback);   




      } 
     }; 

     pairedListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> adapter, View arg1, 
        int position, long id) { 


       dv = devicefound.get(position); 

       mBluetoothGatt = dv.connectGatt(getApplicationContext() , true, btleGattCallback);   
       mBluetoothGatt.connect(); 
       dv.createBond(); 

       //BluetoothDevice dd = madapter.getRemoteDevice(devicefound.get(position).getAddress()); 
       if(i == false) 
       { 
        Toast.makeText(getApplicationContext(), "Service found. Connected to " + dv.getName() , 1).show(); 
       } 
       else 
       { 
        Toast.makeText(getApplicationContext(), "Already Connected " + dv.getName() , 1).show(); 

       } 
       i = mBluetoothGatt.connect(); 

       mBluetoothGatt.beginReliableWrite(); 

       boolean b = mBluetoothGatt.discoverServices(); 
       Log.e("Discovery Started", "" + b); 
        Log.e("get ItemATPosition", "" + adapter.getItemAtPosition(position)); 

        //BluetoothGattService Service = mBluetoothGatt.getService(); 
        // = Service.getCharacteristic(k); 

        BluetoothGattCharacteristic characteristic= new BluetoothGattCharacteristic(k,2,1); //Service 
        characteristic.setValue("This is a Charects "); 



        byte[] value = {(byte)91,(byte)92,(byte)93}; 

        characteristic.setValue(value); 

        boolean st = mBluetoothGatt.writeCharacteristic(characteristic); 
        //Toast.makeText(getActivity(), t1.getText() + " " + st, 1).show(); 
        boolean b1 = mBluetoothGatt.executeReliableWrite(); 


        //Toast.makeText(getActivity(), t1.getText() + " " + b1, 1).show(); 
        Intent in = new Intent("ACTION_BOND_STATE_CHANGED."); 
        sendBroadcast(in); 

      } 
     }); 
     scanLeDevice(true); 

我的廣告回撥只返回使用來自中央的連接的Gatt的writeCharacteristic命令,但不知道如何從外設端接收

任何類型的幫助將b e讚賞。

回答

2

外設模式可以很好的支持在iOS上,我建議你用淺藍色測試的目的,從這裏開始:https://itunes.apple.com/us/app/lightblue-bluetooth-low-energy/id557428110?mt=8 而據我所知棒棒糖安裝在Nexus 6和Nexus 9 5可以支持外設模式,承上啓下5不支持它。 Moto G支持外設模式?

+0

是的,現在差不多6個android設備支持外設模式,而Moto G不是其中之一。不管怎麼說,多謝拉 – sajawalsz 2015-03-30 08:59:19