Unity Arduino sends and receives Json data

#include <WiFi.h>
#include <Adafruit_PWMServoDriver.h>
#include <ArduinoJson.h>
#include <esp_timer.h>

// 舵机驱动板
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

//WIFI连接
const char* ssid = "601";        // Wi-Fi网络名称
const char* password = "950819961018";    // Wi-Fi网络密码
WiFiServer server(80);    // 创建一个Wi-Fi服务器对象,监听端口80


///Json数据
DynamicJsonDocument jsonDoc(1024);
int id;
double value;
 
void setup() {
  pwm.begin();
  pwm.setPWMFreq(50);

  Serial.begin(115200);
  while (!Serial) {}  // 等待串口连接
 
  // 连接到Wi-Fi网络
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  // 打印IP地址
  Serial.println(WiFi.localIP());
  // 开始监听客户端连接
  server.begin();

  //初始化舵机角度
  Seat();
}



void loop() {
  // 等待客户端连接
  WiFiClient client = server.available();
  if (client) {
    Serial.println("客户端连入");
    
    // 等待客户端发送数据
    while (client.connected()) {
      if (client.available()) {
        // 读取客户端发送的数据
        String request = client.readStringUntil('\r');
        Serial.println(request);
        
        // 解析JSON数据
        DeserializationError error = deserializeJson(jsonDoc, request);
        
        // 检查JSON解析错误
        if (error) {
          Serial.print(F("JSON parsing failed: "));
          Serial.println(error.c_str());
          break; // 终止循环
        }
        
        // 提取整数和浮点数字段
        id = jsonDoc["id"].as<int>();
        value = jsonDoc["angle"].as<double>();

      // 在定时器回调函数中执行pwm.setPWM()函数
      if(id>1000)
      {
        if (id == 1001)
        {
          Seat();
        } else if (id == 1002) 
        {
          Stand();
        } else if (id == 1003) 
        {
          Sway();
        }
      }
      else
      {
        pwm.setPWM(id, 0, value);
      }
        // 清空JSON文档,以便接收下一条消息
        jsonDoc.clear();
      }
    }
    
    // 断开客户端连接
    client.stop();
    Serial.println("Client disconnected");
  }
}

//坐下
void Seat()
{
  pwm.setPWM(0, 0, 301);
  delay(10);
  pwm.setPWM(4, 0, 301);
  delay(10);
  pwm.setPWM(2, 0, 301);
  delay(10);
  pwm.setPWM(6, 0, 301);
  delay(10);
  pwm.setPWM(7, 0, 406);
  delay(10);
  pwm.setPWM(5, 0, 209);
  delay(10);
  pwm.setPWM(1, 0, 209);
  delay(10);
  pwm.setPWM(3, 0, 373);
}

//站起来
void Stand()
{
  pwm.setPWM(0, 0, 510);
  delay(10);
  pwm.setPWM(4, 0, 102);
  delay(10);
  pwm.setPWM(2, 0, 102);
  delay(10);
  pwm.setPWM(6, 0, 510);
  delay(10);
  pwm.setPWM(7, 0, 406);
  delay(10);
  pwm.setPWM(5, 0, 209);
  delay(10);
  pwm.setPWM(1, 0, 209);
  delay(10);
  pwm.setPWM(3, 0, 373);
}

//左右摇摆
void Sway()
{

  pwm.setPWM(7, 0, 510);
  delay(10);
  pwm.setPWM(5, 0, 102);
  delay(10);
  pwm.setPWM(1, 0, 102);
  delay(10);
  pwm.setPWM(3, 0, 490);

  delay(500);
  delay(10);
  pwm.setPWM(0, 0, 510);
  delay(10);
  pwm.setPWM(4, 0, 300);
  delay(10);
  pwm.setPWM(2, 0, 300);
  delay(10);
  pwm.setPWM(6, 0, 510);

  delay(500);
  pwm.setPWM(0, 0, 300);
  delay(10);
  pwm.setPWM(4, 0, 102);
  delay(10);
  pwm.setPWM(2, 0, 102);
  delay(10);
  pwm.setPWM(6, 0, 300);

}
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;
using XFrameWork;

public class Machine : BasePanel
{
    [Header("Slider的回调触发时间,让它不要发送太频繁")]
    public float callbackDelay = 0.5f;

    public CustomSlider[] sliderArray;
    public Slider[] sliders;

    private float lastCallbackTime;
    Root root;
    void Start()
    {
        if (NetMgr.Instance == null)
        {
            GameObject obj = new GameObject("Net");
            obj.AddComponent<NetMgr>();
        }
        NetMgr.Instance.Connect("192.168.1.7", 80);


        StartCoroutine(TextReader("Data.json", (str) =>
        {
            root = JsonUtility.FromJson<Root>(str);
        }));

        for (int i = 0; i < sliderArray.Length; i++) 
        {
            int index = i;
            sliderArray[index].OnValueChangedEnd.AddListener(() => {
                Debug.Log(sliderArray[index].name);
                switch (sliderArray[index].name)
                {
                    case "Slider_0":
                        root.id = 0;
                        root.angle = sliders[index].value;
                        break;
                    case "Slider_1":
                        root.id = 1;
                        root.angle = sliders[index].value;
                        break;
                    case "Slider_2":
                        root.id = 2;
                        root.angle = sliders[index].value;
                        break;
                    case "Slider_3":
                        root.id = 3;
                        root.angle = sliders[index].value;
                        break;
                    case "Slider_4":
                        root.id = 4;
                        root.angle = sliders[index].value;
                        break;
                    case "Slider_5":
                        root.id = 5;
                        root.angle = sliders[index].value;
                        break;
                    case "Slider_6":
                        root.id = 6;
                        root.angle = sliders[index].value;
                        break;
                    case "Slider_7":
                        root.id = 7;
                        root.angle = sliders[index].value;
                        break;
                }
                NetMgr.Instance.Send(root);
            });
        }
    }

    /*----------动作函数----------*/

    // |   0  |             |   4  |
    //  ----- -----   ----- -----
    //       |   7  | |  5   |
    //        -----   -----
    //       |   1  | |  3   |
    //  ----- -----   ----- -----
    // |  6   |             |  2   |
    private bool isSliderCallbackAllowed = true;
    //protected override void OnValueChanged(string sliderName, float sliderValue)
    //{
    //    base.OnValueChanged(sliderName, sliderValue);

    //    if (Time.time - lastCallbackTime >= callbackDelay)
    //    {
    //        lastCallbackTime = Time.time;

    //        switch (sliderName)
    //        {
    //            case "Slider_0":
    //                root.id = 0;
    //                root.angle = sliderValue;
    //                break;
    //            case "Slider_1":
    //                root.id = 1;
    //                root.angle = sliderValue;
    //                break;
    //            case "Slider_2":
    //                root.id = 2;
    //                root.angle = sliderValue;
    //                break;
    //            case "Slider_3":
    //                root.id = 3;
    //                root.angle = sliderValue;
    //                break;
    //            case "Slider_4":
    //                root.id = 4;
    //                root.angle = sliderValue;
    //                break;
    //            case "Slider_5":
    //                root.id = 5;
    //                root.angle = sliderValue;
    //                break;
    //            case "Slider_6":
    //                root.id = 6;
    //                root.angle = sliderValue;
    //                break;
    //            case "Slider_7":
    //                root.id = 7;
    //                root.angle = sliderValue;
    //                break;
    //        }
    //        NetMgr.Instance.Send(root);
    //    }
    //}


    protected override void OnClick(string btnName)
    {
        base.OnClick(btnName);
        switch (btnName)
        {
            case "Btn_坐下":
                root.id = 1001;
                root.angle = 0;
                NetMgr.Instance.Send(root);
                break;
            case "Btn_站立":
                root.id = 1002;
                root.angle = 0;
                NetMgr.Instance.Send(root);
                break;
            case "Btn_左右摇摆":
                root.id = 1003;
                root.angle = 0;
                NetMgr.Instance.Send(root);
                break;
        }
    }

    /// <summary>
    /// 读取StreamingAsset中的配置文件
    /// </summary>
    /// <param name="configName"></param>
    /// <param name="action"></param>
    /// <returns></returns>
    public static IEnumerator TextReader(string configName, UnityAction<string> action = null)
    {
        string path = Application.streamingAssetsPath + "/" + configName;
        UnityWebRequest unityWebRequest = UnityWebRequest.Get(path);
        yield return unityWebRequest.SendWebRequest();

        if (unityWebRequest.error != null)
            Debug.Log(unityWebRequest.error);
        else
        {
            string content = unityWebRequest.downloadHandler.text;
            if (action != null)
                action(content);
        }
    }
}

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class CustomSlider : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
    public UnityEvent OnValueChangedEnd;
    Slider slider;

    public float totalTime = 1;
    private float currentTime = 0;

    private bool isStart = false;

    private void Awake()
    {
        slider = GetComponent<Slider>();
    }

    private void Start()
    {
        isStart = false;
    }

    private void Update()
    {
        if (isStart) 
        {
            currentTime += Time.deltaTime;
            if (currentTime >= totalTime)
            {
                currentTime = 0;
                OnValueChangedEnd?.Invoke();
            }
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        isStart = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isStart = false;
        currentTime = 0;
        OnValueChangedEnd?.Invoke();
    }
}

Guess you like

Origin blog.csdn.net/weixin_46711336/article/details/132351173