//windows  Linux系统通用
//本代码使用的编译环境为:golang-go
//运行指令:go run tcpServerDemoDI.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("DI开关量接口测试：")
	
	fmt.Println("读取 DI 开关量输入接口 IN1/DI1 的状态 被动上传(实时读取)：AT+OCCH1=?\\r\\n")
	conn.Write([]byte("AT+OCCH1=?\r\n"))
	a, err := conn.Read(buf)
	fmt.Println("设备应答：", strings.Replace(string(buf[:a]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")
	time.Sleep(500000000) //0.5秒
	//================================================
	
	//被动上传 使用指令：AT+OCCH1=?\r\n 读取状态 设置指令：AT+OCMOD=0,0
	//定时上传 设置 3 秒上传 1 次 DI 接口状态  指令：AT+OCMOD=1,300\r\n
	//触发上传(所有通道) 设置 DI 接口状态触发上传  指令：AT+OCMOD=2,0\r\n
	//触发上传(单个通道) 设置 DI 接口状态触发上传  指令：AT+OCMOD=3,0\r\n
	
	//此例程使用定时上传方式
	fmt.Println("设置DI上传模式：AT+OCMOD=1,300\\r\\n")
	conn.Write([]byte("AT+OCMOD=1,300\r\n"))
	c, err := conn.Read(buf)
	fmt.Println("设备应答：", strings.Replace(string(buf[:c]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")
	
	fmt.Println("测试完成！")

	fmt.Println("更多控制指令的详细解释请查阅《网络控制器AT指令手册V2.8.PDF》")
	fmt.Println("本Demo仅用于开发参考，不能直接用于商业项目实施！")
}
