This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220SF-LAUNCHXL:Azure HTTP-获取/发布方法

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/991580/cc3220sf-launchxl-azure-http--get-post-method

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件:CC3220SF
您好!

1.我正在尝试使用 Azure SDK 执行基于 HTTP/s 的 OTA -更新。 (请建议通过 Azure SDK 执行 OTA 的任何其他最佳方法)。

能够从 Azure SDK 编译和运行"simplesample_http"示例
 
基于此示例(IOTHUB_CLIENT_LL)、是否可以 执行 HTTP GET / POST 操作、以便我可以从 Azure 云下载二进制文件?
我的意思是为    IOTHUB_CLIENT_LL 寻找 HTTPAPI_ExecuteRequest()等效 API。
由于 MOCKABLE API 无法映射实际的客户端 API 调用。 请提供一些参考以将 azure MOCKABLE_Function API 映射到实际的 HTTP/MQTT 客户端 API。
  
  
此外、还尝试 了 HTTP 客户端 API 直接访问(从 azure 的 httpapi_sl.c 和 httpapi.h)。方法是获取参考 "uhttp"示例代码 (C:\ti\azure_cc32xx_4_10_01_01\source\third_party\azure-IoT-simplelink\sdk\deps\ups\ups\uupsamples\uu_sample_samples\f33\uure)  
但我面临的是"HTTPAPI_open_request_failed"。
  
请在下面找到代码片段。
#define HTTP_PORT_NUM       80
#define HTTPS_PORT_NUM      443
#define TEST_SETOPTIONS_CERTIFICATE    (const unsigned char*)"blah!blah!blah!"
#define host_name (const char*)"i.imgur.com"
#define REQUEST_RELATIVE_PATH "/z4d4kWk.jpg"

typedef struct BUFFER_TAG* BUFFER_HANDLE;
typedef struct HTTP_HEADERS_HANDLE_DATA_TAG* HTTP_HEADERS_HANDLE;
typedef struct HTTP_HANDLE_DATA_TAG* HTTP_CLIENT_HANDLE;

static BUFFER_HANDLE TestBufferHandle;
static HTTP_HEADERS_HANDLE requestHttpHeaders;
static HTTP_HEADERS_HANDLE responseHttpHeaders;

static void createHttpObjects(HTTP_HEADERS_HANDLE* requestHttpHeaders, HTTP_HEADERS_HANDLE* responseHttpHeaders)
{
    /*assumed to never fail*/
    *requestHttpHeaders = HTTPHeaders_Alloc();
    *responseHttpHeaders = HTTPHeaders_Alloc();
    if (
        (*requestHttpHeaders == NULL) ||
        (*responseHttpHeaders == NULL)
        )
    {
        //ASSERT_FAIL("unable to build test prerequisites");
    }
}

static void test_http_get(void)
{
    int port_num = HTTP_PORT_NUM;
    HTTP_SAMPLE_INFO sample_info;
    sample_info.stop_running = 0;
    unsigned int statusCode = 0;    
    unsigned int minimumPollingTime = 9;
    int result;

    createHttpObjects(&requestHttpHeaders, &responseHttpHeaders);

    result = HTTPAPI_Init();
    Display_printf(display, 0, 0, "HTTPAPI_Init %d",result );

    HTTP_CLIENT_HANDLE http_handle = HTTPAPI_CreateConnection(host_name);

    if (http_handle == NULL)
    {
        Display_printf(display, 0, 0, "HTTPAPI_CreateConnection Failed");
    }
    else
    {
        Display_printf(display, 0, 0, "HTTPAPI_CreateConnection Success");

        //HTTPAPI_SetOption(http_handle, "TrustedCerts", TEST_SETOPTIONS_CERTIFICATE);
        HTTPAPI_SetOption(http_handle, "MinimumPollingTime", &minimumPollingTime);

        int retval = HTTPAPI_ExecuteRequest(http_handle, 
                                HTTPAPI_REQUEST_GET, 
                                REQUEST_RELATIVE_PATH, 
                                requestHttpHeaders, 
                                NULL, 
                                0, 
                                &statusCode,
                                responseHttpHeaders,
                                TestBufferHandle );
        if(retval != HTTPAPI_OK)          
        {
            Display_printf(display, 0, 0, "HTTPAPI_ExecuteRequest Failed.%d", retval); //Error >> retval = HTTPAPI_OPEN_REQUEST_FAILED
        }
        else
        {
            Display_printf(display, 0, 0, "HTTPAPI_ExecuteRequest Success.");
        }

        HTTPAPI_CloseConnection(http_handle);
        HTTPAPI_Deinit();
    }
}


void simplesample_http_run(void)
{
    if (platform_init() != 0)
    {
        Display_printf(display, 0, 0, "Failed to initialize the platform.");
    }
    else
    {
        if (serializer_init(NULL) != SERIALIZER_OK)
        {
            Display_printf(display, 0, 0, "Failed on serializer_init");
        }
        else
        {
            Display_printf(display, 0, 0, "Sending HTTP GET");
            test_http_get();
            serializer_deinit();
        }
		
        platform_deinit();
    }
}


 
这样我可以执行 HTTP 调用吗? 如果是、请指导我覆盖"HTTPAPI_OPEN_REQUEST_FAILED"
 
 
 
此致、
Suresh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Suresh、

    除了您获得的"HTTPAPI_OPEN_REQUEST_FAILED"返回值之外、还有其他调试输出吗?

    浏览您提供的示例代码、它在理论上应该起作用。

    或者、也可以将主 CC32xx SDK 中的 HttpGet 样本用于 OTA、该示例使用 TI 实现的 HTTP 库。 该解决方案是否适合您?

    此致、

    Michael

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael、

    非常感谢您的回答。  

    默认情况下、Azure 示例使用 TLS 身份验证、因此由于通信证书、我的示例代码 无法正常工作。 现在、我的第2点工作正常。

      

    我的要点1 -(使用 MOCKABLE API)仍然不清楚。 我知道、某些 MOCKABLE API、例如  IoTHubClient_LL_CreateFromConnectionString 、用于使用连接字符串建立 MQTT/HTTP 协议。

     

    但是、如果我想使用 IOTHUB_CLIENT_LL 执行 HTTP-GET 操作、 HTTPAPI_ExecuteRequest() 等效的 MOCKABLE API 将是什么以及如何选择 HTTP 方法(POST / GET / DELETE 等)。
    请帮我获取更多信息。

    此致、

    Suresh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Suresh、

    查看 Azure SDK 的代码架构、至少在 CC32xx 分发中包含的组件中、似乎没有任何明显的 MOCKABLE API 来执行基本的独立 HTTP 请求。 这很可能是因为重点在于让低级 HTTP/MQTT 抽象出来、并将重点放在应用程序与 IoTHub 进行交互。 因此、虽然这些 IoTHub API 可以创建 HTTP 请求、但不能在该 IoTHub 上下文之外使用它。

    您似乎需要使用底层低级 HTTP API 或 TI 为您的用例提供的 HTTP 库。

    此外、对于有关 Azure SDK API 的此类深入问题、我建议您寻找 Azure 的支持渠道、因为它是第三方库、他们将最熟悉它。

    此致、

    Michael