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  阅读(440)  评论(0编辑  收藏  举报

导航