#對接指南
<p>[TOC]</p>
<p>> 如需申請Kalay APP對接,請洽商務洽談:
> 微信公眾號:物聯智慧TUTK
企業官網:<a href="https://www.throughtek.cn/">https://www.throughtek.cn/</a>
問題回饋:kalaysz_support@tutk.com</p>
<hr />
<h1>對接指引</h1>
<p><strong>在開始對接前,請確認您已準備好以下資料:</strong></p>
<ul>
<li>測試UID/certKey</li>
<li>SDK LicenseKey</li>
<li>標準SDK及說明文檔</li>
<li>[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")</li>
<li>Device Profile文件</li>
<li>功能檢查報告</li>
<li>雲端Coupon Code(如需開通雲端儲存功能)</li>
<li>KOTA海外測試帳號(如需開放OTA升級功能,指定非中國大陸及北美地區使用)</li>
<li>KOTA國內測試帳號(如需開放OTA升級功能,指定中國大陸區域使用)</li>
<li>KOTA歐洲測試帳號(如需開啟OTA升級功能,指定歐洲區域使用)</li>
<li>KOTA使用手冊(如需開啟OTA升級功能)</li>
</ul>
<h1>重要說明</h1>
<h1>一、關於設備驗證</h1>
<h2>1.1 為什麼要進行設備驗證?</h2>
<ul>
<li>設備驗證是指針對單一型號的設備,透過產生對應的設定檔來呈現設備相關功能的機制。</li>
<li>經過驗證的設備顯示:TUTK正式授權此類設備使用Kalay App;此類設備已通過TUTK內部驗證測試,各項功能開通正常。</li>
<li>經過驗證機制後,會在新增設備時呈現設備樣圖,可簡化使用者新增設備的流程,並且呈現與之對應的功能項,進而擁有更好的體驗。</li>
</ul>
<p>![選擇設備](<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=94fd5c9f857c4e835479d180955f4345&file=file.jpg">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=94fd5c9f857c4e835479d180955f4345&file=file.jpg</a> "選擇設備")</p>
<h2>1.2 如何申請設備驗證?</h2>
<ul>
<li>客戶需填寫並提供《Kalay2.0_Function Spec Fill In》 相關資料,以確認設備型號/相關功能等基本資訊。</li>
<li>TUTK產生 Device Profile 設定文件,協助上傳至驗證伺服器,並提供certKey、profileVer等資料給客戶對接。</li>
<li>設備完成相關協議對接,並提供測試樣機。</li>
<li>TUTK驗證功能通過後,提請正式出貨使用。</li>
</ul>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2faf258f73e0c1909cce448f60f15316&amp;file=file.jpg" alt="Kalay2.0對接基本流程" /></p>
<h1>二、關於開發者模式</h1>
<h2>2.1 在什麼情況下需要進入開發者模式?</h2>
<ul>
<li>在開發者模式下,Kalay App將開啟【log日誌輸出】功能,為技術檢查與問題分析,提供有效資訊。</li>
<li>在開發者模式下,可支援【本機讀取Device Profile】文件,為開發和測試階段驗證裝置功能,提供除錯工具。</li>
<li>在開發者模式下,可支援顯示【雲端儲存體驗券】入口,為開發和測試階段驗證雲端儲存功能,提供免費開通服務。</li>
</ul>
<h2>2.2 如何開啟/退出開發者模式?</h2>
<ul>
<li>開啟開發者模式:進入「我的」-「關於」頁面,快速點選4次Kalay圖示。</li>
<li>退出開發者模式:基於已開啟的狀態,再次進入「我的」-「關於」頁面,快速點擊4次Kalay圖示即可。</li>
</ul>
<p>> 備註:開發者模式可能會持續耗用手機內存,或影響App使用體驗,在正常使用情形下應避免開啟此模式。</p>
<h2>2.3 如何取得log日誌?</h2>
<ul>
<li>
<p>Android系統手機:進入「檔案管理」 - “Android”資料夾- “data”資料夾- “com.tutk.kalay”資料夾- “files”資料夾- “Log”資料夾- 找到對應時間的log .txt導出
<img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/78f948713595878c2ce16ad62e5ae6f6" alt="" />
<img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/94c87412a34296ac8f2c2bfed2174884" alt="" /></p>
</li>
<li>iOS系統手機:PC端安裝「iTools」工具 - 透過數據線連接PC端 - 點擊「應用程式」 - 找到「Kalay」應用程式的資料夾 - 進入「Log"資料夾 - 找到對應時間的log.txt匯出
<img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/00aa364698d4f3beff3bd2585ae89dc7" alt="" /></li>
</ul>
<p><a id="2.4"></a></p>
<h2>2.4 如何在本機導入Device Profile檔?</h2>
<p>> 前提條件:確認App已開啟開發者模式。</p>
<ul>
<li>
<p>Android系統手機:進入「檔案管理」 - “Android”資料夾 - “data”資料夾 - “com.tutk.kalay”資料夾 - “files”資料夾,然後將Device Profile檔案放入;
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c758665d049b8809edab1bcb21583f93&amp;file=file.png" alt="" /></p>
</li>
<li>
<p>iOS系統手機:PC端安裝「iTools」工具- 透過數據線連接PC端- 點擊「應用」 - “Kalay”應用程式- “Doucuments"資料夾- “Files”資料夾,然後將Device Profile檔案放入;
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=69cfae056b7bf9fc1bcd14f97d4f94e9&amp;file=file.png" alt="" /></p>
</li>
<li>成功放入Device Profile檔案後,重新啟動APP,並新增設備進行偵錯。</li>
</ul>
<h2>2.5 如何進行雲端儲存體驗券兌換?</h2>
<p>> 前提條件:僅在啟用開發者模式時,顯示體驗券兌換功能。</p>
<ul>
<li>從購買入口進入雲端服務頁 — 點選「我有體驗券」 — 輸入正確的體驗券兌換碼 — 點選「兌換」按鈕 — 兌換成功;</li>
</ul>
<p>![體驗券兌換](<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=915a6e2efc19fded648fbcbd42d225dc&file=file.png">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=915a6e2efc19fded648fbcbd42d225dc&file=file.png</a> "體驗券兌換")</p>
<h1>功能對接</h1>
<h1>一、新增設備功能</h1>
<h2>1.1 設備掃碼添加</h2>
<h3>1.1.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “pairing mode” 設定為「iris」時,將採用設備掃碼新增方式。</li>
<li>App端會跟IRIS伺服器建立一個連接,並等待IRIS回傳設備資訊。</li>
<li>App端將連接和配網資訊產生二維碼,發給設備端。</li>
<li>設備端聯網成功後,並將設備的相關資訊上傳給IRIS伺服器。</li>
<li>IRIS伺服器將設備資訊回傳給App。</li>
<li>App與設備進行連線並完成新增流程。</li>
</ul>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/805f49c304795de765b5097601fa7cfc" alt="" /></p>
<h3>1.1.2 App端實作</h3>
<p>App讀取Device Profile中的 “pairing mode” 陣列如下:</p>
<pre><code class="language-json">&quot;pairing_mode&quot;: [
{
&quot;flag&quot;: &quot;iris&quot;
}
]</code></pre>
<p>App按以下Json格式產生QRCode:</p>
<p><code>{&quot;r&quot;:&quot;&quot;,&quot;s&quot;:&quot;&quot;,&quot;ss&quot;:&quot;&quot;,&quot;p&quot;:&quot;&quot;,&quot;re&quot;:&quot;&quot;}</code></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th>說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">r</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td>realm,設備上傳資訊時需填入此參數</td>
</tr>
<tr>
<td style="text-align: left;">s</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td>sessionId,設備上傳資訊時需填入此參數</td>
</tr>
<tr>
<td style="text-align: left;">ss</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td>wifi ssid,設備需設定的wifi網路</td>
</tr>
<tr>
<td style="text-align: left;">p</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td>wifi password,設備設定wifi網路的密碼</td>
</tr>
<tr>
<td style="text-align: left;">re</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td>region,根據設備出貨的區域存取對應的iris伺服器 (參考不同區域的IRIS伺服器位址)</td>
</tr>
</tbody>
</table>
<p>> 注意:App端對以上定義的參數的內容(例如:特殊字元、中文等)未做任何轉換處理。</p>
<p>IRIS伺服器位址:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">存取網域名稱</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">cn</td>
<td style="text-align: left;">cn-iris-tutk.kalay.net.cn</td>
<td style="text-align: left;">中國大陸地區</td>
</tr>
<tr>
<td style="text-align: left;">us</td>
<td style="text-align: left;">us-iris-tutk.kalayservice.com</td>
<td style="text-align: left;">北美地區(美國、加拿大)</td>
</tr>
<tr>
<td style="text-align: left;">eu</td>
<td style="text-align: left;">eu-iris-tutk.kalayservice.com</td>
<td style="text-align: left;">歐洲地區</td>
</tr>
</tbody>
</table>
<p>> 備註:目前iris分cn和us兩個區域,設備端需要依照Kalay APP指定的區域回報設備訊息,否則無法新增成功。</p>
<p><a id="1.1.3"></a></p>
<h3>1.1.3 設備端實作</h3>
<p>設備端解碼出QRCode內容後,請參考以下步驟完成對接流程:</p>
<p>設備端讀取QRCode中的 "ss" 和 "p" 參數,將設備配置到該WiFi網路下。</p>
<p>設備端讀取QRCode中的 "r"、"s" 和 "re" 參數,將參數帶入HTTP請求中,上傳給IRIS伺服器。</p>
<p><strong>HTTP請求如下:</strong></p>
<p><strong>請求URL:</strong></p>
<ul>
<li><a href="https://{iris_domain}/iris/api/v1/prevali/session/{sessionId}?realm={realm">https://{iris_domain}/iris/api/v1/prevali/session/{sessionId}?realm={realm</a>}</li>
</ul>
<p><strong>請求方式:</strong></p>
<ul>
<li>post</li>
</ul>
<p><strong>Request Headers:</strong></p>
<ul>
<li>Content-Type:application/json</li>
</ul>
<p><strong>Query Params:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">realm</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">此處為取QRCode中的 "r" 參數。</td>
</tr>
<tr>
<td style="text-align: left;">sessionId</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">此處為取QRCode中的 "s" 參數。</td>
</tr>
</tbody>
</table>
<p><strong>Body</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">secretData</td>
<td style="text-align: left;">object</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">建議帶入credential 和 udid</td>
</tr>
<tr>
<td style="text-align: left;">credential</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">設備的credential</td>
</tr>
<tr>
<td style="text-align: left;">udid</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">設備的udid</td>
</tr>
</tbody>
</table>
<p><strong>credential產生方式如下:</strong></p>
<ul>
<li>例如設備的資訊如下:</li>
</ul>
<pre><code class="language-c">UID:UUUUUUUUUUUUUUUUUUUU,
Authkey:00000000
Av account: admin
Av passwd: 88888888</code></pre>
<ul>
<li>使用JSON格式組裝資訊:</li>
</ul>
<pre><code class="language-c">{
&quot;av&quot;: &quot;88888888&quot;,
&quot;ak&quot;: &quot;00000000&quot;, // 如果沒有使用authkey,則不需此字段
&quot;identity&quot;: &quot;admin&quot;
}</code></pre>
<ul>
<li>進行base64編碼產生credential:</li>
</ul>
<p>`ewoJ4oCcYXbigJ06IOKAnDg4ODg4ODg44oCdLAoJ4oCcYWvigJ06IOKAnDAwMDAwMDAw4oCdLAoJ4oCcaWRlbnRpdHnigJ06IOKAnGFWlu4oCdn0Wlu4oCdn0kb</p>
<p>STEP3. 啟動P2P模組。</p>
<p>關於設備端如何啟用P2P模組,請參考[#基于AVAPIs的家用摄像头开发-设备端](关于设备端如何启用P2P模块,请参考 #<a href="https://note.youdao.com/ynoteshare/index.html?id=ac272d611999a4764ece8df90b36e4cc&type=note&_time=1721805925210">https://note.youdao.com/ynoteshare/index.html?id=ac272d611999a4764ece8df90b36e4cc&type=note&_time=1721805925210</a> "#基于AVAPIs的家用摄像头开发-设备端")</p>
<h3>1.1.4 範例</h3>
<ul>
<li>App按以下Json格式產生QRCode:</li>
</ul>
<p><code>{&quot;r&quot;:&quot;kalayapp-cn&quot;,&quot;s&quot;:&quot;579vca7h8wcj3g2wg1a9&quot;,&quot;ss&quot;:&quot;TUTK-GUEST&quot;,&quot;p&quot;:&quot;hshhs&quot;,&quot;re&quot;:&quot;cn&quot;}</code></p>
<ul>
<li>最終設備上傳給IRIS伺服器的資訊為:</li>
</ul>
<p><strong>請求URL:</strong></p>
<ul>
<li>post:<a href="https://cn-iris-tutk.kalay.net.cn/iris/api/v1/prevali/session/579vca7h8wcj3g2wg1a9?realm=kalayapp-cn">https://cn-iris-tutk.kalay.net.cn/iris/api/v1/prevali/session/579vca7h8wcj3g2wg1a9?realm=kalayapp-cn</a></li>
</ul>
<p><strong>Request Headers:</strong></p>
<ul>
<li>Content-Type:application/json</li>
</ul>
<p><strong>Body:</strong></p>
<pre><code class="language-json">{
&quot;secretData&quot;:{
&quot;credential&quot;:&quot;ewoJ4oCcYXbigJ06IOKAnDg4ODg4ODg44oCdLAoJ4oCcYWvigJ06IOKAnDAwMDAwMDAw4oCdLAoJ4oCcaWRlbnRpdHnigJ06IOKAnGFkbWlu4oCdCn0=&quot;,
&quot;udid&quot;:&quot;UUUUUUUUUUUUUUUUUUUU&quot;
}
}
</code></pre>
<h2>1.2 快速配網添加</h2>
<h3>1.2.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “pairing mode” 設定為「ap」時,將採用快速配網新增方式。</li>
<li>此方式需要設備支援開啟AP熱點設定模式,並對接相關協定。</li>
<li>Kalay APP先至系統WIFI頁面成功連接至設備的AP熱點,然後呼叫Lan Search介面搜尋在該AP熱點網路下的設備UID資訊;</li>
<li>透過使用者手動輸入的設備密碼,連接該設備;</li>
<li>成功連接設備後,需要使用者手動選擇的WIFI和輸入的密碼,將WIFI及密碼訊息傳送給設備進行網路設定。</li>
</ul>
<p>關於App端如何呼叫Lan Search接口,可參考 [#基于IOTCAPIs的局域网设备搜索](<a href="https://note.youdao.com/ynoteshare/index.html?id=10697362dd57d388e4598e96995ef642&type=note&_time=1721806255069">https://note.youdao.com/ynoteshare/index.html?id=10697362dd57d388e4598e96995ef642&type=note&_time=1721806255069</a> "#基于IOTCAPIs的局域网设备搜索")</p>
<h3>1.2.2 App端實作</h3>
<p>App讀取Device Profile中的 “pairing mode” 陣列如下:</p>
<pre><code class="language-json">&quot;pairing_mode&quot;: [
{
&quot;flag&quot;: &quot;ap&quot;
}
]</code></pre>
<p>App發送如下IO Command設定設備的WiFi網路:</p>
<p><code>IOTYPE_USER_IPCAM_SETWIFI_REQ = 0x0342;</code></p>
<p><code>IOTYPE_USER_IPCAM_SETWIFI_REQ2 = 0x0346;</code></p>
<p>> 其中0x0346 支援64bit密碼,與IOTYPE_USER_IPCAM_SETWIFI_REQ = 0x0342一起傳送。</p>
<p><a id="1.2.3"></a></p>
<h3>1.2.3 設備端實作</h3>
<p>設備需回應如下IO Command表示設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SETWIFI_RESP = 0x0343;</code></p>
<p><code>IOTYPE_USER_IPCAM_GETWIFI_RESP2 = 0x0347;</code></p>
<p>> 其中0x0347 支援64bit密碼,裝置依實際情況選擇回應 0x0343 或 0x0347。</p>
<h3>1.2.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>1.3 設備已連網新增</h2>
<h3>1.3.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “pairing mode” 設定為「qrcode」時,將採用設備已連網新增方式。</li>
<li>此方式需確保設備已接取網路線,或已設定WLAN網絡,並對接相關協定。</li>
<li>Kalay APP先啟用掃碼功能,掃描並辨識設備的二維碼內容;</li>
<li>透過掃碼取得的設備UDID和密碼,連接該設備;</li>
<li>成功連接設備後,新增至伺服器。</li>
</ul>
<h3>1.3.2 App端實作</h3>
<p>App讀取Device Profile中的 “pairing mode” 陣列如下:</p>
<pre><code class="language-json">&quot;pairing_mode&quot;: [
{
&quot;flag&quot;: &quot;qrcode&quot;
}
]</code></pre>
<p><a id="1.3.3"></a></p>
<h3>1.3.3 設備端實作</h3>
<p>無</p>
<h3>1.3.4 範例</h3>
<p>無</p>
<h2>1.4 藍牙配置添加</h2>
<h3>1.4.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “pairing mode” 設定為「ble」時,將採用藍牙配置新增方式。</li>
<li>此方式需確保設備支援藍牙設定模式,並對接相關協定。</li>
<li>Kalay APP先啟用藍牙權限,搜尋並辨識符合命名規則的藍牙設備;</li>
<li>Kalay App從獲取的Device Profile 中讀取 “服務UUID” 和 “特徵值UUID” 信息,並與設備端建立藍牙連接;</li>
<li>藍牙配對成功時,Kalay App將需設定的WiFi資訊傳送給設備,同時取得設備UDID和密碼;</li>
<li>設備端接收WiFi訊息後進行網路設定;</li>
<li>Kalay App輪詢設備狀態,成功連接設備後,新增至伺服器。</li>
</ul>
<h3>1.4.2 App端實作</h3>
<p>App讀取Device Profile中的 “pairing mode” 陣列如下:</p>
<pre><code class="language-json">&quot;pairing_mode&quot;: [
{
&quot;flag&quot;: &quot;ble&quot;
}
]</code></pre>
<p>App啟用藍牙權限,搜尋符合以【TK】開頭的藍牙設備:</p>
<p>設備名稱命名規則: <code>{TK}-{Vendor}-{Model}-{AABBCC}</code></p>
<ul>
<li>{TK} 為默認開頭;</li>
<li>{Verdor} 使用Device Profile中已定義的"vendor";</li>
<li>{Model} 由客戶自訂,建議與Device Profile中定義保持一致;</li>
<li>{AABBCC} 是設備名,一般是設備 UID 的 4~6 位,具體待定。</li>
</ul>
<p>>建議<code>{TK}-{Vendor}-{Model}-{AABBCC}</code>總長度不超過24比特,其中<code>{Model}-{AABBCC}</code>總長度不超過16比特。</p>
<p>App解析廣播包,讀取製造商數據,過濾並顯示未綁定和待配網的藍牙設備:</p>
<p><strong>製造商數據:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">TYPE</th>
<th style="text-align: left;">SIZE</th>
<th style="text-align: left;">DATA</th>
<th style="text-align: left;">NOTE</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">AD Size </td>
<td style="text-align: left;">1</td>
<td style="text-align: left;">0x0D</td>
<td style="text-align: left;">AD 結構大小</td>
</tr>
<tr>
<td style="text-align: left;">AD Type </td>
<td style="text-align: left;">1</td>
<td style="text-align: left;">0xFF</td>
<td style="text-align: left;">AD 類型,0xFF:表示製造商資料</td>
</tr>
<tr>
<td style="text-align: left;">Frame Counter </td>
<td style="text-align: left;">1</td>
<td style="text-align: left;">0x00</td>
<td style="text-align: left;">計數器,用於去重,00:表示暫時沒有用到</td>
</tr>
<tr>
<td style="text-align: left;">Frame Flags </td>
<td style="text-align: left;">1</td>
<td style="text-align: left;">0x12</td>
<td style="text-align: left;">標誌訊息,具體定義見下表</td>
</tr>
<tr>
<td style="text-align: left;">Device ID </td>
<td style="text-align: left;">6</td>
<td style="text-align: left;">0x112233445566</td>
<td style="text-align: left;">裝置 ID,為裝置的藍牙位址</td>
</tr>
</tbody>
</table>
<p><strong>Flags 標誌位定義:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">BIT</th>
<th style="text-align: left;">NAME</th>
<th style="text-align: left;">NOTE</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">0</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">保留欄位</td>
</tr>
<tr>
<td style="text-align: left;">1</td>
<td style="text-align: left;">Registered</td>
<td style="text-align: left;">0:設備未綁定,1:表示設備已註冊與綁定</td>
</tr>
<tr>
<td style="text-align: left;">3</td>
<td style="text-align: left;">isEncrypted</td>
<td style="text-align: left;">0:未加密,1:表示已加密</td>
</tr>
<tr>
<td style="text-align: left;">4</td>
<td style="text-align: left;">MAC Include</td>
<td style="text-align: left;">0:表示不包含 Device ID,1:表示包含</td>
</tr>
</tbody>
</table>
<p>App讀取Device Profile中的 “uuid” 數組,並與設備建立藍牙連線:</p>
<pre><code class="language-json">&quot;uuid&quot;: [
{
&quot;s-uuid&quot;: &quot;&quot;
},
{
&quot;c-uuid&quot;: &quot;&quot;
}
]</code></pre>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">s-uuid</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">服務uuid,每個型號的驗證設備使用固定值,在生成Device Profile時需先定義此參數</td>
</tr>
<tr>
<td style="text-align: left;">c-uuid</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">特徵值uuid,每個型號的驗證設備使用固定值,在生成Device Profile時需先定義此參數</td>
</tr>
</tbody>
</table>
<p>App發送以下WiFi設定資訊給設備:
<code>{&quot;m&quot;:&quot;&quot;,&quot;i&quot;: ,&quot;p&quot;:{&quot;s&quot;:&quot;&quot;,&quot;p&quot;:&quot;&quot;,r:&quot;&quot;}}</code></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">m</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">connect,固定值。表示請求發送訊息</td>
</tr>
<tr>
<td style="text-align: left;">i</td>
<td style="text-align: left;">int</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">請求ID</td>
</tr>
<tr>
<td style="text-align: left;">p</td>
<td style="text-align: left;">object</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">請求參數對象,詳細請參考下方params參數定義</td>
</tr>
</tbody>
</table>
<p><strong>params參數定義:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">s</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">ssid,表示 WiFi的SSID</td>
</tr>
<tr>
<td style="text-align: left;">p</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">password,表示 WiFi 密碼</td>
</tr>
<tr>
<td style="text-align: left;">r</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">region,根據Kalay App目前所在環境,將區域資訊同步給設備(參考不同區域縮寫)</td>
</tr>
</tbody>
</table>
<p><strong>不同區域縮寫:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">cn</td>
<td style="text-align: left;">中國大陸地區</td>
</tr>
<tr>
<td style="text-align: left;">us</td>
<td style="text-align: left;">北美地區(美國、加拿大)</td>
</tr>
<tr>
<td style="text-align: left;">eu</td>
<td style="text-align: left;">歐洲地區</td>
</tr>
</tbody>
</table>
<p>App傳送以下訊息輪詢設備配網狀態:
<code>{&quot;m&quot;:&quot;&quot;,&quot;i&quot;: }}</code></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">m</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">status,固定值。表示請求查詢狀態</td>
</tr>
<tr>
<td style="text-align: left;">i</td>
<td style="text-align: left;">int</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">請求ID</td>
</tr>
</tbody>
</table>
<p><a id="1.4.3"></a></p>
<h3>1.4.3 設備端實作</h3>
<p>設備端依規則定義命名,並啟用藍牙廣播(相關協定補充,請參考 [Kalay 2.0 蓝牙配网协议-20241111.pdf](<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=da319c632ed4c9e2659dbf759e76a97c">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=da319c632ed4c9e2659dbf759e76a97c</a> "[Kalay 2.0 蓝牙配网协议-20241111.pdf"))</p>
<p>設備端需回應如下告知設備連線資訊:
<code>{&quot;i&quot;: ,&quot;r&quot;:{&quot;s&quot;: ,&quot;d&quot;:&quot;&quot;,&quot;p&quot;:&quot;&quot;,&quot;a&quot;:&quot;&quot;}}</code></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">i</td>
<td style="text-align: left;">int</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">請求ID</td>
</tr>
<tr>
<td style="text-align: left;">r</td>
<td style="text-align: left;">object</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">結果參數對象,詳細請參考下方result參數定義</td>
</tr>
</tbody>
</table>
<p><strong>result參數定義:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">s</td>
<td style="text-align: left;">int</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">state,連線狀態。詳細請參考state參數定義</td>
</tr>
<tr>
<td style="text-align: left;">d</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">uid/udid,設備 20 位元 uid 或 40 位元 udid</td>
</tr>
<tr>
<td style="text-align: left;">p</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">password,表示設備的av連線密碼</td>
</tr>
<tr>
<td style="text-align: left;">a</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">authkey,表示設備的authkey。</td>
</tr>
</tbody>
</table>
<p><strong>state參數值定義:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數值</th>
<th style="text-align: left;">狀態說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">0</td>
<td style="text-align: left;">待配網</td>
</tr>
<tr>
<td style="text-align: left;">10</td>
<td style="text-align: left;">聯網中</td>
</tr>
<tr>
<td style="text-align: left;">20</td>
<td style="text-align: left;">獲取IP中</td>
</tr>
<tr>
<td style="text-align: left;">50</td>
<td style="text-align: left;">設備配網成功</td>
</tr>
<tr>
<td style="text-align: left;">100</td>
<td style="text-align: left;">設備配網成功,且P2P Login成功</td>
</tr>
</tbody>
</table>
<p>> 備註:當設備未填入authkey時,Kalay App將使用預設值建立IOTC連線。為了確保安全性,建議使用autkey。</p>
<p>設備端需回應如下告知配網狀態:
<code>{&quot;i&quot;: ,&quot;s&quot;: ,&quot;e&quot;:{&quot;c&quot;: ,&quot;m&quot;:&quot;&quot;}}</code></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">i</td>
<td style="text-align: left;">int</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">請求ID</td>
</tr>
<tr>
<td style="text-align: left;">s</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">state,連線狀態。詳細請參考state參數定義</td>
</tr>
<tr>
<td style="text-align: left;">e</td>
<td style="text-align: left;">object</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">error參數對象,詳細請參考下方error參數定義</td>
</tr>
</tbody>
</table>
<p><strong>error參數定義:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">c</td>
<td style="text-align: left;">int</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">code,表示錯誤碼。 0:表無錯誤,其它:參考錯誤碼定義</td>
</tr>
<tr>
<td style="text-align: left;">m</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">message,表示錯誤訊息</td>
</tr>
</tbody>
</table>
<p><strong>錯誤碼定義:</strong></p>
<ul>
<li>請直接參考 [Kalay 2.0 蓝牙配网协议-20241111.pdf](<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=da319c632ed4c9e2659dbf759e76a97c">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=da319c632ed4c9e2659dbf759e76a97c</a> "[Kalay 2.0 蓝牙配网协议-20241111.pdf")</li>
</ul>
<h3>1.4.4 範例</h3>
<ul>
<li>例如設備的資訊如下:</li>
</ul>
<pre><code class="language-c">type:ipcam
vendor:tutk
model:ipcam01
uid:AA29RITNWDEBR5YCWXXX
uid後6:YCWXXX
av密碼:a12345678
authkey:123456
服務uuid:55535343-fe7d-4ae5-8fa9-9fafd205e455
特徵值uuid:49535343-8841-43f4-a8d4-ecbe34729bb3</code></pre>
<ul>
<li>
<p>設備端依規則定義命名為:<code>TK-TUTK-IPCAM01-YCWXXX</code></p>
</li>
<li>App讀取Device Profile中的 “pairing mode” 和 “uuid” 陣列如下:</li>
</ul>
<pre><code class="language-json">&quot;pairing_mode&quot;: [
{
&quot;flag&quot;: &quot;ble&quot;
}
],
&quot;uuid&quot;: [
{
&quot;s-uuid&quot;: &quot;55535343-fe7d-4ae5-8fa9-9fafd205e455&quot;
},
{
&quot;c-uuid&quot;: &quot;49535343-8841-43f4-a8d4-ecbe34729bb3&quot;
}
]</code></pre>
<ul>
<li>
<p>App啟用藍牙權限,搜尋並識別命名如下的藍牙設備:
<code>TK-TUTK-IPCAM01-YCWXXX</code></p>
</li>
<li>
<p>App解析廣播包,讀取製造商數據,過濾並顯示未綁定和待配網的藍牙設備:
<code>未綁定狀態 (包含 MAC 位址):00 10 112233445566</code>
<code>未綁定狀態 (不包含 MAC 位址):00 00</code></p>
</li>
<li>
<p>使用者選擇設備後,根據 "s-uuid" 和 "c-uuid" 與此設備建立藍牙連線;</p>
</li>
<li>
<p>App發送以下WiFi設定資訊給設備:
<code>{&quot;m&quot;:&quot;connect&quot;,&quot;i&quot;:0,&quot;p&quot;:{&quot;s&quot;:&quot;TUTK-FAE&quot;,&quot;p&quot;:&quot;12345678&quot;,&quot;r&quot;:&quot;cn&quot;}}</code></p>
</li>
<li>
<p>設備端收到App傳送的WiFi設定訊息時,回覆如下:
<code>{&quot;i&quot;:0,&quot;r&quot;:{&quot;s&quot;:0,&quot;d&quot;:&quot;AA29RITNWDEBR5YCWXXX&quot;,&quot;p&quot;:&quot;a12345678&quot;,&quot;a&quot;:&quot;123456&quot; }}</code></p>
</li>
<li>
<p>App傳送以下訊息輪詢設備配網狀態:
<code>{&quot;m&quot;:&quot;status&quot;,&quot;i&quot;:1}}</code></p>
</li>
<li>設備端配網成功,並回應如下告知配網狀態:
<code>{&quot;i&quot;:1,&quot;s&quot;:100,&quot;e&quot;:{&quot;c&quot;:0,&quot;m&quot;:&quot;success&quot;}}</code></li>
</ul>
<h2>1.5 多種配網新增方式</h2>
<h3>1.5.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “pairing mode” 設定多個值時,將可支援多種配網方式。</li>
<li>此設定需要確保設備可支援對應的配網方式,並對接相關協定。</li>
<li>Kalay APP依據 “pairing mode” 設定值,顯示選擇配網方式頁面。</li>
<li>透過使用者手動選擇配網方式,走不同的新增流程。</li>
</ul>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0c0f56afdfe2c0a617c96893af17036d&amp;file=file.png" alt="" /></p>
<h3>1.5.2 App端實作</h3>
<p>App讀取Device Profile中的 “pairing mode” 陣列如下:</p>
<pre><code class="language-json">&quot;pairing_mode&quot;: [
{
&quot;flag&quot;: &quot;ap&quot;
},
{
&quot;flag&quot;: &quot;qrcode&quot;
},
{
&quot;flag&quot;: &quot;iris&quot;
}
]</code></pre>
<p>App依照已讀取的 “pairing mode” 順序顯示配網方式。</p>
<h3>1.5.3 設備端實作</h3>
<p>如需支援 設備掃碼添加,請參考 [1.1.3 設備端實作][1.1.3]。</p>
<p>如需支援 快速配網添加,請參考 [1.2.3 設備端實作][1.2.3]。</p>
<p>如需支援 設備已連網新增,請參考 [1.3.3 設備端實作][1.3.3]。</p>
<p>如需支援 藍牙配置添加,請參考 [1.4.3 设备端实作][1.4.3]。</p>
<h3>1.5.4 範例</h3>
<p>無</p>
<h2>1.6 驗證設備檢查</h2>
<h3>1.6.1 對接說明</h3>
<ul>
<li>正式啟用功能時,Device Profile設定檔需上傳至驗證伺服器,並通過TUTK測試驗證。</li>
<li>非正式啟用/測試功能:可在開發者模式下,匯入Device Profile檔案並進行本機偵錯。([如何導入?][2.4])</li>
<li>在對接開始前,TUTK將提供certKey及profileVer(fw_ver)訊息,請進行保存使用。</li>
</ul>
<h3>1.6.2 App端實作</h3>
<p>App發送如下IO Command詢問設備的certKey及profileVer資訊:</p>
<p><code>IOTYPE_USER_IPCAM_GET_PROFILE_REQ = 0x9014;</code></p>
<h3>1.6.3 設備端實作</h3>
<p>設備需回應如下IO Command告知certKey及profileVer資訊:</p>
<p><code>IOTYPE_USER_IPCAM_GET_PROFILE_RESP = 0x9015;</code></p>
<h3>1.6.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h1>二、設備設定功能</h1>
<h2>2.1 修改設備名稱</h2>
<h3>2.1.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_name" 設定時,將判定為該設備支援修改名稱功能。</li>
<li>根據此結果,終端用戶可在App上點選修改設備名稱。</li>
</ul>
<h3>2.1.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_name&quot;
}
]</code></pre>
<p>App呼叫介面更新伺服器中已儲存的設備名稱,並非透過IO Command形式同步給設備。</p>
<h3>2.1.3 設備端實作</h3>
<p>無</p>
<h3>2.1.4 範例</h3>
<p>無</p>
<h2>2.2 更改密碼</h2>
<h3>2.2.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_password" 設定時,將判定為該設備支援變更密碼功能。</li>
<li>根據此結果,終端用戶可在App上點選更改設備密碼。</li>
</ul>
<h3>2.2.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_password&quot;
}
]</code></pre>
<p>App發送如下IO Command設定設備的密碼:</p>
<p><code>IOTYPE_USER_IPCAM_SETPASSWORD_REQ = 0x0332;</code></p>
<h3>2.2.3 設備端實作</h3>
<p>設備需回應如下IO Command告知設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SETPASSWORD_RESP = 0x0333;</code></p>
<h3>2.2.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.3 網路設置</h2>
<h3>2.3.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_wifi" 設定時,將判定為該設備支援網路設定功能。</li>
<li>根據此結果,終端用戶可在App上點選更改網路設定。</li>
</ul>
<h3>2.3.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_wifi&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備目前的WIFI網路:</p>
<p><code>IOTYPE_USER_IPCAM_GETWIFI_REQ = 0x0344;</code></p>
<p>App發送如下IO Command詢問設備周圍的WIFI清單:</p>
<p><code>IOTYPE_USER_IPCAM_LISTWIFIAP_REQ = 0x0340;</code></p>
<p>App發送如下IO Command設定設備的WIFI網路:</p>
<p><code>IOTYPE_USER_IPCAM_SETWIFI_REQ2 = 0x0346;</code></p>
<h3>2.3.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前設定的WIFI網路:</p>
<p><code>IOTYPE_USER_IPCAM_GETWIFI_RESP = 0x0345;</code></p>
<p>設備需回應如下IO Command告知周圍的WIFI清單:</p>
<p><code>IOTYPE_USER_IPCAM_LISTWIFIAP_RESP = 0x0341;</code></p>
<p>設備需回應如下IO Command告知週WIFI網路設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_GETWIFI_RESP2 = 0x0347;</code></p>
<h3>2.3.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.4 分辨率</h2>
<h3>2.4.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_stream_ctrl" 設定時,將判定為該設備支援解析度設定功能。</li>
<li>根據此結果,終端用戶可在App上點選更改解析度設定。</li>
</ul>
<h3>2.4.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_stream_ctrl&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備目前的解析度:</p>
<p><code>IOTYPE_USER_IPCAM_GETSTREAMCTRL_REQ = 0x0322;</code></p>
<p>App發送如下IO Command設定設備的解析度:</p>
<p><code>IOTYPE_USER_IPCAM_SETSTREAMCTRL_REQ = 0x0320;</code></p>
<h3>2.4.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前設備的解析度:</p>
<p><code>IOTYPE_USER_IPCAM_GETSTREAMCTRL_RESP = 0x0323;</code></p>
<p>設備需回應如下IO Command告知設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SETSTREAMCTRL_RESP = 0x0321;</code></p>
<h3>2.4.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.5 畫面設置</h2>
<h3>2.5.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_video_mode" 設定時,將判定為該設備支援畫面設定功能。</li>
<li>根據此結果,終端用戶可在App上點選更改畫面設定。</li>
</ul>
<h3>2.5.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_video_mode&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備目前的鏡像/翻轉狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_VIDEOMODE_REQ = 0x0372;</code></p>
<p>App發送如下IO Command設定設備的鏡像/翻轉效果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_VIDEOMODE_REQ = 0x0370;</code></p>
<h3>2.5.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前設備的鏡像/翻轉狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_VIDEOMODE_RESP = 0x0373;</code></p>
<p>設備需回應如下IO Command告知設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_VIDEOMODE_RESP = 0x0371;</code></p>
<h3>2.5.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.6 時間設定</h2>
<h3>2.6.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_timezone" 設定時,將判定為該設備支援同步時間和時區設定功能。</li>
<li>根據此結果,終端用戶可在App上點選時間設定。</li>
</ul>
<h3>2.6.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_timezone&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備目前的時區:</p>
<p><code>IOTYPE_USER_IPCAM_GET_TIME_ZONE_REQ = 0x904A;</code></p>
<p>App發送如下IO Command設定設備的時區:</p>
<p><code>IOTYPE_USER_IPCAM_SET_TIME_ZONE_REQ = 0x904C;</code></p>
<h3>2.6.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前時區:</p>
<p><code>IOTYPE_USER_IPCAM_GET_TIME_ZONE_RESP = 0x904B;</code></p>
<p>設備需回應如下IO Command告知設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_TIME_ZONE_RESP = 0x904D;</code></p>
<h3>2.6.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.7 休眠設置</h2>
<h3>2.7.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_sleep" 設定時,將判定為該設備支援休眠設定功能。</li>
<li>根據此結果,終端用戶可在App上點選休眠設定。</li>
</ul>
<h3>2.7.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_sleep&quot;
}
]</code></pre>
<p>App傳送如下IO Command詢問裝置目前的休眠狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_DORMANCY_REQ = 0x9046;</code></p>
<p>App傳送如下IO Command設定裝置的休眠狀態:</p>
<p><code>IOTYPE_USER_IPCAM_SET_DORMANCY_REQ = 0x9048;</code></p>
<h3>2.7.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前的休眠狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_DORMANCY_RESP = 0x9047;</code></p>
<p>設備需回應如下IO Command告知設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_DORMANCY_RESP = 0x9049;</code></p>
<p>> 備註:1.設備休眠狀態為「開啟」時,表示常休眠狀態;2.定時休眠開啟時,設備會依計畫執行休眠。 3.當設備進入休眠狀態時,建議應關閉鏡頭和麥克風等功能,停止進行SD卡錄影和雲端錄影功能。</p>
<h3>2.7.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.8 設備訊息</h2>
<h3>2.8.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_ota_info" 設定時,將判定為該設備支援查詢設備資訊功能。</li>
<li>根據此結果,終端用戶可在App上查詢設備資訊。</li>
</ul>
<p>> 備註:因設備資訊與OTA升級在同一頁面呈現,故此處使用相同的 "flag": "set_ota_info" 設定。</p>
<h3>2.8.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_ota_info&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備的vendor/product/model等資訊:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_INFO_REQ = 0x8015;</code></p>
<h3>2.8.3 設備端實作</h3>
<p>設備需回應如下IO Command告知相關資訊:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_INFO_RESP = 0x8016;</code></p>
<p>> 備註:歷史遺留問題導致,原則上應使用“vendor”而非“vender”,暫無法糾正。</p>
<h3>2.8.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.9 OTA升級</h2>
<h3>2.9.1 對接說明</h3>
<ul>
<li>
<p>實施此功能前,請確保已成功開啟我司OTA升級服務,且在OTA伺服器後台正確設定/上傳最新的韌體。 ([如何開啟與設定?](<a href="https://note.youdao.com/ynoteshare/index.html?id=5c3872ac51912092fdf0c46d93424138">https://note.youdao.com/ynoteshare/index.html?id=5c3872ac51912092fdf0c46d93424138</a> "如何開啟與設定?"))</p>
</li>
<li>在Kalay APP上,當取得的Device Profile 中 “group1” 陣列中包含 "flag": "set_ota_info" 設定時,將判定為該設備支援OTA升級功能。</li>
<li>
<p>根據此結果,終端用戶可在App上點選韌體升級。</p>
</li>
<li>Kalay APP發送IO Command,用於詢問設備的資訊。</li>
<li>根據裝置回覆的結果,取得相關參數,並拼接API請求,向伺服器取得OTA升級檔案的下載位址。</li>
<li>Kalay APP成功向伺服器取得至下載位址時,將該位址透過IO Command回傳給設備。</li>
<li>設備需依據下載位址,取得升級文件,並完成韌體升級。</li>
<li>在設備進行下載和升級的過程中,Kalay APP將每隔1s向設備發送IO Command,以確認設備的升級進度。</li>
</ul>
<p>> 備註:如果設備位於中國大陸地區,因防火牆限制,將無法正常存取海外OTA伺服器。故請正確區分設備出貨環境,向指定的OTA伺服器進行請求,以免設備取得升級檔案失敗。</p>
<h3>2.9.2 App端實作</h3>
<p>App讀取Device Profile中的 “group1” 陣列如下:</p>
<pre><code class="language-json">&quot;group1&quot;: [
{
&quot;flag&quot;: &quot;set_ota_info&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備的資訊:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_INFO_REQ = 0x8015;</code></p>
<p>App根據設備資訊拼接API請求:</p>
<p><code>https://{ota_domain}/ota/GET/i/{vendor}/{product}/{model}</code></p>
<p>App傳送如下IO Command將下載URL回傳給設備端:</p>
<p><code>IOTYPE_USER_IPCAM_OTA_REQ = 0x8001;</code></p>
<p>App依據如下IO Command顯示目前設備的升級進度:</p>
<p><code>IOTYPE_USER_IPCAM_OTA_RESP = 0x8002;</code></p>
<h3>2.9.3 設備端實作</h3>
<p>設備需回應如下IO Command告知vendor/product/model等資訊:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_INFO_RESP = 0x8016;</code></p>
<p>> 附註:以上參數用於拼接向KOTA伺服器取得升級檔案的下載位址請求,故需與在KOTA伺服器上建立的vendor,product,model等資訊保持一致,且注意區分設備所在區域。</p>
<p>設備需依據以下IO Command取得升級檔案的下載位址:</p>
<p><code>IOTYPE_USER_IPCAM_OTA_REQ = 0x8001;</code></p>
<p>設備需回應如下IO Command告知目前升級進度:</p>
<p><code>IOTYPE_USER_IPCAM_OTA_RESP = 0x8002;</code></p>
<h3>2.9.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.10 智能偵測</h2>
<h3>2.10.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group2” 陣列中包含 "flag": "set_intelligent_detect" 設定時,將判定為該設備支援智能偵測設定功能。</li>
<li>
<p>根據此結果,終端用戶可在App上點選智能偵測。</p>
</li>
<li>在Kalay APP上,當裝設備支援智能偵測設定功能時,再根據Device Profile 中 「group4」 陣列中包含的詳細設定,顯示不同的偵測類型和設定功能。</li>
<li>根據此結果,終端使用者可在App上設定移動偵測、人形偵測、哭聲偵測、寵物偵測 和/或 跌倒偵測等多種狀態。</li>
</ul>
<h3>2.10.2 App端實作</h3>
<p>App讀取Device Profile中的 “group2” 陣列如下:</p>
<pre><code class="language-json">&quot;group2&quot;: [
{
&quot;flag&quot;: &quot;set_intelligent_detect&quot;
}
]</code></pre>
<p>App讀取Device Profile中的 “group4” 陣列如下:</p>
<pre><code class="language-json">&quot;group4&quot;: [
{
&quot;flag&quot;: &quot;set_motion_detect&quot;
},
{
&quot;flag&quot;: &quot;set_humanoid_detect&quot;
},
{
&quot;flag&quot;: &quot;set_cry_detect&quot;
},
{
&quot;flag&quot;: &quot;set_pet_detect&quot;
},
{
&quot;flag&quot;: &quot;set_fall_detect&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問裝置的智能偵測設定狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_INTELLIGENT_DETECTION_REQ = 0x9042;</code></p>
<p>App傳送如下IO Command設定裝置的智能偵測狀態:</p>
<p><code>IOTYPE_USER_IPCAM_SET_INTELLIGENT_DETECTION_REQ = 0x9044;</code></p>
<h3>2.10.3 設備端實作</h3>
<p>設備需回應如下IO Command告知其智能偵測的設定狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_INTELLIGENT_DETECTION_RESP = 0x9043;</code></p>
<p>設備需回應如下IO Command告知智能偵測的設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_INTELLIGENT_DETECTION_RESP = 0x9045;</code></p>
<h3>2.10.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.11 SD卡設置</h2>
<h3>2.11.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group2” 陣列中包含 "flag": "set_sd_info" 設定時,將判定為該設備支援SD卡查詢和設定功能。</li>
<li>根據此結果,終端用戶可在App上點選SD卡設定。</li>
<li>在SD卡設定中,包含SD卡錄影模式設定 和 SD卡資訊/格式化 的功能。</li>
</ul>
<h3>2.11.2 App端實作</h3>
<p>App讀取Device Profile中的 “group2” 陣列如下:</p>
<pre><code class="language-json">&quot;group2&quot;: [
{
&quot;flag&quot;: &quot;set_sd_info&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備的SD卡錄影模式:</p>
<p><code>IOTYPE_USER_IPCAM_GETRECORD_REQ = 0x0312;</code></p>
<p>App發送如下IO Command設定設備的SD卡錄影模式:</p>
<p><code>IOTYPE_USER_IPCAM_SETRECORD_REQ = 0x0310;</code></p>
<p>App發送如下IO Command詢問設備的SD卡資訊:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_INFO_REQ = 0x8015;</code></p>
<p>> 備註:因取得設備資訊的IO Command有包含SD卡資訊的相關參數,故此處直接使用上述設備資訊IO Command的回覆結果。</p>
<p>App發送如下IO Command詢問設備的SD卡的掛載狀態:</p>
<p><code>IOTYPE_USER_IPCAM_SDINFO_REQ = 0x9034;</code></p>
<p>App傳送如下IO Command進行設備的SD卡格式化:</p>
<p><code>IOTYPE_USER_IPCAM_FORMATEXTSTORAGE_REQ = 0x0380;</code></p>
<h3>2.11.3 設備端實作</h3>
<p>設備需回應如下IO Command告知其錄影模式的設定狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GETRECORD_RESP = 0x0313;</code></p>
<p>設備需回應如下IO Command告知其錄影模式的設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SETRECORD_RESP = 0x0311;</code></p>
<p>設備需回應如下IO Command告知其SD卡的資訊:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_INFO_RESP = 0x8016;</code></p>
<p>> 備註:因前述的取得設備資訊的IO Command有包含SD卡資訊的相關參數,故此處直接使用上述設備資訊IO Command的回覆結果。</p>
<p>設備需回應如下IO Command告知其SD卡的掛載狀態:</p>
<p><code>IOTYPE_USER_IPCAM_SDINFO_RESP = 0x9035;</code></p>
<p>設備需回應如下IO Command告知其SD卡的格式化結果:</p>
<p><code>IOTYPE_USER_IPCAM_FORMATEXTSTORAGE_RESP = 0x0381;</code></p>
<h3>2.11.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.12 雲端儲存設置</h2>
<h3>2.12.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group2” 陣列中包含 "flag": "set_cloud_setting" 設定時,將判定為該設備支援雲端儲存設定功能。</li>
<li>
<p>根據此結果,終端用戶可在App上點選雲端儲存設定。</p>
</li>
<li>Kalay APP發送IO Command,用於詢問該設備雲端儲存推流功能的啟動狀態。</li>
<li>
<p>根據設備回覆的結果,顯示不同的開關狀態。</p>
</li>
<li>Kalay APP發送IO Command,用於設定開啟/關閉設備的雲端儲存推流功能。</li>
<li>設備在接收設定開啟的指令時,根據VSaaS Info的資訊向指定伺服器要求取流。</li>
<li>設備在接收到設定關閉的指令時,停止向伺服器推流。</li>
</ul>
<h3>2.12.2 App端實作</h3>
<p>App讀取Device Profile中的 “group2” 陣列如下:</p>
<pre><code class="language-json">&quot;group2&quot;: [
{
&quot;flag&quot;: &quot;set_cloud_setting&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備的雲端儲存開關狀態:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_GET_CLOUD_REQ = 0x8012;</code></p>
<p>App傳送如下IO Command設定開啟/關閉設備的雲端儲存功能:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_SET_CLOUD_REQ = 0x8010;</code></p>
<h3>2.12.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前雲端儲存的開關狀態:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_GET_CLOUD_RESP = 0x8013;</code></p>
<p>設備需回應如下IO Command告知目前雲端儲存的開關設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_DEVICE_SET_CLOUD_RESP = 0x8011;</code></p>
<h3>2.12.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.13 夜視</h2>
<h3>2.13.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group2” 陣列中包含 "flag": "set_night_vision" 設定時,判定為該設備支援夜視設定功能。</li>
<li>根據此結果,終端用戶可在App上點選夜視。</li>
</ul>
<h3>2.13.2 App端實作</h3>
<p>App讀取Device Profile中的 “group2” 陣列如下:</p>
<pre><code class="language-json">&quot;group2&quot;: [
{
&quot;flag&quot;: &quot;set_night_vision&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備的夜視設定狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_NIGHTVISION_REQ = 0x9006;</code></p>
<p>App傳送如下IO Command設定設備的夜視狀態:</p>
<p><code>IOTYPE_USER_IPCAM_SET_NIGHTVISION_REQ = 0x9008;</code></p>
<h3>2.13.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前夜視的設定狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_NIGHTVISION_RESP = 0x9007;</code></p>
<p>設備需回應如下IO Command告知目前夜視的設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_NIGHTVISION_RESP = 0x9009;</code></p>
<h3>2.13.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.14 移動追蹤</h2>
<h3>2.14.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group2” 陣列中包含 "flag": "set_motion_tracking" 設定時,將判定為該設備支援移動追蹤設定功能。</li>
<li>
<p>根據此結果,終端用戶可在App上點選移動追蹤。</p>
</li>
<li>在Kalay APP上,當設備支援移動追蹤設定功能時,再根據Device Profile 中 「group5」 陣列中包含的詳細設定,顯示不同的追蹤類型和設定功能。</li>
<li>根據此結果,終端用戶可在App上設定物體追蹤、人形追蹤 和/或 聽音辨位等多種狀態。</li>
</ul>
<h3>2.14.2 App端實作</h3>
<p>App讀取Device Profile中的 “group2” 陣列如下:</p>
<pre><code class="language-json">&quot;group2&quot;: [
{
&quot;flag&quot;: &quot;set_motion_tracking&quot;
}
]</code></pre>
<p>App讀取Device Profile中的 “group5” 陣列如下:</p>
<pre><code class="language-json">&quot;group5&quot;: [
{
&quot;flag&quot;: &quot;set_object_trace&quot;
},
{
&quot;flag&quot;: &quot;set_human_trace&quot;
},
{
&quot;flag&quot;: &quot;set_audio_trace&quot;
}
]</code></pre>
<p>App傳送如下IO Command詢問裝置的移動追蹤設定狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_INTELLIGENT_DETECTION_REQ = 0x9042;</code></p>
<p>App傳送如下IO Command設定裝置的移動追蹤狀態:</p>
<p><code>IOTYPE_USER_IPCAM_SET_INTELLIGENT_DETECTION_REQ = 0x9044;</code></p>
<h3>2.14.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前移動追蹤的設定狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_INTELLIGENT_DETECTION_RESP = 0x9043;</code></p>
<p>設備需回應如下IO Command告知目前移動追蹤的設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_INTELLIGENT_DETECTION_RESP = 0x9045;</code></p>
<h3>2.14.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.15 指示燈</h2>
<h3>2.15.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group2” 陣列中包含 "flag": "set_pilot_lamp" 設定時,將判定為該設備支援指示燈開關設定功能。</li>
<li>根據此結果,終端用戶可在App上點選指示燈開關。</li>
</ul>
<h3>2.15.2 App端實作</h3>
<p>App讀取Device Profile中的 “group2” 陣列如下:</p>
<pre><code class="language-json">&quot;group2&quot;: [
{
&quot;flag&quot;: &quot;set_pilot_lamp&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備的指示燈開關狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_PILOT_LAMP_REQ = 0x903C;</code></p>
<p>App發送如下IO Command設定設備的指示燈狀態:</p>
<p><code>IOTYPE_USER_IPCAM_SET_PILOT_LAMP_REQ = 0x903E;</code></p>
<h3>2.15.3 設備端實作</h3>
<p>設備需回應如下IO Command告知目前指示燈開關狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_PILOT_LAMP_RESP = 0x903D;</code></p>
<p>設備需回應如下IO Command告知目前指示燈的設定結果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_PILOT_LAMP_RESP = 0x903F;</code></p>
<h3>2.15.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.16 重啟設備</h2>
<h3>2.16.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group3” 陣列中包含 "flag": "reset" 設定時,將判定為該設備支援重新啟動功能。</li>
<li>根據此結果,終端用戶可在App上點選重啟。</li>
</ul>
<p>> 備註:重新啟動設備通常不會將設備恢復原廠設定;在設備重新啟動的過程中,可能會中斷連線。</p>
<h3>2.16.2 App端實作</h3>
<p>App讀取Device Profile中的 “group3” 陣列如下:</p>
<pre><code class="language-json">&quot;group3&quot;: [
{
&quot;flag&quot;: &quot;reset&quot;
}
]</code></pre>
<p>App發送如下IO Command請求重新啟動設備:</p>
<p><code>IOTYPE_USER_IPCAM_SET_RESTART_REQ = 0x9040;</code></p>
<h3>2.16.3 設備端實作</h3>
<p>設備需回應如下IO Command告知重新啟動結果:</p>
<p><code>IOTYPE_USER_IPCAM_SET_RESTART_RESP = 0x9041;</code></p>
<p>> 備註:此結果應該在設備完成重啟後發送;在設備重新啟動的過程中,可能會斷開連線。</p>
<h3>2.16.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>2.17 取得多種設定狀態</h2>
<h3>2.17.1 對接說明</h3>
<ul>
<li>在Kalay APP上,可透過呼叫一個IO Command,實現同時取得多種設備設定功能的狀態。</li>
<li>設備在接收相關指令時,需依照 "SMsgCommandTask" 陣列要求傳回對應的狀態結果。</li>
</ul>
<h3>2.17.2 App端實作</h3>
<p>App發送如下IO Command詢問設備多種設定功能的目前狀態:</p>
<p><code>IOTYPE_USER_IPCAM_GET_ALL_STATE_REQ = 0x904E;</code></p>
<h3>2.17.3 設備端實作</h3>
<p>設備端依照 "SMsgCommandTask" 陣列要求,回覆對應的IO Command即可。</p>
<p>> 備註:詳細回覆的IO Command 對應 # 二、設備設定功能 中任何一條 或 多條 設備指令,具體的內容以設備對接的功能項目為準。</p>
<h3>2.17.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h1>三、SD卡重播功能</h1>
<h2>3.1 取得SD卡事件列表</h2>
<h3>3.1.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “liveview” 陣列中包含 "flag": "sd_event" 設定時,將判定為該設備支援SD卡錄影查詢功能。</li>
<li>根據此結果,終端用戶可在App上查詢SD卡中儲存的事件,並進行回放。</li>
</ul>
<h3>3.1.2 App端實作</h3>
<p>App讀取Device Profile中的 “liveview” 陣列如下:</p>
<pre><code class="language-json">&quot;liveview&quot;: [
{
&quot;flag&quot;: &quot;sd_event&quot;
}
]</code></pre>
<p>App發送如下IO Command詢問設備的SD卡事件清單:</p>
<p><code>IOTYPE_USER_IPCAM_LISTEVENT_REQ = 0x0318;</code></p>
<h3>3.1.3 設備端實作</h3>
<p>設備需回應如下IO Command回傳SD卡事件清單:</p>
<p><code>IOTYPE_USER_IPCAM_LISTEVENT_RESP = 0x0319;</code></p>
<h3>3.1.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>3.2 SD卡事件回放</h2>
<h3>3.2.1 對接說明</h3>
<ul>
<li>在Kalay APP上,根據前述所取得的SD卡事件清單中,所回應的 "STimeDay stTimeDay" 參數,向設備要求對應時間的SD卡事件進行播放。</li>
<li>設備應在指定通道傳回對應的事件內容。</li>
<li>在Kalay APP上,播放控制將由ijK player處理。</li>
</ul>
<h3>3.2.2 App端實作</h3>
<p>App發送如下IO Command請求播放指定的某個SD卡事件:</p>
<p><code>IOTYPE_USER_IPCAM_RECORD_PLAYCONTROL_REQ = 0x031A;</code></p>
<p>> 備註:在回放模式下,"downloadFlag"參數 將設定為 "0:回放模式",設備需依照音訊串流的方式傳送SD卡事件內容。</p>
<h3>3.2.3 設備端實作</h3>
<p>設備需回應如下IO Command回傳播放結果:</p>
<p><code>IOTYPE_USER_IPCAM_RECORD_PLAYCONTROL_RESP = 0x031B;</code></p>
<p>關於設備端如何實施SD卡事件回放功能,請參考[#基于AVAPIs的事件回放[下载]流程](<a href="https://note.youdao.com/ynoteshare/index.html?id=5df4743d83ea31fcc3afa6a073c11316&type=note&_time=1721806295857">https://note.youdao.com/ynoteshare/index.html?id=5df4743d83ea31fcc3afa6a073c11316&type=note&_time=1721806295857</a> "#基于AVAPIs的事件回放[下载]流程")</p>
<h3>3.2.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h2>3.3 SD卡事件下載</h2>
<h3>3.3.1 對接說明</h3>
<ul>
<li>在Kalay APP上,根據前述取得的SD卡事件清單中,所回應的 "STimeDay stTimeDay" 參數,發送IO Command向設備請求對應時間的SD卡事件進行下載。</li>
<li>設備應在指定通道傳回對應的事件內容。</li>
</ul>
<h3>3.3.2 App端實作</h3>
<p>App傳送如下IO Command請求下載指定的某個SD卡事件:</p>
<p><code>IOTYPE_USER_IPCAM_EVENT_DOWNLOAD_FILE_REQ = 0x9029;</code></p>
<p>> 備註:在Kalay APP上,目前僅支援單一事件下載,且需走AVAPI下載模式(TKTransferType_AVAPI = 0)。</p>
<h3>3.3.3 設備端實作</h3>
<p>設備需回應如下IO Command返回下載檔:</p>
<p><code>IOTYPE_USER_IPCAM_EVENT_DOWNLOAD_FILE_RESP = 0x902A;</code></p>
<p>> 備註:在下載模式下,設備需依照檔案的方式(如mp4)傳送SD卡事件內容。</p>
<p>關於設備端如何實施SD卡事件下載功能,請參考[#基于AVAPIs的文件下载](<a href="https://note.youdao.com/ynoteshare/index.html?id=ad73baf467b8f7724a3030b577b0ec9b&type=note&_time=1721806636465">https://note.youdao.com/ynoteshare/index.html?id=ad73baf467b8f7724a3030b577b0ec9b&type=note&_time=1721806636465</a> "#基于AVAPIs的文件下载")</p>
<h3>3.3.4 範例</h3>
<p>IO Command各結構體的定義,可參考:[IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition")。</p>
<h1>四、雲端儲存功能</h1>
<h2>4.1 是否支援雲端存儲</h2>
<h3>4.1.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “group2” 陣列中包含 "flag": "set_cloud_setting" 設定時,將判定為該設備支援雲端儲存功能。</li>
<li>根據此結果,終端用戶可在App上點選購買雲端服務。</li>
</ul>
<p>> 備註:因前述的雲端儲存設定和是否支援雲端儲存為關聯功能,故此處透過相同的 "flag": "set_cloud_setting" 判斷。</p>
<h3>4.1.2 App端實作</h3>
<p>App讀取Device Profile中的 “group2” 陣列如下:</p>
<pre><code class="language-json">&quot;group2&quot;: [
{
&quot;flag&quot;: &quot;set_cloud_setting&quot;
}
]</code></pre>
<p>App直接讀取Device Profile判斷,無需再額外發送IO Command。</p>
<h3>4.1.3 設備端實作</h3>
<p>無</p>
<h3>4.1.4 範例</h3>
<p>無</p>
<h2>4.2 雲端儲存推流</h2>
<h3>4.2.1 對接說明</h3>
<ul>
<li>當終端使用者點擊購買雲端服務成功時,Kalay APP將發送VSaaS Info資訊給設備。</li>
<li>設備根據雲端儲存開關狀態和已接收的VSaaS Info訊息,向雲端儲存伺服器推流。</li>
<li>Kalay APP向雲端儲存服務取得事件,並進行播放或下載。</li>
</ul>
<h3>4.2.2 App端實作</h3>
<p>App呼叫下列介面將VSaaS Info資訊同步給設備:</p>
<p><code>setCloudRecordingEndpoint</code></p>
<h3>4.2.3 設備端實作</h3>
<p>關於設備端如何實作雲端儲存相關功能,請參考 [#设备端-云存储(基于SDK3)](<a href="https://note.youdao.com/ynoteshare/index.html?id=19c7bb26d3aa158cbb2a7692f7e157d0&type=note&_time=1721807719779">https://note.youdao.com/ynoteshare/index.html?id=19c7bb26d3aa158cbb2a7692f7e157d0&type=note&_time=1721807719779</a> "#设备端-云存储(基于SDK3)")</p>
<h3>4.2.4 範例</h3>
<p>無</p>
<h2>4.3 取得雲端事件列表</h2>
<h3>4.3.1 對接說明</h3>
<ul>
<li>在Kalay APP上,當取得的Device Profile 中 “liveview” 陣列中包含 "flag": "cloud_event" 設定時,將判定為該設備支援雲端儲存錄影查詢功能。</li>
<li>根據此結果,終端用戶可在App上查詢雲端伺服器中儲存的事件,並進行回放。</li>
</ul>
<h3>4.3.2 App端實作</h3>
<p>App讀取Device Profile中的 “liveview” 陣列如下:</p>
<pre><code class="language-json">&quot;liveview&quot;: [
{
&quot;flag&quot;: &quot;cloud_event&quot;
}
]</code></pre>
<p>App直接呼叫伺服器API取得雲端事件列表,無需再額外發送IO Command。</p>
<h3>4.3.3 設備端實作</h3>
<p>無</p>
<h3>4.3.4 範例</h3>
<p>無</p>
<h2>4.4 雲端事件下載</h2>
<h3>4.4.1 對接說明</h3>
<ul>
<li>在Kalay APP上,根據前述所取得的雲端事件清單中,所回應的 "timestamp" 參數,呼叫API會向伺服器要求對應時間的雲端事件進行下載。</li>
<li>伺服器將在指定通道傳回對應的事件內容。</li>
<li>在Kalay APP上,雲端事件下載將由ijK player處理。</li>
</ul>
<h3>4.4.2 App端實作</h3>
<p>App直接呼叫伺服器API進行雲端事件下載,無需再額外發送IO Command。</p>
<h3>4.4.3 設備端實作</h3>
<p>無</p>
<h3>4.4.4 範例</h3>
<p>無</p>
<h2>4.5 雲端事件刪除</h2>
<h3>4.5.1 對接說明</h3>
<ul>
<li>在Kalay APP上,根據前述所取得的雲端事件清單中,所回應的 "timestamp" 參數,呼叫API會向伺服器要求對應時間的雲端事件進行刪除。</li>
<li>伺服器將刪除對應的事件內容。</li>
</ul>
<h3>4.5.2 App端實作</h3>
<p>App直接呼叫伺服器API進行雲端事件刪除,無需再額外發送IO Command。</p>
<h3>4.5.3 設備端實作</h3>
<p>無</p>
<h3>4.5.4 範例</h3>
<p>無</p>
<h1>五、訊息功能</h1>
<h2>5.1 設備訊息推播</h2>
<h3>5.1.1 對接說明</h3>
<ul>
<li>在Kalay APP上,將採用DM Push方式實現訊息推播功能。在App成功新增設備後,將需使用的參數透過"avSendJSONCtrlRequest"傳送給設備端。</li>
<li>設備根據IO Command接收相關參數並儲存,在每次觸發偵測等事件時,發送HTTP請求向訊息伺服器產生推播訊息。</li>
<li>設備根據行為定義,在觸發偵測訊息時,可以同時錄製視頻,並保存在SD卡或雲端伺服器中,但需確保訊息推送和圖片/視訊檔案的「starttime」保持一致。</li>
</ul>
<h3>5.1.2 App端實作</h3>
<p>App直接呼叫伺服器API取得指定裝置的「dmToken」資訊。</p>
<p>App透過avSendJSONCtrlRequest 將url,dmToken等資訊同步給設備:</p>
<p>JSON IOCtrl參數說明:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">url</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">設備推送的位址</td>
</tr>
<tr>
<td style="text-align: left;">token</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">dmToken,由App呼叫API時取得</td>
</tr>
</tbody>
</table>
<h3>5.1.3 設備端實作</h3>
<p>> 設備端觸發訊息推送,建議使用最新API實作,如下說明皆以V4版本API為例。</p>
<p>設備端透過avRecvJSONCtrlRequestFn 解析url,dmToken等資訊:</p>
<p>設備端將「url」、「dmToken」參數,帶入HTTP請求中,產生偵測訊息。</p>
<p><strong>HTTP請求如下:</strong></p>
<p><strong>請求URL:</strong></p>
<ul>
<li><a href="https://{url}/hestia/v4/dm/create/event">https://{url}/hestia/v4/dm/create/event</a></li>
</ul>
<p><strong>請求方式:</strong></p>
<ul>
<li>post</li>
</ul>
<p><strong>Request Headers:</strong></p>
<ul>
<li>Authorization:Bearer {dmToken}</li>
<li>Content-Type:application/json</li>
</ul>
<p><strong>Body:</strong>
使用form-data格式</p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">udid</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">設備的UDID</td>
</tr>
<tr>
<td style="text-align: left;">starttime</td>
<td style="text-align: left;">int64</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">觸發訊息的起始時間,採用秒級單位。如設備有同時錄製圖片/視頻,請確保與該圖片/視頻檔案的起始時間保持一致。</td>
</tr>
<tr>
<td style="text-align: left;">type</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">訊息類型。詳細參考:type_enum</td>
</tr>
<tr>
<td style="text-align: left;">tag</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">標籤訊息,需進行base64編碼。在Kalay App上主要用於讀取type,flag等擴展信息,詳細定義參考:tag參數定義。</td>
</tr>
<tr>
<td style="text-align: left;">upload</td>
<td style="text-align: left;">file</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">上傳的圖片檔案(格式無限制,最大不超過300KB)。在Kalay App上主要用於訊息清單顯示縮圖。</td>
</tr>
</tbody>
</table>
<p>> “tag”參數的優先順序高於“type”參數,如果有使用“tag”將會直接讀取“tag”參數中的“type”類型。 故非必要請儘量不使用“tag”來定義消息類型。</p>
<p><strong>type_enum:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">type_enum</th>
<th style="text-align: left;">事件類型</th>
<th style="text-align: left;">event_id</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">motionSensor</td>
<td style="text-align: left;">移動偵測</td>
<td style="text-align: left;">1</td>
</tr>
<tr>
<td style="text-align: left;">human</td>
<td style="text-align: left;">人形偵測</td>
<td style="text-align: left;">16</td>
</tr>
<tr>
<td style="text-align: left;">doorbellRing</td>
<td style="text-align: left;">門鈴通話</td>
<td style="text-align: left;">2000</td>
</tr>
<tr>
<td style="text-align: left;">babyCry</td>
<td style="text-align: left;">哭聲偵測</td>
<td style="text-align: left;">17</td>
</tr>
<tr>
<td style="text-align: left;">rareSound</td>
<td style="text-align: left;">異響偵測</td>
<td style="text-align: left;">21</td>
</tr>
<tr>
<td style="text-align: left;">fallDetection</td>
<td style="text-align: left;">跌倒偵測</td>
<td style="text-align: left;">18</td>
</tr>
<tr>
<td style="text-align: left;">videoCall</td>
<td style="text-align: left;">視訊通話</td>
<td style="text-align: left;">102</td>
</tr>
<tr>
<td style="text-align: left;">face</td>
<td style="text-align: left;">人臉偵測</td>
<td style="text-align: left;">19</td>
</tr>
<tr>
<td style="text-align: left;">animal</td>
<td style="text-align: left;">寵物偵測</td>
<td style="text-align: left;">40</td>
</tr>
<tr>
<td style="text-align: left;">notappear</td>
<td style="text-align: left;">未出現提醒</td>
<td style="text-align: left;">25</td>
</tr>
<tr>
<td style="text-align: left;">intelligentWatcher</td>
<td style="text-align: left;">智能看家</td>
<td style="text-align: left;">26</td>
</tr>
<tr>
<td style="text-align: left;">perimeterIntrusion</td>
<td style="text-align: left;">區域入侵</td>
<td style="text-align: left;">27</td>
</tr>
<tr>
<td style="text-align: left;">lineCrossing</td>
<td style="text-align: left;">電子圍籬</td>
<td style="text-align: left;">28</td>
</tr>
<tr>
<td style="text-align: left;">telephoneAlarm</td>
<td style="text-align: left;">電話警報</td>
<td style="text-align: left;">29</td>
</tr>
</tbody>
</table>
<p>> - 採用DM Push進行訊息推送,訊息伺服器主要依據"type"判斷,而不再使用"event_id"區分。但Kalay App仍將"type"與"event_id"進行映射,主要是因為需與設備端SD卡/雲端事件類型保持對應。</p>
<ul>
<li>設備端SD卡/雲端事件類型定義可參考 [IO Command Definition](<a href="https://www.showdoc.com.cn/tutkiocmd/8933939875585050">https://www.showdoc.com.cn/tutkiocmd/8933939875585050</a> "IO Command Definition") 中0x0319指令的typedef enum。</li>
</ul>
<p><strong>tag參數定義:</strong></p>
<pre><code class="language-json">[
{
&quot;sensor&quot; :&quot;devicePush&quot;,
&quot;props&quot; :[
{
&quot;type&quot; :&quot;fallDetection&quot;,
&quot;flag&quot; :&quot;video&quot;
}
]
}
]</code></pre>
<p><strong>tag參數說明:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">sensor</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">預設值 "devicePush"</td>
</tr>
<tr>
<td style="text-align: left;">props</td>
<td style="text-align: left;">array</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">詳細參考props參數說明</td>
</tr>
</tbody>
</table>
<p><strong>props參數說明:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">參數</th>
<th style="text-align: left;">類型</th>
<th style="text-align: left;">是否必須</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">type</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">參考:type_enum</td>
</tr>
<tr>
<td style="text-align: left;">flag</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">參考:flag_enum</td>
</tr>
<tr>
<td style="text-align: left;">action</td>
<td style="text-align: left;">string</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">自訂動作</td>
</tr>
</tbody>
</table>
<p><strong>flag_enum:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">flag_enum</th>
<th style="text-align: left;">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">message</td>
<td style="text-align: left;">設備只觸發了訊息推送,但沒有錄製影片或圖片(可能原因有:不錄製;未插卡;錄製失敗等)</td>
</tr>
<tr>
<td style="text-align: left;">video</td>
<td style="text-align: left;">設備觸發訊息推送,同時錄製影片</td>
</tr>
<tr>
<td style="text-align: left;">image</td>
<td style="text-align: left;">設備觸發訊息推播,同時儲存圖片</td>
</tr>
</tbody>
</table>
<h3>5.1.4 範例</h3>
<p>> 此範例假設:</p>
<ul>
<li>設備的UDID為:TUTKKALAY20000000000XDSAA9JMVDB49GPGUHFJ;</li>
<li>設備在產生偵測訊息的同時,需要上傳一張縮圖,且同時錄製一段影片檔案。</li>
</ul>
<p>App直接呼叫伺服器API取得指定設備的「dmToken」資訊如下:</p>
<p><code>&quot;dmToken&quot;: &quot;w4arhzKE6uj7gBzLsv5Qe95QrR8u1289hPP-ccR04GGCnef-87dVpAn8OYWCJ4P9TRvQQ6y8AnQZighzU-msAV8gbnX5ppK d7YVbHryZ1bpAJXDXGCg==&quot;</code></p>
<p>App透過avSendJSONCtrlRequest 將url,dmToken等資訊同步給設備:</p>
<pre><code class="language-json">{
&quot;func&quot;:&quot;DmPush&quot;,
&quot;args&quot;:[
{
&quot;url&quot;:&quot;cn-dm1-kalayappstg.kalay.net.cn&quot;,
&quot;token&quot;:&quot;w4arhzKE6uj7gBzLsv5Qe95QrR8u1289hPP-ccR04GGCnef-87dVpAn8OYWCJ4P9TRvQ6y8AnQZighzU-msAV8gbnX5ppKq3L0s8m9V5H0q71hmJ_JsY2QeeyTkOzXcQM1d7YVbHryZ1bpAJXDXGCg==&quot;
}
]
}</code></pre>
<p>設備端透過avRecvJSONCtrlRequestFn 解析url,dmToken等資訊;</p>
<p>最終設備產生訊息推送的資訊為:(以下使用postman工具產生)</p>
<pre><code class="language-json">POST https://cn-dm1-kalayappstg.kalay.net.cn/hestia/v4/dm/create/event: {
&quot;Request Headers&quot;: {
&quot;authorization&quot;: &quot;Bearer w4arhzKE6uj7gBzLsv5Qe95QrR8u1289hPP-ccR04GGCnef-87dVpAn8OYWCJ4P9TRvQ6y8AnQZighzU-msAV8gbnX5ppKq3L0s8m9V5H0q71hmJ_JsY2QeeyTkOzXcQM1d7YVbHryZ1bpAJXDXGCg==&quot;,
&quot;content-type&quot;: &quot;multipart/form-data; boundary=--------------------------352369069433534314468499&quot;,
},
&quot;Request Body&quot;: {
&quot;udid&quot;: &quot;TUTKKALAY20000000000XDSAA9JMVDB49GPGUHFJ&quot;,
&quot;starttime&quot;: &quot;1722411030&quot;,
&quot;upload&quot;: &quot;&quot;,
&quot;type&quot;: &quot;motionSensor&quot;
}
}</code></pre>
<hr />
<p>[1.1.3]: #1.1.3 "1.1.3 設備端實作"
[1.2.3]: #1.2.3 "1.2.3 設備端實作"
[1.3.3]: #1.3.3 "1.3.3 設備端實作"
[2.4]: #2.4 "如何導入?"
[1.4.3]: #1.4.3 "1.4.3 设备端实作"</p>