这几天通过查找资料,和自己构思想了一大堆,本来想通过C#写个tcp连接到板子,之后在通过QQ来发送信息和接收信息,来获取传感器数据,之后发现我技术不行。写好的tcp连接就不能拿来用了(不过可以拿来调试,调试……)
于是躺在床上想了很久,还是得用内网穿透,所以选择了nat123这款软件
因为这一学期学了PHP,所以本来就安装了wampserver(用来做web服务器,用windows自带的iis也行),于是乎,上网抄php做tcp客户端的代码,还行,比较简练,之后就打开服务器,打开nat123,将需要的信息输入进去就ok了
手机打开浏览器输入域名访问就行了
思路图:
虽说网上代码很多,但我也是找了很久,这就是不好好学习php的后果
留下来之后可以方便抄
//主体部分
set_time_limit(0);
$host = ""; //ip地址
$port = 80; //端口号
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socket\n");//创建服务器客户端
$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");
socket_write($socket, $text) or die("Write failed\n");
//由于我要传的数据不大不多,这里将while循环删了,就很快了,数据量大的还是需要写的
//甚至连读取都不用,就现在只是led的开关
$buff = @socket_read($socket, 1024, PHP_NORMAL_READ);
socket_close($socket);
之后网页部分还没写好,当然bug一大堆…………现在也丑得一匹………………
长这样…………(没学英语,英语不会)
下面是用c#搞的tcp连接,可以拿来测试(我知道网上一大堆,但好不容易搞出来的,贴别人的代码,自己在不断找错误,由于固件写的代码特别…………所以改成我适用的,不行的话将注释掉的代码,取消注释,就是网上找的大佬的代码),直接copy就能用,这是客户端,因为我是固件是服务端,所以这边贴的代码都是客户端,
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private string ip; //ip地址
IPAddress IP;
private string pont; //字符串版端口号
int pont_int;
private static string text; //交换字符串
IAsyncResult ir;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ip = textBox1.Text;
pont = textBox2.Text;
pont_int = int.Parse(pont);
IP = IPAddress.Parse(ip);
IPEndPoint ipEndPoint = new IPEndPoint(IP, pont_int);
TcpClient client = new TcpClient();
textBox4.Text += "尝试连接服务器\n";
try
{
text = "open\n";
ir = client.BeginConnect(IP, pont_int, new AsyncCallback(ConnectedCallBack), client);
client.EndConnect(ir);
textBox4.Text += "连接服务器成功\r\n";
}
catch(Exception)
{
textBox4.Text += "连接错误\r\n";
}
}
private static void ConnectedCallBack(IAsyncResult ar) //按钮调用
{
try {
TcpClient client = (TcpClient)ar.AsyncState;
//Console.WriteLine("连接服务器成功");
//Console.WriteLine("给服务器发送信息:服务器,我想要一个苹果。");
SendMsg(client, text);
RecMsg(client);
}
catch(Exception)
{
text = "连接错误\r\n";
}
}
public static void SendMsg(TcpClient client, string data) //发送信息用(服务器,数据)
{
//byte[] msgLength = new byte[2];
byte[] buff = Encoding.ASCII.GetBytes(data);
int length = buff.Length;
//msgLength = BitConverter.GetBytes(length);
NetworkStream ns = client.GetStream();
//ns.BeginWrite(msgLength, 0, 2, new AsyncCallback(AysncSendMsg), ns);
ns.BeginWrite(buff, 0, length, new AsyncCallback(AysncSendMsg), ns);
}
private static void AysncSendMsg(IAsyncResult ar) //暂时不知道是什么,是发送信息用到
{
NetworkStream ns = (NetworkStream)ar.AsyncState;
ns.EndWrite(ar);
}
public static void RecMsg(TcpClient client) //收信息用(服务器)收取到的信息用text保存
{
//byte[] msgLength = new byte[2];
byte[] buff;
text = "..\r\n";
NetworkStream ns = client.GetStream();
/*IAsyncResult ir1 = ns.BeginRead(msgLength, 0, msgLength.Length, new AsyncCallback(AysncRecMsg), ns);
while (ir1.IsCompleted == false)
{
Thread.Sleep(10);
}
int length = BitConverter.ToInt16(msgLength, 0);*/
int length = 25600;
buff = new byte[length];
IAsyncResult ir3 = ns.BeginRead(buff, 0, length, new AsyncCallback(AysncRecMsg), ns);
while (ir3.IsCompleted == false)
{
Thread.Sleep(10);
}
string message = Encoding.ASCII.GetString(buff).Trim();
text = "收到来自服务器" + client.Client.RemoteEndPoint + "的消息:" + message;
}
private static void AysncRecMsg(IAsyncResult ar) //暂时不知道是什么 是接收信息用的
{
((NetworkStream)ar.AsyncState).EndRead(ar);
}
private void button2_Click(object sender, EventArgs e) //发送按钮
{
TcpClient client = new TcpClient();
text = textBox3.Text + "\n";
ConnectedCallBack(ir);
textBox4.Text += text + "\r\n";
}
private void button3_Click(object sender, EventArgs e) //清屏
{
textBox4.Text = "";
}
}
}
上一篇写的lua代码我改了一点点,直接led_up和led_down来控制灯的亮度,不用去输入数字,不难改,这边就不贴了。
到这里,我想完成的大致,已经完成了,接下来应该是两块nodemcu的访问控制
应该会花更久的时间
之后会用尝试上传到服务器写入数据库这种,这个算简单了