工作應用總結
1、確認信息:
(1)攝像頭/設備型號(2)是否有開放平臺、是post or get連接(3)接口文檔(4)headers、body/params參數和編碼格式。
2、連接通信:
若有示例,參考示例編輯代碼,由返回值結果確認連接成功與否
具體示例
1、開放平臺 - 和目攝像頭平臺開發記錄
- 學習消息頭header和正文body規範
- 調用python的requests包與服務器端建立連接
-
response = requests.post(url, data=json.dumps(body), headers=headers)
- 獲取並驗證響應報文response.text
具體流程詳細說明:
1、首先在專業平臺申請賬號 https://pro.andmu.cn/,因爲本次開發需要專業版,普通版申請未通過;
2、在和目開放平臺申請賬號 https://open.andmu.cn/,其中專業版賬號密碼和region與第一步相同,見圖1;
申請專業應用的結果和賬號部分信息,見圖2。獲取平臺開發的相關信息之後,即可以參考接口文檔做二次開發了。
3、參照和目開放平臺開發文檔
依次獲取token、設備列表、攝像機視頻播放WebSDK鏈接等
附:
基於Token的身份驗證的過程如下:
1.用戶通過用戶名和密碼發送請求。
2.程序驗證。
3.程序返回一個簽名的token 給客戶端。
4.客戶端儲存token,並且每次用於每次發送請求。
5.服務端驗證token並返回數據。
問題及解決方式:
(1)直接拿網頁上的參數調接口,網頁可以調通,但本地出現{"resultCode":"000008","resultMsg":"數據校驗失敗"}
方法:打印日誌對比如下。
正確:"request":"{"sig":"68a182330016b9d6957f09e8c8d07eec","operatorType":1}"}"
錯誤:"request":"sig=68a182330016b9d6957f09e8c8d07eec&operatorType=1"}"
更新:data=json.dumps(body).replace(" ", "")
(2)報錯:{"resultCode":"000004","resultMsg":"簽名驗證失敗“}
更新:在headers裏添加token
headers = {
'content-type': 'application/json;utf-8',
"appid": appid,
"md5": md5,
"timestamp": "1569218400437",
"version": "1.0.0",
"token": token,
"signature": signature2
}
圖1:圖2:完成開發賬號申請:
備註:研究rsa加密原理。
本次python實現rsa簽名的示意代碼如下:
# RSA密鑰
rsakey = RSA.importKey(base64.b64decode(rsaSecret))
signer = Signature_pkcs1_v1_5.new(rsakey)
digest = SHA.new()
digest.update(json.dumps(header).replace(" ", "").encode("utf-8"))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
示意代碼:
# coding:utf-8
import requests, json
import hashlib
from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
from Crypto.PublicKey import RSA
import base64
#(1)獲取token
url1 = "https://open.andmu.cn/v3/open/api/token"
appid = '5ee2606645f345fc800ec'
secret = 'UWHAPpsG1e0'
rsaSecret = 'MIICdgIBADAN'
test = appid + secret
m = hashlib.md5()
m.update(test.encode(encoding='utf-8'))
sig = m.hexdigest()
body = {
"sig": sig,
"operatorType": 1,
}
m = hashlib.md5()
m.update(json.dumps(body).replace(" ", "").encode("utf-8"))
md5 = m.hexdigest()
header = {
"appid": appid,
"md5": md5,
"timestamp": "1569218400437",
"version": "1.0.0"
}
# RSA密鑰
rsakey = RSA.importKey(base64.b64decode(rsaSecret))
signer = Signature_pkcs1_v1_5.new(rsakey)
digest = SHA.new()
digest.update(json.dumps(header).replace(" ", "").encode("utf-8"))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
headers = {
'content-type': 'application/json;utf-8',
"appid": appid,
"md5": md5,
"timestamp": "1569218400437",
"version": "1.0.0",
"signature": signature
}
response = requests.post(url1, data=json.dumps(body).replace(" ", ""), headers=headers)
print(response)
print(response.text)
2、單機連接 - 物聯網AI攝像頭開發記錄
- 用於辦公區人臉檢測、人流統計的攝像頭連接
HTTP服務器 - python中http.server
參考文檔:http.server
HTTPServer,是socketserver.TCPServer的子類,利用此python工具包監聽相機端投遞的人臉圖、客流數據以及設備狀態信息。
相機投遞數據官方文檔
官方文檔:接口和數據文檔
關鍵點包括:與相機單機連接方式爲POST方式,投遞數據內容爲json格式。
其他介紹
AI攝像機的開發包括單機模式和平臺模式,需要獲取攝像機的信息包括人臉抓拍圖和視頻流,目前物聯網公司給出的AI攝像頭僅支持從平臺模式拉取視頻流,且需通過rtmp服務器接收。
動產質押demo時間有限,沒有rtmp服務器,所以暫定使用單機模式獲取抓拍人臉圖。
具體流程
(1)攝像機聯網配置單機模式 - 參照說明書中指導手冊 or 官方網頁文檔
(2)獲取兩個工具:AI搜索工具(驗證攝像機聯網成功)、第三方傳圖demo工具(驗證攝像機傳圖功能)
(3)利用python的HTTPServer工具包,建立服務器端口並抓取相機數據(與相機單機連接方式爲POST方式,投遞數據內容爲json格式。
)
示例:
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
class Resquest(BaseHTTPRequestHandler):
def handler(self):
print("data:", self.rfile.readline().decode())
self.wfile.write(self.rfile.readline())
def do_POST(self):
print(self.headers)
print(self.command)
req_datas = self.rfile.read(int(self.headers['content-length'])) # 重點在此步!
print(req_datas.decode())
data = {
}
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(data).encode('utf-8'))
if __name__ == '__main__':
host = ('', 9002)
server = HTTPServer(host, Resquest)
print("Starting server, listen at: %s:%s" % host)
server.serve_forever()
3、平臺連接 - 物聯網傳感器設備“追貨寶”,連接onenet平臺和平臺接口調用
- 用於倉庫貨物狀態、移動監控、位置溫度等狀態監控的物聯網設備連接
設備連接onenet平臺
(1)申請onenet開放平臺賬號(2)進入平臺開發者中心,添加產品和設備(此處在NB-IoT物聯網套件下添加)(3)添加設備,並驗證設備連接成功
平臺接口api調用
總接口文檔:https://open.iot.10086.cn/doc/book/application-develop/api/api-usage.html
調用批量查詢接口(抓取信息):https://open.iot.10086.cn/doc/book/application-develop/api/LwM2M/20批量查詢設備最新數據.html
更新設備靈敏度接口文檔:https://open.iot.10086.cn/doc/book/application-develop/api/LwM2M/10緩存命令-寫設備資源.html
依照協議確定設備更新參數之後,調用onenet平臺接口更新設備靈敏度。更新之後,搖動喚醒設備接收信號。