微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 Azure IoT sdk-c 移植到 yocto 系统

如何解决将 Azure IoT sdk-c 移植到 yocto 系统

我们正在考虑将 Azure Hub 的 sdk-c 移植到运行 yocto 的设备上,我们已经使用目标端工具链对其进行了编译,现在我们正在测试目标端的结果。 目的是通过 mbedtls 将它与 MQTT 一起使用,目前我们收到了 socketio (socketio_berkley.c) 和 tlsio_mbedtls.c 的错误

azure-c-shared-utility/adapters/socketio_berkeley.c Func:initiate_socket_connection Line:353 打开到端点的连接失败 azure-c-shared-utility/adapters/socketio_berkeley.c Func:socketio_open Line:829 lookup_address_and_connect_socket 失败 azure-umqtt-c/src/mqtt_client.c Func:onopenComplete Line:454 错误:打开端点连接失败

设备客户端已断开连接^M

azure-c-shared-utility/adapters/tlsio_mbedtls.c Func:tlsio_mbedtls_open Line:649 底层 IO 打开失败 azure-umqtt-c/src/mqtt_client.c Func:mqtt_client_connect Line:1093 错误:io_open 失败^M azure-iot-sdk-c/iothub_client/src/iothubtransport_mqtt_common.c Func:SendMqttConnectMsg Line:2530 无法连接到地址 MYHUBNAME.azure-devices.net

This is the code I am using:
/* legato Framework */
#include "legato.h"
#include "interfaces.h"
#include "le_basics.h"
#include "json.h"


// copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

// CAVEAT: This sample is to demonstrate azure IoT client concepts only and is not a guide design principles or style
// Checking of return codes and error values shall be omitted for brevity.  Please practice sound engineering practices
// when writing production code.

#include <stdio.h>
#include <stdlib.h>

#include "iothub.h"
#include "iothub_device_client_ll.h"
#include "iothub_client_options.h"
#include "iothub_message.h"
#include "azure_c_shared_utility/threadapi.h" //need to find this
#include "azure_c_shared_utility/crt_abstractions.h"  //need to find this
#include "azure_c_shared_utility/shared_util_options.h"  //need to find this
#include "internal/iothub_internal_consts.h"

#ifdef SET_TRUSTED_CERT_IN_SAMPLES
#include "certs.h"
#endif // SET_TRUSTED_CERT_IN_SAMPLES

/* This sample uses the _LL APIs of iothub_client for example purposes.
Simply changing the using the convenience layer (functions not having _LL)
and removing calls to _DoWork will yield the same results. */

// The protocol you wish to use should be uncommented
//
#define SAMPLE_MQTT
//#define SAMPLE_MQTT_OVER_WEBSOCKETS
//#define SAMPLE_AMQP
//#define SAMPLE_AMQP_OVER_WEBSOCKETS
//#define SAMPLE_HTTP

#define USE_MbedTLS

#ifdef SAMPLE_MQTT
    #include "iothubtransportmqtt.h"
#endif // SAMPLE_MQTT
/*
#ifdef SAMPLE_MQTT_OVER_WEBSOCKETS
    #include "iothubtransportmqtt_websockets.h"
#endif // SAMPLE_MQTT_OVER_WEBSOCKETS
#ifdef SAMPLE_AMQP
    #include "iothubtransportamqp.h"
#endif // SAMPLE_AMQP
#ifdef SAMPLE_AMQP_OVER_WEBSOCKETS
    #include "iothubtransportamqp_websockets.h"
#endif // SAMPLE_AMQP_OVER_WEBSOCKETS
#ifdef SAMPLE_HTTP
    #include "iothubtransporthttp.h"
#endif // SAMPLE_HTTP
*/

/* Paste in the your iothub connection string  */
static const char* connectionString = "****MY-CONNECTION-STRING****";
#define MESSAGE_COUNT        5
static bool g_continueRunning = true;
static size_t g_message_count_send_confirmations = 0;

static void send_confirm_callback(IOTHUB_CLIENT_CONFIRMATION_RESULT result,void* userContextCallback)
{
    (void)userContextCallback;
    // When a message is sent this callback will get envoked
    g_message_count_send_confirmations++;
    (void)printf("Confirmation callback received for message %lu with result %s\r\n",(unsigned long)g_message_count_send_confirmations,MU_ENUM_TO_STRING(IOTHUB_CLIENT_CONFIRMATION_RESULT,result));
}

static void connection_status_callback(IOTHUB_CLIENT_CONNECTION_STATUS result,IOTHUB_CLIENT_CONNECTION_STATUS_REASON reason,void* user_context)
{
    (void)reason;
    (void)user_context;
    // This sample DOES NOT take into consideration network outages.
    if (result == IOTHUB_CLIENT_CONNECTION_AUTHENTICATED)
    {
        (void)printf("The device client is connected to iothub\r\n");
    }
    else
    {
        (void)printf("The device client has been disconnected\r\n");
    }
}


main
{
    IOTHUB_CLIENT_TRANSPORT_PROVIDER protocol = MQTT_Protocol;
    IOTHUB_MESSAGE_HANDLE message_handle;
    size_t messages_sent = 0;
    const char* telemetry_msg = "test_message";

    // Used to initialize IoTHub SDK subsystem
    (void)IoTHub_Init();

    IOTHUB_DEVICE_CLIENT_LL_HANDLE device_ll_handle;

    (void)printf("Creating IoTHub Device handle\r\n");
    // Create the iothub handle here
    device_ll_handle = IoTHubDeviceClient_LL_CreateFromConnectionString(connectionString,protocol);
    if (device_ll_handle == NULL)
    {
        (void)printf("Failure creating IotHub device. Hint: Check your connection string.\r\n");
    }
    else
    {
        // Set any option that are neccessary.
        // For available options please see the iothub_sdk_options.md documentation
    /*
    #ifndef SAMPLE_HTTP
            // Can not set this options in HTTP
            bool traceOn = true;
            IoTHubDeviceClient_LL_Setoption(device_ll_handle,OPTION_LOG_TRACE,&traceOn);
    #endif

    #ifdef SET_TRUSTED_CERT_IN_SAMPLES
            // Setting the Trusted Certificate. This is only necessary on systems without
            // built in certificate stores.
                IoTHubDeviceClient_LL_Setoption(device_ll_handle,OPTION_TRUSTED_CERT,certificates);
    #endif // SET_TRUSTED_CERT_IN_SAMPLES
    */

    #if defined SAMPLE_MQTT || defined SAMPLE_MQTT_OVER_WEBSOCKETS
            //Setting the auto URL Encoder (recommended for MQTT). Please use this option unless
            //you are URL Encoding inputs yourself.
            //ONLY valid for use with MQTT
            bool urlEncodeOn = true;
            (void)IoTHubDeviceClient_LL_Setoption(device_ll_handle,OPTION_AUTO_URL_ENCODE_DECODE,&urlEncodeOn);
    #endif
    
        // Setting connection status callback to get indication of connection to iothub
        (void)IoTHubDeviceClient_LL_SetConnectionStatusCallback(device_ll_handle,connection_status_callback,NULL);

        do
        {
            if (messages_sent < MESSAGE_COUNT)
            {
                // Construct the iothub message from a string or a byte array
                message_handle = IoTHubMessage_CreateFromString(telemetry_msg);
                //message_handle = IoTHubMessage_CreateFromByteArray((const unsigned char*)msgText,strlen(msgText)));

                // Set Message property
                
                (void)IoTHubMessage_SetMessageId(message_handle,"MSG_ID");
                (void)IoTHubMessage_SetCorrelationId(message_handle,"CORE_ID");
                (void)IoTHubMessage_SetContentTypeSystemProperty(message_handle,"application%2fjson");
                (void)IoTHubMessage_SetContentEncodingSystemProperty(message_handle,"utf-8");
                (void)IoTHubMessage_SetMessageCreationTimeUtcSystemProperty(message_handle,"2020-07-01T01:00:00.346Z");
                


                // Add custom properties to message
                (void)IoTHubMessage_SetProperty(message_handle,"property_key","property_value");

                (void)printf("Sending message %d to IoTHub\r\n",(int)(messages_sent + 1));
                IoTHubDeviceClient_LL_SendEventAsync(device_ll_handle,message_handle,send_confirm_callback,NULL);

                // The message is copied to the sdk so the we can destroy it
                IoTHubMessage_Destroy(message_handle);

                messages_sent++;
            }
            else if (g_message_count_send_confirmations >= MESSAGE_COUNT)
            {
                // After all messages are all received stop running
                g_continueRunning = false;
            }

            IoTHubDeviceClient_LL_DoWork(device_ll_handle);
            ThreadAPI_Sleep(1);

        } while (g_continueRunning);

        // Clean up the iothub sdk handle
        IoTHubDeviceClient_LL_Destroy(device_ll_handle);
    }
    // Free all the sdk subsystem
    IoTHub_Deinit();

    printf("Press any key to continue,this is a test.");
    (void)getchar();

    return;
}

我刚刚选择了 MQTT_Protocol,但连接字符串是否足以连接到后端,或者我还需要准备好证书?

解决方法

设备需要证书才能通过 TLS 握手。如果您涵盖了那个,Cert 是一种连接选项,但您可以使用根据您的连接字符串生成的 SAS 令牌进行连接。

对于 Yocto 特定问题,您是否尝试过 this getting started 示例?

如果在查看后仍然无法正常工作,请打开 GitHub issue 并添加日志以进行调查。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。