aws-iot - 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数据有问题,但是除了那个代码之外的版本有问题吗?请帮我。
解决方案
推荐阅读
- sql - SQL 分割一个字段 If
- mysql - 如何在连接中获取对象?
- bash - 如何将 dbaccess 计数输出到 unix 变量中?
- php - 在前缀根路径中找不到路由
- kotlin - 在 Kotlin 中覆盖 Java final 函数的 Kotlin 编译器问题
- python - 从包含数组的不同列之间的匹配元素创建一个新列
- pyspark - 如何在 `groupBy()` 之后选择 DataFrame 的特定行?
- python - 注释不存在的 dict 字段不应该产生错误吗?
- c# - 在 WPF 应用程序中包含字体
- ios - UINavigationBar(嵌入在 UIImagePickerController 中)背景颜色未更新仅在 iOS13 中发生的此问题