0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

line monitor > python > UDPコマンドによる設定のset/get

Last updated at Posted at 2015-11-13
動作確認
CentOS 6.5

ソフト設計 @ mindmup

上記の設計の元、UDP通信による設定のset/get処理を実装中。

v0.1 @ github

設定のクラス

utilSetting.py
class CSetting:
	def __init__(self):
		self.monip = "192.168.10.8"
		self.monport = 9000
		self.comdelay = 0 # [msec]

	def getMonip(self):
		return self.monip

	def setMonip(self,monip_):
		self.monip = monip_
		return

	def getMonport(self):
		return self.monport

	def setMonport(self,monport_):
		self.monport = monport_
		return

	def getComdelay(self):
		return self.comdelay

	def setComdelay(self, comdelay_):
		self.comdelay = comdelay_
		return

UDP通信の実装

utilUdpCmd.py
import time
import socket
from utilSetting import CSetting

g_setting = CSetting()

# TODO: error handling > cmd typo etc

'''
v0.1 2015/11/13
  - can get/set settings (monitor ip, monitor port, com delay[msec])
'''

def procSetCommand(rcvstr):
	cmds = rcvstr.split(",")
	if "mon" in cmds[1]:
		count = len(cmds)
		if count == 4:
			g_setting.setMonip(cmds[2])
			g_setting.setMonport(cmds[3])
			print "set monitor (ip, port)"
			print g_setting.getMonip()
			print g_setting.getMonport()
	if "comdelay" in cmds[1]:
		g_setting.setComdelay(int(cmds[2]))
		print "set comdelay"
		print g_setting.getComdelay()

def procGetCommand(rcvstr):
	cmds = rcvstr.split(",")
	count = len(cmds)
	if count == 2:
		if "monip" in cmds[1]:
			print "monip," + g_setting.getMonip()
		if "monport" in cmds[1]:
			print "monport," + `g_setting.getMonport()`
		if "comdelay" in cmds[1]:
			print "comdelay," + `g_setting.getComdelay()`
	return

def procCommand(rcvstr):
	rcvstr = rcvstr.rstrip('\n')
	rcvstr = rcvstr.rstrip('\r')
	print "rcvd:[", rcvstr, "]"
	cmds = rcvstr.split(",")
	if "set" in cmds[0]:
		procSetCommand(rcvstr)
	if "get" in cmds[0]:
		procGetCommand(rcvstr)
	return

def recvCommand(cmdsock, rcvcmd):
	try:
		data,address = cmdsock.recvfrom(100)
	except socket.error:
		pass
	else:
		rcvcmd = rcvcmd + data
		return rcvcmd, True
	return rcvcmd, False

def main():
	cmdip = ""
	cmdport = 7000
	cmdsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	cmdsock.bind((cmdip, cmdport))
	cmdsock.setblocking(0)

	rcvcmd = ""

	while 1:
		rcvcmd,rcvd = recvCommand(cmdsock, rcvcmd)
		if rcvd == True and "\n" in rcvcmd:
			procCommand(rcvcmd)
			rcvcmd = ""

if __name__ == '__main__':
	main()

実行

動作確認
プログラム実行: CentOS 6.5 (IP: 192.168.10.8)
UDPコマンド送信: Mac OS X 10.8.5

プログラム実行は以下で行う。

$ python utilUdpCmd.py

モニターIP,port設定

MacOSXのターミナルで以下を実行。

$ echo "set,mon,192.168.10.5,8000" | nc -w 1 -u 192.168.10.8 7000

すると、CentOSでは以下となる。

[python-151113-lineMonitor]$ python utilUdpCmd.py 
rcvd:[ set,mon,192.168.10.5,8000 ]
set monitor (ip, port)
192.168.10.5
8000

COM通信ディレイ設定

MacOSXのターミナルで以下を実行。

$ echo "set,comdelay,300" | nc -w  1 -u 192.168.10.8 7000

すると、CentOSでは以下となる。

[python-151113-lineMonitor]$ python utilUdpCmd.py 
rcvd:[ set,comdelay,300 ]
set comdelay
300

設定取得

MacOSXで以下を実行すると、それぞれの設定が取得できる。

$ echo "get,comdelay" | nc -w 1 -u 192.168.10.8 7000
$ echo "get,monip" | nc -w 1 -u 192.168.10.8 7000
$ echo "get,monport" | nc -w 1 -u 192.168.10.8 7000

上記で設定が変更できるようにはなった。

pythonはまだよく分からない点が色々あり、現状の実装が最適とは思えないが、とりあえず自分のやりたいことを実装してからリファクタリングするかもしれない。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?