// windows  Linux系统通用
// 本代码使用的编译环境为:golang-go
// 运行指令:go run tcpServerDemoVO.go
package main

import (
	"fmt"
	"net"
	"strings"
	"time"

	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/transform"
)

var buf []byte = make([]byte, 4096)
var serverIp = "192.168.10.173"
var serverPort = "6000"

func utf8ToGB2312(str string) (string, error) {
	// GB2312编码器
	encoder := simplifiedchinese.GB18030.NewEncoder()

	// 使用转换器将UTF-8字符串转换为GB2312编码
	gb2312Bytes, _, err := transform.Bytes(encoder, []byte(str))
	if err != nil {
		return "", err
	}

	// 将转换后的字节切片转换为字符串
	gb2312Str := string(gb2312Bytes)
	return gb2312Str, nil
}

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("VO 语音输出接口测试：")

	//实时播放 控制 VO1 接口播放文字“泥人科技”
	fmt.Println("控制 VO1 接口播放文字“泥人科技”：AT+TTS1=1,0,8\\r\\n泥人科技")
	str := "AT+TTS1=1,0,8\r\n泥人科技"

	gb2312Str, err := utf8ToGB2312(str)
	if err != nil {
		fmt.Println("转换失败：", err)
		return
	}

	conn.Write([]byte(gb2312Str))
	a, err := conn.Read(buf)
	fmt.Println("设备应答：", strings.Replace(string(buf[:a]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")
	time.Sleep(1000000000) //1秒
	//================================================

	//控制 VO1 接口播放语音文件 1
	//fmt.Println("控制 VO1 接口播放语音文件 1 指令：AT+AUDIO1=1,10\\r\\n")
	//conn.Write([]byte("AT+AUDIO1=1,10\r\n"))
	//b, err := conn.Read(buf)
	//fmt.Println("设备应答：", strings.Replace(string(buf[:b]), "\r\n", "\\r\\n", 1))
	//fmt.Println("指令执行成功！")
	//time.Sleep(500000000) //0.5秒
	//================================================

	//VO1 接口每天早上 8 点播放语音文件 1  定时播放
	fmt.Println("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")
	conn.Write([]byte("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"))
	c, err := conn.Read(buf)
	fmt.Println("设备应答：", strings.Replace(string(buf[:c]), "\r\n", "\\r\\n", 1))
	fmt.Println("指令执行成功！")
	time.Sleep(500000000) //0.5秒
	//================================================

	//IN1/DI1 联动播放语音文件 1  开关量联动播放
	fmt.Println("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")
	conn.Write([]byte("AT+AUTOCONT=2,TASK1,[CYC:1],[DI:3,1,1],[VO:0,1,1,10,1,0],[N:1,0]\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秒
	//================================================

	//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]
	fmt.Println("VO1 接口使用 发音人：晓玲 声调：5 语速：5 语调：5 音量：5播放 文本 指令：AT+TTS1=1,0,1,1,39\\r\\n[m3][s5][t5][v5]欢迎[i0]shi3用泥人科技")

	str = "AT+TTS1=1,0,1,1,39\r\n[m3][s5][t5][v5]欢迎[i0]shi3用泥人科技"
	gb2312Str1, err := utf8ToGB2312(str)
	if err != nil {
		fmt.Println("转换失败：", err)
		return
	}

	conn.Write([]byte(gb2312Str1))
	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("测试完成！")

	fmt.Println("更多控制指令的详细解释请查阅《网络控制器AT指令手册V2.9.PDF》")
	fmt.Println("本Demo仅用于开发参考，不能直接用于商业项目实施！")
}
