• +86-18468090689
  • toriejiang1991@sina.cn

服务器设备SDK编程

设备SDK编程文章背景

服务器设备SDK编程

本文使用2.1.3.9版本SDK,该版本提供64位linux系统动态库与keil5环境静态库,设备SDK文件目录如下:

服务器设备SDK文件

  • hailinDevSdk.chm文件:设备SDK中数据结构以及API接口说明文件;
  • libhlDeviceSdk.h文件:设备SDK头文件;
  • mainRel.c文件:SDK例程文件;
  • libhlDeviceSdk.so:linux64位动态库,依赖libjpeg.so.9库;
  • libhlServerDeviceSDK.lib:keil5环境静态库;

设备接入流程:

  1. 注册“鸣”云平台用户;
  2. “设备管理”模块下“设备属性信息维护”页中,“新建”设备;
  3. 填写新建设备数据,点击“确定”添加;
  4. 记下新建设备码与设备类型码,SDK中需要配置这两个参数;
  5. 使能设备SDK环境函数:void initSdkEnv(void);
  6. 配置设备SDK环境参数:
    SSdkConfigParam    sCfgParam;
    
    sCfgParam.s_nHeartbeatCycle = 60;     // 建议设置为60秒
    sCfgParam.s_nDeviceType = Ehl_DeviceTypeCode_universalityNoVidDev;	// 通用非视频类设备类型码
    sCfgParam.s_nSocketfd = socket(AF_INET, SOCK_STREAM, 0);   // 创建socket句柄
    memcpy(sCfgParam.s_sDeviceSn, "XXXXXX8895FEFABC8895FEFABC88XXXX", 32);	// 新建通用设备的设备码
    memcpy(sCfgParam.s_sServAddr, "192.168.1.XXX", 14);   // 配置服务器IP地址或者服务器域名
    memcpy(sCfgParam.s_sLocalIP, "192.168.1.174", 14);      // 配置设备本地IP地址
    memcpy(sCfgParam.s_sDeviceName, "commNoVideoControlDevice", 26);   // 配置新建设备名称
    
    configSdkParam(&sCfgParam);   // 配置SDK参数
  7. 注册设备SDK网络接口函数:
    /** 
     * @brief		temp_sendNByts:例程注册用send回调函数
     * @author		HaiLin.toraloo
     * @param[in]	nscokfd		socket句柄
     * @param[in]	vptr		发送数据指针
     * @param[in]	nDatalen	发送数据长度
     * @return	
     * - 0: socket关闭
     * - -1: 发送异常
     * - >0: 发送字节数
     * @warning 警告: 传入参数不能为空	
     */
    static int temp_sendNByts(int nscokfd, const char *vptr, int nDatalen);
    /** 
     * @brief		temp_connect:例程注册用connect回调函数
     * @author		HaiLin.toraloo
     * @param[in]	nscokfd		socket句柄
     * @param[in]	pIPAddr		连接IP地址
     * @param[in]	nport		端口号
     * @return
     * - 0: 成功
     * - -1: 连接失败
     * @warning 警告: 传入参数不能为空		
     */
    static int temp_connect(int nfd, const char *pIPAddr, int nport);
    /**
    * @brief		temp_recv:例程注册用recv回调函数
    * @author		HaiLin.toraloo
    * @param[in]	nscokfd		socket句柄
    * @param[in]	pRecvbuf	接收缓存
    * @param[in]	nRecvlen	接收缓存长度
    * @return
    * - 0: socket关闭
    * - -1: 接收异常
    * - >0: 接收到字节数
    * @warning 警告: 传入参数不能为空
    */
    static int temp_recv(int nfd, char *pRecvbuf, int nRecvlen);
    /*------------------------------------------------------------------------------------*/
    SNetworkInterface sNetApi;
    
    sNetApi.pCloseSocket = NULL;     // close注册函数指针
    sNetApi.pCreateSocket = NULL;   // socket创建注册函数指针
    sNetApi.pConnectfx = temp_connect;   // connect注册函数指针
    sNetApi.pRecvfx = temp_recv;   // recv注册函数指针
    sNetApi.pSendfx = temp_sendNByts;   // send注册函数指针
    /*------------------------------------------------------------------------------------*/
    registerNetworkApi(&sNetApi);   // 向SDK注册网络回调函数指针
  8. 注册设备SDK事件回调处理函数:
    /** 
     * @brief		serverCommandDealfunction:接收事件处理回调函数
     * @author		HaiLin.toraloo
     * @param[in]	param		用户传入参数
     * @param[in]	nCmdCode	事件码
     * @param[in]	pPktDat		事件数据
     * @param[in]	nPktlen		事件数据长度
     * @return	暂无意义
     * @warning 警告: 传入参数不能为空
     */
    static int serverCommandDealfunction(void *param, int32_t nCmdCode, const char *pPktDat, uint32_t nPktlen);
    
    /*-------------------------------------------------------------------------------------*/
    SMessageCallbackParam	sMsgParam;
    char   *pUserString = "DeviceTestString";  
    
    sMsgParam.s_pUserParam = pUserString;    // 用户传入回调参数
    sMsgParam.s_pMsgCbfx = serverCommandDealfunction;   // SDK事件处理回调函数
    
    registerMessageCbfx(&sMsgParam);   // 注册SDK回调事件参数
    /*-------------------------------------------------------------------------------------*/
  9. 设备登录服务器:
    /**
    * @brief	loginServer:登录服务函数
    * @author	HaiLin.toraloo
    * @param[in]	pFwVer		设备固件版本号
    * @param[in]	nExtNodeNum	外接设备数
    * @return
    * - 0:成功
    * - -1:接收失败
    * - -2:发送失败
    * - -3:连接失败
    * - -4:接收到错误包
    * @warning 警告: 必须配置SDK参数
    */
    int loginServer(const char *pFwVer, uint8_t nExtNodeNum);
    
    /*-------------------------------------------------------*/
    nRtn = loginServer("4.1.4.78", 1);    // 设备发起登录操作
    /*-------------------------------------------------------*/
  10. 进入SDK事件循环,等待服务器指令,并定时推送设备心跳指令:
    /** 
     * @brief		hailinProtocolWaitYield:等待服务器事件并让出CPU函数
     * @author		HaiLin.toraloo
     * @return
     * - -1:socket异常关闭
     * - 0:无事件返回
     * - >0:事件数据长度
     * @note	配置SDK参数同时配置网络底层函数指针合集
     */
    int hailinProtocolWaitYield(void);
    
    /*--------------------------------------------------*/
    nRtn = hailinProtocolWaitYield();   // 进入SDK处理循环
    /*--------------------------------------------------*/
  11. SDK时间更新函数:void timer_update_1s(void); // 函数需要每秒调用一次
  12. 虚拟设备端报警触发线程:
    static void *eventTriggerThread(void *param) ; // 接收用户输入并将设备报警信息上传
  13. 完整代码参考SDK压缩包中mainRel.c例程代码;

如需要不同平台的设备SDK库,可将对应平台信息发送至该邮箱地址:toriejiang1991@sina.cn

toraloo