[C#] 折騰海康威視的人體測溫 模組

来源:https://www.cnblogs.com/catzhou/archive/2020/05/21/12928921.html
-Advertisement-
Play Games

單位的項目需要測溫,同事買了個海康威視的人體測溫機芯,型號位:TB 4117 3/S,給了一份pdf的說明書。 按說明書把設備連接設置好,從官網下載了sdk,我的個乖乖,壓縮包就有70多M,把他家的所有東西都給了我,有各種Demo,就是沒有測溫的,暈死,差點想打退堂鼓不玩了。 最後,最後得到如下成果 ...


單位的項目需要測溫,同事買了個海康威視的人體測溫機芯,型號位:TB-4117-3/S,給了一份pdf的說明書。

按說明書把設備連接設置好,從官網下載了sdk,我的個乖乖,壓縮包就有70多M,把他家的所有東西都給了我,有各種Demo,就是沒有測溫的,暈死,差點想打退堂鼓不玩了。

最後,最後得到如下成果:

一、所需的DLL

  1. HCCore.dll
  2. HCCoreDevCfg.dll 這玩意必須在運行目錄
  3. HCGeneralCfgMgr.dll 這鬼也必須在運行目錄
  4. HCNetSDK.dll
  5. libeay32.dll
  6. ssleay32.dll
    以上6個文件必須的,幹啥用俺也不知道,反正缺一不可。

二、委托、dll封裝、數據結果


        public delegate void LOGINRESULTCALLBACK(int lUserID, int dwResult, IntPtr lpDeviceInfo, IntPtr pUser);
        public delegate void UpdateTextStatusCallback(string strLogStatus, IntPtr lpDeviceInfo);
        public delegate void RemoteConfigCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData);


        #region DllWrapper
        const string DllFileName = "HCNetSDK.dll";
        [DllImport(DllFileName)]
        public static extern bool NET_DVR_Init();
        [DllImport(DllFileName)]
        public static extern int NET_DVR_Login_V40(ref NET_DVR_USER_LOGIN_INFO pLoginInfo, ref NET_DVR_DEVICEINFO_V40 lpDeviceInfo);
        [DllImportAttribute(DllFileName)]
        public static extern int NET_DVR_StartRemoteConfig(int lUserID, int dwCommand, IntPtr lpInBuffer, Int32 dwInBufferLen, RemoteConfigCallback cbStateCallback, IntPtr pUserData);
        [DllImport(DllFileName)]
        public static extern bool NET_DVR_Logout(int iUserID);
        [DllImport(DllFileName)]
        public static extern bool NET_DVR_Cleanup();
        [DllImport(DllFileName)]
        public static extern uint NET_DVR_GetLastError();
        #endregion

        #region Data

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_THERMOMETRY_UPLOAD
        {
            public uint dwSize;
            public uint dwRelativeTime;     // 相對時標
            public uint dwAbsTime;            // 絕對時標
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)]
            public byte[] szRuleName;//規則名稱
            public byte byRuleID;//規則ID號
            public byte byRuleCalibType;//規則標定類型 0-點,1-框,2-線
            public ushort wPresetNo; //預置點號
            [MarshalAs(UnmanagedType.Struct)]
            public NET_DVR_POINT_THERM_CFG struPointThermCfg;
            [MarshalAs(UnmanagedType.Struct)]

            public NET_DVR_LINEPOLYGON_THERM_CFG struLinePolygonThermCfg;
            public byte byThermometryUnit;//測溫單位: 0-攝氏度(℃),1-華氏度(℉),2-開爾文(K)
            public byte byDataType;//數據狀態類型:0-檢測中,1-開始,2-結束
            public byte byRes1;
            /*
            bit0-中心點測溫:0-不支持,1-支持;
            bit1-最高點測溫:0-不支持,1-支持;
            bit2-最低點測溫:0-不支持,1-支持;
            */
            public byte bySpecialPointThermType;// 是否支持特殊點測溫
            public float fCenterPointTemperature;//中心點溫度,精確到小數點後一位(-40-1500),(浮點數+100)*10 (由bySpecialPointThermType判斷是否支持中心點)
            public float fHighestPointTemperature;//最高點溫度,精確到小數點後一位(-40-1500),(浮點數+100)*10(由bySpecialPointThermType判斷是否支持最高點)
            public float fLowestPointTemperature;//最低點溫度,精確到小數點後一位(-40-1500),(浮點數+100)*10(由bySpecialPointThermType判斷是否支持最低點)
            [MarshalAs(UnmanagedType.Struct)]
            public NET_VCA_POINT struHighestPoint;//線、框測溫最高溫度位置坐標(當規則標定類型為線、框的時候生效)
            [MarshalAs(UnmanagedType.Struct)]
            public NET_VCA_POINT struLowestPoint;//線、框測溫最低溫度位置坐標(當規則標定類型為線、框的時候生效)
            public byte byIsFreezedata;//是否數據凍結 0-否 1-是
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;
            public uint dwChan; //通道號,查詢條件中通道號為0xffffffff時該欄位生效
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 88, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_POINT_THERM_CFG
        {
            public float fTemperature;
            public NET_VCA_POINT struPoint;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 120, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;

        }

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_LINEPOLYGON_THERM_CFG
        {
            public float fMaxTemperature;
            public float fMinTemperature;
            public float fAverageTemperature;
            public float fTemperatureDiff;
            public NET_VCA_POLYGON struRegion;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }
        public const int VCA_MAX_POLYGON_POINT_NUM = 10;//檢測區域最多支持10個點的多邊形

        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_VCA_POLYGON
        {
            /// DWORD->unsigned int
            public uint dwPointNum;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = VCA_MAX_POLYGON_POINT_NUM, ArraySubType = UnmanagedType.Struct)]
            public NET_VCA_POINT[] struPos;
        }
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_VCA_POINT
        {
            public float fX;// X軸坐標, 0.001~1
            public float fY;//Y軸坐標, 0.001~1
        }



        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_REALTIME_THERMOMETRY_COND
        {
            public uint dwSize;
            public uint dwChan;//通道號,從1開始,0xffffffff代表獲取全部通道
            public byte byRuleID; //規則ID 0-代表獲取全部規則,具體規則ID從1開始 
            /*
            1-定時模式:設備每隔一秒上傳各個規則測溫數據的最高溫、最低溫和平均溫度值、溫差
            2-溫差模式:若上一秒與下一秒的最高溫或者最低溫或者平均溫或者溫差值的溫差大於等於2攝氏度,則上傳最高溫、最低溫和平均溫度值。若大於等於一個小時溫差值均小於2攝氏度,則上傳最高溫、最低溫、平均溫和溫差值
            */
            public byte byMode; //長連接模式, 0-保留(為相容老設備),1-定時模式,2-溫差模式
            public ushort wInterval; //上傳間隔,僅溫差模式支持,1~3600S,填0則預設3600S上傳一次
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 60, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes; //保留
        }
        public const int NET_DVR_DEV_ADDRESS_MAX_LEN = 129;
        public const int NET_DVR_LOGIN_USERNAME_MAX_LEN = 64;
        public const int NET_DVR_LOGIN_PASSWD_MAX_LEN = 64;

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_USER_LOGIN_INFO
        {
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_DEV_ADDRESS_MAX_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sDeviceAddress;
            public byte byUseTransport;
            public ushort wPort;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_LOGIN_USERNAME_MAX_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sUserName;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_LOGIN_PASSWD_MAX_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sPassword;
            public LOGINRESULTCALLBACK cbLoginResult;
            public IntPtr pUser;
            public bool bUseAsynLogin;
            public byte byProxyType; //0:不使用代理,1:使用標準代理,2:使用EHome代理
            public byte byUseUTCTime;    //0-不進行轉換,預設,1-介面上輸入輸出全部使用UTC時間,SDK完成UTC時間與設備時區的轉換,2-介面上輸入輸出全部使用平臺本地時間,SDK完成平臺本地時間與設備時區的轉換
            public byte byLoginMode; //0-Private, 1-ISAPI, 2-自適應
            public byte byHttps;    //0-不適用tls,1-使用tls 2-自適應
            public int iProxyID;    //代理伺服器序號,添加代理伺服器信息時,相對應的伺服器數組下表值
            public byte byVerifyMode;  //認證方式,0-不認證,1-雙向認證,2-單向認證;認證僅在使用TLS的時候生效;    
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 119, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes3;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_DEVICEINFO_V40
        {
            public NET_DVR_DEVICEINFO_V30 struDeviceV30;
            public byte bySupportLock;        //設備支持鎖定功能,該欄位由SDK根據設備返回值來賦值的。bySupportLock為1時,dwSurplusLockTime和byRetryLoginTime有效
            public byte byRetryLoginTime;	    //剩餘可嘗試登陸的次數,用戶名,密碼錯誤時,此參數有效
            public byte byPasswordLevel;      //admin密碼安全等級0-無效,1-預設密碼,2-有效密碼,3-風險較高的密碼。當用戶的密碼為出廠預設密碼(12345)或者風險較高的密碼時,上層客戶端需要提示用戶更改密碼。      
            public byte byProxyType;//代理類型,0-不使用代理, 1-使用socks5代理, 2-使用EHome代理
            public uint dwSurplusLockTime;	//剩餘時間,單位秒,用戶鎖定時,此參數有效
            public byte byCharEncodeType;     //字元編碼類型
            public byte bySupportDev5;//支持v50版本的設備參數獲取,設備名稱和設備類型名稱長度擴展為64位元組
            public byte bySupport;  //能力集擴展,位與結果:0- 不支持,1- 支持
            // bySupport & 0x1:  保留
            // bySupport & 0x2:  0-不支持變化上報 1-支持變化上報
            public byte byLoginMode; //登錄模式 0-Private登錄 1-ISAPI登錄
            public int dwOEMCode;
            public int iResidualValidity;   //該用戶密碼剩餘有效天數,單位:天,返回負值,表示密碼已經超期使用,例如“-3表示密碼已經超期使用3天”
            public byte byResidualValidity; // iResidualValidity欄位是否有效,0-無效,1-有效
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 243, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;
        }

        public const int SERIALNO_LEN = 48;//序列號長度

        //NET_DVR_Login_V30()參數結構
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_DEVICEINFO_V30
        {
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sSerialNumber;  //序列號
            public byte byAlarmInPortNum;		        //報警輸入個數
            public byte byAlarmOutPortNum;		        //報警輸出個數
            public byte byDiskNum;				    //硬碟個數
            public byte byDVRType;				    //設備類型, 1:DVR 2:ATM DVR 3:DVS ......
            public byte byChanNum;				    //模擬通道個數
            public byte byStartChan;			        //起始通道號,例如DVS-1,DVR - 1
            public byte byAudioChanNum;                //語音通道數
            public byte byIPChanNum;					//最大數字通道個數,低位  
            public byte byZeroChanNum;			//零通道編碼個數 //2010-01-16
            public byte byMainProto;			//主碼流傳輸協議類型 0-private, 1-rtsp,2-同時支持private和rtsp
            public byte bySubProto;				//子碼流傳輸協議類型0-private, 1-rtsp,2-同時支持private和rtsp
            public byte bySupport;        //能力,位與結果為0表示不支持,1表示支持,
                                          //bySupport & 0x1, 表示是否支持智能搜索
                                          //bySupport & 0x2, 表示是否支持備份
                                          //bySupport & 0x4, 表示是否支持壓縮參數能力獲取
                                          //bySupport & 0x8, 表示是否支持多網卡
                                          //bySupport & 0x10, 表示支持遠程SADP
                                          //bySupport & 0x20, 表示支持Raid卡功能
                                          //bySupport & 0x40, 表示支持IPSAN 目錄查找
                                          //bySupport & 0x80, 表示支持rtp over rtsp
            public byte bySupport1;        // 能力集擴充,位與結果為0表示不支持,1表示支持
                                           //bySupport1 & 0x1, 表示是否支持snmp v30
                                           //bySupport1 & 0x2, 支持區分回放和下載
                                           //bySupport1 & 0x4, 是否支持佈防優先順序	
                                           //bySupport1 & 0x8, 智能設備是否支持佈防時間段擴展
                                           //bySupport1 & 0x10, 表示是否支持多磁碟數(超過33個)
                                           //bySupport1 & 0x20, 表示是否支持rtsp over http	
                                           //bySupport1 & 0x80, 表示是否支持車牌新報警信息2012-9-28, 且還表示是否支持NET_DVR_IPPARACFG_V40結構體
            public byte bySupport2; /*能力,位與結果為0表示不支持,非0表示支持							
							bySupport2 & 0x1, 表示解碼器是否支持通過URL取流解碼
							bySupport2 & 0x2,  表示支持FTPV40
							bySupport2 & 0x4,  表示支持ANR
							bySupport2 & 0x8,  表示支持CCD的通道參數配置
							bySupport2 & 0x10,  表示支持佈防報警回傳信息(僅支持抓拍機報警 新老報警結構)
							bySupport2 & 0x20,  表示是否支持單獨獲取設備狀態子項
							bySupport2 & 0x40,  表示是否是碼流加密設備*/
            public ushort wDevType;              //設備型號
            public byte bySupport3; //能力集擴展,位與結果為0表示不支持,1表示支持
                                    //bySupport3 & 0x1, 表示是否多碼流
                                    // bySupport3 & 0x4 表示支持按組配置, 具體包含 通道圖像參數、報警輸入參數、IP報警輸入、輸出接入參數、
                                    // 用戶參數、設備工作狀態、JPEG抓圖、定時和時間抓圖、硬碟盤組管理 
                                    //bySupport3 & 0x8為1 表示支持使用TCP預覽、UDP預覽、多播預覽中的"延時預覽"欄位來請求延時預覽(後續都將使用這種方式請求延時預覽)。而當bySupport3 & 0x8為0時,將使用 "私有延時預覽"協議。
                                    //bySupport3 & 0x10 表示支持"獲取報警主機主要狀態(V40)"。
                                    //bySupport3 & 0x20 表示是否支持通過DDNS功能變數名稱解析取流

            public byte byMultiStreamProto;//是否支持多碼流,按位表示,0-不支持,1-支持,bit1-碼流3,bit2-碼流4,bit7-主碼流,bit-8子碼流
            public byte byStartDChan;		//起始數字通道號,0表示無效
            public byte byStartDTalkChan;	//起始數字對講通道號,區別於模擬對講通道號,0表示無效
            public byte byHighDChanNum;		//數字通道個數,高位
            public byte bySupport4;
            public byte byLanguageType;// 支持語種能力,按位表示,每一位0-不支持,1-支持  
                                       //  byLanguageType 等於0 表示 老設備
                                       //  byLanguageType & 0x1表示支持中文
                                       //  byLanguageType & 0x2表示支持英文
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 9, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;		//保留
        }

        #endregion

三、測溫

 const string IPAddress = "192.168.1.64";
        const string UserName = "admin";
        const string Password = "13245678";
        const ushort PortNo = 8000;
        static void Main(string[] args)
        {
            //初始化
            if (!NET_DVR_Init())
            {
                Console.WriteLine("NET_DVR_Init error!");
                return;
            }
            //登陸
            var struLogInfo = new NET_DVR_USER_LOGIN_INFO();

            //設備IP地址或者功能變數名稱
            byte[] byIP = System.Text.Encoding.Default.GetBytes(IPAddress);
            struLogInfo.sDeviceAddress = new byte[129];
            byIP.CopyTo(struLogInfo.sDeviceAddress, 0);

            //設備用戶名
            byte[] byUserName = System.Text.Encoding.Default.GetBytes(UserName);
            struLogInfo.sUserName = new byte[64];
            byUserName.CopyTo(struLogInfo.sUserName, 0);

            //設備密碼
            byte[] byPassword = System.Text.Encoding.Default.GetBytes(Password);
            struLogInfo.sPassword = new byte[64];
            byPassword.CopyTo(struLogInfo.sPassword, 0);

            struLogInfo.wPort = PortNo;//設備服務埠號

            struLogInfo.bUseAsynLogin = false; //是否非同步登錄:0- 否,1- 是 

            var DeviceInfo = new NET_DVR_DEVICEINFO_V40();

            //登錄設備 Login the device
            var m_lUserID = NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);
            if (m_lUserID < 0)
            {
                Console.WriteLine("登陸失敗,錯誤代碼:" + NET_DVR_GetLastError()); //登錄失敗,輸出錯誤號
                return;
            }


            //配置測溫
            var size = Marshal.SizeOf(typeof(NET_DVR_REALTIME_THERMOMETRY_COND));

            NET_DVR_REALTIME_THERMOMETRY_COND struThermCond = new NET_DVR_REALTIME_THERMOMETRY_COND();
            struThermCond.dwSize = (uint)size;
            struThermCond.byRuleID = 0;       //規則ID,0代表獲取全部規則,具體規則ID從1開始
            struThermCond.dwChan = 1;// dwChannel; //從1開始,0xffffffff代表獲取全部通道

            IntPtr pCond = Marshal.AllocCoTaskMem(size);
            Marshal.StructureToPtr(struThermCond, pCond, false);
            var ret = NET_DVR_StartRemoteConfig(m_lUserID, 3629, pCond, size, Callback, IntPtr.Zero);
            if (ret < 0)
            {
                Console.WriteLine("配置測溫失敗, 錯誤代碼:" + NET_DVR_GetLastError()); //登錄失敗,輸出錯誤號
                return;
            }

            Console.WriteLine("開始測溫...");
            Console.ReadKey();

            //退出登錄
            NET_DVR_Logout(m_lUserID);

            NET_DVR_Cleanup();


        }
        /// <summary>
        /// 只顯示最高溫度
        /// </summary>
        /// <param name="dwType"></param>
        /// <param name="lpBuffer"></param>
        /// <param name="dwBufLen"></param>
        /// <param name="pUserData"></param>
        static void Callback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
        {
            var ret = Marshal.PtrToStructure<NET_DVR_THERMOMETRY_UPLOAD>(lpBuffer);
            Console.WriteLine(ret.struLinePolygonThermCfg.fMaxTemperature);
        }

哎,就這麼點事,弄得很複雜。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近年來,企業管理軟體開發領域掀起了一陣快速開發平臺的風氣,很多人覺得這是開發界有人帶的節奏,很快就會消失了,軟體開發應該回歸最真實的代碼之中。 不過隨著時間的推移,越來越多的企業認識到快速開發平臺的重要性,相比於傳統的代碼式開發風格,快速開發平臺的優勢體現的淋漓盡致。 傳統開發平臺最突出的特點就是開 ...
  • 背景:我們的應用程式通常都是由多個程式集組成,例如一個 exe 程式依賴於多個 dll 程式集。在某些情況下,我們希望程式的分發能夠簡單,單獨一個 exe 就能正常運行。這種情況下,就需要將 dll 依賴項合併到 exe 主程式中。 本文章給大家講下非常好用的NuGet 包,Costura.Fody ...
  • 一、概述 在Window伺服器部署程式後,可能因為代碼的不合理或者其他各種各樣的問題,會導致CPU暴增,甚至達到100%等情況,嚴重危及到伺服器的穩定以及系統穩定,但是一般來說對於已發佈的程式,沒法即時看到出問題的代碼,而微軟提供了一個很好的工具“WinDbg”,使得我們能夠回溯問題。下麵講一下操作 ...
  • 前言, Blazor Assembly 需要最少 1.9M 的下載量. ( Blazor WebAssembly 船新項目下載量測試 , 僅供參考. ) 隨著程式越來越複雜, 引用的東西越來越多, 需要更多的下載量 , 有一些網站的網路可能較差, 載入這些文件需要一定的時間. 對於一些網站而言, 它 ...
  • 背景介紹:基於netcore2.2開發api介面程式,自定義了一個異常捕獲中間件,用於捕獲未經處理的異常以及狀態碼404、500等訪問(設計的出發點就是,出現了非200的響應,我這邊全部會進行處理成200,並返回固定格式的JSON格式數據),併進行統一的信息返回。 返回的JSON實體定義如下: 中間 ...
  • 前言: 昨天 Blazor WebAssembly 3.2 正式發佈了. 更新 VS2019後就能直接使用. 新建了兩個PWA項目, 一個不用asp.net core (靜態部署), 一個使用asp.net core (項目模板與伺服器交互) 其中下載量主要是預壓縮有沒有被使用 , 分別為 3.2M ...
  • 上一篇文章(https://www.cnblogs.com/meowv/p/12916613.html)使用自定義倉儲完成了簡單的增刪改查案例,有心的同學可以看出,我們的返回參數一塌糊塗,顯得很不友好。 在實際開發過程中,每個公司可能不盡相同,但都大同小異,我們的返回數據都是包裹在一個公共的模型下麵 ...
  • 現象: 用Microsoft.Office.Interop.Outlook取得日曆項,然後根據業務要求篩選。 items.Restrict方法中的篩選器,使用like進行模糊查詢時,會出COMException異常。 代碼: 1 //folder取得前略 2 3 Outlook.Items item ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...