SenseNebulaマニュアル
  • SenseNebulaについて
  • リリースノート
  • 改訂履歴
  • クイックスタートガイド
    • 1. セットアップ
    • 2. SenseNebulaの起動
    • 3. 初期設定
    • 4. 管理画面へアクセス
    • 5. システム情報の確認
    • 6. システム時刻の設定
    • 7. HTTPSをご利用時の注意点
    • 8. 顔データベース作成
    • 9. デバイス追加
    • 10. 画像認識の利用
    • 11. SenseLink Cloudとの接続
    • 12. シャットダウン方法
  • ユーザーマニュアル
    • 1. 製品概要
      • 1.1. 製品仕様
      • 1.2. ポートとボタン
      • 1.3 パッケージ内容
    • 2. 基本設定
      • 2.1. セットアップ
        • 2.1.1 ネットワークへの接続
        • 2.1.2 設定手順
        • 2.1.3 システム時刻の設定
      • 2.2 顔認識機能
        • 2.2.1 顔データベースの追加
        • 2.2.2 顔画像のインポート
        • 2.2.3 デバイスの追加
      • 2.3 全身認識機能
      • 2.4 車両の識別
        • 2.4.1 車両データベースの追加
        • 2.4.2 車両情報を追加
        • 2.4.3 デバイスを追加
      • 2.5 自動車以外の車両認識機能
      • 2.6 共通タスク
        • 2.6.1 ライブプレビュー
        • 2.6.2 要注意リストアラーム機能の設定
        • 2.6.3 未登録者クラスタリングの設定
        • 2.6.4 徘徊アラートの設定
        • 2.6.5 車両識別アラーム機能の設定
        • 2.6.6 顔検出
        • 2.6.7 顔比較
        • 2.6.8 信号リンク
    • 3. 詳細設定
      • 3.1 システム情報
      • 3.2 インターフェース方式
      • 3.3 ユーザー管理
      • 3.4 ストレージ管理
      • 3.5 セキュリティ設定
      • 3.6 ログ管理
  • 技術仕様
    • 1. 製品概要
    • 2. 製品の特長
    • 3. 製品機能
    • 4. 適用シナリオ
    • 5. 仕様
    • 付録. 動作確認済みのIPカメラリスト
  • APIマニュアル
    • 1. API利用について
    • 2. ユーザー管理インターフェース
    • 3. 顔関連のインターフェース
    • 4. 車両関連インターフェース
    • 5. カメラ関連インターフェース
    • 6. 顔検出・比較機能関連インターフェース
    • 7. 未登録者クラスタリング関連のインターフェース
    • 8. システム構成インターフェース
    • 9. http設定用インターフェース
    • 10. https設定用インターフェース
    • 11. WebSocketによるアラート展開結果のプッシュに関連するインターフェース
    • 12. イベント管理インターフェース
    • 付録
      • 付録A:エラーコード
      • 付録B:顔属性の説明
      • 付録C:全身属性の説明
      • 付録D:車両属性の説明
      • 付録E:自動車以外の属性の説明
      • 付録F:プッシュ受信のhttp/Websocketの例
      • 付録G:権限設定
      • 付録H:マルチアルゴリズム計算能力の計算
Powered by GitBook
On this page
  • 1. httpserverの例
  • 2. Websocketの例
  1. APIマニュアル
  2. 付録

付録F:プッシュ受信のhttp/Websocketの例

1. httpserverの例

#!/usr/bin/env python3

import tornado.ioloop
import tornado.web
import pprint
import sys
import os
import time
import json
import logging
import socket
import datetime

file_handler = logging.FileHandler('/tmp/http_server.log', 'a', encoding='utf-8')
formatter = logging.Formatter("%(asctime)-15s %(message)s")
file_handler.setFormatter(formatter)
logger = logging.getLogger()
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)

# the ip of httpserver
local_IP = socket.gethostbyname(socket.gethostname())

class MyDumpHandler(tornado.web.RequestHandler):

    def post(self)
        logger.info("=" * 100 + "\n")
        logger.info(datetime.datetime.now())
        logger.info("\n[BODY]")
        try:
            body = self.request.body.decode('utf', 'backslashreplace')
            logger.info("try1:\n%s" % body)
            # logger.info('BODY: \n' + body)
        except BaseException as e:
            logger.info("BaseException1 %s" % e)
            try:
                body = self.request.body.decode('utf-8')
                logger.info("try2:\n%s" % body)
                # logger.info('BODY: \n' + body)
            except BaseException as e:
                logger.info("BaseException2 %s" % e)
                pass

        os.makedirs('/tmp/images', exist_ok=True)
        ip = self.request.remote_ip  # the ip of nebula-m
        file = self.request.files
        rsp_json = self.request.body_arguments["json"][0].decode("utf-8")

        # the push data field
        js_dict = json.loads(rsp_json)
        if js_dict["msg_id"] == 774:
            response_774_dict = ["camera_name", "device_id", "channel", "position", "img_id", "img_path", "lib_name", "lib_type", "person_addr", "person_age", "person_gender", "person_idcard","person_name", "snap_id", "similarity", "quality", "snap_feat", "snap_path", "trigger"]
            self.assert_resp_in_data(response_774_dict, js_dict["data"])
        elif js_dict["msg_id"] == 775:
            response_775_dict = ["device_id", "trigger"]
            self.assert_resp_in_data(response_775_dict, js_dict["data"])
        else:
            print(js_dict["msg_id"])

        # write the pushing picture
        t = str(time.time()).replace('.', '')
        if file:
            logger.info(file['snap'][0]['filename'] + ' saved')
            fobj = open('/tmp/images/' + ip + 'snap' + t + '.jpg', "wb")
            fobj.write(file['snap'][0]['body'])
            fobj.close()

            logger.info(file['snap_frame'][0]['filename'] + ' saved')
            fobj = open('/tmp/images/' + ip + 'snap_frame' + t + '.jpg', "wb")
            fobj.write(file['snap_frame'][0]['body'])
            fobj.close()
        if 'img' in file:
            logger.info(file['img'][0]['filename'] + ' saved')
            fobj = open('/tmp/images/' + ip + 'image' + t + '.jpg', "wb")
            fobj.write(file['img'][0]['body'])
            fobj.close()

    @staticmethod
    def assert_resp_in_data(resp_dict, resp_data):
        for item in resp_dict:
            assert item in resp_data, print("lost item %s" %item)

if __name__ == "__main__":
    try:
        print("\nHttp server listen on https://" + local_IP +
              ":8880 now ... (/tmp/http_server.log, /tmp/images)")
        tornado.web.Application([(r"/.*", MyDumpHandler), ]).listen(8080)
        tornado.ioloop.IOLoop.instance().start()
    except BaseException as e:
        print(e)
        pass

2. Websocketの例

#!/usr/bin/env python3
import time
import websocket
import ssl
import base64
import sys
import logging
IP = '10.5.2.81'   # the ip of nebula-m

key = ' '

file_handler = logging.FileHandler(
    '/tmp/ws.log', 'a', encoding='utf-8')
formatter = logging.Formatter("%(asctime)-15s %(message)s")
file_handler.setFormatter(formatter)
logger = logging.getLogger()
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)

def on_message(ws, message):
    logger.info(message)
    d = json.loads(message)
    print(d['msg'])
    if 'data' in d:
        # print(dir(d['data']))
        # print(pretty_json(d['data']['img']))
        t = str(time.time()).replace('.', '')
        # print(json.dumps(d))

        response_777_dict = ["camera_name", "device_id", "channel", "img_id", "img_path", "lib_name","lib_type", "person_addr", "person_age", "person_gender", "person_idcard",
         "person_name", "position", "ranking", "similarity", "quality", "snap_id", "snap_buf", "snap_feat", "snap_path", "snap_frame", "trigger"]
        assert_resp_in_data(response_777_dict, d['data'])
        if d['data']['img'] != -1:
            data = d['data']['img'].split(',', 1)
            f = imgdata = base64.b64decode(data[1])
            fobj = open('/tmp/wsimages/' + IP + 'snap' + t + '.jpg', "wb")
            fobj.write(f)
            fobj.close()

def assert_resp_in_data(resp_dict, resp_data):
    for item in resp_dict:
        assert item in resp_data, print(item)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

# Subscribe the push messages
def on_open(ws):
    def run(*args):
        ws.send('{"key":"%s", "msg_id":"776"}' % key)
        print("thread terminating...")
    thread.start_new_thread(run, ())

if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp('ws://' + IP + '/ws/',
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close,
                                on_open=on_open)
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
Previous付録E:自動車以外の属性の説明Next付録G:権限設定

Last updated 3 years ago