歡迎關注公衆號: nullobject 。
文章首發在我的博客 https://www.nullobject.cn,公衆號 nullobject同步更新。
PTP/IP (PTP over IP) 是一個經過IP鏈接,創建在 Picture Transfer Protocol (PTP) 上的傳輸層
英文原版協議下載
本文檔由nullobject對應PTP-IP標準協議1.0版本進行學習整理,原版協議爲英文版,學習時依靠本身理解和使用有道雲翻譯,對理解不到位、翻譯有問題的地方麻煩批評指正。—— by nullobject in 2019-06-03 15:29html
本文檔描述了一個基於IP網絡的ISO-15740/PIMA 1574:2000/圖片傳輸協議(PTP)的實現。c++
PTP被設計用來提供與數字靜止攝影設備的標準通訊。該協議指定了標準的圖像引用行爲、操做、響應、事件、設備屬性、數據集和數據格式,以確保互操做性,還提供了可選的操做和格式,以及擴展機制。算法
The key words 「MUST」, 「MUST NOT」, 「REQUIRED」, 「SHALL」, 「SHALL NOT」, 「SHOULD」, 「SHOULD NOT」, 「RECOMMENDED」, 「NOT RECOMMENDED」, 「MAY」, 「OPTIONAL」 in this document are to be interpreted as described in 「Key words for use in RFCs to Indicate Requirement Levels」[5].編程
下表列舉了本文檔的參考資料:安全
ID/Description |
---|
[1] PTP protocol, PIMA 15740:2000 |
[2] Computer Networks, Andrew S. Tanenbaum, ISBN:0130661023, Prentice Hall Aug 09,2002 |
[3] UPnP Standard, http://www.upnp.org/resources/documents.asp |
[4] ZeroConf Standard, http://www.zeroconf.org |
[5] Formatting Conventions. http://www.faqs.org/rfcs/rfc21129.html |
縮寫 | 含義 |
---|---|
TCP | Transfer Control Protocol |
UDP | User Datagram Protocol |
IP | Internet Procotol |
PnP | Plug and Play |
PTP | Picture Transfer Protocol |
PTP-IP | IP Picture Transfer Protocol |
PIMA | Photographic and Imaging Manufacture Association |
DHCP | Dynamic Host Configuration Protocol |
v4LL | IPv4 Link-Local Address |
PTP規範定義了設備角色、操做、圖像格式和其餘相機特定的數據類型和結構。在PTP的TCP/IP實現中,全部術語和定義都按照PTP規範中定義的那樣使用。服務器
從通訊的角度來看,設備能夠充當啓動器設備(Initiator)或響應端設備(Responder),啓動器設備至關於一個客戶端,響應端設備至關於服務端。啓動器設備是向響應端設備發起操做請求的設備。響應端設備則是可以響應這些操做請求的設備。一個設備可能只是一個啓動器設備,或者只是一個響應端設備,或者二者兼備,但不能在同一個設備鏈接上同時擔任兩種角色。網絡
操做請求只能由啓動器設備發起;事件被響應端設備用於把有關它狀態的改變通知啓動器設備。併發
根據PTP協議,會話被定義爲兩個設備之間的邏輯鏈接,操做和事件事務能夠經過該邏輯鏈接進行通訊。根據PTP規範,一個響應端設備能夠支持多個併發會話,每一個會話都有本身的狀態。異步
當啓動器設備請求OpenSession操做事務時將會打開一個會話,而且使用響應端設備發出的一個有效響應成功結束該請求。socket
會話將在啓動器設備請求CloseSession操做事務時被關閉,而且使用響應端設備發出的一個有效響應成功結束該請求。當啓動器設備和響應端設備之間的鏈接被關斷開時會話也會被關閉(例如通訊超時)。
大多數操做須要在一個開放會話上下文中執行。不過,不須要打開會話就能夠經過GetDeviceInfo操做獲取設備功能。
支持多會話的設備必須可以使它們彼此保持異步和不透明。
一般,若是使用相同傳輸級別的通訊通道,則會話ID旨在使響應端設備可以按適當的順序分發來自不一樣啓動器設備的請求。對於打開不一樣通訊通道的傳輸,對於每一個會話,不須要從新設置會話ID,由於響應端設備將可以處理多個會話。
PTP的PTP- IP傳輸實現不會將會話ID發送到響應端設備。響應端設備能夠經過控制它容許的最大PTP- IP鏈接數來限制併發PTP會話的數量。
若是啓動器設備的PTP-IP層發現響應端設備不接受新的PTP-IP鏈接,它將向PTP層發送傳輸特定的錯誤代碼。在創建傳輸指定鏈接以後,啓動端設備能夠向遠程響應端設備發出GetDeviceInfo和OpenSession請求。在這個階段中,響應端設備可能返回一個設備繁忙(Device_Busy)的PTP錯誤做爲對OpenSession的響應(若是響應端設備對它可以支持的併發PTP會話的數量有限制)。在這種狀況下,啓動端設備應該釋放PTP鏈接,並稍後重試。
事務是PTP協議中操做的基本單位,PTP協議規定的全部操做都基於事務進行。事務操做請求由啓動器設備(Initiator)發起,傳送到到響應端設備(Responder),在一個會話(Session)中,同一時間只能有一個事務操做在執行,操做事務在一個會話中默認是同步的。
一個事務一般由三個階段組成:Operation Request、Operation Response、Data Phase,以下圖:
取決於事務操做自己,Data Phase這一可選階段可能不會存在於一個事務流程中,即事務只有Operation Request和Operation Response。而當事務中存在Data Phase時,數據可能從初始化器Initiator發送到響應設備Responder(即I–>R),或者反過來R–>I,但同一個操做中數據只能在一個方向上傳輸。
事務ID(TransactionID)用於在一個給定的會話中標識不一樣事務,與在PTP協議的第9.3.1項中定義的事務ID相同,是一個32位無符號整型數字。事務ID在給定的會話中是惟一且連續的數字序列,其範圍從0x00000001到0xFFFFFFFE,0x00000000和0xFFFFFFFF做爲保留值不被使用。
在PTP標準協議的7[1]節中,爲底層傳輸層定義了這些需求。
在PTP-IP的實現中,用戶程序與PTP-IP層之間的通訊基於PTP事務模型實現,參考PTP協議的9.3[1]節,該通訊模型以下圖:
本文檔的目的在於制定和說明PTP-IP通訊協議,應用程序和PTP-IP層(編程接口,API)之間交互的實現並不在本文檔的內容範圍內。本文檔僅以互操做性的方式規定兩個PTP-IP實體之間的通訊。不過,PTP層(用戶應用程序)和PTP-IP層之間的接口可能由如下基本類型組成:
每當進行請求操做時,啓動器設備(Initiator)中的應用程序就會發送一個操做請求,隨即該請求被響應端設備(Responder)接受。操做請求中一般包含一組與該操做相關的參數。
每當接收到一個操做請求,響應端設備(Responder)會發送一個操做響應做爲該操做請求的迴應。對於啓動器設備(Initiator)中應用程序發起的每一個操做請求,都須要回覆一個操做響應。操做響應中老是會包含其對應的操做請求的結果代碼,而且可能會包含一組參數。
數據讀入(Data-In)是相對於用於應用程序而言的,即數據流向是從響應端設備(Responder)到啓動器設備(Initiator)。
數據寫出(Data-Out)的數據流與數據讀入(Data-In)相反。
PTP-IP中的事件是指有關響應端設備(Responder)的狀態變動的通知,事件由響應端設備啓動。
設備的鏈接/斷開是平臺相關類型的事件。這兩個事件並不直接在啓動器設備和響應端設備之間通訊,而是當檢測到設備被鏈接/斷開時由各自的PTP-IP層生成。
操做和事件兩種事務的類型的定義在PTP協議文檔的10.11、12 [1]節中能夠找到,而且PTP協議在14 [1]節中爲設備標準的一致性肯定了一組操做和事件。
PTP標準協議文檔的7 [1]節定義了PTP標準傳輸需求,而PTP-IP則是基於使用TCP層做爲傳輸層實現:
與PTP同樣,PTP-IP也指望從其傳輸層得到可靠、穩定無錯誤的通訊通道,而TCP(位於TCP/IP協議棧中)正是能夠知足這些需求的天然傳輸層。TCP是一個基於流的傳輸層,它提供多個通訊通道(TCP Connection)和無錯誤的數據傳輸。
在PTP-IP中,兩個設備之間的全部通訊都經過兩個TCP鏈接(邏輯數據通道)進行:
因爲事件自己具備異步性質,事件的數據包與操做/數據事務數據包分開分別經過兩個單獨的通道傳輸。
PTP-IP的 命令/數據鏈接用於傳輸PTP操做請求、響應和數據事務,以及特定於PTP-IP的數據包。該鏈接由啓動器設備(Initiator)創建,並標誌本地及響應端設備(Responder)的IP地址和端口號。響應端設備(Responder)的IP地址和端口號一般是經過設備發現機制來肯定。
PTP-IP的事件鏈接做爲啓動器設備(Initiator)開啓的與響應端設備(Responder)之間的第二個鏈接,用於傳輸PTP事件,以及特定於PTP-IP的數據包。與命令/數據鏈接相同,事件鏈接由啓動器設備(Initiator)發起創建, 並標誌本地和響應端設備(Responder)的IP地址和端口號,響應端設備(Responder)的IP地址和端口號一般是經過設備發現機制來肯定。
在啓動器設備(Initiator)與響應端設備(Responder)之間的通訊中,每當須要這些傳輸通道時,啓動器設備(Initiator)將負責發起與響應端設備(Responder)的PTP-IP/TCP鏈接。如前文所述,PTP-IP的傳輸通道使用TCP鏈接實現:一個通道用於命令/數據傳輸,另外一個則用於事件傳輸。每一個通道都會標誌本地以及響應端設備(Responder)IP地址和端口號。從PTP-IP的通訊模型中能夠看到,啓動器設備(Initiator)的PTP-IP其實是一個TCP客戶端,對應地響應端設備(Responder)的PTP-IP則是一個TCP服務器。響應端設備(Responder)輪詢等待鏈接請求,而且預約義(或者動態分配)了一個TCP鏈接端口號.PTP-IP服務端默認端口號爲15740。PTP-IP鏈接創建過程:
PTP-IP中的TCP鏈接應遵循上圖所示順序進行:
在第二個TCP鏈接(事件鏈接)創建失敗的狀況下,第一個TCP鏈接(命令/數據鏈接)須要被關閉,稍後啓動器設備(Initiator)應再次嘗試創建PTP-IP鏈接。建議每次建立PTP-IP鏈接的時間間隔爲30s。
根據PTP協議7 [1]節,PTP-IP層要求傳輸通道可靠、無錯誤。這種傳輸通道能夠經過正確配置TCP鏈接來實現。
PTP-IP的TCP鏈接應該使用一下選項建立:
總的來講就是須要設置以下選項(Qt爲例):
// 禁用Nable算法 mTcpSocket->setSocketOption(QAbstractSocket::SocketOption::LowDelayOption,1); // 開啓Keep Alive選項 mTcpSocket->setSocketOption(QAbstractSocket::SocketOption::KeepAliveOption,1);
當再也不須要PTP-IP時,由啓動器設備(Initiator)關閉鏈接。當啓動器設備(Initiator)或者響應端設備(Responder)在打開的傳輸通道上發生錯誤而致使這些通道不穩定時,也應關閉PTP-IP鏈接。關閉PTP-IP鏈接時兩個TCP鏈接(命令/數據鏈接和事件鏈接)都必需要關閉。
本節主要介紹用於在啓動器設備(Initiator)和響應端設備(Responder)間通訊的一組數據包類型。PTP-IP的數據包類型至關於PTP協議中定義的操做請求(Operation Request)、響應(Response)、數據(Data)和事件(Event)事務類型。PTP-IP數據包中的全部多字節值都使用小端(Little-Endian)格式表示,一般一個PTP-IP數據包的格式以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
Payload | 根據Length計算 | ? |
Value | Description |
---|---|
0x00000000 | 保留值 |
0x0000NNNN* | Init Command Request Packet |
0x0000NNNN* | Init Command Ack |
0x0000NNNN* | Init Event Request Packet |
0x0000NNNN* | Init Event Ack Packet |
0x0000NNNN* | Init Fail Packet |
0x0000NNNN* | Operaqion Request Packet |
0x0000NNNN* | Operation Response Packet |
0x0000NNNN* | Event Packet |
0x0000NNNN* | Start Data Packet |
0x0000NNNN* | Data Packet |
0x0000NNNN* | Cancel Packet |
0x0000NNNN* | End Data Packet |
0x0000NNNN* | Probe Request Packet |
0x0000NNNN* | Probe Response Packet |
0x0000NNNN* - 0xFFFFFFFF | 保留值 |
該數據包在命令/數據傳輸通道被創建後當即被啓動器設備(Initiator)發送。該數據包經過命令/數據鏈接傳輸,用於通知響應端設備(Responder)對啓動器進行標識,從而使響應端設備(Responder)可以實現過濾機制。數據包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
Initiator GUID | 16 | UINT8 |
Initiator Friendly Name | Variable | UINT16 |
Initiator Protocol Version | 4 | UINT32 |
- 啓動器設備的GUID和響應端設備的GUID可用於進行設備綁定。若啓動器設備的GUID的16個字節全由0xFF組成,則表示該啓動器設備是一個匿名設備,此時由響應端設備決定是否容許鏈接。更多信息參考附錄5.3。
- 啓動器設備的用戶友好名稱是一個以空(NULL)字符結尾的Unicode字符串。包括結尾的空字符,其最大長度位40個字節。不使用該字段時,必須使用一個空(NULL)字符填充該字段。
數據包示例:
對應地:
該數據包由響應端設備(Responder)回傳給啓動器設備,以響應啓動器設備發送的Init Command Request Packet,併爲接下來的PTP-IP會話分配一個鏈接號(Connection Number),該數據包在命令/數據鏈接上傳輸。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
Connection Number | 4 | UINT32 |
Responder GUID | 16 | UINT6 |
Responder Friendly Name | Variable | UINT16 |
Responder Protocol Version | 4 | UINT32 |
- 響應端設備的用戶友好名稱是一個以空(NULL)字符結尾的Unicode字符串。包括結尾的空字符,其最大長度位40個字節。不使用該字段時,必須使用一個空(NULL)字符填充該字段。
- 鏈接號在啓動器設備和響應端設備鏈接被創建的期間保持有效。一旦響應端設備成功關聯屬於同一個PTP-IP鏈接的兩個TCP鏈接,鏈接號便可被從新使用。
實際該數據包結構看起來以下:
對應地:
命令/數據鏈接被成功創建後,該數據包被啓動器設備發送至響應端設備用於創建事件鏈接。啓動器設備在接收到一個有效的Init Command Ack Packet數據包後,當即創建事件的TCP鏈接併發送Init Event Request Packet數據包,包中攜帶的鏈接號即前面步驟中接收到的在Init Command Ack數據包中返回的鏈接號。Init Event Request數據包經過事件鏈接傳輸。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
Connection Number | 4 | UINT32 |
數據包示例:
對應地:
該數據包由響應端設備(Responder)經過事件鏈接通道回傳給啓動器設備,以告知啓動器設備PTP-IP鏈接創建成功。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
數據包示例:
對應地:
初始化失敗數據包。當PTP-IP鏈接創建失敗時,該數據包由響應端設備(Responder)回傳給啓動器設備,以告知啓動器設備鏈接創建失敗及失敗緣由,失敗緣由被記錄在Reason字段。接收到該數據包以後,啓動器設備必須關閉先前步驟中創建的命令/數據鏈接。該數據包發出後,響應端設備亦應關閉相應的PTP-IP鏈接(由啓動器設備發起的被拒絕的TCP鏈接)。Init Fail Packet能夠經過任意的TCP鏈接傳輸。更多有關PTP-IP鏈接的創建能夠參考PTP-IP鏈接一節內容。
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
Reason | 4 | UINT32 |
Reason字段包含了鏈接拒絕的錯誤碼,該字段定義的錯誤碼有如下幾種:
操做請求數據包。該數據包在PTP-IP協議中用於傳輸在PTP標準協議9.3.2 [1]節定義的PTP操做請求。PTP-IP Operation Request Packet由啓動器設備發送至響應端設備,並經過命令/數據通道傳輸。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
Data Phase Info | 4 | UINT32 |
Operation Code | 2 | UINT16 |
TransactionID | 4 | UINT32 |
Parameter1 | 4 | UINT32 |
Parameter2 | 4 | UINT32 |
Parameter3 | 4 | UINT32 |
Parameter4 | 4 | UINT32 |
Parameter5 | 4 | UINT32 |
Data Phase Info:指示下一個數據階段是數據寫(data out)階段仍是數據讀/數據(data in/no)階段,該字段值被定義爲下列幾種:
- 若是Data Phase Info字段被設置爲Data Out Phase,則在發送該數據包後接着必需要發送一個Start Data Packet包。
- 若是啓動器設備須要發送空數據對象到響應端設備,有兩個選項可選:1.將Data Phase Info字段設置爲No data or data in phase,在這狀況下響應端設備將會直接回應一個Operation Response Packet包,而不會等待Data Packet;2.將Data Phase Info字段設置爲Data out Phase.在這種狀況下,數據寫階段(data out phase)必須只包含一個Start Data Packet包,並將該包的Total Data Length字段設置爲0x00000000,而且啓動器設備必須不能發送後續的End Data Packet數據包。
實際該數據包結構以下:
對應地:
操做響應數據包。該數據包在PTP-IP協議中用於傳輸在PTP標準協議9.3.4 [1]節定義的PTP操做響應。PTP-IP Operation Response Packet數據包由響應端設備經過命令/數據通道迴應給啓動器設備。操做響應數據包僅在須要指示操做請求事務已經結束而且須要傳遞操做結果時才由響應端設備發送給啓動器設備。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
Response Code | 2 | UINT16 |
TransactionID | 4 | UINT32 |
Parameter1 | 4 | UINT32 |
Parameter2 | 4 | UINT32 |
Parameter3 | 4 | UINT32 |
Parameter4 | 4 | UINT32 |
Parameter5 | 4 | UINT32 |
實際該數據包結構以下:
對應地:
事件數據包。該數據包用於傳輸在PTP標準協議12.2 [1]節中定義的事件。這些事件由響應端設備經過事件鏈接通道發送給啓動器設備,以通知啓動器設備響應端的狀態變動。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
Event Code | 2 | UINT16 |
TransactionID | 4 | UINT32 |
Parameter1 | 4 | UINT32 |
Parameter2 | 4 | UINT32 |
Parameter3 | 4 | UINT32 |
開始數據傳輸數據包。該數據包在PTP-IP中用於標識數據傳輸的開始。其經過命令/數據通道傳輸,能夠由任意一設備端發送,另外一端接收。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
TransactionID | 4 | UINT32 |
Total Data Length | 8 | UINT64 |
數據包示例:
其中:
該數據包在PTP-IP中用於傳輸數據。Data Packet包只在數據階段使用,且能夠由當前數據流方向上的任意一端發送,另外一端接收:在數據讀(data-in)階段由響應端設備發送給啓動器設備;在數據寫(data-out)階段由啓動器設備發送給響應端設備。Data Packet數據包走的是命令/數據的鏈接通道。
因爲TCP傳輸是無錯誤、基於流的協議,一般不須要對大型的數據包進行拆包和粘包操做。不過可使用基本的碎片機制來實現一個簡單的數據傳輸取消機制,Data Packet不須要進行錯誤校驗。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
TransactionID | 4 | UINT32 |
Data Payload | ? | UINT8 |
數據包示例:
其中:
終結數據傳輸的數據包。End Data Packet數據包在PTP-IP中用於標識數據階段的結束,該數據包中也能夠攜帶一些有用數據。該數據包只在一個事務的數據階段使用,能夠由數據流方向上的任意一端發送,另外一端接收:在數據讀(data-in)階段由響應端設備發送給啓動器設備;在數據寫(data-out)階段由啓動器設備發送給響應端設備。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
TransactionID | 4 | UINT32 |
Data Payload | ? | UINT8 |
數據包示例:
其中:
Cancel Packet數據包用於取消傳輸事務,由啓動器設備發送至響應端設備。該數據包在命令/數據鏈接通道和事件鏈接通道上發送。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
TransactionID | 4 | UINT32 |
心跳包。該數據包可用於PTP-IP的啓動器設備和響應端設備,以檢查對等設備是否仍然有效。當接收到該數據包時,設備必須當即響應一個Probe Response Packet數據包。若是在一段合理的時間內沒有收到響應,則發出該數據包的設備將關閉與對端設備的PTP-IP會話。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
數據包示例:
其中前、後四個字節分別爲Length字段和Packet Type字段。
使用該數據包時應要注意控制發送的頻率以免形成局域網過載:
- 啓動器設備發送至響應端設備(I–>R):建議這個包只在PTP事務中使用(例如,當發出格式命令時,若是存儲介質很大,響應時間可能會很長),以便檢查響應端設備是否仍然處於活躍狀態。
- 響應端設備發送至啓動器設備(R–>I):建議僅當響應端設備接收到一個新的PTP-IP會話的請求,而另外一個或多個其餘會話處於活動狀態時,才使用此包。在這種狀況下,響應端設備能夠檢查現有的PTP-IP鏈接是否仍然處於活動狀態。
- 建議在發送Probe Request Packet數據包和接收Probe Response Packet包之間設置10秒的超時時間。
心跳包的迴應數據包。該數據包可用於PTP-IP的啓動器設備和響應端設備,做爲另外一端的Probe Request Packet請求的響應。當接收到一個Probe Request Packet請求時應當當即回覆這個數據包。
包結構以下:
Field | Size[Bytes] | Data Type |
---|---|---|
Length | 4 | UINT32 |
Packet Type | 4 | UINT32 |
數據包示例:
其中前、後四個字節分別爲Length字段和Packet Type字段。
由啓動器設備在PTP層發起的新會話請求將生成兩個新的TCP鏈接,這兩個鏈接即對應於PTP-IP層的命令/數據(Command/Data)鏈接和事件(Event)鏈接。這兩個TCP鏈接足夠用來惟一標識其所屬的會話,所以不須要將會話ID(SessionID)做爲獨立的值從啓動器設備發送到響應端設備。
在PTP-IP協議中,對設備的斷開或者網絡丟失的檢測基於如下一些標準:
爲了防止一個設備在事務的數據階段用數據重載另外一個設備,一般會實現一個數據流控制機制。不過在PTP-IP中不須要實現這樣的機制,由於底層的TCP層會執行流控制操做。
TCP層在兩個級別實現流控制:接收設備和網絡,避免在低速接收和低速網絡下數據氾濫。所以,在PTP-IP中採用TCP鏈接做爲通訊通道,直接解決了流量控制的問題。
有兩種可能取消事務的狀況:啓動器設備請求取消或者響應端設備請求取消。
啓動器設備爲了取消正在進行的數據寫階段傳輸,必須在命令/數據通道和事件通道上發出一個Cancel Packet數據包,並中止任何正在命令/數據通道上的數據傳輸。當響應端設備在命令/數據通道或事件通道上收到Cancel Packet數據包時,必須儘量快地中斷並取消正在進行的事務,同時讀取和丟棄全部屬於當前事務(若是有)的剩餘的數據包,而且向啓動器設備迴應一個附帶有Transaction_Cancelled響應碼的Operation Response Packet數據包。
啓動器設備爲了取消正在進行的數據讀階段傳輸,必須在命令/數據通道和事件通道上發出一個Cancel Packet數據包。響應端設備在命令/數據通道或事件通道上收到Cancel Packet數據包時,必須儘量快地中斷並取消正在進行的事務,而且向啓動器設備迴應一個附帶有Transaction_Cancelled響應碼的Operation Response Packet數據包。
啓動器設備能夠經過在命令/數據通道和事件通道上發出一個Cancel Packet數據包以在事務的任意階段退出事務。若是取消的是當前的事務,則響應端設備必須迴應一個附帶有Transaction_Cancelled響應碼的Operation Response Packet數據包。
響應端設備爲了取消正在進行的數據寫階段傳輸,必須發送一個附帶有Transaction_Cancelled或者其餘標識數據傳輸中斷緣由的響應碼的Operation Response Packet數據包。而後,響應端設備必須讀取和丟棄全部屬於當前事務的在命令/數據通道中的Data Packet數據包。
響應端設備爲了取消正在進行的數據讀階段傳輸,必須在命令/數據通道上發送一個Operation Response Packet數據包,而且附帶Transaction_Cancelled響應碼或其餘標識數據傳輸中斷緣由的響應碼。
響應端設備能夠經過發送附帶Transaction_Cancelled響應碼或其餘標識數據傳輸中斷緣由的響應碼的Operation Response Packet以在事務的任意階段退出事務。
啓動器設備爲了取消一個異步操做,必須同時在命令/數據通道和事件通道發送一個包含該異步操做所屬的事務ID的Cancel Packet數據包,啓動器設備能夠在任意時候發送這些數據包。
響應端設備將以PTP事件(例如Capture Complete event)結束操做。解釋取消請求的邏輯由響應端設備的應用層負責。
該PTP-IP規範的二進制協議版本(BINARY PROTOCOL VERSION)是0x00010000(1.0版)。二進制協議版本由一個主要數字(高16位表示)和一個次要數字(低16位表示)組成。這個數字將增長,以表示較新的協議版本,方法以下:
若是沒有實現設備發現協議,則每個響應端設備和啓動器設備應該經過如下端口號來初始化:
Port Name | Port No. | Type | Description |
---|---|---|---|
PTP-IP service | 15740 | TCP | 響應端設備等待TCP鏈接的默認端口,該端口由IANA批准。 |
PTP-IP協議的基礎是TCP/IP協議,該協議的關鍵是尋址機制。響應端設備和啓動端程序都將得到有效的IP地址。獲取有效IP地址的方法有如下幾種:
爲了處理設備的TCP/IP屬性配置,建議執行如下步驟:
在PTP-IP中,啓動器設備能夠經過如下幾種方式配置鏈接到響應端設備的地址:
PTP規範第7.4條要求從其傳輸中支持設備發現和枚舉。所以,PTP-IP 層應該至少實現以上這些服務中的一種。
無論使用什麼服務發現和枚舉,咱們建議將設備的GUID做爲廣播包的一部分,這樣啓動端設備就可以過濾(若是須要的話)特定的設備,並生成選擇性通知。
認證並非PTP-IP層的職責。若是須要身份驗證,則應該依賴於底層網絡(物理/數據鏈路層)中可用的解決方案。設備綁定能夠依賴於底層網絡可用的機制或者基於PTP-IP層提供的機制在應用層實現,以下:
PTP-IP上下文中每個設備都須要由一個可被用於設備綁定的全局惟一的標識:GUID(16字節的惟一數字)。對於這些設備,PTP-IP層提供了一個容許啓動器設備和響應端設備互相交換GUID的機制。這進而容許應用層實現設備級訪問控制(例如,一個新設備到達並被網絡發現,該設備只能接受來自已知啓動器設備的的選擇性鏈接,或者只能啓動到已知響應端設備的鏈接)。
不管使用什麼服務發現和枚舉方法,都建議將設備的GUID做爲廣播包的一部分,這樣啓動端設備就可以過濾(若是須要的話)特定的設備,並生成選擇性通知。
本節不屬於PTP-IP協議的範圍。數據安全將依賴於底層網絡(物理/數據鏈路層)中可用的解決方案。