【发布时间】: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