//windows  Linux系统通用
//本代码使用的编译环境为:golang-go
//运行指令:go run tcpServerDemoAI.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("AI 模拟量输入接口：")
	
	//设置 AI1 接口的信号类型是电压型
	fmt.Println("设置 AI1 接口的信号类型是电压型：AT+AIMODE1=0\\r\\n")
	conn.Write([]byte("AT+AIMODE1=0\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秒
	//================================================

	//读取 AI1 接口实时采样值 被动上传(实时读取)
	fmt.Println("读取 AI1 接口实时采样值：AT+AIVALUE1=?\\r\\n")
	conn.Write([]byte("AT+AIVALUE1=?\r\n"))
	k, err := conn.Read(buf)
	fmt.Println("设备应答：", strings.Replace(string(buf[:k]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")
	time.Sleep(500000000) //0.5秒
	
	//被动上传 使用指令：AT+AIVALUE1=?\r\n 读取 设置指令：AT+AIUPLOAD1=0
	//定时上传 设置 3 秒上传 1 次 AI1 接口采样值  指令：AT+AIUPLOAD1=1,30\r\n
	//触发上传 设置AI1接口采样值高于2000并持续3秒触发上传  指令：AT+AIUPLOAD1=2,0,20,0,2000,0,0\r\n
	//定时 + 触发上传 设置3秒上传1次和AI1接口采样值高于2000并持续3秒触发上传  指令：AT+AIUPLOAD1=2,30,20,0,2000,0,0\r\n
	//此例程使用定时上传方式
	fmt.Println("设置 3 秒上传 1 次 AI1 接口采样值：AT+AIUPLOAD1=1,30\\r\\n")
	conn.Write([]byte("AT+AIUPLOAD1=1,30\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仅用于开发参考，不能直接用于商业项目实施！")
}
