使用 C 将事件发送到 Azure 事件中心

介绍

事件中心是一个高度可缩放的引入系统,每秒可引入数百万事件,从而使应用程序能够处理和分析连接的设备和应用程序所产生的海量数据。 将数据采集到事件中心后,可以使用任何实时分析提供程序或存储群集来转换和存储数据。

有关详细信息,请参阅 [事件中心概述][事件中心概述]。

在本教程中,将学习如何使用用 C 编写的控制台应用程序将事件发送到事件中心。若要接收事件,请单击左侧目录中的相应接收语言。

若要完成本教程,需要满足以下条件:

  • C 语言开发环境。 对于本教程,我们假定 gcc 堆栈在使用 Ubuntu 14.04 的 Azure Linux 虚拟机上。
  • Microsoft Visual Studio
  • 有效的 Azure 帐户。 如果没有帐户,可以创建一个试用帐户,只需几分钟即可完成。 有关详细信息,请参阅 Azure 试用

将消息发送到事件中心

在本部分中,我们将编写用于将事件发送到事件中心的 C 应用。 此代码使用 Apache Qpid 项目中的 Proton AMQP 库。 这类似于通过 C 将服务总线队列和主题与 AMQP 配合使用,如此处所示。 有关详细信息,请参阅 Qpid Proton 文档

  1. Qpid AMQP Messenger 页中,根据具体的环境,按照说明安装 Qpid Proton。
  2. 若要编译 Proton 库,请安装以下程序包:

    sudo apt-get install build-essential cmake uuid-dev openssl libssl-dev
    
  3. 下载 Qpid Proton 库并提取它,例如:

    wget http://archive.apache.org/dist/qpid/proton/0.7/qpid-proton-0.7.tar.gz
    tar xvfz qpid-proton-0.7.tar.gz
    
  4. 创建生成目录、编译和安装:

    cd qpid-proton-0.7
    mkdir build
    cd build
    cmake -DCMAKE_INSTALL_PREFIX=/usr ..
    sudo make install
    
  5. 在工作目录中,创建一个包含以下代码的名为 sender.c 的新文件。 请记得替换事件中心名称和命名空间名称的值。 还必须用密钥的 URL 编码版本替换之前创建的 SendRule。 可以在 此处对它进行 URL 编码。

    #include "proton/message.h"
    #include "proton/messenger.h"
    
    #include <getopt.h>
    #include <proton/util.h>
    #include <sys/time.h>
    #include <stddef.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    #define check(messenger)                                                     
      {                                                                          
        if(pn_messenger_errno(messenger))                                        
        {                                                                        
          printf("check\n");                                                     
          die(__FILE__, __LINE__, pn_error_text(pn_messenger_error(messenger))); 
        }                                                                        
      }  
    
    pn_timestamp_t time_now(void)
    {
      struct timeval now;
      if (gettimeofday(&now, NULL)) pn_fatal("gettimeofday failed\n");
      return ((pn_timestamp_t)now.tv_sec) * 1000 + (now.tv_usec / 1000);
    }  
    
    void die(const char *file, int line, const char *message)
    {
      printf("Dead\n");
      fprintf(stderr, "%s:%i: %s\n", file, line, message);
      exit(1);
    }
    
    int sendMessage(pn_messenger_t * messenger) {
        char * address = (char *) "amqps://SendRule:{Send Rule key}@{namespace name}.servicebus.chinacloudapi.cn/{event hub name}";
        char * msgtext = (char *) "Hello from C!";
    
        pn_message_t * message;
        pn_data_t * body;
        message = pn_message();
    
        pn_message_set_address(message, address);
        pn_message_set_content_type(message, (char*) "application/octect-stream");
        pn_message_set_inferred(message, true);
    
        body = pn_message_body(message);
        pn_data_put_binary(body, pn_bytes(strlen(msgtext), msgtext));
    
        pn_messenger_put(messenger, message);
        check(messenger);
        pn_messenger_send(messenger, 1);
        check(messenger);
    
        pn_message_free(message);
    }
    
    int main(int argc, char** argv) {
        printf("Press Ctrl-C to stop the sender process\n");
    
        pn_messenger_t *messenger = pn_messenger(NULL);
        pn_messenger_set_outgoing_window(messenger, 1);
        pn_messenger_start(messenger);
    
        while(true) {
            sendMessage(messenger);
            printf("Sent message\n");
            sleep(1);
        }
    
        // release messenger resources
        pn_messenger_stop(messenger);
        pn_messenger_free(messenger);
    
        return 0;
    }
    
  6. 使用 gcc编译该文件:

    gcc sender.c -o sender -lqpid-proton
    

    Note

    在此代码中,我们使用传出窗口 1 以强制尽快发出消息。 通常,应用程序应尝试批处理消息,以提高吞吐量。 请参阅 Qpid AMQP Messenger 页,了解如何在此环境及其他环境中以及从为其提供了绑定的平台(目前为 Perl、PHP、Python 和 Ruby)中使用 Qpid Proton 库。

后续步骤

访问以下链接可以了解有关事件中心的详细信息: