笔记——nodemcu通过内网穿透来访问

这几天通过查找资料,和自己构思想了一大堆,本来想通过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的访问控制

应该会花更久的时间

之后会用尝试上传到服务器写入数据库这种,这个算简单了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fre内穿透只能穿透http协议,且页面大小限制在1496B以内(MTU,包含header头部) 包含函数如下: begin(char*,char*,char*,uint16,String,String);//设定参数信息,第一个参数是wifi名称,第二个参数是wifi密码,第三个参数是服务器地址,第四个参数是服务器端口,都五个参数是自定义域名密码,第六个参数是域名(多个域名以英文逗号分割) on(String,void);//页面以及回调函数,第一个参数是页面路径,第二个参数是回调函数 header(String,String);//设定header头部信息 sendfile();//发送默认的SPIFFS文件 sendfile(String);//发送指定的SPIFFS文件 send(int,string,string);//发送string,第一个参数是响应代码一般是200,第二个参数是页面类型,第三个参数是需要发送的文本 send(int,string,uint8_t*,size_t);//发送uint8_t数组文件,第一个参数是响应代码一般是200,第二个参数是页面类型,第三个参数是需要发送的uint8_t数组文件,第四个参数是uint8_t数组文件的大小 send(int,string,char*,size_t);//发送char数组文件,第一个参数是响应代码一般是200,第二个参数是页面类型,第三个参数是需要发送的char数组文件,第四个参数是char数组文件的大小 Authenticate(String, String);//判断Auth鉴权信息,第一个参数是用户名,第二个参数是密码 requestAuthentication();//向页面返回鉴权需求,使页面弹出Auth鉴权登录信息 getheader(String);//返回header指定头部信息参数值 arg(String);//返回GET请求参数值

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值