DnsSdTxtRecordListener没有被调用!!是否可以通过Wifi直接服务发现来传输txt记录?

问题描述 投票:1回答:1

我想通过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。

android android-wifi wifi-direct wifimanager wifip2p
1个回答
0
投票

简短回答-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个字节的数据,但是我试图减少它的工作量。因此,请尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.