Autore Topic: Velocità di trasferimento Bluetooth  (Letto 605 volte)

Offline davix10

  • Utente normale
  • ***
  • Post: 155
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Velocità di trasferimento Bluetooth
« il: 30 Settembre 2014, 10:27:30 CEST »
0
Ciao, ho realizzato un'applicazione in grado di ricevere delle stringhe da bluetooth e ora la sto provando tramite un programmino fatto con visual studio. Il mio problema è la velocità di trasferimento, se mando le stringhe ad una velocità inferiore ai 40 ms va in confusione. Mi ripete 3/4/5 volte la stessa stringa e mi salta le successive. Non posso trasferire ad una velocità minore di 40 ms?
Grazie.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Velocità di trasferimento Bluetooth
« Risposta #1 il: 30 Settembre 2014, 10:43:30 CEST »
0
Più che di velocità di trasferimento parlerei di latenza. Può tranquillamente essere che non sia possibile iniziare trasferimenti più rapidamente di 40ms e questo a prescindere dalla velocità di trasferimento (banda).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline davix10

  • Utente normale
  • ***
  • Post: 155
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Velocità di trasferimento Bluetooth
« Risposta #2 il: 30 Settembre 2014, 10:49:13 CEST »
0
Quindi non c'è una soluzione?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Velocità di trasferimento Bluetooth
« Risposta #3 il: 30 Settembre 2014, 12:18:23 CEST »
0
Oltre alla latenza hai anche il problema del jitter.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Velocità di trasferimento Bluetooth
« Risposta #4 il: 30 Settembre 2014, 12:35:02 CEST »
+1
Quindi non c'è una soluzione?

Non ho minimamente idea delle necessità della tua applicazione, l'idea sarebbe di accorpare un po' di stringhe in un unico pacchetto.

Come analogia con la realtà: se devi portare al quinto piano 100 bottiglie di acqua usando l'ascensore, se ne porti una alla volta ci metti una vita, perchè l'ascensore si muove alla stessa velocità, sia che porti 1 bottiglia che 100.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline davix10

  • Utente normale
  • ***
  • Post: 155
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Velocità di trasferimento Bluetooth
« Risposta #5 il: 30 Settembre 2014, 16:55:19 CEST »
0

Questa è la mia libreria bluetooth:

Codice (Java): [Seleziona]
package com.example.tut1;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;







import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.visualization.ot.R;

public class Bluetooth extends Activity implements OnItemClickListener{

        public static void disconnect(){
                if (connectedThread != null) {
                        connectedThread.cancel();
                        connectedThread = null;
                }
        }

        public static void gethandler(Handler handler){//Bluetooth handler
                mHandler = handler;
        }
        static Handler mHandler = new Handler();

        static ConnectedThread connectedThread;
        public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        protected static final int SUCCESS_CONNECT = 0;
        protected static final int MESSAGE_READ = 1;
        ArrayAdapter<String> listAdapter;
        ListView listView;
        static BluetoothAdapter btAdapter;
        Set<BluetoothDevice> devicesArray;
        ArrayList<String> pairedDevices;
        ArrayList<BluetoothDevice> devices;
        IntentFilter filter;
        BroadcastReceiver receiver;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_bluetooth);
                init();
                if (btAdapter==null){
                        Toast.makeText(getApplicationContext(), "No bluetooth detected", 0).show();
                        finish();
                }else{
                        if (!btAdapter.isEnabled()){
                                turnOnBT();
                        }
                        getPairedDevices();
                        startDiscovery();
                }

        }


        private void startDiscovery() {
                // TODO Auto-generated method stub
                btAdapter.cancelDiscovery();
                btAdapter.startDiscovery();
        }

        private void turnOnBT() {
                Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(intent, 1);
        }

        private void getPairedDevices() {
                devicesArray = btAdapter.getBondedDevices();
                if (devicesArray.size()>0){
                        for(BluetoothDevice device:devicesArray){
                                pairedDevices.add(device.getName());
                        }
                }
        }

        private void init(){
                listView = (ListView)findViewById(R.id.listView);
                listView.setOnItemClickListener(this);
                listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,0);
                listView.setAdapter(listAdapter);
                btAdapter = BluetoothAdapter.getDefaultAdapter();
                pairedDevices = new ArrayList<String>();
                filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                devices = new ArrayList<BluetoothDevice>();    
                receiver = new BroadcastReceiver(){
                        @Override
                        public void onReceive(Context context, Intent intent) {
                                String action = intent.getAction();
                                if (BluetoothDevice.ACTION_FOUND.equals(action)){
                                        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                                        devices.add(device);
                                        String s = "";
                                        for(int a=0;a<pairedDevices.size();a++){
                                                if (device.getName().equals(pairedDevices.get(a))){
                                                        //append
                                                        s = "(Paired)";
                                                        break;
                                                }
                                        }
                                        listAdapter.add(device.getName()+" "+s+" "+"\n"+device.getAddress());

                                }else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){

                                }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){

                                }else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){
                                        if (btAdapter.getState() == btAdapter.STATE_OFF){
                                                turnOnBT();
                                        }
                                }  
                        }

                };

                registerReceiver(receiver, filter);
                IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
                registerReceiver(receiver, filter);
                filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
                registerReceiver(receiver, filter);
                filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        }

        @Override
        protected void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
            try {
                unregisterReceiver(receiver);
            } catch (IllegalArgumentException e) {
                // ignored    
            }
        }

        protected void onActivityResult(int requestCode, int resultCode, Intent data){
                super.onActivityResult(requestCode, resultCode, data);
                if (resultCode == RESULT_CANCELED){
                        Toast.makeText(getApplicationContext(), "Bluetooth must be enabled to continue", Toast.LENGTH_SHORT).show();
                        finish();
                }
        }

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                // TODO Auto-generated method stub
                if (btAdapter.isDiscovering()){
                        btAdapter.cancelDiscovery();
                }
                if (listAdapter.getItem(arg2).contains("(Paired)")){

                        BluetoothDevice selectedDevice = devices.get(arg2);
                        ConnectThread connect = new ConnectThread(selectedDevice);
                        connect.start();
                }else {
                        Toast.makeText(getApplicationContext(), "device is not paired", 0).show();
                }
        }

        private class ConnectThread extends Thread {
                private final BluetoothSocket mmSocket;
                private final BluetoothDevice mmDevice;

                public ConnectThread(BluetoothDevice device) {
                        // Use a temporary object that is later assigned to mmSocket,
                        // because mmSocket is final
                        BluetoothSocket tmp = null;
                        mmDevice = device;

                        // Get a BluetoothSocket to connect with the given BluetoothDevice
                        try {
                                // MY_UUID is the app's UUID string, also used by the server code
                                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
                        } catch (IOException e) { }
                        mmSocket = tmp;
                }

                public void run() {
                        // Cancel discovery because it will slow down the connection
                        btAdapter.cancelDiscovery();

                        try {
                                // Connect the device through the socket. This will block
                                // until it succeeds or throws an exception
                                mmSocket.connect();
                                //connectedThread = new ConnectedThread(mmSocket);
                        } catch (IOException connectException) {
                                // Unable to connect; close the socket and get out
                                try {
                                        mmSocket.close();
                                } catch (IOException closeException) { }
                                return;
                        }

                        // Do work to manage the connection (in a separate thread)
                        mHandler.obtainMessage(SUCCESS_CONNECT, mmSocket).sendToTarget();
                }

                /** Will cancel an in-progress connection, and close the socket */
                public void cancel() {
                        try {
                                mmSocket.close();
                        } catch (IOException e) { }
                }
        }

        static class ConnectedThread extends Thread {
                private final BluetoothSocket mmSocket;
                private final InputStream mmInStream;
                private final OutputStream mmOutStream;

                public ConnectedThread(BluetoothSocket socket) {
                        mmSocket = socket;
                        InputStream tmpIn = null;
                        OutputStream tmpOut = null;

                        // Get the input and output streams, using temp objects because
                        // member streams are final
                        try {
                                tmpIn = socket.getInputStream();
                                tmpOut = socket.getOutputStream();
                        } catch (IOException e) { }

                        mmInStream = tmpIn;
                        mmOutStream = tmpOut;
                }
                StringBuffer sbb = new StringBuffer();
                public void run() {

                        byte[] buffer;  // buffer store for the stream
                        int bytes; // bytes returned from read()

                        // Keep listening to the InputStream until an exception occurs
                        while (true) {
                                try {
                                        try {
                                                sleep(30);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }

                                        buffer = new byte[1024];
                                        // Read from the InputStream
                                        bytes = mmInStream.read(buffer);
                                        // Send the obtained bytes to the UI activity
                                        mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
                                } catch (IOException e) {
                                        break;
                                }
                        }
                }

                /* Call this from the main activity to send data to the remote device */
                public void write(String income) {

                        try {
                                mmOutStream.write(income.getBytes());
                                for(int i=0;i<income.getBytes().length;i++)
                                Log.v("outStream"+Integer.toString(i),Character.toString((char)(Integer.parseInt(Byte.toString(income.getBytes()[i])))));
                                try {
                                        Thread.sleep(20);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        } catch (IOException e) { }
                }
               
                 public void write(byte[] buffer) {
                         
                                 try {
                         
                                     mmOutStream.write(buffer);
                         
                                 } catch (IOException e) { }
                         
                             }

               
                /* Call this from the main activity to shutdown the connection */
                public void cancel() {
                        try {
                                mmSocket.close();
                        } catch (IOException e) { }
                }
       
        }

       
}

e questa la mia activity principale:

Codice (Java): [Seleziona]
public class MainActivity extends Activity implements View.OnClickListener{

        @Override
        public void onBackPressed() {
                // TODO Auto-generated method stub
                if (Bluetooth.connectedThread != null) {
                        Bluetooth.connectedThread.write(" ");}//Stop streaming
                super.onBackPressed();
        }


        //toggle Button
        static boolean Lock;//whether lock the x-axis to 0-5
        static boolean AutoScrollX;//auto scroll to the last x value
        static boolean Stream;//Start or stop streaming
       
        boolean absolute=false;
   
    boolean relative=false;
    long n1=0,n2=0,n3=0,n4=0;
   
    long somma1=0,somma2=0,somma3=0,somma4=0;
   
    String Max1,Max2,Max3,Max4;
        boolean dark = true;
        //Button init
        Button bXminus,bAbsolute,bRelative;
        Button bXplus;
        Button bYminus;
        Button bYplus;
        ToggleButton tbScroll;
        ToggleButton tbStream;
        RadioButton ch1,ch2,ch3,ch4;
        //GraphView init
        static LinearLayout GraphView, GraphView1;
        static GraphView graphView, graphView1;
        static GraphViewSeries Series,Series1;
        //graph value
        private static double graph2LastXValue = 0;
        private static int Xview=10;
        Button bConnect, bDisconnect;
        Button cambia;
        Button bBackground;
        int switches = 0;
        int range = 1;
        int counter = 0;
       
        TextView Ch1,Ch2,Ch3,Ch4;
    TextView valore1,valore2,valore3,valore4,textPoc1,textPoc2;
   
    long max1=1,max2=1,max3=1,max4=1;
    int barra1,barra2,barra3,barra4,conta1,conta2,conta3,conta4;
    long media1=1,media2=1,media3=1,media4=1;
       
        byte prova = (byte) 187; //188 e 168  

        Handler mHandler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                        // TODO Auto-generated method stub
                       
                        super.handleMessage(msg);
                        switch(msg.what){
                        case Bluetooth.SUCCESS_CONNECT:
                                Bluetooth.connectedThread = new Bluetooth.ConnectedThread((BluetoothSocket)msg.obj);
                                Toast.makeText(getApplicationContext(), "Connected!", 0).show();
                                String s = "successfully connected";
                                Bluetooth.connectedThread.start();
                                Bluetooth.connectedThread.write(new byte[]{(byte) prova});
                                bAbsolute.setClickable(true);
                                break;
                        case Bluetooth.MESSAGE_READ:

                                byte[] readBuf = (byte[]) msg.obj;
                                int valore_a_16 = ((readBuf[1] & 0xFF) << 8) | (readBuf[0] & 0xFF);
                                int valore_a_16_2 = ((readBuf[3] & 0xFF) << 8) | (readBuf[2] & 0xFF);
                                int valore_a_16_3 = ((readBuf[5] & 0xFF) << 8) | (readBuf[4] & 0xFF);
                                int valore_a_16_4 = ((readBuf[7] & 0xFF) << 8) | (readBuf[6] & 0xFF);
                                String strIncom = new String(readBuf);   // create string from bytes array
                                String str = String.valueOf(valore_a_16);
                                String str2 = String.valueOf(valore_a_16_2);
                                String str3 = String.valueOf(valore_a_16_3);
                                String str4 = String.valueOf(valore_a_16_4);
                                Log.d("SHORT", str);
                                Log.d("strIncom", strIncom);
                                Log.d("SHORT CH 2", str2);
                                Log.d("SHORT CH 3", str3);
                                Log.d("SHORT CH 4", str4);
                                char c = strIncom.charAt(0);
                                long foo = Integer.parseInt(str);
                                long foo2 = Integer.parseInt(str2);
                                long foo3 = Integer.parseInt(str3);
                                long foo4 = Integer.parseInt(str4);
                               
                               

                                break;
                        }
                }

               

        };

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                requestWindowFeature(Window.FEATURE_NO_TITLE);//Hide title
                this.getWindow().setFlags(WindowManager.LayoutParams.
                                FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//Hide Status bar
                setContentView(R.layout.activity_main);
                //set background color
                LinearLayout background = (LinearLayout)findViewById(R.id.bg);
                background.setBackgroundColor(Color.BLACK);
               
                init();
                ButtonInit();
        }

Avete dei consigli da darmi?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1186
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Velocità di trasferimento Bluetooth
« Risposta #6 il: 30 Settembre 2014, 18:22:37 CEST »
0
Cosa non funziona?

Quando chiami un metodo getQualcosa quel metodo da prassi deve avere un return. Il tuo static get non torna niente.
Quanto inizializzi quei long prima del break mi viene da pensare che siano inutili. La variabile che dichiari muore una volta che chiudi la parentesi graffa.

Spiega cosa vuoi fare

Offline davix10

  • Utente normale
  • ***
  • Post: 155
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Velocità di trasferimento Bluetooth
« Risposta #7 il: 30 Settembre 2014, 19:09:41 CEST »
0
Il problema è che perdo dei dati, o meglio mi ripete gli stessi valori 4/5/6 e mi omette quelli in mezzo. Come dovrei fare?