저는 Android 프로그래밍에있어서 매우 새로운 기술입니다. 하지만 저는 일주일 넘게이 작업을 해왔습니다.Wifi Direct로 특정 서비스를 시작하고 검색 할 수 없습니다.
제 생각에는 Wifi Direct를 사용하여 두 대의 장치를 연결하고 싶습니다. 하지만 난 단지 내 응용 프로그램을 실행하는 사람들에게 연결하고 싶습니다. 게다가 사용자가 WifiP2pDevice에 포함 된 MAC 또는 Android_XXXX 이름뿐 아니라 다른 장치 (예 : 사용자 이름)의 일부 정보를 볼 수있게하려고합니다. 그래서 다른 기기를 찾는 기기가 애플리케이션 서비스를 시작하고이 서비스를 브로드 캐스팅하고있는 동료를 검색해야한다고 결정한 이유입니다.
두 개의 실제 장치로 테스트하는 데 문제가 있습니다. 정확히 동일한 코드를 실행 중이지만 그 중 하나만 서비스 검색 콜백 (아래 onDnsSd ... 수신기)을 얻는 것입니다. 그래서, 한쪽은 적절한 방식으로 행동하지만 다른 한쪽은 행동하지 않습니다. 더욱이 나는 서비스가 시작될 때마다 (심지어 이전에 시작된 서비스를 취소한다고해도) 분명히 의미하는 "오래된"서비스를 얻고 있습니다.이 서비스는 적어도 몇 분 동안 계속 방송됩니다.
나는 내 코드의 단축 버전을 포함한다 :
public class MoveFlufietsDialogFragment extends DialogFragment implements ChannelListener, DeviceActionListener {
public final HashMap<String, FlufietsPeer> mBuddies = new HashMap<String, FlufietsPeer>();
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
...
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
mManager = (WifiP2pManager) getActivity().getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(getActivity(), getActivity().getMainLooper(), null);
...
startRegistration();
discoverFlufietsService();
...
}
public void discoverFlufietsService() {
DnsSdTxtRecordListener txtListener = new DnsSdTxtRecordListener() {
@Override
public void onDnsSdTxtRecordAvailable(String fullDomain, Map record, WifiP2pDevice device) {
// This and the next listener are only called in one of the devices.
String serviceName = (String) record.get("serviceName");
if ((serviceName != null) && (serviceName.equals("flufiets")) {
// I put the record data in the mBuddies HashMap.
...
mBuddies.put(device.deviceAddress, myPeerDataStructure);
}
}
};
DnsSdServiceResponseListener servListener = new DnsSdServiceResponseListener() {
@Override
public void onDnsSdServiceAvailable(String instanceName, String registrationType, WifiP2pDevice resourceType) {
if (mBuddies.containsKey(resourceType.deviceAddress)) {
FlufietsPeer flufietsPeer = mBuddies.get(resourceType.deviceAddress);
WiFiPeerListAdapter adapter = ((WiFiPeerListAdapter) mFragmentList.getListAdapter());
adapter.add(flufietsPeer);
adapter.notifyDataSetChanged();
}
}
};
mManager.setDnsSdResponseListeners(mChannel, servListener, txtListener);
WifiP2pDnsSdServiceRequest serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();
mManager.addServiceRequest(mChannel, serviceRequest, new ActionListener() {
// onSuccess/onFailure toasts.
});
mManager.discoverServices(mChannel, new WifiP2pManager.ActionListener() {
// onSuccess/onFailure toasts.
});
}
public void startRegistration() {
mManager.clearLocalServices(mChannel, new ActionListener() {
// onSuccess/onFailure toasts.
});
Map record = new HashMap();
record.put("serviceName", "flufiets");
...
WifiP2pDnsSdServiceInfo serviceInfo = WifiP2pDnsSdServiceInfo.newInstance(flufietsService, "_tcp", record);
mManager.addLocalService(mChannel, serviceInfo, new ActionListener() {
// onSuccess/onFailure toasts.
});
}
@Override
public void onResume() {
super.onResume();
mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);
getActivity().registerReceiver(mReceiver, mIntentFilter);
}
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(mReceiver);
}
@Override
public void onStop() {
super.onStop();
mManager.clearLocalServices(mChannel, new ActionListener() {
// onSuccess/onFailure toasts.
});
}
...
}
이 문제는 장치 자체 (관련하지 않는 것 때로는 작동, 가끔은하지 않습니다,하지만 항상 단 하나의 그들). 나는 우리가 방송하고있는 서비스를 발견하려고하거나 두 대의 장치가 제공하는 동일한 서비스를 사용하는 것과 관련이 있다고 생각합니다. 서비스의 이름을 변경하려고 시도했기 때문에 각 장치가 "보내기"또는 "받기"서비스를 제공하지만 작동하지 않습니다. 나는 (onDnsSd ...) 콜백을 장치 중 하나에서만 얻는다.
오래된 서비스를 얻는 것에 관한 것, 나는 항상 그 서비스를 정리할 때 이상합니다. (서비스 기록 데이터에 타임 스탬프가 포함되어 있습니다. 마지막으로 제외한 모든 서비스는 항상 버릴 수 있지만 논리적이지는 않습니다.).
아이디어가 있으십니까? 응용 프로그램 작성이 더 이상 재미 없어서 (: -) =
감사합니다. 많은 도움을 주셔서 감사합니다.
아무도 여기에서 전에 이것을 시도한 적이 있습니까? 제발요, 내가 아직도 잘못하고 있을지도 모른다고 궁금해합니다. – ivansiiito
안녕하세요, 나는 WiFi Direct의 안드로이드 구현이 때때로 불일치하게 동작한다는 것을 확인할 수 있습니다. 나는 또한 "자체"에 연결하는 응용 프로그램을 가지고 있으며, 하나 또는 두 개의 인스턴스가 각각의 존재를 감지하는 것을 멈출 수 있음을 알 수 있습니다. 나는 이것이 코어 내부의 너무 복잡한 의사 최적화 (산발적으로 방해받는 것처럼 보이는 '기억 된 그룹'의 캐시 포함) 때문이라고 생각합니다. 도움이되는 것 : WiFi 설정에서 'WiFi 최적화'체크 박스를 끄고'discoverPeers' /'stopPeerDiscovery'를 엄청나게 호출하십시오. 더 나은 사용자 경험 (~ 5 초)에 적합한 시간 초과로. – Stan
작업 한 적이 있습니까? 나는 동일한 시나리오, 매우 임의의 결과를 경험하고 있으며 단지 한 부분 만 콜백을 얻는다. – user331244