惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Martin Fowler
Martin Fowler
Last Week in AI
Last Week in AI
罗磊的独立博客
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
博客园_首页
人人都是产品经理
人人都是产品经理
量子位
美团技术团队
The Cloudflare Blog
小众软件
小众软件
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
博客园 - Franky

博客园 - 网络来者

Element Plus 多页面后台与 ASP.NET Core API 从零手敲教程 从零创建 MESTOOLS 消息弹窗跟练教程 uni app开发一个子页面 MES物料分摊 墨西哥 嘉兴 兼容车牌摄像头 和 tplink 摄像头的sdk开发包 集成 训练数字识别模型 mes测试机 redis vue学习 vue 系统文件结构 udp server 监听服务 第一个服务 c# 开发相关 openclaw 安装 c# 版本号 oracle 触发器 脚本方式安装Python 特定版本 idea 激活 Chrome MCP Server mcp ok mcp_server RepositoryItemGridLookUpEdit 使用 ok devexpress gridcontrol表格知识 winfrom 弹文本框 松下贴片机解锁 Serilog日志组件使用 git 使用
tplink摄像头监控
网络来者 · 2026-05-08 · via 博客园 - 网络来者
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TPOpenSDKCSharpDemo
{
    public partial class MainForm : Form
    {
        private Context ctx摄像头1 = new Context();
        PreviewController 摄像头1;
        IntPtr pCtx摄像头1 = IntPtr.Zero;
        private static TPOpenSDK.SDKReqCallback g_sdkReqCallback = sdkReqCallback;

        TPOpenSDK.SDKPlayerCallbackContext callBcakCtx摄像头1;
        TPOpenSDK.SDKPlayerCallbackContext playbackCallBcakCtx摄像头1;

        Hashtable reqOpHashTable摄像头1 = new Hashtable();
        Hashtable reqControllerHashTable摄像头1 = new Hashtable();

        public MainForm()
        {
            InitializeComponent();
        }




        private void 初始化(PreviewController shexiangtou, string ip, int port)
        {
            if (shexiangtou.pDevHandle != IntPtr.Zero)
            {
                TPOpenSDK.SDKDeleteDevice(shexiangtou.pDevHandle);
                shexiangtou.pDevHandle = IntPtr.Zero;
            }
            shexiangtou.pDevHandle = TPOpenSDK.SDKCreateDevice();
            if (shexiangtou.pDevHandle == IntPtr.Zero)
            {
                XLog.XTrace.WriteLine(string.Format("22AA错误:设备初始化失败!\n"));
                return;
            }
            XLog.XTrace.WriteLine(string.Format("22成功:设备初始化成功!\n"));
            int res = TPOpenSDK.SDKInitDevice(shexiangtou.pDevHandle, ip, port);

            //登录连接(shexiangtou);

            if (shexiangtou.pDevHandle == IntPtr.Zero)
            {
                XLog.XTrace.WriteLine(string.Format("错误:请先初始化设备!\n"));
                return;
            }
            int iReqID = TPOpenSDK.SDKReqLogin(shexiangtou.pDevHandle, g_sdkReqCallback, pCtx摄像头1, "admin", "111111");
            reqControllerHashTable摄像头1.Add(iReqID, 0);
            reqOpHashTable摄像头1.Add(iReqID, SDKReqOperation.DevLogin);
            XLog.XTrace.WriteLine("登录连接中。。。\n");

        }      



        private void 获取视频端口(PreviewController shexiangtou)
        {
            Thread.Sleep(1000);
            int iReqID = TPOpenSDK.SDKReqGetVideoPort(shexiangtou.pDevHandle, g_sdkReqCallback, pCtx摄像头1);
            if (iReqID < TPOpenSDK.IPC_EC_OK)
            {
                XLog.XTrace.WriteLine(string.Format("错误:获取视频端口失败123!\n"));
                return;
            }
            reqControllerHashTable摄像头1.Add(iReqID, 0);
            reqOpHashTable摄像头1.Add(iReqID, SDKReqOperation.GetVideoPort);
        }


        private void 预览(PreviewController shexiangtou)
        {
            if (shexiangtou.pDevHandle == IntPtr.Zero)
            {
                XLog.XTrace.WriteLine(string.Format("错误:请先连接设备!\n"));
                return;
            }
            if (!shexiangtou.bPlaying)
            {
                if (TPOpenSDK.SDKDevGetVideoPort(shexiangtou.pDevHandle) < 0)
                {
                    XLog.XTrace.WriteLine(string.Format("错误:请先获取视频端口!\n"));
                    return;
                }

                int iChannel = -1;
                if (shexiangtou.pPlayerHandle != IntPtr.Zero)
                {
                    TPOpenSDK.SDKDeletePlayer(shexiangtou.pPlayerHandle);
                }
                shexiangtou.pPlayerHandle = TPOpenSDK.SDKCreatePlayer(callBcakCtx摄像头1);
                TPOpenSDK.SDKPlayerStartPreview(shexiangtou.pPlayerHandle,
                    shexiangtou.pDevHandle, iChannel, TPOpenSDK.TPPLAYER_PLAY_QUALITY_VGA,
                    shexiangtou.pWinHandle);

            }
            else
            {
                if (shexiangtou.pPlayerHandle != IntPtr.Zero)
                {
                    TPOpenSDK.SDKPlayerStopPreview(shexiangtou.pPlayerHandle);
                }
                if (shexiangtou.bTalking && shexiangtou.pTalkPlayerHandle != IntPtr.Zero)
                {
                    TPOpenSDK.SDKPlayerStopVoiceTalk(shexiangtou.pTalkPlayerHandle);
                }
            }
        }

        private void btnSnapshot_Click(object sender, EventArgs e)
        {
            截图(摄像头1);
        }

        private bool 截图(PreviewController shexiangtou)
        {
            if (shexiangtou.pPlayerHandle == IntPtr.Zero)
            {
                XLog.XTrace.WriteLine(string.Format("错误:请先进行播放!\n"));
                return false;
            }
            string strFilePath = string.Format("\\TPSnapshot_{0}.jpg", DateTime.Now.ToString("yyyy-MM-dd-hhmmss"));
            TPOpenSDK.SDKPlayerSnapshot(shexiangtou.pPlayerHandle,
                System.Windows.Forms.Application.StartupPath + strFilePath);
            return true;
        }

        delegate void SetUIcallback();
        private static void sdkReqCallback(IntPtr pContext, TPOpenSDK.SDKIPCReqResponse pResp, int iDataNum, IntPtr pData)
        {
            Context context = (Context)Marshal.PtrToStructure(pContext, typeof(Context));
            //SetUIcallback callback = delegate ()/*使用委托*/
            //{
            context.Form.handleReqCallback(pResp, iDataNum, pData);
            //};
            //context.Form.textBoxLog.Invoke(callback);

        }

        private void handleReqCallback(TPOpenSDK.SDKIPCReqResponse resp, int iDataNum, IntPtr pData)
        {
            if (!reqControllerHashTable摄像头1.Contains(resp.iReqID) || !reqOpHashTable摄像头1.Contains(resp.iReqID))
            {
                reqControllerHashTable摄像头1.Remove(resp.iReqID);
                reqOpHashTable摄像头1.Remove(resp.iReqID);
                return;
            }
            int iReqWinIndex = (int)reqControllerHashTable摄像头1[resp.iReqID];
            SDKReqOperation operation = (SDKReqOperation)reqOpHashTable摄像头1[resp.iReqID];
            if (operation != SDKReqOperation.DownloadProgress) /* DownloadProgress回调先不删除,会多次收到 */
            {
                reqControllerHashTable摄像头1.Remove(resp.iReqID);
                reqOpHashTable摄像头1.Remove(resp.iReqID);
            }
            switch (operation)
            {
                case SDKReqOperation.DevLogin:
                    if (resp.iError < TPOpenSDK.IPC_EC_OK)
                    {
                        XLog.XTrace.WriteLine(string.Format("错误:登录设备失败,错误:{0},设备返回错误码:{1}\n", resp.iError, resp.iRval));
                        break;
                    }
                    else
                    {
                        XLog.XTrace.WriteLine(string.Format("33成功:设备登录!\n"));
                        int iReqID = TPOpenSDK.SDKReqConnectDev(摄像头1.pDevHandle, g_sdkReqCallback, pCtx摄像头1);

                        if (iReqID < TPOpenSDK.IPC_EC_OK)
                        {
                            XLog.XTrace.WriteLine(string.Format("错误:设备连接调用失败456!\n"));
                            //break;
                            return;

                        }
                        reqOpHashTable摄像头1.Add(iReqID, SDKReqOperation.DevConnect);
                        reqControllerHashTable摄像头1.Add(iReqID, iReqWinIndex);



                        Task.Run(() =>
                        获取视频端口(摄像头1)
                        );
                    }
                    break;

                case SDKReqOperation.GetVideoPort:
                    if (resp.iError < TPOpenSDK.IPC_EC_OK)
                    {
                        XLog.XTrace.WriteLine(string.Format("44AA错误:获取视频端口失败:{0},设备返回错误码:{1}\n", resp.iError, resp.iRval));
                        break;
                    }
                    XLog.XTrace.WriteLine(string.Format("44成功:获取视频端口!\n"));
                    //labelVideoPort = Convert.ToString(TPOpenSDK.SDKDevGetVideoPort(摄像头1.pDevHandle));

                    预览(摄像头1);

                    break;

            }
        }

        public void playerSnapshotCallback(IntPtr pPlayer, int iErrorCode, string pcFilePath)
        {
            SetUIcallback callback = delegate ()/*使用委托*/
            {
                if (iErrorCode != TPOpenSDK.TPPLAYER_PLAY_OK)
                {
                    XLog.XTrace.WriteLine(string.Format("错误:截图失败,返回码:{0}\n", iErrorCode));
                }
                else
                {
                    XLog.XTrace.WriteLine(string.Format("8成功:截图路径:{0}\n", pcFilePath));
                }
            };
            this.BeginInvoke(callback);
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            ctx摄像头1.Form = this;
            pCtx摄像头1 = Marshal.AllocHGlobal(Marshal.SizeOf(ctx摄像头1));
            Marshal.StructureToPtr(ctx摄像头1, pCtx摄像头1, false);

            摄像头1 = new PreviewController();
            摄像头1.pWinHandle = pictureBox1.Handle;

            callBcakCtx摄像头1.SnapshotCallback = playerSnapshotCallback;
            playbackCallBcakCtx摄像头1.SnapshotCallback = playerSnapshotCallback;

            if (TPOpenSDK.SDKAppReqStart() == TPOpenSDK.IPC_EC_OK)
            {
                XLog.XTrace.WriteLine(string.Format("11成功:SDK初始化成功!\n"));
                初始化(摄像头1, "10.8.32.252", 80);
            }
        }
    }
}