更新:我正在尝试连接一个后端(亚马逊网络服务IoT核心),因为我正在使用一个运行busybox镜像的小型wp77。当使用8883端口时,连接超时,因此我已更改为端口443,并且我可以连接到后端,但是,套接字在三次尝试后关闭。这是我的应用程序中的日志读数:
Aug 14 03:29:13 fx30s user.info Legato: INFO | mqttMain2717 | DSC ...正在启动MQTT连接
Aug 14 03:29:13 fx30s user.info Legato:信息| mqttMain2717 |
Aug 14 03:29:13 fx30s user.info Legato:信息| mqttMain2717 |
Aug 14 03:29:13 fx30s user.info T=main : INFO | mqttMain2717/mqttCliSvrComponent | mqttCliSvr.c DcsStateHandler() 317 | rmnet_data0 connected!启动MQTT会话
Aug 14 03:29:13 fx30s user.info T=main : INFO | mqttClient1120/mqttClientApiComponent mqttClient_StartSession| mqttClientApi.c mqttClient_StartSession() 452 | StartSession已调用
Aug 14 03:29:13 fx30s user.info T=main : INFO | mqttClient1120/mqttClientApiComponent mqttClient_StartSession| mqttClientApi.c mqttClient_StartSession() 455 | mqttClientPts NOT NULL
Aug 14 03:29:13 fx30s user.info Legato: INFO | mqttClient1120 | mqtt_StartSession...正在连接...
Aug 14 03:29:13 fx30s user.info Legato: INFO | mqttClient1120 |。播种随机数生成器...好的
Aug 14 03:29:13 fx30s user.info Legato: INFO | mqttClient1120 |。正在加载CA根证书...从证书加载证书ok (跳过0)
Aug 14 03:29:13 fx30s user.info Legato: INFO | mqttClient1120 |。正在加载客户端证书.../home/root/aws-iot/xxxxxx-certificate.pem.crt ok
Aug 14 03:29:13 fx30s user.info Legato: INFO | mqttClient1120 |。正在加载客户端私钥.../home/root/aws-iot/xxxxxx-private.pem.key ok
Aug 14 03:29:13 fx30s user.info Legato: INFO | mqttClient1120 |。正在连接到tcp/xxxxxx-ats.iot.ap-southeast-1.amazonaws.com/443...
Aug 14 03:29:13 fx30s user.info Legato:信息| mqttClient1120 | ok
Aug 14 03:29:13 fx30s user.info Legato: INFO | mqttClient1120 |。正在设置TLS结构...好的
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 |。正在执行TLS握手...好的
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 |协议为TLSv1.2
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 |密码套件is TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 |。正在验证对等X.509证书...好的
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 | clientId : FX30S
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 | username:
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 |正在尝试(1/3)连接到tcp://xxxxxx-ats.iot.ap-southeast-1.amazonaws.com:443...
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 |检查连接选项。
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 | MQTT serialize connection。
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 | MQTT发送数据包。
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 |发送的字节数: 31
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 |发送的总字节数: 31,共31
Aug 14 03:29:15 fx30s user.info Legato: INFO | mqttClient1120 | MQTT等待CONNACK
Aug 14 03:29:20 fx30s user.info Legato: INFO | mqttClient1120 | MQTT现在正在退出,返回-1
Aug 14 03:29:20 fx30s user.info Legato:信息| mqttClient1120 |失败
Aug 14 03:29:20 fx30s user.info Legato: INFO | mqttClient1120 | tlsSocket_close 1
这是我从github拿来的代码,在我的设备上测试...
int MQTTConnect(Client* c, MQTTPacket_connectData* options)
{
Timer connect_timer;
int rc = FAILURE;
MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer;
int len = 0;
InitTimer(&connect_timer);
countdown_ms(&connect_timer, c->command_timeout_ms);
if (c->isconnected) // don't send connect packet again if we are already connected
goto exit;
fprintf(stdout, "Check connection options.");
fflush(stdout);
if (options == 0)
{
fprintf(stdout, "MQTTConnect Set default options...");
fflush(stdout);
options = &default_options; // set default options if none were supplied
}
c->keepAliveInterval = options->keepAliveInterval;
countdown(&c->ping_timer, c->keepAliveInterval);
fprintf(stdout, "MQTT serialize connection.");
fflush(stdout);
if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= )
goto exit;
#if 0
{
int i;
for (i=0; i<len; i++)
{
fprintf(stdout, "%.2x", c->buf[i]);
}
fprintf(stdout, "\n");
fflush(stdout);
fprintf(stdout, "\n%.*s\n", len, c->buf);
fflush(stdout);
}
#endif
fprintf(stdout, "MQTT send packet.");
fflush(stdout);
if ((rc = sendPacket(c, len, &connect_timer)) != SUCCESS) // send the connect packet
goto exit; // there was a problem
// this will be a blocking call, wait for the connack
fprintf(stdout, "MQTT waiting for CONNACK");
fflush(stdout);
if (waitfor(c, CONNACK, &connect_timer) == CONNACK)
{
unsigned char connack_rc = 255;
char sessionPresent = 0;
if (MQTTDeserialize_connack((unsigned char*)&sessionPresent, &connack_rc, c->readbuf, c->readbuf_size) == 1)
rc = connack_rc;
else
rc = FAILURE;
}
else
rc = FAILURE;
exit:
fprintf(stdout, "MQTT is now exiting with %d", rc );
fflush(stdout);
if (rc == SUCCESS)
//if (SUCCESS == SUCCESS)
c->isconnected = 1;
return rc;
//return SUCCESS;
}由于某些原因,后端无法使用CONNACK确认连接,这就是此操作失败的原因。AWS指定在通过端口443连接到后端时使用APLN,所以我想知道这是否是问题所在,以及如何在paho.mqtt.c上为tls指定此协议(我知道python有解决方案!!)。
谢谢你的帮助。
发布于 2020-08-19 13:00:22
发布于 2020-11-11 07:38:10
我没有发现或解决这个代码的问题,而是使用了AWS SDK for C,现在一切正常。
https://stackoverflow.com/questions/63369895
复制相似问题