室內安防設備對接邊緣服務器接口定義
1 方案介紹
室內各傳感器的數(shù)據(jù)都匯總到室內機上,室內機通過小區(qū)局域網(wǎng)直連物業(yè)管理一體機,即邊緣服務器。傳感器產生的報警事件由室內機上報到邊緣服務器。邊緣服務生成物模型事件并同步到物聯(lián)網(wǎng)平臺
2 接口說明
室內機對接邊緣服務器,訪問10070端口。
邊緣服務器訪問室內機的端口由設備廠商自定義,定義后固定不變。
所有HTTP 報文的首部信息中,不能帶有Connection: Keep-Alive字段,可以設置為Connection:Close。
物業(yè)管理一體機,以下簡稱“邊緣服務器”。
3 服務接口
3.1 服務檢測
調用此接口檢查服務是否可用。
URL:http://[邊緣服務器IP 或 室內機IP]:[端口]/alarm/ping
Method:GET
Content-Type:application/json
說明
服務啟動后開始監(jiān)聽端口數(shù)據(jù),當收到ping消息后,立刻回復pong,以表示服務狀態(tài)正常,否則無消息返回。
請求參數(shù)
無。
返回參數(shù)
名稱 | 類型 | 示例值 | 描述 |
code | Integer | 0 | 調用成功時,返回0。固定內容。 |
message | String | pong | 調用成功時,返回“pong”。固定內容。 |
示例
正常返回示例
{
"code": 0,
"message": "pong"
}
3.2 建立連接
室內機向邊緣服務器發(fā)送連接請求。
URL:http://[邊緣服務器IP]:[端口]/alarm/connect
Method:POST
Content-Type:application/json
說明
前置條件:
室內機先預置安全密鑰(RSA公鑰),再進行連接。
建立連接交互流程:
室內機攜帶下面的請求參數(shù)向邊緣服務器發(fā)起連接請求。
邊緣服務器校驗IP參數(shù)是否已經(jīng)配置,如未配置,拒絕連接請求。設備信息配置需要預先在云端配置好,并部署到邊緣。
如果配置校驗通過,邊緣服務器返回成功消息給室內機。響應消息中包含一個有效的token。
邊緣服務器向室內機發(fā)送“服務檢測”ping請求,室內機返回pong消息給邊緣服務器,連接建立完成。
如果室內機沒有收到成功消息和token,等待一分鐘后,再次發(fā)起連接請求。
connect請求里,如果參數(shù)encrypted為1,那么參數(shù)ciphertext的內容為使用RSA公鑰加密的密文。下面是生成密文和發(fā)送密文的方法:
室內機先隨機生成一個長度為16字節(jié)的AES Secret Key,再使用預置的RSA公鑰對AESSecret Key進行加密,把生成的密文發(fā)送給邊緣服務器。
邊緣服務器使用RSA私鑰解密出AES Secret Key并保存,在后續(xù)通信中,用它對數(shù)據(jù)進行加解密。
連接建立成功后,室內機發(fā)送的數(shù)據(jù)都使用AES Secret Key進行加密,室內機收到的數(shù)據(jù)也是使用AES Secret Key加密的。
說明:
RSA的加密模式為:ECB;填充模式為:PKCS1Padding。(JAVA為:RSA/ECB/PKCS1Padding)
AES長度128位,加密模式為:ECB;填充模式為:PKCS7Padding。(JAVA為:AES/ECB/PKCS5Padding)
限制
調用該接口的每秒請求數(shù)(QPS)最大限制為10。
請求參數(shù)
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
version | String | 是 | 2021-01-01 | API版本號,為日期形式: |
protocol | String | 是 | 2021-01-01 | 設備的通信協(xié)議的版本號,為日期形式: 邊緣服務器發(fā)起請求時,使用此參數(shù)作為version,即version為 |
sn | String | 是 | 123456789 | 設備的唯一編碼。長度為4-32個字符,可以包含英文字母、數(shù)字和特殊字符:連字符(-)、下劃線(_)、at符號(@)、點號(.)、和英文冒號(:)。 |
vendor | String | 是 | DEV | 設備廠商名稱。 |
model | String | 否 | DEV-HW-210 | 設備硬件型號。 |
time | Integer | 是 | 1589472000 | 請求的時間戳。以秒為單位,需要使用UTC時間。 |
ip | String | 是 | 192.168.1.128 | 連接發(fā)起方的IPv4地址。 |
mac | String | 是 | 00-16-EA-AE-3D-40 | 連接發(fā)起方的MAC地址。 |
port | int | 是 | 10000 | 邊緣服務器訪問設備服務的端口,如果不提供,填寫-1。 |
keepalive | Integer | 是 | 30 | 心跳最大間隔。單位:秒,合法取值范圍[10,120]。 |
encrypted | Integer | 是 | 1 | 是否采用數(shù)據(jù)加密模式。
|
ciphertext | String | 否 | mrmZ2Amm5TNDjlxA+ssNt23QTcbcQNKxzMc+YDoewHkR1eOT2+fk= | 如果encrypted為1,需要傳遞此參數(shù)。先隨機生成一個長度為16字節(jié)的AES Secret Key,再使用預置的RSA公鑰對Secret Key進行加密,再把密文進行Base64編碼得到的結果就是ciphertext的內容。 |
返回參數(shù)
名稱 | 類型 | 示例值 | 描述 |
code | Integer | 0 | 調用成功時,返回0。失敗時,返回的錯誤碼。詳見錯誤碼表。 |
message | String | success | 調用結果描述。 |
data | JSONObject | 調用成功時,返回內容定義如下。 |
名稱 | 類型 | 示例值 | 描述 |
token | String | 6f2a-***-1-128 | 連接成功后,由接收連接的server端頒發(fā)的連接成功標識,代表一個有效連接,最大長度位64字節(jié)。在后續(xù)client的請求中需要攜帶,如“心跳保活”。 |
示例
請求示例
{
"version": "2021-01-01",
"protocol": "2021-01-01",
"sn": "123456789",
"vendor": "DEV",
"model": "DEV-HW-210",
"time": 1589472000,
"ip": "192.168.1.128",
"mac": "00-16-EA-AE-3D-40",
"port": 10000,
"keepalive": 30,
"encrypted": 1,
"ciphertext": "hlbtFix0/wrcca8SqUcy+5Q8J76xOM29fp4itQhstZhAQRRi+RITQPupSSnrZCXAGzPHYUdbKWijcMa0FGwAoPqw4m0Mot1HT3qKxMBHTvSGuOEayozZJMj18FL0tceGZ2V5BxkethBDsRTfn2qaDEMCaS9+go0dqj1aP0IjrYg="
}
正常返回示例
{
"code": 0,
"message": "success",
"data":{
"token": "6f2ae65e-d7f3-11ea-9a16-6c96cfdfd355-192-168-1-128"
}
}
3.3 心跳保活
室內機向邊緣服務器定期發(fā)送心跳消息,以確保消息通道的連通性,維持設備的在線狀態(tài)。
URL:http://[邊緣服務器IP]:[端口]/alarm/keepalive
Method:POST
Content-Type:application/json
說明
建立連接后,服務器會向客戶端頒發(fā)一個token,心跳消息中需要攜帶此token。當發(fā)送心跳時,返回token無效,那么需要重新建立連接,獲取有效token。
成功時,返回的消息體中包含一個時間參數(shù),可以用來同步雙方時間。
限制
調用該接口的每秒請求數(shù)(QPS)最大限制為100。
請求參數(shù)
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
version | String | 是 | 2021-01-01 | API版本號,為日期形式: |
token | String | 是 | 6f2a-***-1-128 | 有效連接的標識。 |
返回參數(shù)
名稱 | 類型 | 示例值 | 描述 |
code | Integer | 0 | 調用成功時,返回0。失敗時,返回的錯誤碼。詳見錯誤碼表。 |
message | String | success | 調用結果描述。 |
data | JSONObject | 調用成功時,返回內容定義如下。 |
名稱 | 類型 | 示例值 | 描述 |
time | String | 1591069176000 | 響應消息生成的時間,時間戳以毫秒為單位,需要使用UTC時間。 |
示例
請求示例
{
"version": "2021-01-01",
"token": "6f2ae65e-d7f3-11ea-9a16-6c96cfdfd355-192-168-1-128"
}
正常返回示例
{
"code": 0,
"message": "success",
"data":{
"time": "1591069176000"
}
}
3.4 上報防區(qū)信息和狀態(tài)
室內機上報主機下的防區(qū)信息和防區(qū)狀態(tài)給邊緣服務器。
URL:http://[邊緣服務器IP]:[端口]/alarm/reportZoneInfo
Method:POST
Content-Type:application/json
說明
每次建立連接后,上報一次防區(qū)信息和狀態(tài)。當防區(qū)信息或狀態(tài)變化時,立即上報實時的防區(qū)信息和狀態(tài)。
限制
調用該接口的每秒請求數(shù)(QPS)最大限制為100。
請求參數(shù)
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
version | String | 是 | 2021-01-01 | API版本號,為日期形式: |
token | String | 是 | 6f2a-***-128 | 有效連接標識。 |
zoneInfo | JSONArray | 是 | 防區(qū)信息。 | |
| String | 是 | 01 | 防區(qū)的唯一標識。 |
| Integer | 是 | 1 | 防區(qū)下的探測器類型,枚舉值見附錄。 |
| Integer | 是 | 1 | 防區(qū)布防狀態(tài),枚舉如下:
|
加密的
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
version | String | 是 | 2021-01-01 | API版本號,為日期形式: |
token | String | 是 | 6f2a-***-128 | 有效連接標識。 |
ciphertext | String | 是 | ewogICAgJ2EiJzoiYiIKfQ== | 先將zoneInfo對應的內容轉換為JSON字符串,再使用AES密鑰進行加密,最后把密文Base64編碼。 例如: "zoneInfo":abc,abc就是需要加密的內容。 |
返回參數(shù)
名稱 | 類型 | 示例值 | 描述 |
code | Integer | 0 | 調用成功時,返回0。失敗時,返回的錯誤碼。詳見錯誤碼表。 |
message | String | success | 調用結果描述。 |
示例
請求示例
{
"version":"2021-01-01",
"token":"6f2ae65e-d7f3-11ea-9a16-6c96cfdfd355-192-168-1-128",
"zoneInfo":[
{
"zoneID":"01",
"zoneDeviceType":1,
"zoneState":1
},
{
"zoneID":"02",
"zoneDeviceType":3,
"zoneState":2
}
]
}
加密的
{
"version":"2021-01-01",
"token":"6f2ae65e-d7f3-11ea-9a16-6c96cfdfd355-192-168-1-128",
"ciphertext":"ewogICAgJ2EiJzoiYiIKfQ=="
}
正常返回示例
{
"code": 0,
"message": "success"
}
3.5 設置防區(qū)布防狀態(tài)
邊緣服務器對室內機下的指定防區(qū)進行設防或撤防操作。
URL:http://[室內機IP]:[端口]/alarm/setZoneAlertState
Method:POST
Content-Type:application/json
說明
可以對一個或多個防區(qū)進行布防或撤防操作。
限制
調用該接口的每秒請求數(shù)(QPS)最大限制為100。
請求參數(shù)
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
version | String | 是 | 2021-01-01 | 為connect接口傳遞的protocol參數(shù)值。 |
zoneInfo | JSONArray | 是 | 防區(qū)信息。 | |
| String | 是 | 01 | 防區(qū)的唯一標識。 |
| Integer | 是 | 1 | 防區(qū)狀態(tài),枚舉如下:
|
| String | 是 | 1591069176000 | 設置操作的時間,時間戳以毫秒為單位,需要使用UTC時間。 為了防止重放攻擊,室內機需要記錄這個時間,如果收到請求的時間參數(shù)等于或小于最后記錄的時間,則拋棄這個請求。 |
加密的
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
version | String | 是 | 2021-01-01 | 為connect接口傳遞的protocol參數(shù)值。 |
ciphertext | String | 是 | ewogICAgJ2EiJzoiYiIKfQ== | 先將zoneInfo對應的內容轉換為JSON字符串,再使用AES密鑰進行加密,最后把密文Base64編碼。 例如: "zoneInfo":abc,abc就是需要加密的內容。 |
返回參數(shù)
名稱 | 類型 | 示例值 | 描述 |
code | Integer | 0 | 調用成功時,返回0。失敗時,返回的錯誤碼。詳見錯誤碼表。 |
message | String | success | 調用結果描述。 |
示例
請求示例
{
"version":"2021-01-01",
"zoneInfo":[
{
"zoneID":"01",
"zoneState":1,
"time":"1591069176000"
},
{
"zoneID":"02",
"zoneState":2,
"time":"1591069176000"
}
]
}
加密的
{
"version":"2021-01-01",
"ciphertext":"ewogICAgJ2EiJzoiYiIKfQ=="
}
正常返回示例
{
"code": 0,
"message": "success"
}
3.6 防區(qū)報警
室內機發(fā)送防區(qū)設備報警信息給邊緣服務器。
URL:http://[邊緣服務器IP]:[端口]/alarm/reportAlarm
Method:POST
Content-Type:application/json
說明
當防區(qū)設備觸發(fā)報警時,根據(jù)報警觸發(fā)規(guī)則,室內機上報報警信息給邊緣服務器。
限制
調用該接口的每秒請求數(shù)(QPS)最大限制為100。
請求參數(shù)
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
version | String | 是 | 2021-01-01 | API版本號,為日期形式: |
token | String | 是 | 6f2a-***-128 | 有效連接標識。 |
alarmInfo | JSONArray | 是 | 報警信息。 | |
| String | 是 | 01 | 防區(qū)的唯一標識。 |
| String | 否 | 1591069176000 | 報警事件發(fā)生的歷史時間,如果無此參數(shù),表示事件發(fā)生在當前時間。 時間戳以毫秒為單位,需要使用UTC時間。 |
加密的
名稱 | 類型 | 是否必選 | 示例值 | 描述 |
version | String | 是 | 2021-01-01 | API版本號,為日期形式: |
token | String | 是 | 6f2a-***-128 | 有效連接標識。 |
ciphertext | String | 是 | ewogICAgJ2EiJzoiYiIKfQ== | 先將alarmInfo對象轉換為JSON字符串,再使用AES密鑰進行加密,最后把密文Base64編碼。 例如: "alarmInfo":abc,abc就是需要加密的內容。 |
返回參數(shù)
名稱 | 類型 | 示例值 | 描述 |
code | Integer | 0 | 調用成功時,返回0。失敗時,返回的錯誤碼。詳見錯誤碼表。 |
message | String | success | 調用結果描述。 |
示例
請求示例
{
"version":"2021-01-01",
"token":"6f2ae65e-d7f3-11ea-9a16-6c96cfdfd355-192-168-1-128",
"alarmInfo":[
{
"zoneID":"01"
},
{
"zoneID":"02",
"alarmTime":"1591069176000"
}
]
}
加密的
{
"version":"2021-01-01",
"token":"6f2ae65e-d7f3-11ea-9a16-6c96cfdfd355-192-168-1-128",
"ciphertext":"ewogICAgJ2EiJzoiYiIKfQ=="
}
正常返回示例
{
"code": 0,
"message": "success"
}
附錄
探測器類型
1.SOS緊急按鈕
2.紅外
3.門磁
4.窗磁
5.瓦斯
6.煙霧
7.水浸
8.震動
9.氣壓