首页 > 解决方案 > AWS IoT ) OpenSSL 网络失败

问题描述

我成功完成了一个使用 AWS IoT Embedded C SDK 将 CAN 数据发送到服务器的项目。

这次,在写入电池组的RS232数据后,将接收到的数据发送到服务器的测试过程中出现如下错误。

[INFO] [DEMO] [mqtt_demo_mutual_auth.c:989] 订阅 MQTT 主题 PESS/IoT/Battery。[错误] [Transport_OpenSSL_Sockets] [openssl_posix.c:814] 无法通过网络发送数据:OpenSSL 的 SSL_write 失败:ErrorStatus=(null)。[错误] [MQTT] [core_mqtt.c:605] 传输发送失败。错误代码=-1。[错误] [Transport_OpenSSL_Sockets] [openssl_posix.c:761] 无法通过网络接收数据:SSL_read 失败:ErrorStatus=(null)。[错误] [MQTT] [core_mqtt_serializer.c:2396] 未从传输中读取单个字节:transportStatus=-1。[错误] [MQTT] [core_mqtt.c:1300] 接收传入数据包长度失败。Status=MQTTRecvFailed [ERROR] [MQTT] [core_mqtt.c:2172] 由于失败而退出进程循环:ErrorStatus=MQTTRecvFailed [ERROR] [DEMO] [mqtt_demo_mutual_auth.c:1032] MQTT_ProcessLoop 返回状态 = MQTTRecvFailed。

由于之前的CAN数据传输是成功的,所以在更改宣传RS232数据的部分时似乎出现了异常,但不知道是什么问题。(除了公共部分没有修改。)

以下是我修改的公共代码。

    static int publishToTopic( MQTTContext_t * pMqttContext )
{
    int returnStatus = EXIT_SUCCESS;
    MQTTStatus_t mqttStatus = MQTTSuccess;
    uint8_t publishIndex = MAX_OUTGOING_PUBLISHES;
    uint32_t publishCount = 0;
    const uint32_t maxPublishCount = MQTT_PUBLISH_COUNT_PER_LOOP;   
    int fd;
    fd=open("/dev/ttyHSL6", O_RDWR|O_NOCTTY );
    struct termios SerialPortSettings;

    unsigned char buffer[50]={0,};
    int bytes_read=0;
    char data[200];
    char *data3;
    char *data4;
    int i,j;
    char *canData;

    if (fd == -1)
    {
        printf("Error! in opening port");
        exit(-100);
    }

    memset(&SerialPortSettings, 0, sizeof(struct termios));
        tcgetattr(fd,&SerialPortSettings);

    cfsetispeed(&SerialPortSettings,B9600);
        cfsetospeed(&SerialPortSettings,B9600);

     SerialPortSettings.c_cflag &= ~PARENB;
    SerialPortSettings.c_cflag &= ~CSTOPB;
    SerialPortSettings.c_cflag &= ~CSIZE;
    SerialPortSettings.c_cflag |= CS8;
    SerialPortSettings.c_cflag &= ~CRTSCTS;
    SerialPortSettings.c_cflag |= CREAD|CLOCAL;
    SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY);
    SerialPortSettings.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    SerialPortSettings.c_oflag &= ~OPOST;

     SerialPortSettings.c_cc[VMIN]=1;
    SerialPortSettings.c_cc[VTIME]=0;
    tcflush(fd, TCIFLUSH);

    
    
        data3=malloc(sizeof(char)*200);
        data4=malloc(sizeof(char)*200);
        canData=malloc(sizeof(char)*500);
        memset(buffer, 0, sizeof(buffer));
            
        read(fd, buffer, sizeof(buffer));

            
            sprintf(data,"%02x",buffer[0]);
            strcpy(data3,data);

            for ( j=1; j<15; j++)        
            {
                sprintf(data,"%02x",buffer[j]);
                strcat(data3," ");
                strcat(data3,data);
            }

            //strcpy(data4,data3);

            

    
    sprintf(canData,"{\"can_data\":\"%s\"}",data3);

    if( returnStatus == EXIT_FAILURE )
    {
        LogError( ( "Unable to find a free spot for outgoing PUBLISH message.\n\n" ) );
    }
    else
    {
        
        outgoingPublishPackets[ publishIndex ].pubInfo.qos = MQTTQoS1;
        outgoingPublishPackets[ publishIndex ].pubInfo.pTopicName = MQTT_EXAMPLE_TOPIC;
        outgoingPublishPackets[ publishIndex ].pubInfo.topicNameLength = MQTT_EXAMPLE_TOPIC_LENGTH;
        outgoingPublishPackets[ publishIndex ].pubInfo.pPayload = canData;
        outgoingPublishPackets[ publishIndex ].pubInfo.payloadLength =strlen(canData);
        outgoingPublishPackets[ publishIndex ].packetId = MQTT_GetPacketId( pMqttContext );

        mqttStatus = MQTT_Publish( pMqttContext,
                &outgoingPublishPackets[ publishIndex ].pubInfo,
                outgoingPublishPackets[ publishIndex ].packetId );
    

        if( mqttStatus != MQTTSuccess )
        {
            LogError( ( "Failed to send PUBLISH packet to broker with error = %s.",
                        MQTT_Status_strerror( mqttStatus ) ) );
            cleanupOutgoingPublishAt( publishIndex );
            returnStatus = EXIT_FAILURE;
        }
        else
        {
            
        }


    }

    // ( void ) shutdown( s, SHUT_RDWR );
     close( fd );
    return returnStatus;
}

在将其发送到服务器之前,我使用了一个简单的 printf 来确认数据已被读取,然后在 Public 函数中应用代码。

我能知道问题是什么吗?在我看来,接收CAN数据没有问题,但我认为是码字的问题,因为我只看到RS232数据有问题,但是除了那个代码之外的版本有问题吗?请帮我。

标签: aws-iot

解决方案


推荐阅读