Отправка данных датчика от Wear OS на ноутбук в режиме реального времени - PullRequest
0 голосов
/ 25 сентября 2018

Я создаю приложение для отправки данных акселерометра и гироскопа с Gear Live на ноутбук.Два устройства находятся в одной сети Wi-Fi.Я реализовал сокет слушателя на носимом устройстве и сервер на ноутбуке.Слушатель сокета работает в потоке.

Вот код слушателя сокета:

public class SocketListenThread implements Runnable
{

    @Override
    public void run()
    {
        try
        {
            Log.i(TAG, "trying to bind to the host");
            socket = new Socket( "192.168.43.184", dstPort );
            Log.i(TAG, "Connected..");
            outputStream = socket.getOutputStream();
            while( runThread )
            {
                if( dataObj == null )
                {
                    synchronized ( lock )
                    {
                        lock.wait();
                    }
                }
                synchronized ( lock )
                {

                    ObjectOutputStream os = new ObjectOutputStream( outputStream );
                    os.writeObject(1);
                    os.flush();
                    ConnectionUtil.close(os);

                    lock.notifyAll();
                }
                Thread.sleep( 1 );
            }
        }
        catch( InterruptedException e )
        {
            Log.e( SocketListenThread.class.getSimpleName() + "InterruptedException", e.toString() );
        }
        catch( Exception e )
        {
            Log.e( SocketListenThread.class.getSimpleName() + "Exception", e.toString() );
            e.printStackTrace();
        }
        finally
        {
            ConnectionUtil.close( outputStream );
            ConnectionUtil.close( socket );
            connected = false;
        }

    }
}

Вот метод извлечения данных датчика и уведомление сокета о необходимости отправки данных:

@Override
public void onSensorChanged(SensorEvent event)
{
    List<Float> valList = new ArrayList<>();
    switch( event.sensor.getType() )
    {
        case Sensor.TYPE_HEART_RATE:
            valList.add(event.values[0]);
            sendData(new DataObj(TYPE_HEART_RATE,valList));
            break;
        case Sensor.TYPE_ACCELEROMETER:
            valList.add(event.values[0]);
            valList.add(event.values[1]);
            valList.add(event.values[2]);
            sendData(new DataObj(TYPE_ACCELEROMETER,valList));
            break;
        case Sensor.TYPE_GYROSCOPE:
            valList.add(event.values[0]);
            valList.add(event.values[1]);
            valList.add(event.values[2]);
            sendData(new DataObj(TYPE_GYROSCOPE,valList));
            break;
        default:
            break;
    }
}

public void sendData( DataObj dataObj )
{
    synchronized( lock )
    {
        if( dataObj != null)
        {
            this.dataObj = dataObj;
        }
        lock.notifyAll();
    }
}

Проблема в том, что когда я запускаю этот код, я не получаю данные датчика.То есть я не получаю никаких значений изменения данных датчика в обратный вызов onSensorChanged(SensorEvent event), хотя этот код работает в телефоне правильно.Если я удаляю поток сокетов из кода, я получаю данные.

Итак, мои вопросы:

  • Есть ли проблема с этим кодом
  • Если таккакой самый оптимальный способ отправки данных с износа на ноутбук (мне нужно видеть данные в режиме реального времени, с минимальной потерей данных).
...