我想通过wifi直接服务发现将一些信息传递给接收器。
我正在尝试将包含名称,年龄,性别信息的A,B,C变量发送给接收者,因此我创建了哈希图记录并插入了此信息以进行传输,但在接收端DnsSdTxtRecordListener没有被调用。
private void startRegistrationAndDiscovery() {
Map<String, String> record = new HashMap<String, String>();
record.put(TXTRECORD_PROP_AVAILABLE, "visible");
record.put("A","Jon");
record.put("B","33");
record.put("C","Male");
WifiP2pDnsSdServiceInfo service = WifiP2pDnsSdServiceInfo.newInstance(
SERVICE_INSTANCE, SERVICE_REG_TYPE, record);
manager.addLocalService(channel, service, new ActionListener() {
@Override
public void onSuccess() {
appendStatus("Added Local Service");
}
@Override
public void onFailure(int error) {
appendStatus("Failed to add a service");
}
});
discoverService();
}
public void discoverService() {
/*
* Register listeners for DNS-SD services. These are callbacks invoked
* by the system when a service is actually discovered.
*/
manager.setDnsSdResponseListeners(channel,
new DnsSdServiceResponseListener() {
@Override
public void onDnsSdServiceAvailable(String instanceName,
String registrationType, WifiP2pDevice srcDevice) {
// A service has been discovered. Is this our app?
if (instanceName.equalsIgnoreCase(SERVICE_INSTANCE)) {
// update the UI and add the item the discovered
// device.
WiFiDirectServicesList fragment = (WiFiDirectServicesList) getFragmentManager()
.findFragmentByTag("services");
if (fragment != null) {
WiFiDevicesAdapter adapter = ((WiFiDevicesAdapter) fragment
.getListAdapter());
WiFiP2pService service = new WiFiP2pService();
service.device = srcDevice;
service.instanceName = instanceName;
service.serviceRegistrationType = registrationType;
adapter.add(service);
adapter.notifyDataSetChanged();
Log.d(TAG, "onBonjourServiceAvailable "
+ instanceName);
}
}
}
}, new DnsSdTxtRecordListener() {
/**
* A new TXT record is available. Pick up the advertised
* buddy name.
*/
@Override
public void onDnsSdTxtRecordAvailable(
String fullDomainName, Map<String, String> record,
WifiP2pDevice device) {
Log.d(TAG,
device.deviceName + " is "
+ record.get(TXTRECORD_PROP_AVAILABLE));
Log.d(TAG, "A"+ " is " + record.get("A"));
Log.d(TAG, "B"+ " is " + record.get("B"));
Log.d(TAG, "C"+ " is " + record.get("C"));
}
});
// After attaching listeners, create a service request and initiate
// discovery.
serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();
manager.addServiceRequest(channel, serviceRequest,
new ActionListener() {
@Override
public void onSuccess() {
appendStatus("Added service discovery request");
}
@Override
public void onFailure(int arg0) {
appendStatus("Failed adding service discovery request");
}
});
manager.discoverServices(channel, new ActionListener() {
@Override
public void onSuccess() {
appendStatus("Service discovery initiated");
}
@Override
public void onFailure(int arg0) {
appendStatus("Service discovery failed");
}
});
}
我想传输在接收设备上接收到的字符串A,B,C,但未触发DnsSdTxtRecordListener。
简短回答-DNS SD TXT记录限制为255个字节*。
长答案和*-当我想到阅读WifiP2pDnsSdServiceInfo.newInstance
方法的javadoc时,我陷入了同一问题。引用-
[
@param txtMap TXT record with key/value pair in a map confirming to format defined at *
http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt
在上述文档的“ 6.1 DNS TXT记录的通用格式规则”部分中,它说-
DNS TXT记录中每个组成字符串的格式为单个长度的字节,后跟0-255字节的文本数据。
现在这并不一定意味着它只有255个字节的数据,但是我试图减少它的工作量。因此,请尝试一下。