react-native-zeroconf - Android 模拟器中的 mdns 发现

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

我是 React-Native 和移动开发的新手。我正在尝试编写 MQTT 客户端应用程序。

该应用程序在 Android 模拟器上运行,它应该找到在我的本地网络中的 ESP8266 D1 mini 上运行的 MQTT 代理。问题是模拟器无法直接访问我的本地网络。

我设置了一个从我的主机以太网适配器到模拟器的虚拟以太网适配器的网桥,并给了他一个静态IP。在模拟器中,我可以访问互联网,但无法连接到我的路由器 Web 界面或本地网络中的其他设备。

如何配置模拟器,以便我在其上运行的应用程序可以发现本地网络上的 mDNS 服务?

我对模拟器和移动开发缺乏经验,但我认为使用端口转发在这里没有帮助,因为我想测试 mDNS 发现。难道我错了?

MQTT 代理正在运行,我可以从本地主机通过 MQTT Explorer 进行连接。

这是我的 React-Native 代码:

import React, {useState, useEffect} from 'react';
import {View, StyleSheet, Text} from 'react-native';
import init from 'react_native_mqtt';
import Zeroconf from 'react-native-zeroconf';
import AsyncStorage from '@react-native-async-storage/async-storage';

import Flame from '../components/Flame';

init({
  size: 10000,
  storageBackend: AsyncStorage,
  defaultExpires: 1000 * 3600 * 24,
  enableCache: true,
  reconnect: true, // Enable reconnection
  sync: {},
});

function HomeScreen() {
  // State for temperature and alert
  const [temperature, setTemperature] = useState(0);
  const [alert, setAlert] = useState('');
  const zeroconf = new Zeroconf();

  zeroconf.on('error', error => {
    // log the error
    console.log('Zeroconf Error:', error);
  });

  zeroconf.on('found', service => {
    // log the service
    console.log('Zeroconf scan successful:', service);

    const {addresses, port} = service;

    // Use the discovered MQTT broker address
    const options = {
      host: addresses[0], // Use the discovered MQTT broker address
      port: port,
      clientId: 'id_' + parseInt(Math.random() * 100000),
    };

    const client = new Paho.Client(
      options.host,
      options.port,
      options.clientId,
    );

    function onConnect() {
      console.log('Connected to MQTT broker');
      client.subscribe('temperature', {qos: 0});
      client.subscribe('alert', {qos: 0});
    }

    function onConnectionLost(responseObject) {
      if (responseObject.errorCode !== 0) {
        console.log('onConnectionLost: ' + responseObject.errorMessage);
      }
    }

    function onMessageArrived(message) {
      console.log('onMessageArrived: ' + message.payloadString);

      if (message.destinationName === 'temperature') {
        setTemperature(parseFloat(message.payloadString));
      } else if (message.destinationName === 'alert') {
        setAlert(message.payloadString);
      }
    }

    useEffect(() => {
      client.onConnectionLost = onConnectionLost;
      client.onMessageArrived = onMessageArrived;
      client.connect({onSuccess: onConnect, useSSL: false, timeout: 3});

      // Clean up and disconnect from MQTT when the component unmounts
      return () => {
        if (client.isConnected()) {
          client.disconnect();
        }
      };
    }, []);
  });
  // Discover the MQTT broker using Zeroconf
  zeroconf.scan('mqttbroker._tcp', 'local.');

  return (
    <View style={styles.container}>
      <Flame />
      <Text style={styles.text}>{temperature}°C</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#000',
  },
  text: {
    color: '#fff',
    fontSize: 25,
    position: 'absolute',
    transform: [{translateY: 100}],
  },
});

export default HomeScreen;

运行应用程序时,会记录以下错误:

 LOG  Zeroconf Error: [Error: Starting service discovery failed with code: 0]

编辑:

在我的本地主机上,我检查了 mdns 的入站和出站防火墙规则,两者都是允许的!

我还添加了规则

端口 1883 上的 MQTT - tcp 和 udp、入站和出站(仅限私有网络)

端口 5353 上的 mDNS - udp、入站和出站(仅限私有网络)

windows react-native android-studio android-emulator mdns
1个回答
0
投票

你必须让它发挥作用吗? 可以分享一下你的源代码吗

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