Hikvision ISUP Client - Complete C development project
|
|
3 dní pred | |
|---|---|---|
| docs | 3 dní pred | |
| include | 3 dní pred | |
| libs | 3 dní pred | |
| scripts | 3 dní pred | |
| src | 3 dní pred | |
| tests | 3 dní pred | |
| .gitignore | 3 dní pred | |
| Makefile | 3 dní pred | |
| README.md | 3 dní pred | |
| config.ini | 3 dní pred |
海康威视 ISUP(Ehome) 协议 C 语言客户端/平台服务端完整开发项目
本项目是一个基于海康威视 ISUP(Ehome) 协议的完整 C 语言开发框架,实现了以下核心功能:
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 编程语言 | C11 | 高性能、底层控制 |
| 操作系统 | Ubuntu 24.04 LTS | 稳定服务器系统 |
| 海康SDK | HCNetSDK (ISUP/Ehome) | 设备注册/流媒体/报警 |
| 流媒体 | ZLMediaKit | RTMP/RTSP/HLS 流媒体服务器 |
| 构建系统 | Make | 简单可靠的构建工具 |
| 版本控制 | Git + Gogs | 自托管代码管理 |
┌─────────────┐ ISUP/TCP ┌──────────────────┐
│ 海康设备 │ ◄──────────────► │ ISUP Client │
│ (摄像头/NVR) │ 注册/流/报警 │ (本程序) │
└─────────────┘ └────────┬─────────┘
│ RTMP/PS流
▼
┌──────────────┐
│ ZLMediaKit │
│ (流媒体服务器) │
└──────┬───────┘
│
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ RTMP │ │ HLS │ │ RTSP │
│ 客户端 │ │ 直播 │ │ 拉流 │
└──────────┘ └──────────┘ └──────────┘
hikvision-isup-client/
├── README.md # 项目说明文档
├── Makefile # 构建配置文件
├── config.ini # 运行配置文件
├── .gitignore # Git忽略规则
├── include/ # 头文件目录
│ ├── common.h # 公共定义与常量
│ ├── config.h # 配置管理
│ ├── platform.h # 平台注册管理
│ ├── stream.h # 视频流管理
│ ├── playback.h # 录像回放管理
│ └── alarm.h # 报警管理
├── src/ # 源代码目录
│ ├── main.c # 主程序入口
│ ├── platform.c # 平台注册实现
│ ├── stream.c # 流媒体管理实现
│ ├── playback.c # 录像回放实现
│ ├── alarm.c # 报警管理实现
│ ├── config.c # 配置管理实现
│ └── utils.c # 工具函数实现
├── libs/ # 第三方库目录
├── scripts/ # 辅助脚本
│ ├── setup.sh # 环境初始化脚本
│ ├── deploy.sh # 部署脚本
│ └── git_sync.sh # Git同步脚本
├── docs/ # 文档目录
├── tests/ # 测试目录
└── logs/ # 日志目录(运行时生成)
# 运行环境初始化脚本
chmod +x scripts/setup.sh
./scripts/setup.sh
手动安装依赖:
sudo apt-get update
sudo apt-get install -y build-essential gcc g++ make cmake git pkg-config libssl-dev \
ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev valgrind cppcheck
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
git submodule update --init
mkdir build && cd build
cmake ..
make -j4
sudo make install
从海康威视官网下载 HCNetSDK 包,将 Linux 64位版本的文件复制到 libs/ 目录:
libs/
├── libhcnetsdk.so # 主SDK库
├── libHCCommon.so # 公共库
├── libHCWindowsComm.so # 通信库
├── libPlayCtrl.so # 播放库
├── libHCNetSDK.so # 备用SDK库
└── ... # 其他依赖库
# 使用模拟模式编译(无需HCNetSDK,可用于开发和测试)
make simulate
# 默认编译(需要libs目录中有HCNetSDK库文件)
make
# 指定SDK路径
make HCNETSDK_PATH=/opt/hikvision-sdk
# 清理并重新编译
make cleanbuild
# 使用默认配置运行
./hikvision-isup-client
# 指定配置文件
./hikvision-isup-client -c config.ini
# 守护进程模式运行
./hikvision-isup-client -c config.ini -d
# 查看帮助
./hikvision-isup-client -h
# 查看版本
./hikvision-isup-client -v
sudo make install
sudo ./scripts/deploy.sh
sudo systemctl enable hikvision-isup-client
sudo systemctl start hikvision-isup-client
按照以下路径配置海康设备:
系统 > 高级配置 > 网络 > 平台接入 > ISUP(原Ehome)
配置参数如下(与项目 config.ini 对应):
| 配置项 | 值 | 说明 |
|---|---|---|
| 平台接入方式 | ISUP(原Ehome) | 选择ISUP协议 |
| 启用 | 勾选 | 启用平台接入 |
| 服务器地址 | 117.131.63.98 | 本程序服务器IP |
| 端口 | 7031 | CMS注册端口 |
| 设备ID | AX5324540 | 设备序列号 |
| 注册状态 | 在线 | 确认注册成功 |
| 协议版本 | ISUP5.0 | 协议版本 |
| 加密密钥 | abc12345 |
加密密钥 |
主要配置项说明:
[CMS]
cms_server_ip=117.131.63.98 # CMS服务器IP(本机IP)
cms_server_port=7031 # CMS监听端口
device_id=AX5324540 # 设备ID
protocol_version=ISUP5.0 # 协议版本
encrypt_key=abc12345 # 加密密钥
[RTMP]
rtmp_server=127.0.0.1 # ZLMediaKit服务器地址
rtmp_port=1935 # RTMP端口
rtmp_app_name=live # 应用名称
rtmp_stream_key=camera1 # 流名称
// 1. 初始化CMS库
platform_cms_init();
// 2. 启动CMS监听(接收设备注册)
platform_cms_start_listen("0.0.0.0", 7031, device_register_callback, NULL);
// 3. 设备注册(主动向CMS注册)
int user_id = platform_device_register("117.131.63.98", 7031,
"AX5324540", "ISUP5.0", "abc12345", NULL);
// 4. 设置自动重连
platform_set_auto_reconnect(user_id, 1, 5);
// 5. 清理
platform_cms_cleanup();
// 1. 初始化回放模块
playback_init();
// 2. 开启SMS回放监听
stream_start_playback_listen("0.0.0.0", 7660, NULL, NULL);
// 3. 启动回放
PlaybackSession* session = playback_start(
"AX5324540", // 设备ID
1, // 通道号
start_time, // 开始时间
end_time, // 结束时间
1, // 速度(1=正常)
playback_data_cb, // 数据回调
playback_status_cb, // 状态回调
NULL // 用户数据
);
// 4. 停止回放
playback_stop(session);
// 5. 清理
playback_cleanup();
// 1. 初始化报警模块
alarm_init();
// 2. 启动报警监听
alarm_start_listen("0.0.0.0", 9000,
alarm_data_callback, // 报警数据回调
alarm_process_callback, // 报警处理回调
NULL);
// 3. 清理
alarm_cleanup();
// 1. 创建流会话
StreamSession* session = stream_create_session(
"AX5324540", STREAM_TYPE_MAIN, CODEC_TYPE_H264,
1920, 1080, 25, 4096000
);
// 2. 开始推流到ZLMediaKit
stream_start_push(session, "rtmp://127.0.0.1:1935/live/camera1",
rtmp_push_callback, NULL);
// 3. 发送视频帧
StreamFrame frame = { .data = frame_data, .data_size = frame_size, ... };
stream_send_frame(session, &frame);
// 4. 停止推流
stream_stop_push(session);
// 5. 销毁会话
stream_destroy_session(session);
本项目实现了H.264/H.265原始码流到MPEG-2 PS(Program Stream)的封装:
| Pack Header (4-11 bytes) |
| Program Stream Map |
| PES Packet |
| - PES Header |
| - PES Payload (NALU) |
| ... |
| Pack Header |
| ... |
ZLMediaKit 支持直接接收ISUP/Ehome协议的PS流,配置方法:
# config.ini
[rtmp]
port=1935
# ZLMediaKit会自动将RTMP流转换为多种协议输出
# RTMP: rtmp://server:1935/live/camera1
# HLS: http://server:8080/live/camera1.m3u8
# RTSP: rtsp://server:554/live/camera1
# 运行Git同步脚本
chmod +x scripts/git_sync.sh
./scripts/git_sync.sh
# 初始化git仓库
git init
git branch -M main
# 添加远程仓库(使用Access Token)
git remote add origin "https://steven_roc:1942ce3d6478f7a572fee3dd4891e49f6c416aad@git.zhonjin.com:40717/steven_roc/hikvision-isup-client.git"
# 添加所有文件
git add -A
# 提交
git commit -m "Initial commit: Hikvision ISUP Client project"
# 推送
git push -u origin main
# 方式1: 使用脚本
./scripts/git_sync.sh
# 方式2: 手动
git add -A
git commit -m "描述本次更新内容"
git push
程序运行日志输出到 logs/isup_client.log 文件和控制台。
日志级别:
| 级别 | 说明 |
|---|---|
| DEBUG | 调试信息,详细的内部状态 |
| INFO | 一般信息,关键流程节点 |
| WARN | 警告信息,非致命问题 |
| ERROR | 错误信息,功能异常 |
| FATAL | 致命错误,程序无法继续 |
修改日志级别:编辑 config.ini 中的 log_level 参数。
1. 设备注册失败
2. 视频流无法接收
3. RTMP推流失败
rtmp://server:1935/live/camera1 测试拉流4. 编译错误
make simulate 跳过SDK依赖进行开发libs/ 目录中的SDK库文件# 搜索注册相关日志
grep -i "register\|login\|cms" logs/isup_client.log
# 搜索流相关日志
grep -i "stream\|rtmp\|push" logs/isup_client.log
# 搜索报警相关日志
grep -i "alarm" logs/isup_client.log
# 搜索错误日志
grep -i "error\|fail" logs/isup_client.log
本项目为内部开发项目,仅供学习参考使用。