upload
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
from .presenter_datatype import *
|
||||
from .presenter_agent import *
|
||||
from .presenter_channel import *
|
||||
#from .presenter_message_pb2 import *
|
||||
|
||||
__all__ = ['presenter_datatype.py', 'presenter_agent', 'presenter_channel', 'presenter_message_pb']
|
||||
@@ -0,0 +1,75 @@
|
||||
# !/usr/bin/env python
|
||||
# -*- coding:utf-8 -*-
|
||||
import time
|
||||
from threading import Thread
|
||||
|
||||
from .socket_client import AgentSocket
|
||||
from . import presenter_message as pm
|
||||
from . import presenter_datatype as datatype
|
||||
|
||||
|
||||
class PresenterAgent():
|
||||
def __init__(self, server_ip, port):
|
||||
self.socket = AgentSocket(server_ip, port)
|
||||
self._closed = False
|
||||
|
||||
def connect_server(self):
|
||||
return self.socket.connect()
|
||||
|
||||
def start_heard_beat_thread(self):
|
||||
self.heart_beat_thread = Thread(target=self._keep_alive)
|
||||
self.heart_beat_thread.start()
|
||||
|
||||
def _keep_alive(self):
|
||||
msg = pm.heartbeat_message()
|
||||
|
||||
while True:
|
||||
if self._closed:
|
||||
print("ERROR:Heard beat thread exit")
|
||||
break
|
||||
|
||||
self.socket.send_msg(msg)
|
||||
time.sleep(2)
|
||||
|
||||
def exit(self):
|
||||
self.socket.close()
|
||||
self._closed = True
|
||||
|
||||
|
||||
def StartPresenterAgent(msg_queue, server_ip, port, open_status, data_respone_counter):
|
||||
agent = PresenterAgent(server_ip, port)
|
||||
ret = agent.connect_server()
|
||||
if ret:
|
||||
print("ERROR:Connect server failed, ret =", ret)
|
||||
return
|
||||
|
||||
open_status.value = datatype.STATUS_CONNECTED
|
||||
|
||||
while True:
|
||||
data = msg_queue.get()
|
||||
|
||||
if open_status.value == datatype.STATUS_EXITING:
|
||||
open_status.value = datatype.STATUS_EXITTED
|
||||
agent.exit()
|
||||
break
|
||||
|
||||
if data:
|
||||
agent.socket.send_msg(data)
|
||||
|
||||
msg_name, msg_body = agent.socket.recv_msg()
|
||||
if (msg_name == None) or (msg_body == None):
|
||||
print("ERROR:Recv invalid message, message name ", msg_name)
|
||||
continue
|
||||
|
||||
if ((open_status.value == datatype.STATUS_CONNECTED)
|
||||
and pm.is_open_channel_response(msg_name)):
|
||||
print("Received open channel respone")
|
||||
open_status.value = datatype.STATUS_OPENED
|
||||
agent.start_heard_beat_thread()
|
||||
print("presenter agent change connect_status to ", open_status.value)
|
||||
|
||||
if ((open_status.value == datatype.STATUS_OPENED) and
|
||||
pm.is_image_frame_response(msg_name)):
|
||||
data_respone_counter.value += 1
|
||||
print("send ok ", data_respone_counter.value)
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
# !/usr/bin/env python
|
||||
# -*- coding:utf-8 -*-
|
||||
import ctypes
|
||||
from ctypes import *
|
||||
import time
|
||||
import configparser
|
||||
from multiprocessing import Process, Queue, Manager
|
||||
import queue
|
||||
import numpy as np
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
|
||||
import acl
|
||||
from ..constants import *
|
||||
from ..lib.atlasutil_so import libatlas
|
||||
|
||||
from .presenter_datatype import *
|
||||
from . import presenter_agent as agent
|
||||
from . import presenter_message as pm
|
||||
|
||||
|
||||
class DataBufC(Structure):
|
||||
_fields_ = [
|
||||
('size', c_int),
|
||||
('data', POINTER(c_ubyte))
|
||||
]
|
||||
|
||||
class DataBuf():
|
||||
def __init__(self, data, data_size):
|
||||
self.data = data
|
||||
self.size = data_size
|
||||
self.nparray = None
|
||||
|
||||
def copy_to_local(self):
|
||||
src_data = DataBufC()
|
||||
src_data.data = cast(self.data, POINTER(c_ubyte))
|
||||
src_data.size = self.size
|
||||
dest_data = DataBufC()
|
||||
ret = libatlas.CopyDataToLocal(byref(dest_data), byref(src_data))
|
||||
if ret:
|
||||
print("Copy data to local failed")
|
||||
return None
|
||||
|
||||
return DataBuf(dest_data.data, dest_data.size)
|
||||
|
||||
def tobytes(self):
|
||||
self.nparray = np.frombuffer((ctypes.c_ubyte * self.size).from_address(ctypes.addressof(self.data.contents)), dtype=np.uint8)
|
||||
return self.nparray.tobytes()
|
||||
|
||||
def destroy(self):
|
||||
data_buf = DataBufC()
|
||||
data_buf.data = cast(self.data, POINTER(c_ubyte))
|
||||
data_buf.size = self.size
|
||||
libatlas.ReleaseDataBuf(byref(data_buf))
|
||||
self.data = None
|
||||
self.size = 0
|
||||
|
||||
|
||||
class PresenterChannel():
|
||||
def __init__(self, server_ip, port, name='video', type=CONTENT_TYPE_VIDEO):
|
||||
self._server_ip = server_ip
|
||||
self._port = port
|
||||
self._type = type
|
||||
self._name = name
|
||||
self.agent_msg_queue = Queue()
|
||||
self.open_status = Manager().Value('i', STATUS_DISCONNECT)
|
||||
self.data_respone_counter = Manager().Value('i', 0)
|
||||
self._send_counter = 0
|
||||
self._send_buffer = queue.Queue(64)
|
||||
self.send_cnt = 0
|
||||
self.relase_cnt = 0
|
||||
|
||||
def startup(self):
|
||||
agent_process = Process(target=agent.StartPresenterAgent,
|
||||
args=(self.agent_msg_queue, self._server_ip,self._port,
|
||||
self.open_status, self.data_respone_counter))
|
||||
agent_process.start()
|
||||
time.sleep(0.5)
|
||||
|
||||
self._send_open_channel_request(self._name, self._type)
|
||||
|
||||
return self._wait_open_status(STATUS_OPENED)
|
||||
|
||||
def _wait_open_status(self, listen_status):
|
||||
ret = STATUS_ERROR
|
||||
for i in range(0, 100):
|
||||
time.sleep(0.1)
|
||||
if self.open_status.value == listen_status:
|
||||
print("Open status is %d now"%(listen_status))
|
||||
ret = STATUS_OK
|
||||
break
|
||||
|
||||
return ret
|
||||
|
||||
def send_message(self, data):
|
||||
self.agent_msg_queue.put(data)
|
||||
self._send_counter += 1
|
||||
|
||||
def _send_open_channel_request(self, channel_name, content_type):
|
||||
request_msg = pm.open_channel_request(channel_name, content_type)
|
||||
self.send_message(request_msg)
|
||||
|
||||
def _release_send_success_data(self):
|
||||
release_num = self._send_buffer.qsize() - \
|
||||
(self._send_counter - self.data_respone_counter.value)
|
||||
if release_num > 0:
|
||||
for i in range(0, release_num):
|
||||
data = self._send_buffer.get_nowait()
|
||||
data.destroy()
|
||||
data = None
|
||||
self.relase_cnt += 1
|
||||
#print("Released send success images ", self.relase_cnt)
|
||||
|
||||
def send_detection_data(self, image_width, image_height,
|
||||
image_data, detection_result):
|
||||
if self._send_buffer.full() is True:
|
||||
print("ERROR:Send detection data failed for buffer is full")
|
||||
return False
|
||||
|
||||
image_buf = DataBuf(image_data.data(), image_data.size).copy_to_local()
|
||||
request_msg = pm.image_frame_request(image_width, image_height,
|
||||
image_buf.tobytes(), detection_result)
|
||||
self.send_message(request_msg)
|
||||
self._send_buffer.put(image_buf)
|
||||
self._release_send_success_data()
|
||||
|
||||
return True
|
||||
|
||||
def _send_heart_beat_message(self):
|
||||
msg = pm.heartbeat_message()
|
||||
self.send_message(msg)
|
||||
|
||||
def __del__(self):
|
||||
self.open_status.value = STATUS_EXITING
|
||||
print("Presenter channel close...")
|
||||
self._send_heart_beat_message()
|
||||
if STATUS_OK == self._wait_open_status(STATUS_EXITTED):
|
||||
print("Presenter channel closed")
|
||||
else:
|
||||
print("Presenter channel close failed for presenter agent no response")
|
||||
|
||||
|
||||
def get_presenter_server_addr(config_file):
|
||||
config = configparser.ConfigParser()
|
||||
config.read(config_file)
|
||||
presenter_server_ip = config['baseconf']['presenter_server_ip']
|
||||
port = int(config['baseconf']['presenter_server_port'])
|
||||
|
||||
print("presenter server ip %s, port %d"%(presenter_server_ip, port))
|
||||
return presenter_server_ip, port
|
||||
|
||||
def open_channel(config_file, channel_name='video', channel_type = CONTENT_TYPE_VIDEO):
|
||||
server_ip, port = get_presenter_server_addr(config_file)
|
||||
channel = PresenterChannel(server_ip, port, channel_name, channel_type)
|
||||
ret = channel.startup()
|
||||
if ret:
|
||||
print("ERROR:Open channel failed")
|
||||
return None
|
||||
return channel
|
||||
@@ -0,0 +1,38 @@
|
||||
|
||||
STATUS_DISCONNECT = 0
|
||||
STATUS_CONNECTED = 1
|
||||
STATUS_OPEN_CH_REQUEST = 2
|
||||
STATUS_OPENED = 3
|
||||
STATUS_EXITING = 4
|
||||
STATUS_EXITTED = 5
|
||||
|
||||
CONTENT_TYPE_IMAGE = 0
|
||||
CONTENT_TYPE_VIDEO = 1
|
||||
|
||||
STATUS_OK = 0
|
||||
STATUS_ERROR = 1
|
||||
|
||||
|
||||
class Point():
|
||||
def __init__(self, x=0, y=0):
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
class Box():
|
||||
def __init__(self, lt, rb):
|
||||
self.lt = Point(lt)
|
||||
self.rb = Point(rb)
|
||||
|
||||
def box_valid(self):
|
||||
return ((self.lt.x >= 0)
|
||||
and (self.lt.y >= 0)
|
||||
and (self.rb.x >= self.lt.x)
|
||||
and (self.rb.y >= self.lt.y))
|
||||
|
||||
class ObjectDetectionResult():
|
||||
def __init__(self, ltx=0, lty=0, rbx=0, rby=0, text=None):
|
||||
self.object_class = 0
|
||||
self.confidence = 0
|
||||
self.box = Box((ltx, lty), (rbx, rby))
|
||||
self.result_text = text
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package ascend.presenter.proto;
|
||||
|
||||
enum OpenChannelErrorCode {
|
||||
kOpenChannelErrorNone = 0;
|
||||
kOpenChannelErrorNoSuchChannel = 1;
|
||||
kOpenChannelErrorChannelAlreadyOpened = 2;
|
||||
kOpenChannelErrorOther = -1;
|
||||
}
|
||||
|
||||
enum ChannelContentType {
|
||||
kChannelContentTypeImage = 0;
|
||||
kChannelContentTypeVideo = 1;
|
||||
}
|
||||
|
||||
// By Protocol Buffer Style Guide, need to use underscore_separated_names
|
||||
// for field names
|
||||
message OpenChannelRequest {
|
||||
string channel_name = 1;
|
||||
ChannelContentType content_type = 2;
|
||||
}
|
||||
|
||||
message OpenChannelResponse {
|
||||
OpenChannelErrorCode error_code = 1;
|
||||
string error_message = 2;
|
||||
}
|
||||
|
||||
message HeartbeatMessage {
|
||||
|
||||
}
|
||||
|
||||
enum ImageFormat {
|
||||
kImageFormatJpeg = 0;
|
||||
}
|
||||
|
||||
message Coordinate {
|
||||
uint32 x = 1;
|
||||
uint32 y = 2;
|
||||
}
|
||||
|
||||
message Rectangle_Attr {
|
||||
Coordinate left_top = 1;
|
||||
Coordinate right_bottom = 2;
|
||||
string label_text = 3;
|
||||
}
|
||||
|
||||
message PresentImageRequest {
|
||||
ImageFormat format = 1;
|
||||
uint32 width = 2;
|
||||
uint32 height = 3;
|
||||
bytes data = 4;
|
||||
repeated Rectangle_Attr rectangle_list = 5;
|
||||
}
|
||||
|
||||
enum PresentDataErrorCode {
|
||||
kPresentDataErrorNone = 0;
|
||||
kPresentDataErrorUnsupportedType = 1;
|
||||
kPresentDataErrorUnsupportedFormat = 2;
|
||||
kPresentDataErrorOther = -1;
|
||||
}
|
||||
|
||||
message PresentImageResponse {
|
||||
PresentDataErrorCode error_code = 1;
|
||||
string error_message = 2;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# !/usr/bin/env python
|
||||
# -*- coding:utf-8 -*-
|
||||
import struct
|
||||
import socket
|
||||
|
||||
from . import presenter_message_pb2 as pb2
|
||||
|
||||
def pack_message(msg_name, msg_data):
|
||||
buf = msg_data.SerializeToString()
|
||||
msg_body_len = len(buf)
|
||||
msg_name_len = len(msg_name)
|
||||
msg_total_len = msg_name_len + msg_body_len + 5
|
||||
data = b''
|
||||
msg_total_len = socket.htonl(msg_total_len)
|
||||
pack_data = struct.pack('IB', msg_total_len, msg_name_len)
|
||||
data += pack_data
|
||||
data += msg_name.encode()
|
||||
data += buf
|
||||
|
||||
return data
|
||||
|
||||
def open_channel_request(channel_name, content_type):
|
||||
request = pb2.OpenChannelRequest()
|
||||
request.channel_name = channel_name
|
||||
request.content_type = content_type
|
||||
|
||||
return pack_message(pb2._OPENCHANNELREQUEST.full_name, request)
|
||||
|
||||
def image_frame_request(image_width, image_height, image_data, detection_result):
|
||||
request = pb2.PresentImageRequest()
|
||||
request.format = 0
|
||||
request.width = image_width
|
||||
request.height = image_height
|
||||
request.data = image_data
|
||||
for i in range(0, len(detection_result)):
|
||||
myadd = request.rectangle_list.add()
|
||||
myadd.left_top.x = detection_result[i].box.lt.x
|
||||
myadd.left_top.y = detection_result[i].box.lt.y
|
||||
myadd.right_bottom.x = detection_result[i].box.rb.x
|
||||
myadd.right_bottom.y = detection_result[i].box.rb.y
|
||||
myadd.label_text = detection_result[i].result_text
|
||||
|
||||
return pack_message(pb2._PRESENTIMAGEREQUEST.full_name, request)
|
||||
|
||||
def heartbeat_message():
|
||||
return pack_message(pb2._HEARTBEATMESSAGE.full_name, pb2.HeartbeatMessage())
|
||||
|
||||
def is_open_channel_response(msg_name):
|
||||
return (msg_name == pb2._OPENCHANNELRESPONSE.full_name)
|
||||
|
||||
def is_image_frame_response(msg_name):
|
||||
return (msg_name == pb2._PRESENTIMAGERESPONSE.full_name)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,493 @@
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: presenter_message.proto
|
||||
|
||||
import sys
|
||||
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
|
||||
from google.protobuf.internal import enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from google.protobuf import reflection as _reflection
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
from google.protobuf import descriptor_pb2
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||
name='presenter_message.proto',
|
||||
package='ascend.presenter.proto',
|
||||
syntax='proto3',
|
||||
serialized_pb=_b('\n\x17presenter_message.proto\x12\x16\x61scend.presenter.proto\"l\n\x12OpenChannelRequest\x12\x14\n\x0c\x63hannel_name\x18\x01 \x01(\t\x12@\n\x0c\x63ontent_type\x18\x02 \x01(\x0e\x32*.ascend.presenter.proto.ChannelContentType\"n\n\x13OpenChannelResponse\x12@\n\nerror_code\x18\x01 \x01(\x0e\x32,.ascend.presenter.proto.OpenChannelErrorCode\x12\x15\n\rerror_message\x18\x02 \x01(\t\"\x12\n\x10HeartbeatMessage\"\"\n\nCoordinate\x12\t\n\x01x\x18\x01 \x01(\r\x12\t\n\x01y\x18\x02 \x01(\r\"\x94\x01\n\x0eRectangle_Attr\x12\x34\n\x08left_top\x18\x01 \x01(\x0b\x32\".ascend.presenter.proto.Coordinate\x12\x38\n\x0cright_bottom\x18\x02 \x01(\x0b\x32\".ascend.presenter.proto.Coordinate\x12\x12\n\nlabel_text\x18\x03 \x01(\t\"\xb7\x01\n\x13PresentImageRequest\x12\x33\n\x06\x66ormat\x18\x01 \x01(\x0e\x32#.ascend.presenter.proto.ImageFormat\x12\r\n\x05width\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12>\n\x0erectangle_list\x18\x05 \x03(\x0b\x32&.ascend.presenter.proto.Rectangle_Attr\"o\n\x14PresentImageResponse\x12@\n\nerror_code\x18\x01 \x01(\x0e\x32,.ascend.presenter.proto.PresentDataErrorCode\x12\x15\n\rerror_message\x18\x02 \x01(\t*\xa5\x01\n\x14OpenChannelErrorCode\x12\x19\n\x15kOpenChannelErrorNone\x10\x00\x12\"\n\x1ekOpenChannelErrorNoSuchChannel\x10\x01\x12)\n%kOpenChannelErrorChannelAlreadyOpened\x10\x02\x12#\n\x16kOpenChannelErrorOther\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01*P\n\x12\x43hannelContentType\x12\x1c\n\x18kChannelContentTypeImage\x10\x00\x12\x1c\n\x18kChannelContentTypeVideo\x10\x01*#\n\x0bImageFormat\x12\x14\n\x10kImageFormatJpeg\x10\x00*\xa4\x01\n\x14PresentDataErrorCode\x12\x19\n\x15kPresentDataErrorNone\x10\x00\x12$\n kPresentDataErrorUnsupportedType\x10\x01\x12&\n\"kPresentDataErrorUnsupportedFormat\x10\x02\x12#\n\x16kPresentDataErrorOther\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x62\x06proto3')
|
||||
)
|
||||
|
||||
_OPENCHANNELERRORCODE = _descriptor.EnumDescriptor(
|
||||
name='OpenChannelErrorCode',
|
||||
full_name='ascend.presenter.proto.OpenChannelErrorCode',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
values=[
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kOpenChannelErrorNone', index=0, number=0,
|
||||
options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kOpenChannelErrorNoSuchChannel', index=1, number=1,
|
||||
options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kOpenChannelErrorChannelAlreadyOpened', index=2, number=2,
|
||||
options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kOpenChannelErrorOther', index=3, number=-1,
|
||||
options=None,
|
||||
type=None),
|
||||
],
|
||||
containing_type=None,
|
||||
options=None,
|
||||
serialized_start=780,
|
||||
serialized_end=945,
|
||||
)
|
||||
_sym_db.RegisterEnumDescriptor(_OPENCHANNELERRORCODE)
|
||||
|
||||
OpenChannelErrorCode = enum_type_wrapper.EnumTypeWrapper(_OPENCHANNELERRORCODE)
|
||||
_CHANNELCONTENTTYPE = _descriptor.EnumDescriptor(
|
||||
name='ChannelContentType',
|
||||
full_name='ascend.presenter.proto.ChannelContentType',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
values=[
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kChannelContentTypeImage', index=0, number=0,
|
||||
options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kChannelContentTypeVideo', index=1, number=1,
|
||||
options=None,
|
||||
type=None),
|
||||
],
|
||||
containing_type=None,
|
||||
options=None,
|
||||
serialized_start=947,
|
||||
serialized_end=1027,
|
||||
)
|
||||
_sym_db.RegisterEnumDescriptor(_CHANNELCONTENTTYPE)
|
||||
|
||||
ChannelContentType = enum_type_wrapper.EnumTypeWrapper(_CHANNELCONTENTTYPE)
|
||||
_IMAGEFORMAT = _descriptor.EnumDescriptor(
|
||||
name='ImageFormat',
|
||||
full_name='ascend.presenter.proto.ImageFormat',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
values=[
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kImageFormatJpeg', index=0, number=0,
|
||||
options=None,
|
||||
type=None),
|
||||
],
|
||||
containing_type=None,
|
||||
options=None,
|
||||
serialized_start=1029,
|
||||
serialized_end=1064,
|
||||
)
|
||||
_sym_db.RegisterEnumDescriptor(_IMAGEFORMAT)
|
||||
|
||||
ImageFormat = enum_type_wrapper.EnumTypeWrapper(_IMAGEFORMAT)
|
||||
_PRESENTDATAERRORCODE = _descriptor.EnumDescriptor(
|
||||
name='PresentDataErrorCode',
|
||||
full_name='ascend.presenter.proto.PresentDataErrorCode',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
values=[
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kPresentDataErrorNone', index=0, number=0,
|
||||
options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kPresentDataErrorUnsupportedType', index=1, number=1,
|
||||
options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kPresentDataErrorUnsupportedFormat', index=2, number=2,
|
||||
options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='kPresentDataErrorOther', index=3, number=-1,
|
||||
options=None,
|
||||
type=None),
|
||||
],
|
||||
containing_type=None,
|
||||
options=None,
|
||||
serialized_start=1067,
|
||||
serialized_end=1231,
|
||||
)
|
||||
_sym_db.RegisterEnumDescriptor(_PRESENTDATAERRORCODE)
|
||||
|
||||
PresentDataErrorCode = enum_type_wrapper.EnumTypeWrapper(_PRESENTDATAERRORCODE)
|
||||
kOpenChannelErrorNone = 0
|
||||
kOpenChannelErrorNoSuchChannel = 1
|
||||
kOpenChannelErrorChannelAlreadyOpened = 2
|
||||
kOpenChannelErrorOther = -1
|
||||
kChannelContentTypeImage = 0
|
||||
kChannelContentTypeVideo = 1
|
||||
kImageFormatJpeg = 0
|
||||
kPresentDataErrorNone = 0
|
||||
kPresentDataErrorUnsupportedType = 1
|
||||
kPresentDataErrorUnsupportedFormat = 2
|
||||
kPresentDataErrorOther = -1
|
||||
|
||||
|
||||
|
||||
_OPENCHANNELREQUEST = _descriptor.Descriptor(
|
||||
name='OpenChannelRequest',
|
||||
full_name='ascend.presenter.proto.OpenChannelRequest',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='channel_name', full_name='ascend.presenter.proto.OpenChannelRequest.channel_name', index=0,
|
||||
number=1, type=9, cpp_type=9, label=1,
|
||||
has_default_value=False, default_value=_b("").decode('utf-8'),
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='content_type', full_name='ascend.presenter.proto.OpenChannelRequest.content_type', index=1,
|
||||
number=2, type=14, cpp_type=8, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=51,
|
||||
serialized_end=159,
|
||||
)
|
||||
|
||||
|
||||
_OPENCHANNELRESPONSE = _descriptor.Descriptor(
|
||||
name='OpenChannelResponse',
|
||||
full_name='ascend.presenter.proto.OpenChannelResponse',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='error_code', full_name='ascend.presenter.proto.OpenChannelResponse.error_code', index=0,
|
||||
number=1, type=14, cpp_type=8, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='error_message', full_name='ascend.presenter.proto.OpenChannelResponse.error_message', index=1,
|
||||
number=2, type=9, cpp_type=9, label=1,
|
||||
has_default_value=False, default_value=_b("").decode('utf-8'),
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=161,
|
||||
serialized_end=271,
|
||||
)
|
||||
|
||||
|
||||
_HEARTBEATMESSAGE = _descriptor.Descriptor(
|
||||
name='HeartbeatMessage',
|
||||
full_name='ascend.presenter.proto.HeartbeatMessage',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=273,
|
||||
serialized_end=291,
|
||||
)
|
||||
|
||||
|
||||
_COORDINATE = _descriptor.Descriptor(
|
||||
name='Coordinate',
|
||||
full_name='ascend.presenter.proto.Coordinate',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='x', full_name='ascend.presenter.proto.Coordinate.x', index=0,
|
||||
number=1, type=13, cpp_type=3, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='y', full_name='ascend.presenter.proto.Coordinate.y', index=1,
|
||||
number=2, type=13, cpp_type=3, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=293,
|
||||
serialized_end=327,
|
||||
)
|
||||
|
||||
|
||||
_RECTANGLE_ATTR = _descriptor.Descriptor(
|
||||
name='Rectangle_Attr',
|
||||
full_name='ascend.presenter.proto.Rectangle_Attr',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='left_top', full_name='ascend.presenter.proto.Rectangle_Attr.left_top', index=0,
|
||||
number=1, type=11, cpp_type=10, label=1,
|
||||
has_default_value=False, default_value=None,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='right_bottom', full_name='ascend.presenter.proto.Rectangle_Attr.right_bottom', index=1,
|
||||
number=2, type=11, cpp_type=10, label=1,
|
||||
has_default_value=False, default_value=None,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='label_text', full_name='ascend.presenter.proto.Rectangle_Attr.label_text', index=2,
|
||||
number=3, type=9, cpp_type=9, label=1,
|
||||
has_default_value=False, default_value=_b("").decode('utf-8'),
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=330,
|
||||
serialized_end=478,
|
||||
)
|
||||
|
||||
|
||||
_PRESENTIMAGEREQUEST = _descriptor.Descriptor(
|
||||
name='PresentImageRequest',
|
||||
full_name='ascend.presenter.proto.PresentImageRequest',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='format', full_name='ascend.presenter.proto.PresentImageRequest.format', index=0,
|
||||
number=1, type=14, cpp_type=8, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='width', full_name='ascend.presenter.proto.PresentImageRequest.width', index=1,
|
||||
number=2, type=13, cpp_type=3, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='height', full_name='ascend.presenter.proto.PresentImageRequest.height', index=2,
|
||||
number=3, type=13, cpp_type=3, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='data', full_name='ascend.presenter.proto.PresentImageRequest.data', index=3,
|
||||
number=4, type=12, cpp_type=9, label=1,
|
||||
has_default_value=False, default_value=_b(""),
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='rectangle_list', full_name='ascend.presenter.proto.PresentImageRequest.rectangle_list', index=4,
|
||||
number=5, type=11, cpp_type=10, label=3,
|
||||
has_default_value=False, default_value=[],
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=481,
|
||||
serialized_end=664,
|
||||
)
|
||||
|
||||
|
||||
_PRESENTIMAGERESPONSE = _descriptor.Descriptor(
|
||||
name='PresentImageResponse',
|
||||
full_name='ascend.presenter.proto.PresentImageResponse',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='error_code', full_name='ascend.presenter.proto.PresentImageResponse.error_code', index=0,
|
||||
number=1, type=14, cpp_type=8, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='error_message', full_name='ascend.presenter.proto.PresentImageResponse.error_message', index=1,
|
||||
number=2, type=9, cpp_type=9, label=1,
|
||||
has_default_value=False, default_value=_b("").decode('utf-8'),
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=666,
|
||||
serialized_end=777,
|
||||
)
|
||||
|
||||
_OPENCHANNELREQUEST.fields_by_name['content_type'].enum_type = _CHANNELCONTENTTYPE
|
||||
_OPENCHANNELRESPONSE.fields_by_name['error_code'].enum_type = _OPENCHANNELERRORCODE
|
||||
_RECTANGLE_ATTR.fields_by_name['left_top'].message_type = _COORDINATE
|
||||
_RECTANGLE_ATTR.fields_by_name['right_bottom'].message_type = _COORDINATE
|
||||
_PRESENTIMAGEREQUEST.fields_by_name['format'].enum_type = _IMAGEFORMAT
|
||||
_PRESENTIMAGEREQUEST.fields_by_name['rectangle_list'].message_type = _RECTANGLE_ATTR
|
||||
_PRESENTIMAGERESPONSE.fields_by_name['error_code'].enum_type = _PRESENTDATAERRORCODE
|
||||
DESCRIPTOR.message_types_by_name['OpenChannelRequest'] = _OPENCHANNELREQUEST
|
||||
DESCRIPTOR.message_types_by_name['OpenChannelResponse'] = _OPENCHANNELRESPONSE
|
||||
DESCRIPTOR.message_types_by_name['HeartbeatMessage'] = _HEARTBEATMESSAGE
|
||||
DESCRIPTOR.message_types_by_name['Coordinate'] = _COORDINATE
|
||||
DESCRIPTOR.message_types_by_name['Rectangle_Attr'] = _RECTANGLE_ATTR
|
||||
DESCRIPTOR.message_types_by_name['PresentImageRequest'] = _PRESENTIMAGEREQUEST
|
||||
DESCRIPTOR.message_types_by_name['PresentImageResponse'] = _PRESENTIMAGERESPONSE
|
||||
DESCRIPTOR.enum_types_by_name['OpenChannelErrorCode'] = _OPENCHANNELERRORCODE
|
||||
DESCRIPTOR.enum_types_by_name['ChannelContentType'] = _CHANNELCONTENTTYPE
|
||||
DESCRIPTOR.enum_types_by_name['ImageFormat'] = _IMAGEFORMAT
|
||||
DESCRIPTOR.enum_types_by_name['PresentDataErrorCode'] = _PRESENTDATAERRORCODE
|
||||
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||
|
||||
OpenChannelRequest = _reflection.GeneratedProtocolMessageType('OpenChannelRequest', (_message.Message,), dict(
|
||||
DESCRIPTOR = _OPENCHANNELREQUEST,
|
||||
__module__ = 'presenter_message_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ascend.presenter.proto.OpenChannelRequest)
|
||||
))
|
||||
_sym_db.RegisterMessage(OpenChannelRequest)
|
||||
|
||||
OpenChannelResponse = _reflection.GeneratedProtocolMessageType('OpenChannelResponse', (_message.Message,), dict(
|
||||
DESCRIPTOR = _OPENCHANNELRESPONSE,
|
||||
__module__ = 'presenter_message_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ascend.presenter.proto.OpenChannelResponse)
|
||||
))
|
||||
_sym_db.RegisterMessage(OpenChannelResponse)
|
||||
|
||||
HeartbeatMessage = _reflection.GeneratedProtocolMessageType('HeartbeatMessage', (_message.Message,), dict(
|
||||
DESCRIPTOR = _HEARTBEATMESSAGE,
|
||||
__module__ = 'presenter_message_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ascend.presenter.proto.HeartbeatMessage)
|
||||
))
|
||||
_sym_db.RegisterMessage(HeartbeatMessage)
|
||||
|
||||
Coordinate = _reflection.GeneratedProtocolMessageType('Coordinate', (_message.Message,), dict(
|
||||
DESCRIPTOR = _COORDINATE,
|
||||
__module__ = 'presenter_message_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ascend.presenter.proto.Coordinate)
|
||||
))
|
||||
_sym_db.RegisterMessage(Coordinate)
|
||||
|
||||
Rectangle_Attr = _reflection.GeneratedProtocolMessageType('Rectangle_Attr', (_message.Message,), dict(
|
||||
DESCRIPTOR = _RECTANGLE_ATTR,
|
||||
__module__ = 'presenter_message_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ascend.presenter.proto.Rectangle_Attr)
|
||||
))
|
||||
_sym_db.RegisterMessage(Rectangle_Attr)
|
||||
|
||||
PresentImageRequest = _reflection.GeneratedProtocolMessageType('PresentImageRequest', (_message.Message,), dict(
|
||||
DESCRIPTOR = _PRESENTIMAGEREQUEST,
|
||||
__module__ = 'presenter_message_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ascend.presenter.proto.PresentImageRequest)
|
||||
))
|
||||
_sym_db.RegisterMessage(PresentImageRequest)
|
||||
|
||||
PresentImageResponse = _reflection.GeneratedProtocolMessageType('PresentImageResponse', (_message.Message,), dict(
|
||||
DESCRIPTOR = _PRESENTIMAGERESPONSE,
|
||||
__module__ = 'presenter_message_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ascend.presenter.proto.PresentImageResponse)
|
||||
))
|
||||
_sym_db.RegisterMessage(PresentImageResponse)
|
||||
|
||||
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,119 @@
|
||||
# !/usr/bin/env python
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
import threading
|
||||
import socket
|
||||
import time
|
||||
import struct
|
||||
import time
|
||||
|
||||
from .presenter_datatype import *
|
||||
|
||||
|
||||
|
||||
class AgentSocket(object):
|
||||
def __init__(self, server_ip, port):
|
||||
self._server_address = (server_ip, port)
|
||||
self._sock_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
|
||||
|
||||
def connect(self):
|
||||
ret = 0
|
||||
for i in range(0,5):
|
||||
ret = self._sock_client.connect_ex(self._server_address)
|
||||
if ret == 0:
|
||||
break
|
||||
time.sleep(0.2)
|
||||
return ret
|
||||
|
||||
def _read_socket(self, read_len):
|
||||
has_read_len = 0
|
||||
read_buf = b''
|
||||
total_buf = b''
|
||||
|
||||
while has_read_len != read_len:
|
||||
try:
|
||||
read_buf = self._sock_client.recv(read_len - has_read_len)
|
||||
except socket.error:
|
||||
print("ERROR:Read socket failed")
|
||||
return False, None
|
||||
if read_buf == b'':
|
||||
return False, None
|
||||
total_buf += read_buf
|
||||
has_read_len = len(total_buf)
|
||||
|
||||
return True, total_buf
|
||||
|
||||
def _read_msg_head(self, read_len):
|
||||
ret, msg_head = self._read_socket(read_len)
|
||||
#print("msg head data is :", msg_head)
|
||||
if not ret:
|
||||
print("ERROR:socket receive msg head null")
|
||||
return None, None
|
||||
|
||||
# in Struct(), 'I' is unsigned int, 'B' is unsigned char
|
||||
msg_head_data = struct.Struct('IB')
|
||||
(msg_total_len, msg_name_len) = msg_head_data.unpack(msg_head)
|
||||
msg_total_len = socket.ntohl(msg_total_len)
|
||||
#print("msg total length is :", msg_total_len)
|
||||
#print("msg name is :", msg_name_len)
|
||||
return msg_total_len, msg_name_len
|
||||
|
||||
def _read_msg_name(self, msg_name_len):
|
||||
ret, msg_name = self._read_socket(msg_name_len)
|
||||
#print("direct msg name is :", msg_name)
|
||||
if not ret:
|
||||
print("ERROR:socket receive msg name null")
|
||||
return False, None
|
||||
try:
|
||||
msg_name = msg_name.decode("utf-8")
|
||||
#print("decode msg name is :", msg_name)
|
||||
except Exception as e:
|
||||
print("ERROR:msg name decode to utf-8 error")
|
||||
return False, None
|
||||
|
||||
return True, msg_name
|
||||
|
||||
def _read_msg_body(self, msg_body_len):
|
||||
#print("msg body length is :", msg_body_len)
|
||||
ret, msg_body = self._read_socket(msg_body_len)
|
||||
if not ret:
|
||||
print("ERROR:socket receive msg body null")
|
||||
return False, None
|
||||
return True, msg_body
|
||||
|
||||
def recv_msg(self):
|
||||
# Step1: read msg head
|
||||
msg_total_len, msg_name_len = self._read_msg_head(5)
|
||||
if msg_total_len is None:
|
||||
print("ERROR:msg total len is None.")
|
||||
return None
|
||||
|
||||
# Step2: read msg name
|
||||
ret, msg_name = self._read_msg_name(msg_name_len)
|
||||
if not ret:
|
||||
return None
|
||||
|
||||
# Step3: read msg body
|
||||
msg_body_len = msg_total_len - 5 - msg_name_len
|
||||
if msg_body_len < 0:
|
||||
print("ERROR:msg total len is 0")
|
||||
return None
|
||||
ret, msg_body = self._read_msg_body(msg_body_len)
|
||||
if not ret:
|
||||
return None
|
||||
|
||||
return msg_name, msg_body
|
||||
|
||||
|
||||
def send_msg(self, data):
|
||||
try:
|
||||
self._sock_client.sendall(data)
|
||||
except Exception as e:
|
||||
print("ERROR:Send msg failed")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
def close(self):
|
||||
self._sock_client.shutdown(socket.SHUT_RDWR)
|
||||
self._sock_client.close()
|
||||
Reference in New Issue
Block a user