React native mqtt - 按下按钮时发布

Posted

技术标签:

【中文标题】React native mqtt - 按下按钮时发布【英文标题】:React native mqtt - publish when button is pressed 【发布时间】:2021-12-23 11:02:42 【问题描述】:

我的项目使用sp-react-native-mqtt,我想在按下按钮时向 mqtt 主题发布消息。

Mqtt 连接代码,返回一个promise:

    MQTT.createClient(
  uri: 'mqtt://test.mosquitto.org:1883',
  clientId: 'your_client_id'
).then(function(client) 

  client.on('closed', function() 
    console.log('mqtt.event.closed');
  );

  client.on('error', function(msg) 
    console.log('mqtt.event.error', msg);
  );

  client.on('message', function(msg) 
    console.log('mqtt.event.message', msg);
  );

  client.on('connect', function() 
    console.log('connected');
    client.subscribe('/data', 0);
    client.publish('/data', "test", 0, false);
  );

  client.connect();
).catch(function(err)
  console.log(err);
);

编辑:

如果我将客户端保存在一个变量中,并且我使用该变量发布我收到此错误:

  let mqttClient = null;

MQTT.createClient(
        uri: 'mqtt://test.mosquitto.org:1883',
        clientId: 'your_client_id',
      )
        .then(function (client) 
          mqttClient = client;
    .... 

       <Button
              title="test"
              onPress=() => 
                mqttClient.publish('/data', 'message');
              
            />

我应该如何处理? 或者如果您对如何在 react native 中使用 mqtt 或 mqtt 的其他包有任何其他建议。

谢谢!

【问题讨论】:

作为一项规则,主题真的不应该以 / 开头(虽然在规范中允许,但它会破坏共享订阅等内容,并且它会在所有主题的开头添加一个额外的 null树)。至于您尝试过什么问题(例如,将client 保存到您可以从按钮处理程序访问的变量中)? 感谢您的回复。我试过了,但我得到了一个错误。我编辑了我的问题以将错误的图像放在那里。 错误非常不太可能与发布 MQTT 消息有关。它试图将 Double 对象转换为本机 double,而不是发布通常需要的东西。 有趣的是,如果我添加 QoS 和保留参数,我不会收到该错误,但它也不会发送消息。 mqttClient.publish('/data', 'dsdsadasdsadas', 0, true); 【参考方案1】:

毕竟,@hardillb 的回答帮助了我。

起初,即使我将 client 保存在变量中,它也没有发送消息,因为我在连接客户端之前保存了它。

工作代码:

  let mqttClient = null;

  MQTT.createClient(
    uri: 'mqtt://test.mosquitto.org:1883',
    clientId: 'your_client_id',
  )
    .then(function (client) 
      client.on('closed', function () 
        console.log('mqtt.event.closed');
      );

      client.on('error', function (msg) 
        console.log('mqtt.event.error', msg);
      );

      client.on('message', function (msg) 
        console.log('mqtt.event.message', msg);
      );

      client.on('connect', function () 
        console.log('connected');
        client.subscribe('data', 0);
        mqttClient = client;
      );

      client.connect();
    )
    .catch(function (err) 
      console.log(err);
    );

       <Button
          title="test"
          onPress=() => 
            //   console.log(mqttClient);
            mqttClient.publish('data', 'This is the answer', 0, true);
          
        />

谢谢@hardillb!

【讨论】:

以上是关于React native mqtt - 按下按钮时发布的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中按下按钮时更改文本值?

使用 TouchableHighlight 在 React Native 中按下时如何更改按钮颜色?

React - Native ' Redux 未捕获错误:操作必须是普通对象。按下按钮时使用自定义中间件进行异步操作

React-Native:按下 android 硬件后退按钮返回

(React Native)按下按钮时在JSON文件中检索下一个值

在 React-native 中按下按钮后双触发