本章主要介绍在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客户端:

    1. 打开相应开关。
      CONFIGURE_STANDALONE_CLIENT := 1
      说明 配置CONFIGURE_STANDALONE_CLIENT为1,则使用SDK包中自带的独立DPS客户端,可通过设备证书信息直接与云端建立连接。
    2. 配置设备证书(ProductKey、DeviceName、DeviceSecret)。
      PRODUCT_KEY := ProductKey
      DEVICE_NAME := DeviceName
      DEVICE_SECRET := DeviceSecret
      说明 当且仅当CONFIGURE_STANDALONE_CLIENT为1时,才需要配置设备证书,否则配置不生效。

    编译客户端开发库:

    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集成进自有的客户端项目中。

    2. 指定ToolChain安装路径。

      目标平台toolchain安装路径在toolchains/config.mk文件中指定。

      TOOLCHAIN_INSTL_DIR := $(HOME)/your_toolchain_path_dir
    3. 编译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启动方式如下步骤所示。

  1. 在编译目标系统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
  2. /etc/systemd/system/multi-user.target.wants/目录下创建软连接,指向/usr/lib/systemd/system/dpsd.service文件。