# coding:utf-8
# windows  Linux系统通用
# 运行指令:python TCPServerDemo.py

from socket import *
from time import ctime
import time

# 0：DO 继电器输出接口
# 1：DI 开关量输入接口
# 2：AI 模拟量输入接口
# 3：VO 语音输出接口
# 4：PC 电脑开关机接口
Type = 0

HOST = '192.168.10.173'
PORT = 6000 #端口号
BUFSIZ = 1024 #接收数据缓冲大小
ADDR = (HOST, PORT)

print(u'本机作为服务端')
print(u'本机IP：')
print(HOST)
print(u'端口：')
print(PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM) #创建TCP服务器套接字
tcpSerSock.bind(ADDR) #套接字与地址绑定
tcpSerSock.listen(5) #监听连接，同时连接请求的最大数目

print(u'等待客户机的连接')
tcpCliSock, addr = tcpSerSock.accept()  #接收继电器端连接请求
print(u'连接成功')
print(u'客户端IP与端口如下：')
print(addr)

def TestDO():
    print(u'DO继电器输出接口测试：')

    print(u"控制DO继电器输出接口OUT1吸合；发送指令：AT+STACH1=1\\r\\n \r\n")
    meg = "AT+STACH1=1\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"时间单位改成 秒；发送指令：AT+DLYUNIT=0\\r\\n \r\n")
    meg = "AT+DLYUNIT=0\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"控制DO继电器输出接口OUT1点动开，开启后延时5秒再关闭：AT+STACH1=3,5,100000,1000000\\r\\n \r\n")
    meg = "AT+STACH1=3,5,100000,1000000\r\n"
    tcpCliSock.send(meg.encode('gbk'))
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"控制DO继电器输出接口OUT1~OUT4间隔1秒轮流吸合：AT+DODLY=1,1,4,1,1\\r\\n \r\n")
    meg = "AT+DODLY=1,1,4,1,1\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"继电器OUT1每天早上8点定时吸合：AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[DO:0,1,1,100000,100000,1000000],[N:1,0]\\r\\n \r\n")
    meg = "AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[DO:0,1,1,100000,100000,1000000],[N:1,0]\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"IN1/DI1联动控制继电器OUT1点动输出5秒：AT+LINKAGE1=3,5,100000,1,1000000\\r\\n \r\n")
    meg = "AT+LINKAGE1=3,5,100000,1,1000000\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"上电默认状态设置为吸合指令：AT+DODEFSTA=1\\r\\n \r\n")
    meg = "AT+DODEFSTA=1\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"使能状态主动上传指令：AT+KPUPLOAD=1\\r\\n \r\n")
    meg = "AT+KPUPLOAD=1\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"使能掉电保存指令：AT+KPKEEP=1\\r\\n \r\n")
    meg = "AT+KPKEEP=1\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
def TestDI():
    print(u'DI开关量输入接口测试：')

    print(u'读取DI开关量输入接口IN1/DI1的状态指令：AT+OCCH1=?\\r\\n')
    meg = "AT+OCCH1=?\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    # 被动上传  AT+OCMOD=0\r\n
    # 定时上传	AT+OCMOD=1,300   1：上传模式  300：上传间隔 单位：10ms
    # 触发上传(所有通道)	AT+OCMOD=2,0
    # 触发上传(单个通道)	AT+OCMOD=3,0
    print(u'设置DI上传模式：每3秒设置上传一次DI状态：AT+OCMOD=1,300\\r\\n \r\n')
    meg = "AT+OCMOD=1,300\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')

def TestAI():
    print(u"AI模拟量输入接口测试：")
    # 设置AI1接口的信号类型是电压型
    print(u"设置AI1接口的信号类型是电压型：AT+AIMODE1=0\\r\\n \r\n")
    meg = "AT+AIMODE1=0\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)

    # 读取AI1接口实时采样值 被动上传(实时读取)
    print(u"读取AI1接口实时采样值：AT+AIVALUE1=?\\r\\n \r\n")
    meg = "AT+AIVALUE1=?\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)

    # 0：被动上传  使用AT+AIVALUE1=?\r\n指令读取AI1接口实时采样值
    # 1：定时上传	AT+AIUPLOAD1=1,30\r\n   30：上传间隔 单位：100ms
    # 2：触发上传	AT+AIUPLOAD1=2,0,30,0,2000,0,0\r\n  设置 AI1 接口采样值高于 2000 并持续 3 秒触发上传
    # 3：定时+触发上传 AT+AIUPLOAD1=2,30,30,0,2000,0,0\r\n  设置 AI1 接口 3秒上传一次 或 采样值高于 2000 并持续 3 秒触发上传
    print(u"设置3秒上传1次AI1接口采样值：AT+AIUPLOAD1=1,30\\r\\n \r\n")
    meg = "AT+AIUPLOAD1=1,30\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)
def TestVO():
    print(u"VO语音输出接口测试：")

    print(u"控制VO1接口播放文字“泥人科技”：AT+TTS1=1,0,8\\r\\n泥人科技\r\n")
    meg = u"AT+TTS1=1,0,8\r\n泥人科技"
    tcpCliSock.send(meg.encode('gbk'))
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)

    print(u"控制VO1接口播放语音文件1：AT+AUDIO1=1,10\\r\\n \r\n")
    meg = "AT+AUDIO1=1,10\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)

    print(u"定时播放 VO1接口每天早上8点播放语音文件1：AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[VO:0,1,1,10,1,0],[N:1,0]\\r\\n \r\n")
    meg = "AT+AUTOCONT=2,TASK1,[CYC:1],[T:3,0|1|2|3|4|5|6,08:00:00],[VO:0,1,1,10,1,0],[N:1,0]\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)
    # 开关量联动播放
    print(u"IN1/DI1联动播放语音文件1：AT+AUTOCONT=2,TASK1,[CYC:1],[DI:3,1,1],[VO:0,1,1,10,1,0],[N:1,0]\\r\\n \r\n")
    meg = "AT+AUTOCONT=2,TASK1,[CYC:1],[DI:3,1,1],[VO:0,1,1,10,1,0],[N:1,0]\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)

    # 文本播放拓展（发音人、声调、语速、语调）
    # VO1 接口使用 
    # 发音人：[m3] 3 晓玲(女声) 51 尹小坚(男声) 52 易小强(男声) 53 田蓓蓓(女声) 54 唐老鸭(效果器) 55 小燕子(女童声)
    # 声调：[i0] 0 - 不识别汉语拼音 1 - 识别汉语拼音 
    # 注意： 欢迎[i0]shi3泥人科技  读作：欢迎shi3用泥人科技   欢迎[i1]shi3用泥人科技  读作：欢迎使用泥人科技
    # 1）拼音格式为：1 至 6 位字母 + 1 位数字   
    # 2）声调用 1 位数字表示 ：1 阴平、2 阳平、3 上声、4 去声、5 轻声 
    # 语速：1-10档 [s5]
    # 语调：1-10档 [t5]
    # 音量：1-10档 [v5]
    # VO1接口使用发音人：晓玲,声调：5,语速：5,语调：5,音量：5播放文本
    print(u"VO1接口使用发音人：晓玲,声调：5,语速：5,语调：5,音量：5播放文本：AT+TTS1=1,0,1,1,39\\r\\n[m3][s5][t5][v5]欢迎[i0]shi3用泥人科技\r\n")
    meg = u"AT+TTS1=1,0,1,1,39\r\n[m3][s5][t5][v5]欢迎[i0]shi3用泥人科技"
    tcpCliSock.send(meg.encode('gbk'))
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'设备应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)
def TestPC():
    print(u'电脑开关机功能测试：')

    print(u'发送电脑开机指令：AT+PCSSSTA=1\\r\\n')
    meg = "AT+PCSSSTA=1\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'电脑开关机应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    print(u"每天早上8点开机： AT+AUTOCONT=2,TaskName1,[T:3,0|1|2|3|4|5|6,08:00:00],[PC:0,1],[N:1,0]\\r\\n \r\n")
    meg = "AT+AUTOCONT=2,TaskName1,[T:3,0|1|2|3|4|5|6,08:00:00],[PC:0,1],[N:1,0]\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'电脑开关机应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)#休眠1秒

    # 0：被动上传  使用AT+PCSSSTA=?\r\n指令读取开关机状态
    # 1：定时上传	AT+PCSSUPLOAD=1,30\r\n   30：上传间隔 单位：100ms
    # 2：触发上传	AT+PCSSUPLOAD=2\r\n  
    # 3：定时+触发上传 AT+PCSSUPLOAD=3,30\r\n 
    # 设置3秒上传1次电脑开关机状态
    print(u"设置3秒上传1次电脑开关机状态：AT+PCSSUPLOAD=1,30\\r\\n \r\n")
    meg = "AT+PCSSUPLOAD=1,30\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'电脑开关机应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)

    # 上电自动开机功能启用
    print(u'上电自动开机功能启用：AT+PCSSAUTO=1\\r\\n \r\n')
    meg = "AT+PCSSAUTO=1\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'电脑开关机应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')
    time.sleep(1)

    # 上电禁用机箱按键
    print(u'上电禁用机箱按键，即按键失效：AT+PCSSEXTKEY=1\\r\\n \r\n')
    meg = "AT+PCSSEXTKEY=1\r\n"
    tcpCliSock.send(meg.encode())
    recv_data = tcpCliSock.recv(BUFSIZ)
    print(u'电脑开关机应答：')
    print(recv_data.decode('gbk'))
    print(u'指令执行成功!')

if Type == 0:
    TestDO()
elif Type == 1:
    TestDI()
elif Type == 2:
    TestAI()
elif Type == 3:
    TestVO()
elif Type == 4:
    TestPC()

print(u'测试完成！')

print(u'更多控制指令的详细解释请查阅《网络控制器AT指令手册V2.9.PDF》')
print(u'本Demo仅用于开发参考，不能直接用于商业项目实施！')
