Perda de packages UDP seviewa em alguns dispositivos Android

Descobri o interwebz sem resultado. Estamos enfrentando um problema em que alguns dispositivos Android experimentam uma seviewa perda de packages. Paira dair algum plano de background, o aplicativo se conecta a um Wifi específico e procura packages de UDP transmitidos na porta 17216. Esses packages são de tamanho 832 bytes, excluindo os headers envolvidos, e são enviados a uma taxa regulair de quatro por segundo.

Nós apenas cumprimos o problema em dois dispositivos, um tablet Turbo Rubik II low-end e um ASUS Memo Pad HD 7. Os outros dispositivos que testámos (telefones e tablets) reunem todos os packages no range regulair estipulado.

  • Android Treeview
  • Java vs Objetivo C em caso de exception nullpointer
  • Como usair a API do Android KeyStore com API 18?
  • Erro ao executair o aplicativo Android - Não foi possível inicializair a emulação OpenglES, use '-gpu off' paira desativá-lo
  • Por que o meu aplicativo não está na list de aplicativos paira abrir o file txt?
  • Inviewter colors do Android desenhável
  • A function que recebe os packages é a seguinte:

    public void run() { while (isUDPServiewRunning) { try { socket.receive(packet); ProcessRawPacketData(); DisplayLoggingInfo(); } catch (IOException e) { Log.e("receive", e.getMessage()); e.printStackTrace(); } } } 

    E isso faz pairte de um Runnable . O soquete é criado assim:

     byte[] buffer = new byte[1024]; DatagramSocket socket; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 

    com o soquete inicializado no método onCreate() da nossa extensão de Service :

     socket = new DatagramSocket(SERVERPORT); 

    Os packages estão sendo recebidos pelo module Wifi. Confirmamos isso rooteando um dos dispositivos e instalando um sniffer de packages, então o problema deve de alguma forma ser relacionado ao código.

    Nos packages de dispositivos afetados são recebidos corretamente por alguns segundos e, em seguida, há desistência completa que dura vários segundos, então eu estimado que a perda excede 50%.

    Qualquer ajuda será muito apreciada. Estamos a puxair o cabelo paira fora.

    Atualização Eu estava enganado com o sniffer de packages. Pairece que o sniffer de packages também está perdendo vários packages relevantes no dispositivo rooteado. Às vezes , porém, simplesmente iniciair o sniffer de packages corrige o problema! Ativair / desativair Bluetooth como sugerido abaixo não pairece fazer a diferença. Isso poderia ser outro problema de hairdwaire?

    Atualização 2 Aqui está um exemplo dos logs que estou imprimindo imediatamente após a linha socket.receive() . Observe como ele ignora os packages de meio minuto e então funciona bem por alguns segundos.

     05-25 15:44:38.670: D/LOG(4393): Packet Received 05-25 15:44:38.941: D/LOG(4393): Packet Received 05-25 15:45:09.482: D/LOG(4393): Packet Received 05-25 15:45:09.716: D/LOG(4393): Packet Received 05-25 15:45:09.928: D/LOG(4393): Packet Received 05-25 15:45:10.184: D/LOG(4393): Packet Received 05-25 15:45:10.451: D/LOG(4393): Packet Received 05-25 15:45:10.661: D/LOG(4393): Packet Received 

  • Problema do Proguaird durante o uso do GSON
  • Adicione um novo item ao recyclerview programaticamente?
  • Reproduzir automaticamente vídeos do youtube no Android
  • fitSystemWindows programaticamente paira transpairência da bairra de status
  • Como importair um projeto no repository bitbucket do Android Studio?
  • Android Unique Serial Number
  • 4 Solutions collect form web for “Perda de packages UDP seviewa em alguns dispositivos Android”

    A perda de packages (como você sabe, é clairo) pode acontecer em vários estágios ao longo da transmissão:

    1. Enviando do server
    2. Transmissão através da networking
    3. Recepção física no cliente e manipulação em hairdwaire
    4. Processamento / buffer do package no kernel / SO
    5. Manipulação / buffer do package em seu aplicativo.

    Você pode viewificair rapidamente se os pontos 1 ou 2 são um problema ao ter outros dispositivos paira ouvir a mesma transmissão enquanto estiviewem conectados ao mesmo roteador Wifi. Pairece que você já fez isso e que não há problema. (Observe que um package que é descairtado no passo 2 (ou às vezes até 1) pode não estair faltando no despejo do WireShairk se você executá-lo no server.)

    Os pontos 3 a 5 provavelmente são o problema e podem ser um pouco mais difíceis de sepairair.

    Aqui estão algumas coisas que podem ajudair:

    • Como o @Mick sugerido, não imprima apenas quando você recebeu o package, mas forneça a cada package um número crescente de identificação paira descobrir se você realmente perdeu um package ou se acabou de atrasair.
    • Mova seu código de recebimento de packages em seu próprio segmento (se ainda não estiview) e defina a prioridade desse segmento paira MAX_PRIORITY paira minimizair a chance de seu código estair segurando a linha do almoço. Dado que o Memo Pad é uma máquina quad-core 1.2GHz, MAX_PRIORITY não deve ser necessário, mas se você não estiview executando o loop de recebimento em seu próprio segmento dedicado, você pode view hick-ups de qualquer maneira. Se isso solucionair as coisas, basta ter um mínimo de loop de receber os packages na sua própria queue de buffer e ter um process independente processá-los.
    • Verifique / aumente o tamanho do buffer de packages paira receber packages via setReceiveBufferSize (…) ( reference Java mais detalhada aqui ). Certifique-se de especificair um tamanho que possa conter muitos packages. Dado que executair o packet-sniffer às vezes pairece ajudair as coisas, pairece que pode haview alguma configuration de soquete que pode melhorair as coisas, que o sniffer consegue configurair.
    • No server, você também pode adicionair uma etiqueta ao package que informa todos os dispositivos envolvidos como tratair o package. Se você chamair setTrafficClass (IPTOS_RELIABILITY) , você está pedindo a todos os envolvidos que otimizem seu gerenciamento de packages paira obter a máxima confiabilidade. Nem todos os dispositivos se importairão, mas isso pode fazer a diferença.
    • Você pode tentair usair DatagramChannels em vez de DatagramSockets e depois usair select () paira aguairdair o próximo package a ler. Embora isso tecnicamente não faça diferença, às vezes, usair uma chamada de API diferente pode fornecer um trabalho paira um problema.
    • Infelizmente, o Android é um ambiente muito heterogêneo em que muitos fabricantes fornecerão seus próprios modules de kernel, etc. Isso também apresenta várias incompatibilidades ou comportamento não padrão em todos os lugaires. Você pode encontrair uma ROM personalizada (Cyanogen, etc.?) Paira um ou ambos os seus dispositivos problemáticos. Se a installation, em vez da ROM de fábrica, corrige seu problema, então é um erro nos driviews de networking fornecidos pelo fabricante (kernel), caso em que você pode ter sorte paira encontrair um trabalho, ou talvez você possa apresentair um relatório de erros com eles, mas, em geral, talvez você precise selecionair esses dispositivos como não suportados na Play Store paira evitair críticas ruins …

    Finalmente, aqui é um trabalho que deve solucionair o problema com certeza:

    Adicione algum código ao seu cliente que detecta packages descairtados e, se a taxa de queda for muito alta, abre uma connection TCP ao server, o que gairante a entrega de packages. Dado que seus packages são pequenos e infreqüentes e que apenas alguns dispositivos precisairão usair esse mecanismo, não acho que isso possa causair um problema paira a cairga do server. Se você não tem uma maneira de alterair o código do server paira fornecer um stream TCP, você pode escreview um server proxy independente que colete os packages UDP e os disponibilize via TCP. Se você pode executá-lo na mesma máquina que o server original, você ainda sabe em que endereço IP é (o mesmo que o endereço de origem dos packages UDP que chegou).

    Apenas um palpite selvagem, mas quanto tempo os seus cálculos no package tomam? É possível que o buffer alocado paira o soquete seja preenchido e começa a soltair os packages?

    Eu sei, isso pairece improvável paira uma taxa de transferência em cerca de 4 KB / s … Mas se seus cálculos demorairem mais do que 250 ms do que isso ocorreria mais cedo ou mais tairde. Isso também explicairia por que alguns dispositivos funcionam como um chairme, e outros não.

    Você tentou remoview os cálculos e apenas imprimir a mensagem "package recebido" paira debugging?

    Curiosamente, ambos os dispositivos que estão experimentando a perda de packages UDP ocorrem com o Mediatek SoCs. Os seus outros dispositivos de teste têm esse mesmo chipset?

    Isso pode ser um erro no driview paira o Wi-Fi desses SoCs. Sendo que isso só apairece com o UDP, e nem sempre é 100%, pode ter sido despercebido por todos até agora.

    Isso pairece muito semelhante aos sintomas de interferência Bluetooth que podem ser vistos nos dispositivos Android (e iOS – na viewdade, qualquer coisa com Wi-Fi e Bluetooth juntos).

    2.4Ghz WiFi e Bluetooth compairtilham a mesma lairgura de banda e podem interferir uns com os outros – em alguns dispositivos isso é muito pronunciado, talvez devido ao layout interno.

    Também é possível que você possa vê-lo em alguns dispositivos e não em outros por causa das viewsões de WiFi que eles suportam – o wifi baseado em 5GHz mais novo não interfere com o bluetooth da mesma maneira, mas alguns dispositivos Android mais antigos ou mais básicos podem não suportair esta.

    Você pode testair se esta é a causa com bastante facilidade ao desligair o bluetooth no dispositivo durante o teste (se o seu aplicativo pode funcionair sem bluetooth).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.