﻿

{"id":15998,"date":"2023-10-07T17:15:02","date_gmt":"2023-10-07T08:15:02","guid":{"rendered":"https:\/\/www.bitstrong.com\/jp\/?p=15998"},"modified":"2024-01-12T09:37:29","modified_gmt":"2024-01-12T00:37:29","slug":"thermal-manually-measuring-temperature","status":"publish","type":"post","link":"https:\/\/www.bitstrong.com\/jp\/thermal-manually-measuring-temperature\/","title":{"rendered":"\u3010Thermal\u3011Manually Measuring Temperature"},"content":{"rendered":"<p><strong><span style=\"font-size: 18pt;\">\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0<\/span><\/strong><\/p>\n<div>\/\/<\/div>\n<div>\/\/ Device Network SDK (Thermal)<\/div>\n<div>\/\/ Manually Measure Temperature<\/div>\n<div>\/\/ Sample Code of Manually Measuring Temperature<\/div>\n<div>\/\/<\/div>\n<div>#include &lt;stdio.h&gt;<\/div>\n<div>#include &lt;iostream&gt;<\/div>\n<div>#include &#8220;Windows.h&#8221;<\/div>\n<div>#include &#8220;HCNetSDK.h&#8221;<\/div>\n<p>using namespace std;<\/p>\n<div>\/\/Macro Definition of temporal resolution<\/div>\n<div>#define GET_YEAR(_time_)\u00a0 \u00a0 \u00a0 (((_time_)&gt;&gt;26) + 2000)<\/div>\n<div>#define GET_MONTH(_time_)\u00a0 \u00a0 \u00a0(((_time_)&gt;&gt;22) &amp; 15)<\/div>\n<div>#define GET_DAY(_time_)\u00a0 \u00a0 \u00a0 \u00a0(((_time_)&gt;&gt;17) &amp; 31)<\/div>\n<div>#define GET_HOUR(_time_)\u00a0 \u00a0 \u00a0 (((_time_)&gt;&gt;12) &amp; 31)<\/div>\n<div>#define GET_MINUTE(_time_)\u00a0 \u00a0 (((_time_)&gt;&gt;6)\u00a0 &amp; 63)<\/div>\n<p>#define GET_SECOND(_time_)\u00a0 \u00a0 (((_time_)&gt;&gt;0)\u00a0 &amp; 63)<\/p>\n<div>int iNum=0;<\/div>\n<div>#define ISAPI_OUT_LEN 3 * 1024 * 1024<\/div>\n<p>#define ISAPI_STATUS_LEN\u00a0 8*1024<\/p>\n<div>void CALLBACK GetManualThermInfoCallback(DWORD dwType, void* lpBuffer, DWORD dwBufLen, void* pUserData)<\/div>\n<div>{<\/div>\n<div>\u00a0 \u00a0 if (dwType == NET_SDK_CALLBACK_TYPE_DATA)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 LPNET_SDK_MANUAL_THERMOMETRY lpManualThermometry = new NET_SDK_MANUAL_THERMOMETRY;<\/div>\n<div>memcpy(lpManualThermometry, lpBuffer, sizeof(*lpManualThermometry));<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_TIME struAbsTime = {0};<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwYear = GET_YEAR(lpManualThermometry-&gt;dwAbsTime);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwMonth = GET_MONTH(lpManualThermometry-&gt;dwAbsTime);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwDay = GET_DAY(lpManualThermometry-&gt;dwAbsTime);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwHour = GET_HOUR(lpManualThermometry-&gt;dwAbsTime);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 struAbsTime.dwMinute = GET_MINUTE(lpManualThermometry-&gt;dwAbsTime);<\/div>\n<p>struAbsTime.dwSecond = GET_SECOND(lpManualThermometry-&gt;dwAbsTime);<\/p>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;Manual Temperature Measurement Result: dwChannel[%d]byThermometryUnit[d%]dwAbsTime[%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d]\\n&#8221;,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 lpManualThermometry-&gt;dwChannel, lpManualThermometry-&gt;byThermometryUnit, struAbsTime.dwYear,<\/div>\n<p>struAbsTime.dwMonth, struAbsTime.dwDay, struAbsTime.dwHour, struAbsTime.dwMinute, struAbsTime.dwSecond);<\/p>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if (lpManualThermometry != NULL)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 delete lpManualThermometry;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 lpManualThermometry = NULL;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 else if (dwType == NET_SDK_CALLBACK_TYPE_STATUS)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 DWORD dwStatus = *(DWORD*)lpBuffer;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 if (dwStatus == NET_SDK_CALLBACK_STATUS_SUCCESS)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;dwStatus:NET_SDK_CALLBACK_STATUS_SUCCESS\\n&#8221;);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 else if (dwStatus == NET_SDK_CALLBACK_STATUS_FAILED)<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 DWORD dwErrCode = *(DWORD*)((char *)lpBuffer + 4);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_GET_MANUALTHERM_INFO failed, Error code %d\\n&#8221;, dwErrCode);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 }<\/div>\n<p>}<\/p>\n<div>void main()<\/div>\n<div>{<\/div>\n<div>DWORD dwChannel = 2;\u00a0 \/\/Thermal imaging channel<\/div>\n<div>\u00a0 \u00a0 char *m_pOutBuf = new char[ISAPI_OUT_LEN];<\/div>\n<div>memset(m_pOutBuf, 0, ISAPI_OUT_LEN);<\/div>\n<div>\u00a0 \u00a0 char *m_pStatusBuf = new char[ISAPI_STATUS_LEN];<\/div>\n<p>memset(m_pStatusBuf, 0, ISAPI_STATUS_LEN);<\/p>\n<div>\u00a0 \u00a0 \/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>\u00a0 \u00a0 \/\/Initialize<\/div>\n<div>NET_DVR_Init();<\/div>\n<div>\u00a0 \u00a0 \/\/Set connected time and reconnected time<\/div>\n<div>\u00a0 \u00a0 NET_DVR_SetConnectTime(2000, 1);<\/div>\n<p>NET_DVR_SetReconnect(10000, true);<\/p>\n<div>\u00a0 \u00a0 \/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>\u00a0 \u00a0 \/\/Register device (it is not required when listening alarm)<\/div>\n<div>\u00a0 \u00a0 LONG lUserID;<\/div>\n<div>\u00a0 \u00a0 NET_DVR_DEVICEINFO_V30 struDeviceInfo;<\/div>\n<div>\u00a0 \u00a0 lUserID = NET_DVR_Login_V30(&#8220;10.8.10.199 &#8220;, 8000, &#8220;admin&#8221;, &#8220;abcd1234&#8221;, &amp;struDeviceInfo);<\/div>\n<div>\u00a0 \u00a0 if (lUserID &lt; 0)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;Login error, %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 NET_DVR_Cleanup();<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 return;<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 \/\/Capability sets of manual temperature measurement<\/div>\n<div>\u00a0 \u00a0 NET_DVR_STD_ABILITY struStdAbility = {0};<\/div>\n<div>\u00a0 \u00a0 struStdAbility.lpCondBuffer = &amp;dwChannel;<\/div>\n<div>\u00a0 \u00a0 struStdAbility.dwCondSize = sizeof(DWORD);<\/div>\n<div>\u00a0 \u00a0 struStdAbility.lpOutBuffer\u00a0 \u00a0 = m_pOutBuf;<\/div>\n<div>\u00a0 \u00a0 struStdAbility.dwOutSize\u00a0 \u00a0 \u00a0 = ISAPI_OUT_LEN;<\/div>\n<div>\u00a0 \u00a0 struStdAbility.lpStatusBuffer = m_pStatusBuf;<\/div>\n<p>struStdAbility.dwStatusSize\u00a0 \u00a0= ISAPI_STATUS_LEN;<\/p>\n<div>\u00a0 \u00a0 if(!NET_DVR_GetSTDAbility(lUserID,NET_DVR_GET_MANUALTHERM_CAPABILITIES,&amp;struStdAbility))<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_GET_MANUALTHERM_CAPABILITIES failed, error code: %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 else<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_GET_MANUALTHERM_CAPABILITIES is successful!&#8221;);<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 \/\/Configure basic parameter of manual temperature measurement<\/div>\n<div>\u00a0 \u00a0 NET_DVR_STD_CONFIG struStdConfig = {0};<\/div>\n<div>\u00a0 \u00a0 struStdConfig.lpCondBuffer = &amp;dwChannel;<\/div>\n<div>\u00a0 \u00a0 struStdConfig.dwCondSize = sizeof(dwChannel);<\/div>\n<div>\u00a0 \u00a0 struStdConfig.lpInBuffer = NULL;<\/div>\n<div>\u00a0 \u00a0 struStdConfig.dwInSize = 0;<\/div>\n<div>\u00a0 \u00a0 NET_SDK_MANUALTHERM_BASICPARAM struManualThermBasicParam = {0};<\/div>\n<div>\u00a0 \u00a0 struStdConfig.lpOutBuffer = (LPVOID)&amp;struManualThermBasicParam;<\/div>\n<div>\u00a0 \u00a0 struStdConfig.dwOutSize = sizeof(struManualThermBasicParam);<\/div>\n<div>\u00a0 \u00a0 struStdConfig.lpStatusBuffer = m_pStatusBuf;<\/div>\n<div>struStdConfig.dwStatusSize = ISAPI_STATUS_LEN;<\/div>\n<p>DWORD dwReturned=0;<\/p>\n<div>\u00a0 \u00a0 if(!NET_DVR_GetSTDConfig(lUserID,NET_DVR_GET_MANUALTHERM_BASICPARAM,&amp;struStdConfig))<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_GET_MANUALTHERM_BASICPARAM failed, error code: %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 else<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_GET_MANUALTHERM_BASICPARAM is successful!&#8221;);<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 struManualThermBasicParam.wDistance = 20; \/\/Distance (m), ranging from 0 to 10000<\/div>\n<div>\u00a0 \u00a0 struStdConfig.lpInBuffer = (LPVOID)&amp;struManualThermBasicParam;<\/div>\n<p>struStdConfig.dwInSize = sizeof(struManualThermBasicParam);<\/p>\n<div>\u00a0 \u00a0 if(!NET_DVR_SetSTDConfig(lUserID,NET_DVR_SET_MANUALTHERM_BASICPARAM,&amp;struStdConfig))<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_SET_MANUALTHERM_BASICPARAM failed, error code: %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 else<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_SET_MANUALTHERM_BASICPARAM is successful!&#8221;);<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 \/\/Configure rule for manual temperature measurement<\/div>\n<div>\u00a0 \u00a0 NET_SDK_MANUAL_THERMOMETRY struManualTherm = {0};<\/div>\n<div>\u00a0 \u00a0 struManualTherm.dwSize = sizeof(struManualTherm);<\/div>\n<div>\u00a0 \u00a0 struManualTherm.dwChannel = dwChannel;<\/div>\n<div>\u00a0 \u00a0 struManualTherm.byThermometryUnit = 0; \/\/Temperature unit: 0-Centigrade\uff0c1-Fahrenheit, 2-Kelvin<\/div>\n<div>\u00a0 \u00a0 struManualTherm.struRuleInfo.byRuleID = 1;<\/div>\n<div>\u00a0 \u00a0 struManualTherm.struRuleInfo.byEnable=1;<\/div>\n<div>\u00a0 \u00a0 strcpy(struManualTherm.struRuleInfo.szRuleName, &#8220;TestName&#8221;);<\/div>\n<div>\u00a0 \u00a0 struManualTherm.struRuleInfo.byRuleCalibType = 0;<\/div>\n<div>\u00a0 \u00a0 struManualTherm.struRuleInfo.struPointTherm.struPoint.fX = 0.5; \/\/Normalized value, ranging from 0.001 to 1.<\/div>\n<div>\u00a0 \u00a0 struManualTherm.struRuleInfo.struPointTherm.struPoint.fY = 0.5; \/\/Normalized value, ranging from 0.001 to 1.<\/div>\n<div>\u00a0 \u00a0 struStdConfig.lpCondBuffer = &amp;dwChannel;<\/div>\n<div>\u00a0 \u00a0 struStdConfig.dwCondSize = sizeof(dwChannel);<\/div>\n<div>\u00a0 \u00a0 struStdConfig.lpInBuffer = (LPVOID)&amp;struManualTherm;;<\/div>\n<p>struStdConfig.dwInSize = sizeof(struManualTherm);<\/p>\n<div>\u00a0 \u00a0 if(!NET_DVR_SetSTDConfig(lUserID,NET_DVR_SET_MANUALTHERM,&amp;struStdConfig))<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_SET_MANUALTHERM failed, error code: %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 else<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_SET_MANUALTHERM is successful!&#8221;);<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 \/\/Enable manual temperature measurement<\/div>\n<div>\u00a0 \u00a0 NET_DVR_REALTIME_THERMOMETRY_COND struThermCond = {0};<\/div>\n<div>\u00a0 \u00a0 struThermCond.dwSize = sizeof(struThermCond);<\/div>\n<div>\u00a0 \u00a0 struThermCond.byRuleID = 1;\u00a0 \u00a0 \u00a0 \u00a0\/\/Rule ID, 0-Get all rules, the rule ID starts from 1.<\/div>\n<p>struThermCond.dwChan = dwChannel; \/\/Start from 1, 0xffffffff- Get all channels<\/p>\n<div>\u00a0 \u00a0 LONG ManualHandle = NET_DVR_StartRemoteConfig(lUserID, NET_DVR_GET_MANUALTHERM_INFO, &amp;struThermCond, sizeof(struThermCond), GetManualThermInfoCallback, NULL);<\/div>\n<div>\u00a0 \u00a0 if (ManualHandle &gt;= 0)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_GET_MANUALTHERM_INFO failed, error code: %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>\u00a0 \u00a0 }<\/div>\n<div>\u00a0 \u00a0 else<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_GET_MANUALTHERM_INFO is successful!&#8221;);<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 Sleep(5000);\u00a0 \/\/Wait for receiving manual measurement result<\/div>\n<div>\u00a0 \u00a0 \/\/Close the handle created by long connection configuration API, and release resource.<\/div>\n<div>\u00a0 \u00a0 if(!NET_DVR_StopRemoteConfig(ManualHandle))<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;NET_DVR_StopRemoteConfig failed, error code: %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 \/\/User logout, if the user is not login, skip this step.<\/div>\n<p>NET_DVR_Logout(lUserID);<\/p>\n<div>\u00a0 \u00a0 \/\/Release SDK resource<\/div>\n<p>NET_DVR_Cleanup();<\/p>\n<div>\u00a0 \u00a0 if (m_pOutBuf != NULL)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 delete []m_pOutBuf;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 m_pOutBuf = NULL;<\/div>\n<p>}<\/p>\n<div>\u00a0 \u00a0 if (m_pStatusBuf != NULL)<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 delete []m_pStatusBuf;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 m_pStatusBuf = NULL;<\/div>\n<div>}<\/div>\n<div>\u00a0 \u00a0 return;<\/div>\n<div>}<\/div>\n","protected":false},"excerpt":{"rendered":"\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0 \/\/ \/\/ Device Network SDK (Thermal) \/\/ Manually Measure Temperature \/\/ Sample Code of Manually Measuring Temperature \/\/ #include &lt;stdio.h&gt; ...","protected":false},"author":2,"featured_media":15936,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"categories":[107],"tags":[],"class_list":["post-15998","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-camera-connection"],"_links":{"self":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/15998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/comments?post=15998"}],"version-history":[{"count":1,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/15998\/revisions"}],"predecessor-version":[{"id":15999,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/15998\/revisions\/15999"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/media\/15936"}],"wp:attachment":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/media?parent=15998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/categories?post=15998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/tags?post=15998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}