在實際開發專案過程中,如果已有自己的開發工程,可以將Link SDK添加到現有開發工程中進行編譯。本文通過樣本為您講解如何將Link SDK添加到一個已有工程中並進行編譯。
樣本說明
本樣本包含一個列印Hello World!
的測試程式hello.c
,並有一個編譯該測試程式的makefile。具體代碼內容如下(附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 mqtt_basic_demo.c
PROG_OBJS := $(patsubst %.c,%.o,$(PROG_FILE))
PROG = hello
SDK_ROOT = $(shell pwd)/LinkSDK
SDK_INC = -I$(SDK_ROOT)/output/include/
SDK_LIB = $(SDK_ROOT)/output/lib/libaiot.a -lpthread
all:prepare $(PROG_OBJS)
$(CC) $(CFLAGS) -o $(PROG) $(PROG_OBJS) $(SDK_INC) $(SDK_LIB)
prepare:
make -C $(SDK_ROOT)
./%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS) $(SDK_INC)
clean:
make -C LinkSDK clean
rm -f *.o $(PROG) $(SDK_OBJS)
SDK移植步驟
擷取SDK。
裝置OS選擇Linux。
串連物聯網平台協議選擇MQTT。
資料加密選擇TLS-CA。
裝置認證方案選擇裝置密鑰。
不選擇任何進階能力,單擊按鈕開始產生下載SDK。
SDK移植步驟。
SDK下載之後,將壓縮檔解壓,並將Link SDK目錄複寫到
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
複製MQTT樣本並進行修改。
將
LinkSDK/demos/mqtt_basic_demo.c
複製到hello.c
所在目錄,並將mqtt_basic_demo.c
檔案中的main
函數修改為sdk_test
,修改後的代碼如內容所示:/* TODO: 替換為自己裝置的裝置認證*/ char *product_key = "${YourProductKey}"; char *device_name = "${YourDeviceName}"; char *device_secret = "${YourDeviceSecret}"; /* TODO: 替換為自己執行個體的存取點 */ char *mqtt_host = "${YourInstanceId}.mqtt.iothub.aliyuncs.com"; 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(上海)的網域名稱尾碼 */ ... }
修改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庫的連結。
修改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); }
編譯:
make
。運行:./hello
。在hello.c所在目錄運行make命令進行編譯,然後運行產生的hello程式,如果一切順利將輸出類似如下內容:
Hello World! [1687781092.755][LK-0313] MQTT user calls aiot_mqtt_connect api, connect [1687781092.755][LK-032A] mqtt host: iot-****.mqtt.iothub.aliyuncs.com [1687781092.755][LK-0317] user name: demo****** establish tcp connection with server(host='iot-******.mqtt.iothub.aliyuncs.com', port=[443]) success to establish tcp, fd=3 local port: 52008 [1687781092.811][LK-1000] establish mbedtls connection with server(host='iot-****.mqtt.iothub.aliyuncs.com', port=[443]) [1687781092.844][LK-1000] success to establish mbedtls connection, (cost 45338 bytes in total, max used 48306 bytes) [1687781092.899][LK-0313] MQTT connect success in 137 ms AIOT_MQTTEVT_CONNECT heartbeat response