会飞的月饼 2017-11-17 01:32 采纳率: 0%
浏览 3108
已结题

LinkIT One使用paho mqtt连接服务器失败

背景描述:
使用LinkIT One基于paho的mqtt客户端,当代码执行到rc=client.connect(data);,超时然后返回rc=-1。
测试连接的服务端包括IBM Watson、中移OneNet还有自己搭建的mosquitto,都是一样的错误。查了一下paho的实现代码,把MQTTClient.h中的connect实现改了一下就connect成功了,但subscribe又超时并返回错误了(如下所示)。

在网上查到了和我类似的错误,貌似LinkIT One并不能使用paho的mqtt。但将mqtt客户端换成pubsub后却能够正常工作。
下面是我的测试代码(mqtt服务器是本地局域网的mosquitto)

 #include <LWiFi.h>
#include <LWiFiClient.h>
#include <IPStack.h>
#include <Countdown.h>
#include <MQTTClient.h>

#define WIFI_AP "SSID"
#define WIFI_PASSWORD "PASSWD"
#define WIFI_AUTH LWIFI_WPA

int port = 1883;
char servername[]="10.214.149.119";
char clientName[] = "myaccount";
char topicName[] = "@tp";
char userName[] = "myaccount";
char password[] = "12345";

LWiFiClient tcpClient;
IPStack ipstack(tcpClient);
MQTT::Client<IPStack, Countdown, 200> client = MQTT::Client<IPStack, Countdown, 200>(ipstack);

void messageArrived(MQTT::MessageData& md){
  MQTT::Message &message = md.message;
  char res[100];
  int len = message.payloadlen;
  strncpy(res, (char*)message.payload, len);
  res[len] = '\0';
  Serial.println(res);
}

void setup(){
  Serial.begin(9600);
  while(!Serial.available());
  InitWiFi();
  if (!client.isConnected())
    reconnect();
  int rc = client.subscribe(topicName, MQTT::QOS0, messageArrived);
  if (rc != 0)
    Serial.println(String("rc from MQTT subscribe is ")+rc);
  else
    Serial.println(String("rc from MQTT subscribe is ")+rc);
}

void loop(){
  Serial.println("loop");
  client.yield(100);
  delay(2000);
}

void InitWiFi(){
  LWiFi.begin();
  // Keep retrying until connected to AP
  Serial.println("Connecting to AP");
  while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
  {
    Serial.println("Retry connect AP ... ");
    delay(1000);
  }
  Serial.println("Connected to AP");
}

void reconnect() {
  // Loop until we're reconnected
  if(!client.isConnected()) {
    int rc = ipstack.connect(servername, port);
    if (rc == 1){
      Serial.println("IPStack Success");  
    }else{
      Serial.println("IPStack Failed");
    }
    Serial.print("Connecting to IOT platform ...");
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
    data.MQTTVersion = 4;
    data.clientID.cstring = clientName;
    data.username.cstring = userName;
    data.password.cstring = password;
    rc = client.connect(data);
    if (rc == 0) {
      Serial.println( "[DONE]" );
    } else {
      Serial.println( "[FAILED]");
      delay(5000);
    }
  }
}

我的问题是:
有没有大神使用LinkIT One基于paho的mqtt实现了客户端,可以正常pub/sub话题,测试的mqtt代理可以是mosquitto或IBM Watson或中移OneNet?允许修改paho或LWiFiClient的源码?(我只要基于paho的实现)

提示:
1.通过之前在Arduino UNO、BeagleBone Black、树莓派2的实验感觉各种mqtt的代理基本都一样的,能在mosquitto上测试通过的基本都能在IBM Watson或OneNet上测试通过;
2.LinkIt One用pubsub测试没有问题,这说明LWiFiClient很大概率是没问题的,估计要修改paho的实现代码

  • 写回答

1条回答

  • tsky9988 2018-08-09 16:10
    关注

    // 创建一个jsMQTT客户端实例,clientId是唯一标识符,地址和端口号为服务的地址和端口 client = new Paho.MQTT.Client(locatio

    评论

报告相同问题?

悬赏问题

  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误