def __init__(self, settings, callback_send): """ コンストラクタ settings : 上位側のconfig情報 callback_send : GPIO入力、およびSerial読み込み割り込み発生時のcallback関数 """ # データ初期化 self.__serial_recv_buf = [[] for i in range(5) ] # serail 5slotぶんのバッファslot 1,3,5,7,9 の順 self.__serial_info = [{ 'recv_kind': '' } for i in range(5)] # serail 5slotぶんの情報 """ {'recv_kind':以下} 'NONE'/'CHAR'/'LENG'/'TI で、それぞれ必要なら、 {'char':1文字} {'leng':長さ} {'time':ms} """ # P1/P2/P3 切り替え self.__board_kind = 'P3' if self.__board_kind == 'P1': self.__board = TpP1Interface() elif self.__board_kind == 'P2': self.__board = TpP2Interface() else: # P3 self.__board = TpP3Interface() self.board = self.__board # 排他制御用定義 self.i2c_lock = thread.allocate_lock() self.spi_lock = thread.allocate_lock() if self.__board_kind == 'P2' or self.__board_kind == 'P3': self.__board.spi_lock_init(self.spi_lock) # I2C健全性チェック self.__board.i2c_check_before_init() # FWバージョン確認 self.__board.check_pic_fw() self.__board.read_pic_fw_ver(True) tpUtils.stdout('Board FW ver = ' + str(self.get_pic_fw_ver())) # ボード初期化 self.__board.board_init() # 設定 self.__tp_button = False self.settings = settings self.__settings_check() # イベント発生用のコールバック関数をセット self.callback_send = callback_send # PICスロット初期化 self.__board.pic_slot_init()
def __client_handler(self, clientsock): """ 受信処理スレッド """ while True: try: # 受信 rcvmsg = clientsock.recv(self.bufsize) #tpUtils.stdout('Received -> %s' % (rcvmsg)) except Exception: # コネクション切断等のエラー時はコネクションの再接続を行う。 break # 切断時 if rcvmsg == b'': # コネクション切断時は再接続を行う。 break if self.callback_recv != None: # コールバック send_data = self.handler( self.callback_recv, self.info, rcvmsg) try: # メッセージを返します if (send_data is None or send_data == ''): # Noneという文字列を返却 clientsock.send('None'.encode()) elif type(send_data) == str: # 文字 clientsock.send(send_data.encode()) else: # bytes clientsock.send(send_data) except Exception: # コネクション切断等のエラー時はコネクションの再接続を行う。 break # クローズ clientsock.close() # コネクション切断時は再接続を行う。 tpUtils.stdout("Socket erroor reconnect %s %d" % (self.host, self.port))
def recv(self, host, port): """ 受信イベント """ self.host = host self.port = port rty_cnt = 0 while True: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) while True: try: self.sock.bind((host, port)) break except: rty_cnt = rty_cnt + 1 # リトライ if rty_cnt >= 10: raise try: time.sleep(1) except KeyboardInterrupt: sys.exit(0) self.sock.listen(100) tpUtils.stdout("Server listening on %s %d" % (host, (port))) # 接続待機 clientsock, _ = self.sock.accept() # 配列に保持する self.lst_clientsock.append(clientsock) # 受信イベントスレッド client_thread = threading.Thread(target=self.__client_handler, args=(clientsock,)) client_thread.daemon = True client_thread.start()
def connect(self, host, port): """ 接続 """ rty_cnt = 0 while True: try: # 接続 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect((host, port)) # 接続完了 tpUtils.stdout( '[TP TCP Client] Successfully connected! host:' + host + ' port:' + str(port)) # 接続したhost、portを保存 self.host = host self.port = port break except ConnectionRefusedError: # 接続中 tpUtils.stdout('[TP TCP Client] Try connecting') rty_cnt = rty_cnt + 1 # リトライ # if rty_cnt >= 10: # raise # 1秒WAIT try: time.sleep(1) except KeyboardInterrupt: sys.exit(0)
def reconnect(self, host, port): # ソケットをクローズして、コネクションの再接続を行う。 self.sock.close() tpUtils.stdout("Socket erroor reconnect %s %d" % (host, port)) self.connect(host, port) return
def recv(self, host, port): """ 受信イベント """ while True: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.sock.bind((host, port)) self.sock.listen(0) tpUtils.stdout("Server listening on %s %d" % (host, (port))) # 接続待機 self.clientsock, client_address = self.sock.accept() # 一つのクライアントのみ接続可能にするため閉じる self.sock.close() while True: try: # 受信 rcvmsg = self.clientsock.recv(self.bufsize) #tpUtils.stdout('Received -> %s' % (rcvmsg)) except Exception: # コネクション切断等のエラー時はコネクションの再接続を行う。 break # 切断時 if rcvmsg == b'': # コネクション切断時は再接続を行う。 break if self.callback_recv != None: # コールバック send_data = self.handler(self.callback_recv, self.info, rcvmsg) try: # メッセージを返します if (send_data is None or send_data == ''): # Noneという文字列を返却 self.clientsock.send('None'.encode()) elif type(send_data) == str: # 文字 self.clientsock.send(send_data.encode()) else: # bytes self.clientsock.send(send_data) except Exception: # コネクション切断等のエラー時はコネクションの再接続を行う。 break # クローズ self.clientsock.close() # コネクション切断時は再接続を行う。 tpUtils.stdout("Socket erroor reconnect %s %d" % (host, port))
if (len(argvs) > 1): setting_file = argvs[1] connect_flg = False if (len(argvs) > 2 and argvs[2] == 'true'): connect_flg = argvs[2] try: # インスタンス生成 tp_connect = TpConnect(setting_file, connect_flg) except tpUtils.TpCheckError as e: # トレースは出さず、メッセージのみ tpUtils.stderr(str(e.args)) tpUtils.stderr('Tibbo-Pi failed to start up.') sys.exit(0) # サーバ起動 tp_connect.start() # 接続完了 tpUtils.stdout('Successfully connected!') # 待ち処理 try: while True: time.sleep(1) except KeyboardInterrupt: pass