//windows  Linux系统通用
//本代码使用的编译环境为:golang-go
//运行指令:go run tcpServerDemoPC.go
package main

import (
	"fmt"
	"net"
	"strings"
	"time"
)

var buf []byte = make([]byte, 4096)
var serverIp = "192.168.10.173"
var serverPort = "6000"

func main() {
	//参数连接 --> https://www.jianshu.com/p/325ac02fc31c
	fmt.Println("本机作为服务端")
	fmt.Println("本机IP：" + serverIp + "端口：" + serverPort)
	localAddress, _ := net.ResolveTCPAddr("tcp4", serverIp + ":" + serverPort) //定义一个本机IP和端口。
	var tcpListener, err = net.ListenTCP("tcp", localAddress)           //在刚定义好的地址上进监听请求。
	if err != nil {
		fmt.Println("监听出错：", err)
		return
	}
	defer func() { //担心return之前忘记关闭连接，因此在defer中先约定好关它。
		tcpListener.Close()
	}()

	fmt.Println("等待客户机的连接")
	var conn, err2 = tcpListener.AcceptTCP() //接受连接。
	if err2 != nil {
		fmt.Println("接受连接失败：", err2)
		return
	}
	fmt.Println("连接成功")

	var remoteAddr = conn.RemoteAddr() //获取连接到的对像的IP地址。
	fmt.Println("客户端IP与端口 --> ", remoteAddr)
		
	fmt.Println("电脑开关机接口测试：")

	fmt.Println("发送开机指令：AT+PCSSSTA=1\\r\\n")
	conn.Write([]byte("AT+PCSSSTA=1\r\n"))
	a, err := conn.Read(buf)
	fmt.Println("电脑开关机应答：", strings.Replace(string(buf[:a]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")
	time.Sleep(1000000000) //1秒
	//================================================
	
	fmt.Println("发送每天早上8点定时开机指令：AT+AUTOCONT=2,TASK1,[T:3,0|1|2|3|4|5|6,08:00:00],[PC:0,1],[N:1,0]\\r\\n")
	conn.Write([]byte("AT+AUTOCONT=2,TASK1,[T:3,0|1|2|3|4|5|6,08:00:00],[PC:0,1],[N:1,0]\r\n"))
	b, err := conn.Read(buf)
	fmt.Println("电脑开关机应答：", strings.Replace(string(buf[:b]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")

	//被动上传(实时读取)
	fmt.Println("发送读取电脑开关机状态指令：AT+PCSSSTA=?\\r\\n")
	conn.Write([]byte("AT+PCSSSTA=?\r\n"))
	c, err := conn.Read(buf)
	fmt.Println("电脑开关机应答：", strings.Replace(string(buf[:c]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")	
	time.Sleep(500000000) //0.5秒
	//================================================
	
	//上传方式   1：定时上传 2：触发上传 3：定时 + 触发上传   本例程使用1：定时上传
	//设置 3 秒上传 1 次电脑开关机状态
	//AT+PCSSSTA=1,30  1：上传方式  30：上传间隔：单位 100ms
 	fmt.Println("发送电脑关机指令：AT+PCSSSTA=1,30\\r\\n ") 
	conn.Write([]byte("AT+PCSSSTA=1,30\r\n"))
	d, err := conn.Read(buf)
	fmt.Println("电脑开关机应答：", strings.Replace(string(buf[:d]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")
	time.Sleep(500000000) //0.5秒
	
	// 上电自动开机功能启动
	fmt.Println("上电自动开机功能启动：AT+PCSSAUTO=1\\r\\n")
	conn.Write([]byte("AT+PCSSAUTO=1\r\n"))
	e, err := conn.Read(buf)
	fmt.Println("电脑开关机应答：", strings.Replace(string(buf[:e]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")	
	time.Sleep(500000000) //0.5秒
	
	// 上电禁用机箱按键
	fmt.Println("上电禁用机箱按键，即按键失效：AT+PCSSEXTKEY=1\\r\\n")
	conn.Write([]byte("AT+PCSSEXTKEY=1\r\n"))
	f, err := conn.Read(buf)
	fmt.Println("电脑开关机应答：", strings.Replace(string(buf[:f]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")	

	fmt.Println("测试完成！")

	fmt.Println("更多控制指令的详细解释请查阅《网络控制器AT指令手册V2.9.PDF》")
	fmt.Println("本Demo仅用于开发参考，不能直接用于商业项目实施！")
}
