【问题标题】:Publish onto Mosquitto broker running on laptop发布到在笔记本电脑上运行的 Mosquitto 代理
【发布时间】:2016-04-04 14:54:31
【问题描述】:

我已按照以下链接中列出的步骤在我的笔记本电脑上安装和运行 Mosquitto 代理。 https://sivatechworld.wordpress.com/2015/06/11/step-by-step-installing-and-configuring-mosquitto-with-windows-7/ 我已经使用命令行测试了发布和订阅事件,即 mosquitto_pub 和 mosquitto_sub 命令,它们运行良好!
我想使用正在使用“PubSubClient”库中的函数的 Arduino 发布到在我的笔记本电脑上运行的这个代理(监听端口 1883 - 使用 netstat-an 命令确认)。
对于 Arduino Publish 草图中的服务器 IP 地址,我给出了笔记本电脑本身的 IP 地址,它在连接到我的家庭网络时获得。以下是发布者代码:

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>


#define CLIENTID "Arsen"
const char topic[] = "tem";
#define POLLINTERVAL 120000

void callback(char* topic, byte* payload, unsigned int length){
//Do nothing as we are publishing ONLY.
}

byte mac [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED} ;
IPAddress server(192, 168, 0, 10);
EthernetClient ethClient;
PubSubClient arduinoClient(server,1883, callback, ethClient) ;
unsigned long boardTime = 0 ;
float sensedTemperature = 0;
char charTemp [6];
int connRC = 0;


void setup(void) {
Serial.begin(9600);
//Connect to the MQTT server - test.mosquitto.org
beginConnection() ;
}

//Initialise MQTT connection
void beginConnection() {
Serial.begin(9600);
Ethernet.begin(mac) ;   //using the address assigned through DHCP
do{ 
int connRC = arduinoClient.connect(CLIENTID);
}while(connRC==1);
Serial.println("We are connected finally");
delay(5000);
Serial.println(arduinoClient.state());
}



void loop(void) {
boardTime = millis();
if ((boardTime % POLLINTERVAL) == 0) {
  getTemp();
  dtostrf(sensedTemperature,5,2,charTemp);
  boolean rec = arduinoClient.publish(topic, charTemp);
  Serial.println(rec);
  Serial.println("Successfully published");
}
arduinoClient.loop();
}

void getTemp() {
// Send the command to get temperatures
delay(100);
sensedTemperature = analogRead(2);   //temperature sensor at analog pin 2 on Arduino.
Serial.println(sensedTemperature);
delay(150);
}

订阅者代码是:

    #include <Ethernet.h>
#include <EthernetUdp.h>
#include <EthernetServer.h>
#include <EthernetClient.h>
#include <Dns.h>
#include <Dhcp.h>
#include <SPI.h>
#include <PubSubClient.h>

#define PIN 13

//MQTT Definition

#define CLIENTID "Aract"
#define TOPICNAME "tem"
byte mac [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED} ;
IPAddress server(192,168,0,5);     // Mosquitto Server
int connRC = 0;

//Handle message from mosquitto and set LEDs
void callback(char* topic, byte* payload, unsigned int length) {
int i=0; char buffer [length];
for(i=0;i<length;i++) {
  buffer [i] = char((payload[i]));
}
String payLoadData = buffer;
Serial.println(payLoadData);
setled(payLoadData);
}

//Our MQTT client
EthernetClient ethclient;
PubSubClient arduinoClient(server, 1883, callback, ethclient) ;
void setup() {
//Connect to the MQTT server - test.mosquitto.org
beginConnection() ;
}

//Initialise MQTT connection
void beginConnection() {
Serial.begin(9600);
Ethernet.begin(mac) ;
do{
connRC = arduinoClient.connect(CLIENTID) ;
delay(2000);
}while(connRC==1);
delay(3000);
Serial.println(arduinoClient.state());
if (connRC==1) {
boolean rec = arduinoClient.subscribe(TOPICNAME) ;
Serial.println(rec);
Serial.println("Successfully Subscribed");
} else {
Serial.println("connRC") ;
}
}

void loop()
{
  arduinoClient.loop() ;

}

void setled(String s)
{
  int temperature;
  temperature = s.toInt();
  Serial.println(temperature);
  if (temperature >= 200){
    digitalWrite(PIN, HIGH);
  }
  else{
    digitalWrite(PIN, LOW);
  }
}

Ethernet shield 运行良好,因为它成功执行了示例程序。状态函数返回“零”,这意味着该板正在连接到网络。但是,发布命令返回一个布尔值“rec”,它是假的。我想知道为什么这个过程总是不成功?
命令行上的详细选项 (-v) 和 Mosquitto 会引发未知错误,而不是显示记录的详细信息。如何克服这个问题或我的技术到底出了什么问题?

【问题讨论】:

  • 将 mosquitto 控制台输出添加到问题中,以便我们可以准确地看到错误是什么,因为这可能会指出问题的原因
  • 正如所指出的,pub 和 sub 命令运行良好。然而,详细命令没有列出在后台运行的操作的 jist。另外,我认为它不能接受它通常应该接受的 IPv4 地址!
  • 这与Ardunio代码无关,只是mosquitto无法启动。你是如何安装它的,你是否安装了 readme-windows.txt 中提到的 pre-reqs?
  • @hardlib。蚊子无法启动?我已经按照这里提到的步骤安装了它:sivatechworld.wordpress.com/2015/06/11/…
  • @hardlib。如果无法启动,为什么 pub 和 sub 命令有效?此外,昨天晚上,我能够将数据发布到在我的笔记本电脑上运行的 mosquitto 代理上,并通过命令行 (mosquitto_sub) 订阅主题(arduino 正在发布的主题)。我能够成功接收数据!附件是屏幕截图(问题中的第二个)。目前的问题是在 arduino 上运行的订阅者无法从代理接收数据,尽管命令行订阅者能够。我也包含了订阅者代码。

标签: arduino publish-subscribe mqtt ethernet mosquitto


【解决方案1】:

我遇到了同样的问题,我得到了解决方案...... 只需转到您PC中运行的服务停止 mosquitto-broker,现在打开cmd并将目录更改为mosuitto所在的位置找到文件(在我的情况下是“cd C:\Program Files (x86)\mosquitto”),然后输入这个命令mosquitto -v,现在就离开了像那样的窗口(如果你关闭了它就不会工作)...... 它确实有效,它在之前的情况下不起作用的原因是,当我们启动 moquitto-broker 服务时,它没有为 IPv4 打开端口,这里是参考“Mosquitto Error

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多