SDK虽然提供了makefile用于编译SDK以及其中的示例文件,但是实际开发项目过程中,客户往往已经有自己的开发工程,因此实际的做法是将SDK添加到现有开发工程中进行编译。本文通过示例为您讲解如何将SDK添加到一个已有工程中并进行编译。

示例说明

本示例包含一个打印Hello World!的测试程序hello.c,并有一个编译该测试程序的makefile。 hello.c代码内容非常简单,只是打印一句输出。具体代码内容如下(附hello代码片段):

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

int main(int argc, char **argv)
{
        printf("Hello World!\n\r");
        return(0);
}
			

makefile的编码内容如下:

PROG_FILE := hello.c
PROG_OBJS := $(patsubst %.c,%.o,$(PROG_FILE))
PROG = hello

main:$(PROG_OBJS)
    $(CC) -o $(PROG) $(PROG_OBJS)

clean:
    rm -f *.o $(PROG)

SDK移植步骤

  1. 获取SDK

    参照SDK获取中提供的路径获取SDK,具体配置如下:

    • 主机开发环境设备运行环境均选择Linux
    • 设备认证方案选择设备秘钥
    • 连接物联网平台协议选择MQTT
    • 通道安全方式选择TLS-CA
    SDK定制

    不选择任何高级功能,点击按钮开始生成下载SDK。

  2. SDK移植步骤

    SDK下载之后,将压缩文件解压,并将LinkSDK目录复制到hello.c所在目录,如下内容所示:

    $ ls -l
    
    -rwxrwxrwx 1 root root   183  5月 11 19:45 hello.c
    drwxrwxrwx 1 root root  4096  5月 11 17:28 LinkSDK
    -rwxrwxrwx 1 root root   672  5月 11 19:49 makefile
    						
  3. 复制mqtt示例并进行修改

    LinkSDK/demos/mqtt_basic_demo.c复制到hello.c所在目录,并将mqtt_basic_demo.c文件中的main函数修改为sdk_test,修改后的代码如内容所示:

    int sdk_test(int argc, char *argv[])
    {
        int32_t     res = STATE_SUCCESS;
        void       *mqtt_handle = NULL;
        char       *url = "iot-as-mqtt.cn-shanghai.aliyuncs.com"; /* 阿里云平台上海站点(华东2站点)的域名后缀 */
    
    ...
    }
    						
  4. 修改makefile包含SDK

    修改makefile去编译SDK的源代码,以及复制出来的文件mqtt_basic_demo.c(附sdk_test代码片段):

    PROG_FILE := hello.c mqtt_basic_demo.c
    PROG_OBJS := $(patsubst %.c,%.o,$(PROG_FILE))
    PROG = hello
    
    SDK_ROOT = $(shell pwd)/LinkSDK
    SDK_DIR = $(SDK_ROOT)/core $(SDK_ROOT)/core/sysdep $(SDK_ROOT)/core/utils  $(SDK_ROOT)/portfiles/aiot_port $(SDK_ROOT)/external  $(SDK_ROOT)/external/mbedtls/library
    SDK_INC = -I$(SDK_ROOT)/external/mbedtls/include  $(foreach dir, $(SDK_DIR), -I$(dir) )
    SDK_FILES = $(foreach dir, $(SDK_DIR), $(wildcard $(dir)/*.c))
    SDK_OBJS = $(patsubst %.c,%.o,$(SDK_FILES))
    SDK_LIBS = -lpthread
    
    CFLAGS += $(SDK_INC)
    
    main:$(PROG_OBJS) $(SDK_OBJS)
        $(CC) $(CFLAGS) -o $(PROG) $(PROG_OBJS) $(SDK_OBJS) $(SDK_LIBS)
    
    clean:
        rm -f *.o $(PROG) $(SDK_OBJS)

    上面的改动中需要注意的是:

    • SDK_DIR需要包含SDK中设备需要用到功能的目录,如果客户选择了高级功能,那么在LinkSDK/components目录下将会出现相应的目录,那么需要将相关目录也加入到SDK_DIR中;
    • 因为本例中选择使用TLS对数据进行加密,所以编译的时候也编译了SDK中附带的mbedtls,并在SDK_INC中指定了对external/mbedtls/include目录的包含;
    • 因为编译后的程序在Linux平台上运行,会使用到线程相关的库,所以在SDK_LIBS里面指定了对pthread库的链接。
  5. 修改hello.c调用SDK

    修改hello.c调用文件mqtt_basic_demo.c中的函数sdk_test,初始化SDK并连接阿里云物联网平台:

    #include <stdio.h>
    #include <stdlib.h>
    
    /*声明sdk_test函数*/
    extern int sdk_test(int argc, char *argv[]);
    
    int main(int argc, char **argv)
    {
            printf("Hello World!\n\r");
            /*调用SDK Demo中的sdk_test函数,去初始化SDK并连接阿里云物联网平台*/
            sdk_test(0,NULL);
            return(0);
    }
    						
  6. 编译并运行

    在hello.c所在目录运行make命令进行编译,然后运行生成的hello程序,如果一切顺利将输出类似如下内容:

    $ ./hello
    Hello World!
    [61760.936][LK-0313] MQTT user calls aiot_mqtt_connect api, connect
    [61760.936][LK-0317] mqtt_basic_demo&a13FN5TplKq
    [61760.936][LK-0318] 4780A5F17990D8DC4CCAD392683ED80160C4C2A1FFA649425CD0E2666A8593EB
    establish mbedtls connection with server(host='a13FN5TplKq.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443])
    success to establish tcp, fd=3
    success to establish mbedtls connection, fd = 3(cost 43093 bytes in total, max used 45881 bytes)
    [61761.107][LK-0313] MQTT connect success in 172 ms
    AIOT_MQTTEVT_CONNECT
    heartbeat response