Arduino 与 Unity3D TCP通信

 一、通过传输流的方式

#include <WiFi.h>#define LED_PIN 5
const char * ssid = "Daschow2021";
const char * password = "daschow2021";
void setup() {Serial.begin(9600);//连接WiFiWiFi.begin(ssid,password);Serial.print("正在连接Wifi");//检测是否连接成功while (WiFi.status()!=WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("连接成功");Serial.print("IP 地址:");Serial.println(WiFi.localIP());//通过LED 反馈Wifi 连接状态pinMode(LED_PIN,OUTPUT);digitalWrite(LED_PIN,HIGH);delay(100);digitalWrite(LED_PIN,LOW);delay(100);digitalWrite(LED_PIN,HIGH);delay(1500);digitalWrite(LED_PIN,LOW);
}void loop()
{}
using UnityEngine;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using UnityEngine.UI;public class Test : MonoBehaviour
{private TcpClient client;private StreamReader reader;private StreamWriter writer;private Thread clientThread;public Button btnA;public Button btnB;public string serverIPAddress;public int serverPort;void Start(){ConnectToServer();btnA.onClick.AddListener(() => {sendMessage("a");});btnB.onClick.AddListener(() => {sendMessage("b");});}private void Update(){print(client.Connected);}void ConnectToServer(){try{client = new TcpClient();client.Connect(serverIPAddress, serverPort);Debug.Log("Connected to Arduino server");btnA.interactable = true;btnB.interactable = true;NetworkStream stream = client.GetStream();reader = new StreamReader(stream);writer = new StreamWriter(stream);clientThread = new Thread(new ThreadStart(ReceiveMessages));clientThread.Start();}catch (System.Exception e){Debug.Log("Connection error: " + e.Message);}}/// <summary>/// 接收数据/// </summary>void ReceiveMessages(){try{while (client.Connected){string message = reader.ReadLine();if (message != null){// 处理接收到的消息handleMessage(message);}}}//异常断开连接catch (System.Exception e){Debug.Log("Read/write error: " + e.Message);}}void sendMessage(string message){try{writer.WriteLine(message);writer.Flush(); // 清空缓冲区,确保消息被发送}catch (System.Exception e){Debug.Log("Read/write error: " + e.Message);}}void handleMessage(string message){Debug.Log("Message received: " + message);// 在这里添加逻辑来处理接收到的消息}void OnDestroy(){if (client != null){clientThread.Abort();writer.Close();reader.Close();client.Close();}}
}

 二、通过传输流的方式

#include <WiFi.h>#define LED_PIN 5const char* ssid = "大西洲01";        // Wi-Fi网络名称
const char* password = "Foresight2022NB";    // Wi-Fi网络密码WiFiServer server(80);    // 创建一个Wi-Fi服务器对象,监听端口80const size_t bufferSize = 64;  // 缓冲区大小
char buffer[bufferSize];  // 声明和初始化缓冲区void handleMessage(const char* message);  // 声明handleMessage函数void setup() {pinMode(LED_PIN, OUTPUT);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();
}void loop() {WiFiClient client = server.available();if (client) {while (client.connected()) {// 检查是否有可用数据if (client.available() > 0) {// 获取可用数据字节数size_t availableBytes = client.available();// 限制每次读取的字节数,避免缓冲区溢出size_t bytesToRead = min(availableBytes, bufferSize - 1);// 读取客户端发送的二进制数据size_t len = client.readBytes(buffer, bytesToRead);buffer[len] = '\0'; // 在字符串末尾添加终止符// 处理接收到的消息handleMessage(buffer);// 发送响应给客户端client.println("Data received");client.flush();delay(10);}}// 断开客户端连接client.stop();}
}void handleMessage(const char* message) {// 在这里添加逻辑来处理接收到的字符串数据// 根据需要解析和处理收到的数据// 以下是一个简单的示例,假设收到的数据指令是控制LED开关if (strcmp(message, "a") == 0) {digitalWrite(LED_PIN, HIGH);} else if (strcmp(message, "b") == 0) {digitalWrite(LED_PIN, LOW);}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Http.Headers;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;public class NetMgr : MonoBehaviour
{private static NetMgr instance;public static NetMgr Instance => instance;//客户端Socketprivate Socket socket;//用于发送消息队列 公共容器 主线程往里面放//private Queue<string> sendMsgQueue = new Queue<string>();//用于处理分包时,缓存的字节数组和字节数组长度private byte[] cacheBytes = new byte[1024 * 1024];private int cacheNum = 0;//是否连接private bool isConnected = false;private int SEND_HEART_MSG_TIME = 2;private void Awake(){instance = this;DontDestroyOnLoad(gameObject);}public void Connect(string ip, int port){//避免多次连接if (isConnected) return;if (socket == null)socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接服务端IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(ip), port);try{print("服务器连接成功");socket.Connect(ipPoint);isConnected = true;开启发送线程//ThreadPool.QueueUserWorkItem(SendMsg);}catch (SocketException s){if (s.ErrorCode == 10061)print("服务器拒绝连接");elseprint("连接失败" + s.ErrorCode + s.Message);}}//发送消息public void Send(string str) {//sendMsgQueue.Enqueue(str);socket.Send(Encoding.UTF8.GetBytes(str));}//private void SendMsg(object state)//{//    while (isConnected)//    {//        if (sendMsgQueue.Count > 0)//        {//            string str = sendMsgQueue.Dequeue();//            print("Send:" + str);//            socket.Send(Encoding.UTF8.GetBytes(str));//        }//    }//}public void Close(){if (socket != null){print("客户端主动断开连接");socket.Shutdown(SocketShutdown.Both);socket.Disconnect(false);socket.Close();socket = null;isConnected = false;}}private void OnDestroy(){Close();}
}
using UnityEngine;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using UnityEngine.UI;
using Unity.VisualScripting;public class Test : MonoBehaviour
{public Button btnA;public Button btnB;private void Start(){if (NetMgr.Instance == null){GameObject obj = new GameObject("Net");obj.AddComponent<NetMgr>();}NetMgr.Instance.Connect("192.168.50.49", 80);btnA.onClick.AddListener(() => {NetMgr.Instance.Send("a");});btnB.onClick.AddListener(() => {NetMgr.Instance.Send("b");});}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux麒麟系统二级等保【三权分立策略】

目录 三权分立策略 一、系统管理员 二、审计管理员 三、安全管理员 三权分立策略 "建议创建管理、操作、审计三类独立权限账号&#xff0c;支持三权分立机制。参考配置&#xff1a; 管理账号&#xff08;root&#xff09;&#xff1a;拥有所有操作权限&#xff1b;…

如何理解spring cloud 和 spring cloud Alibaba

Spring Cloud是一个基于Spring Framework构建的用于开发和构建分布式系统的开源框架。它提供了一系列的工具和组件&#xff0c;用于帮助开发者快速构建、部署和管理微服务架构。Spring Cloud提供了包括服务发现、配置管理、负载均衡、断路器等在内的众多功能。 Spring Cloud A…

第四十三天

●<template>&#xff1a;每个vue文件中最多可以包含一个&#xff0c;语块包裹的内容内容会被提取&#xff0c;编译成js渲染函数&#xff0c;并附在导出的组件上作为其render选项。 ●<script>​&#xff1a;每个 vue 文件最多可以包含一个 script>块(使用 <…

【JVM】JVM执行流程 JVM类加载 垃圾回收机制等

目录 &#x1f337;1、JVM是什么&#xff1f; &#x1f337;2、JVM的执行流程&#xff08;能够描述数据区5部分&#xff09; &#x1f337;3、JVM类加载过程 &#x1f337;4、双亲委派机制&#xff1a;描述类加载的过程 问题1&#xff1a;类加载器 问题2&#xff1a;什么…

Ubuntu Linux中hostname`命令

当然&#xff0c;让我们将关于在Ubuntu Linux中理解hostname的知识转化为列表形式&#xff1a; 参考&#xff1a; https://www.howtouseubuntu.com/network/change-hostname-in-ubuntu-linux/ 定义&#xff1a;hostname是Ubuntu&#xff08;以及其他Linux发行版&#xff09;中…

最优贸易(记忆化搜索)

题目链接&#xff1a;[NOIP2009 提高组] 最优贸易 - 洛谷 思路&#xff1a;这道题的标签是SPFA&#xff0c;但是我觉得这道题可以用记忆化搜索&#xff0c;用两组dfs&#xff0c;将从1到 i点道路上的最小值都存进min数组&#xff0c;将i 到n点的最大值存进max组&#xff0c;最后…

支付宝原生小程序组件与父级传递数据(微信小程序基本一样)

1. 声明组件 在对应的目录下,右击点击 新建小程序,之后会生成对应的文件 2. 子组件 Component({data: {colorList: [#165FF6, #3D16F6,

一元多项式的表示及相加

实现思路&#xff1a; 通过链表实现&#xff0c;会更为简单直观。用链表中的每个结点表示多项式中的每一项&#xff0c;多项式每一项都是由数据域&#xff08;包含系数和指数&#xff09;和指针域构成的&#xff0c;所以在定义表示结点的结构体时&#xff0c;可如下所示进行定义…

FFMPEG android mac 编译 支持DASH/OPENSSL问题汇总

一 下载源码 FFMPEG https://github.com/FFmpeg/FFmpeg/tree/release/4.3 二 编写脚本 支持https 就必须添加open SSL 的编译 具体可以查看我的另一个关于open SSL 的 然后我们配置的一些路径 涉及 ndk 的一定要查看你用的ndk 版本 是否存在这些路径这是第一步 然后如果支…

python爬虫入门

基础回顾 使用函数, 先导入, 直接点方法名使用 import math m math.log10(100) print(m)python 交互模式 input输入示例 age int(input("请输入年龄")) age 1 print(age)if else 的使用 和java一样, 只是不加括号, else if 阉割成了 elif 与或非 java : &am…

网络中的一些概念对比

HTTP与HTTPS 从安全性和效率性进行阐述&#xff1a; 对于HTTP HTTP默认端口是80 HTTP是明文传输&#xff0c;数据以纯文本、明文形式在网络上传输&#xff0c;容易受到黑客的攻击和数据窃取。 对于HTTPS HTTPS默认端口是443 HTTPS用的是SSL或者TLS协议对数据进行加密&am…

No3: 学习过程中故障成长积累

文章目录 故障积累1、编码错误导致 故障积累1、编码错误导致

5.2 Bootstrap 过渡效果(Transition)插件

文章目录 Bootstrap 过渡效果&#xff08;Transition&#xff09;插件使用案例 Bootstrap 过渡效果&#xff08;Transition&#xff09;插件 过渡效果&#xff08;Transition&#xff09;插件提供了简单的过渡效果。 注意&#xff1a;如果您想要单独引用该插件的功能&#xff0…

Typescript:类的装饰器

装饰器 装饰器为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c; 访问符&#xff0c;属性或参数上。 装饰器使用 expression这种形式&#xff0c;expression求值后必…

【ACM】—蓝桥杯大一暑期集训Day5

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前正在学习C/C、Java、算法等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff…

Qt6 Qt Quick UI原型学习QML第五篇

文章目录 效果QML语法父文件 MyQML.qmlQML语法子文件 TLineEditV1.qmlQML语法子文件 TTextEdit.qml 效果 QML语法父文件 MyQML.qml import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12Window {id: windowvisible: truewidth: 600height: 600title:…

Linux系统进程概念详解

这里写目录标题 冯诺依曼体系结构操作系统(Operator System)1.概念2.目的3.管理4.系统调用和库函数概念 进程1.概念2.描述进程-PCB3.查看进程4.通过系统调用获取进程标示符5.通过系统调用创建进程-fork 进程状态1.Linux内核源代码2.进程状态查看 进程优先级1.基本概念2.查看系统…

投个 3D 冰壶,上班玩一玩

本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟。 Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎&#xff0c;它使用 JavaScript 语言编写&#xff0c;并且基于 OimoPhysics 引擎进行了改进和优化。Oimo.js 核心库只有 150K &#xff0c;专门用…

交易流水指标统计——pandas

1、根据交易流水&#xff0c;计算每个交易交易对象的如下指标&#xff0c; 总收入笔数、总收入月数、最大月收入笔数、最大月收入笔数所在日期&#xff08;年月日格式&#xff09; import pandas as pd path r"C:\Users\xxx\Desktop\科技数据.xlsx"df pd.read_exc…

5G的发展过程

目录 1.什么是5G 2.5G与4G的区别 3.5G的应用领域 4.5G给人类带来的福利 5.5G未来的发展趋势 1.什么是5G 5G技术是第五代移动通信技术&#xff0c;它是对之前的2G、3G和4G技术的升级和革新。5G技术具有更高的数据传输速度、更低的延迟和更大的网络容量&#xff0c;为人们提供…