本章主要介绍在Linux系统上集成开发的操作。
开发环境
当前Linux X86-64 SDK需在有systemd为init的系统上开发。
开发包下载完成后,将其解压到目标设备开发环境所在机器上的任意目录。再根据目标设备开环境的具体要求,将SDK目录引入到设备的开发环境中。
编译设置
DPS开发包提供标准的Makefile编译脚本,以适配一般Linux设备的编译环境。其中差异化的配置可以在SDK包中的config.mk文件中指定。
- 硬件体系
ARCH := x86_64
DPS SDK目前支持Armhf,Arm64,x86_64三个目标平台架构。
- DPS_DATA
DPS_DATA := /data/dps
指定DPS的data目录,该目录主要用来存放基线规则,以及客户端在运行过程中产生的临时文件等。
缺省值为/data/dps ,请确保/data目录或者相应分区可读、可写。
- DPS_PROFILE
DPS_PROFILE := standard
DPS类型,取值为standard、server、lite中的一种。当开发板的CPU性能较差时,可选择lite模式。
缺失值为standard 。
- PROTECTED_PATH
PROTECTED_PATH := /home/dps/my_important_dir
scanner默认扫描常规系统目录。如果有用户需要自定义scanner额外的扫描路径,可在这里指定。
- SYSTEM_VERSION
SYSTEM_VERSION := version://textfile:/etc/YOUR_VERNO_FILE:.+ SYSTEM_VERSION := version://string:ver.1.0.0
若选择textfile比对方式,则指定厂商固件版本号寄存的文本文件路径,例如/etc/YOUR_VERNO_FILE,按照定义的正则表达式从该文件路径中解析版本号,例如
.+
正则表达式。如果选择string比对方式,那么直接使用接续字串当做固件版本号,例如ver.1.0.0
。 - MANAGED_ID
MANAGED_ID := managedid://textfile:/etc/MANAGED_ID:.+ MANAGED_ID := managedid://string:15709823
MANAGED_ID同SYSTEM_VERSION,也可选择字串和档案正则表达方式。
- 客户端选项
客户端主要用来连接云端,接收和发送云端指令。相关配置选项在SDK包的config.mk中指定。
DPS连云提供了两种方式,一种是直接使用SDK包里的dps_client客户端程序,可通过设备证书直接上云;另一种是使用SDK包中提供的Makefile脚本编译libclient.a,然后将libclient.a集成到自己的项目中,通过库导出的接口连接云端。
使用独立DPS客户端:
- 打开相应开关。
CONFIGURE_STANDALONE_CLIENT := 1
说明 配置CONFIGURE_STANDALONE_CLIENT为1,则使用SDK包中自带的独立DPS客户端,可通过设备证书信息直接与云端建立连接。 - 配置设备证书(ProductKey、DeviceName、DeviceSecret)。
PRODUCT_KEY := ProductKey DEVICE_NAME := DeviceName DEVICE_SECRET := DeviceSecret
说明 当且仅当CONFIGURE_STANDALONE_CLIENT为1时,才需要配置设备证书,否则配置不生效。
编译客户端开发库:
- 打开相应开关。
CONFIGURE_CLIENT_LIBRARY := 1 CONFIGURE_IOTX_LIBRARY := 0 CONFIGURE_BUILD_CLIENT := 0
说明 配置 CONFIGURE_CLIENT_LIBRARY 为1,则需要编译 DPS 客户端开发库 libclient.a ,供自有客户端项目集成使用。客户端API的具体使用方式请参见客户端API。另外, CONFIGURE_IOTX_LIBRARY开关用来编译Linkkit开发库。该库主要用来最终编译演示版dps_client客户端程序之用,用户在实际项目中自行替换成最新的Linkkit开发库即可。客户端开发库libclient.a内部封装了Linkkit开发库导出的接口。
CONFIGURE_BUILD_CLIENT开关用来编译完整的演示版dps_client客户端程序,其主要功能是用来演示如何将客户端开发库libclient.a集成进自有的客户端项目中。
- 指定ToolChain安装路径。
目标平台toolchain安装路径在toolchains/config.mk文件中指定。
TOOLCHAIN_INSTL_DIR := $(HOME)/your_toolchain_path_dir
- 编译libclient.a。
make libs
如果上述配置都没有问题,那么最终编译出来的库会在会放在output/lib_a/libclient.a。
最后,将编译出来的.a库集成到自己的工程中即可。客户端API的具体使用方式请参见客户端API。
- 打开相应开关。
- 其他组件选项
CONFIGURE_SANDBOX_SERVICE := 0
DPS沙箱服务,主要用来限制进程的行为和权限,防止病毒作恶。具体使用方式参考DPS Sandbox相关文档。
- 安装路径
SDK中Makefile的主要工作是将DPS各组件释放到目标image的rootfs根目录下,并自动创建相关文件夹。
那么,上述所有配置完毕之后,就可以将DPS SDK解压并释放到指定的安装目录中了。安装目录可以在SDK包的config.mk中指定。
prefix ?= /device_root_path
也可以在安装的时候通过参数形式指定。
make install prefix=/device_root_path
内核配置
开发者如果需要为目标设备编译Linux Kernel,请确保Linux Kernel版本在3.15及以上。并且需要检查在Kernel编译的defconfig选项中使能了以下项目。
- 开启AUDIT和NETLINKE
CONFIG_AUDIT_ARCH=y CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y CONFIG_AUDIT_WATCH=y CONFIG_AUDIT_TREE=y CONFIG_NF_CT_NETLINK=y CONFIG_NF_CT_NETLINK_TIMEOUT=y CONFIG_NETFILTER_NETLINK_GLUE_CT=y
- 开启NETFILTER和IPTABLES
CONFIG_NETFILTER=y CONFIG_NETFILTER_NETLINK=y CONFIG_NETFILTER_NETLINK_ACCT=y CONFIG_NETFILTER_NETLINK_QUEUE=y CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_IP_NF_IPTABLES=y
- 开启XTABLES及相关选项
CONFIG_NETFILTER_XTABLES=y # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=y ... # # Xtables targets # CONFIG_NETFILTER_XT_TARGET_AUDIT=y ... # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_BPF=y ...
编译示例
DPS模块提供头文件和静态库供设备应用集成使用。AppSample为实现参考。
$(DPS_SDK)/client/inc/DPSClient.h
DPS client header file
$(DPS_SDK)/output/lib_a/libdpsclient.a
DPS client static library
$(DPS_SDK)/output/lib_a/libiotx.a
Link MQTT static library
应用Makefile示例:
CPPFLAGS += -I$(DPS_SDK)/client/inc
LDFLAGS += -L$(DPS_SDK)/output/libdpsclient.a
LDFLAGS += -L$(DPS_SDK)/output/libiotx.a
启动设置
正常情况下,DPS SDK通过Makefile install预装入image。操作系统启动的过程中会将DPS SDK拉起,无需额外配置。
systemd启动方式如下步骤所示。
- 在编译目标系统Image之前,在目标系统的/usr/lib/systemd/system/目录下创建dpsd.service文件。
[Unit] Description=dps deamon server # After=network.target [Service] ExecStart=/system/dps/bin/dpsd Type=simple User=root Group=root KillMode=process Restart=always RestartSec=10s [Install] WantedBy=multi-user.target Alias=dpsd.service
- 在/etc/systemd/system/multi-user.target.wants/目录下创建软连接,指向/usr/lib/systemd/system/dpsd.service文件。