Я создаю приложение для отправки данных акселерометра и гироскопа с 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)
, хотя этот код работает в телефоне правильно.Если я удаляю поток сокетов из кода, я получаю данные.
Итак, мои вопросы:
- Есть ли проблема с этим кодом
- Если таккакой самый оптимальный способ отправки данных с износа на ноутбук (мне нужно видеть данные в режиме реального времени, с минимальной потерей данных).