1

I'm currently trying to have my device (program) show up as a mock chromecast on the network. The application itself can see the Mock-Caster as a chromecast but if i try searching for it using Youtube or any other sender app, the "Mock-Caster" does not appear in the list.

I registered a service on jmDNS with all the criteria that would be available on an actual chromecast as well.

Is there something that I am missing or getting wrong?

Here's what I have so far.

    public void postConstruct() throws Exception {

        InetAddress discoveryInterface = InetAddress.getByName("192.168.1.1");

        CAST_DEVICE_MONITOR.startDiscovery(discoveryInterface, "Mock-Server");
        CAST_DEVICE_MONITOR.registerListener(new DeviceDiscoveryListener() {
            @Override
            public void deviceDiscovered(CastDevice castDevice) {
                System.out.println("New chrome cast detected: " + castDevice);
            }

            @Override
            public void deviceRemoved(CastDevice castDevice) {
                System.out.println("New chrome cast detected: " + castDevice);
            }
        });

        JmDNS jmdns = JmDNS.create(discoveryInterface, "Mock-Server");

        final String name = "Mock-Caster";
        final String id = UUID.randomUUID().toString();

        // Register a service
        HashMap<String, String> properties = new HashMap<>();

        //values scraped from chromecast or another java project
        properties.put("sf", "1");
        properties.put("id", id);
        properties.put("md", name);
        properties.put("fd", name);
        properties.put("s#", "1");
        properties.put("ff", "0");
        properties.put("ci", "1");
        properties.put("c#", Integer.toString(1));
        properties.put("pv", "1.1");
        properties.put("cd", "E465315D08CFDEF2742E1264D78F6035");
        properties.put("rm", "ED724E435DA8115C");
        properties.put("ve", "05");
        properties.put("ic", "/setup/icon.png");
        properties.put("ca", "201221");
        properties.put("st", "0");
        properties.put("bs", "FA8FCA771881");
        properties.put("nf", "1");
        properties.put("rs", "");


        ServiceInfo serviceInfo = ServiceInfo.create("_googlecast._tcp.local.", name, 8009, 1, 1, properties);
        jmdns.registerService(serviceInfo);

    }

//This is where i know that the mock-caster is registered and available
    @Bean
    public IntegrationFlow tcpServer() throws Exception {
        TcpNioServerConnectionFactory factory = new TcpNioServerConnectionFactory(8009);

        DefaultTcpSSLContextSupport defaultTcpSSLContextSupport = new DefaultTcpSSLContextSupport(keystore, keystore, password, password);
        defaultTcpSSLContextSupport.setProtocol("TLS");

        factory.setTcpNioConnectionSupport(new DefaultTcpNioSSLConnectionSupport(defaultTcpSSLContextSupport));
        factory.setTcpSocketSupport(new DefaultTcpSocketSupport(false));
        factory.setDeserializer(TcpCodecs.lengthHeader4());
        factory.setSerializer(TcpCodecs.lengthHeader4());

        TcpInboundGatewaySpec inboundGateway = Tcp.inboundGateway(factory);

        return IntegrationFlows
                .from(inboundGateway)
                .handle(message -> {
                    String ip_address = message.getHeaders().get("ip_address").toString();
                    if(ip_address.equalsIgnoreCase("192.168.1.1")) {
                        System.out.println("Self IP Address received");
                        System.out.println("Payload: " + message.getPayload());
                        System.out.println("MessageHeaders: " + message.getHeaders());
                    }else{
                        System.out.println("Other IP address received: " + ip_address);
                    }
                })
                .get();
    }

//Mock-Caster detected here
 @Scheduled(fixedRate = 15000)
    public void checkCasters() throws Exception {

        Set<CastDevice> casters = CAST_DEVICE_MONITOR.getCastDevices();
        System.out.println("Current CCs: " + casters.size());

        for (CastDevice device : casters) {

            System.out.println("CC (" + device.getDisplayName() + ")");
            
            var receiver = new CastEvent.CastEventListener() {
                @Override
                public void onEvent(@Nonnull CastEvent<?> castEvent) {
                    System.out.println("Event: " + castEvent);
                }
            };


            var appId = DEFAULT_MEDIA_RECEIVER_APP;
            try {
                if (!device.isConnected()) {
                    device.connect();
                }

                device.addEventListener(receiver);
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                device.removeEventListener(receiver);
                device.disconnect();
            }
        }

0

Browse other questions tagged or ask your own question.