Unity :Android局域网通信、UDP广播实现控制器开关(继电器)(02)
今天的重点有以下几点
1.比如有1-16个按钮 ,每个对应一个继电器的16个开关和Windows电脑里面程序16个视频
点击一个按钮,继电器打开一个,其余都关闭。Windows程序切换一个视频
1.问题:不能一个按钮写一个命令,对应一个继电器的开关和Windows的视频吧,如果有100个呢?不得死?后期修改维护呢?
1.解决办法,搞个for循环。没错,是这样的,但是新问题出来了
2.新问题:(Windows程序就不说了,你固定好1-16发送string即可)继电器不一样啊,继电器要接收16位的16进制的数字
2.首先分析16位的16进制的数字
2.1. 以这个为例子550113000000016A,这个是打开继电器1号开关,其余都关闭
2.2继续分解550113000000016A,
红色部分为固定的,看继电器说明书即可,每个不一样。
绿色部分为1-16继电器的开关(注意了:0001,是一号开关,0002是二号开关,但是0003,不是3号开关。3号开关为0004。4号开关为0008。12号开关为0800)
怎么得来呢??看截图
绿色部分("6A")为和校验结果(HEX),为什么要有这个,因为要判断前面的12位数字是不是正确(乌龟的屁股,规定)
//和校验结果代码 private string hexStrToByte(string data) { int sum = 0; for(int i = 0;i < data.Length / 2;i++) { string hexStr = data.Substring(i * 2,2); sum += Convert.ToInt32(hexStr,16); } //ToUpper 大写//ToLower 小写 return Convert.ToString(sum,16).ToUpper(); }
完整代码
using System; using UnityEngine; public class ClientTool:MonoBehaviour { public GameObject allBtn; void Start() { for(int i = 0;i < allBtn.transform.childCount;i++) { GameObject obj = allBtn.transform.GetChild(i).gameObject; EventTriggerListener.Get(obj).onClick = onClick; } } void onClick(GameObject sender) { UDPClient.instance.Send(sender.name); //发送给Windows的命令 for(int i = 0;i < allBtn.transform.childCount;i++) { GameObject obj = allBtn.transform.GetChild(i).gameObject; if(sender.name == obj.name) { getStrTo16(i); } } } //开关,比如继电器上有12个开关 //111111111111:表示全开; //000000000000表示全关; //100000000001表示第十二个和第一个开关打开,其余的全部关闭 //获取16位字串符 void getStrTo16(int num) { string str = ""; for(int i = 16;i > 0;i--) { if(i == num) { str += "1"; } else { str += "0"; } } Two_16(str); } //二进制转换16进制 void Two_16(string args) { // print(Convert.ToInt32(args, 2));: //print(Convert.ToInt32(args, 2).ToString("X4")); //重点:取后四位16进制的字符 string s1 = Convert.ToInt32(args,2).ToString("X4"); //这里的s2是字串符,而不是所谓的16进制数字, //s1是点击的哪个按钮,或者说是操作的哪个继电器的串口 //"5501130000"是固定的开关命令 string s2 = "5501130000" + s1; //hexStrToByte(s2) 16位进制和校验结果(HEX)------也就是s2的校验 string send_ChuanKou = s2 + hexStrToByte(s2); //发送给继电器的送命令,所有的工作都是为了这一步 //有时候同时发送,只能接收一个,可以协成 yield return new WaitForSeconds(0.01f);,间隔一下 UDPClient.instance.SendHEX(send_ChuanKou); } /// <summary> /// //要把这一串字符“55011300112233”转换为8个 数字 55 01 13 00 11 22 33,并且这八个数字是16进制的 /// </summary> private string hexStrToByte(string data) { int sum = 0; for(int i = 0;i < data.Length / 2;i++) { string hexStr = data.Substring(i * 2,2); sum += Convert.ToInt32(hexStr,16); } //ToUpper 大写//ToLower 小写 return Convert.ToString(sum,16).ToUpper(); } }
posted on 2022-11-23 17:10 zqiang0803 阅读(467) 评论(0) 编辑 收藏 举报