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

```txt:動作確認
CentOS 6.5
```

[ソフト設計 @ mindmup](https://atlas.mindmup.com/2015/11/90a4a2a06c370133eea40fc7cf8ea63c/151112_line_monitor/index.html)

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

[v0.1 @ github](https://github.com/yasokada/python-151113-lineMonitor/releases/tag/v0.1)

## 設定のクラス

```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()
```

##実行

```txt:動作確認
プログラム実行: 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はまだよく分からない点が色々あり、現状の実装が最適とは思えないが、とりあえず自分のやりたいことを実装してからリファクタリングするかもしれない。