2012-05-15 2 views
2

Я рассматриваю демонстрацию WifiDirect для Android и хотел узнать, можно ли что-то получить как RSSI или уровень сигнала между двумя подключенными устройствами.Сила сигнала в соединении p2p с Wifi Direct?

Извините, если вопрос не имеет смысла, я знаю, что можно получить RSSI из точек доступа, но я хочу знать, является ли эта концепция RSSI в p2p-соединениях между устройствами в Wifi Direct.

Спасибо за ваше время.

ответ

8

Примечание: Этот ответ был верно для уровня 14 API, я не знаю, если он до сих пор относится к последним версиям Android.

В источнике кода Android существует не документированный файл с именем WifiP2pPeer. Он содержит несколько «интересных» строк.

Мы можем видеть, что значение RSSI жестко закодировано (mRssi = 60; //TODO: fix), поэтому функция может еще не быть реализована ... (Как и другие в Android 14 относительно WifiP2p).

public class WifiP2pPeer extends Preference { 

    private static final int[] STATE_SECURED = {R.attr.state_encrypted}; 
    public WifiP2pDevice device; 

    private int mRssi; 
    private ImageView mSignal; 

    private static final int SIGNAL_LEVELS = 4; 

    public WifiP2pPeer(Context context, WifiP2pDevice dev) { 
     super(context); 
     device = dev; 
     setWidgetLayoutResource(R.layout.preference_widget_wifi_signal); 
     mRssi = 60; //TODO: fix 
    } 

    @Override 
    protected void onBindView(View view) { 
     if (TextUtils.isEmpty(device.deviceName)) { 
      setTitle(device.deviceAddress); 
     } else { 
      setTitle(device.deviceName); 
     } 
     mSignal = (ImageView) view.findViewById(R.id.signal); 
     if (mRssi == Integer.MAX_VALUE) { 
      mSignal.setImageDrawable(null); 
     } else { 
      mSignal.setImageResource(R.drawable.wifi_signal); 
      mSignal.setImageState(STATE_SECURED, true); 
     } 
     refresh(); 
     super.onBindView(view); 
    } 

    @Override 
    public int compareTo(Preference preference) { 
     if (!(preference instanceof WifiP2pPeer)) { 
      return 1; 
     } 
     WifiP2pPeer other = (WifiP2pPeer) preference; 

     // devices go in the order of the status 
     if (device.status != other.device.status) { 
      return device.status < other.device.status ? -1 : 1; 
     } 

     // Sort by name/address 
     if (device.deviceName != null) { 
      return device.deviceName.compareToIgnoreCase(other.device.deviceName); 
     } 

     return device.deviceAddress.compareToIgnoreCase(other.device.deviceAddress); 
    } 

    int getLevel() { 
     if (mRssi == Integer.MAX_VALUE) { 
      return -1; 
     } 
     return WifiManager.calculateSignalLevel(mRssi, SIGNAL_LEVELS); 
    } 

    private void refresh() { 
     if (mSignal == null) { 
      return; 
     } 
     Context context = getContext(); 
     mSignal.setImageLevel(getLevel()); 
     String[] statusArray = context.getResources().getStringArray(R.array.wifi_p2p_status); 
     setSummary(statusArray[device.status]); 
    } 
} 
+0

Спасибо, Фабьен, это полезно. Могу ли я просмотреть этот файл в Интернете? Или мне нужно загрузить репо 4.0 для его просмотра? – unbekant

+0

Это должно помочь: [http://stackoverflow.com/questions/449763/where-can-i-browse-android-source-code-on-line](http://stackoverflow.com/questions/449763/where -может-я-просмотра-андроид-исходный код-он-лайн). Но я предпочитаю скачать его ... –

+0

Отлично, я загружу его из менеджера SDK и посмотрю. Очень полезное открытие Фабьен еще раз спасибо! – unbekant

Смежные вопросы