nodemcu接收服务器数据,收到“1”,则点亮小灯,其他信息,则关闭小灯
0脚接小灯
16脚接3v3脚,这里模拟开关,当开关接通,则向服务器传送“开机”信息,如果断开,则发送“关机信息”
#include <ESP8266WiFi.h>
#ifndef STASSID
#define STASSID "" //wifi的账号
#define STAPSK "" //wifi的密码
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
const char* host = "192.168.8.10"; //tcp连接的服务器地址
const uint16_t port = 16550; //服务器端口号
WiFiClient client;
String str=""; //tcp接收的字符串
int status=0; //读取当前开机关机信号
void setup() {
pinMode(0, OUTPUT);
pinMode(16, OUTPUT);
Serial.begin(115200);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
while (!client.connected())//若未连接到服务端,则客户端进行连接。
{
if (!client.connect(host, port))//实际上这一步就在连接服务端,如果连接上,该函数返回true
{
Serial.println("connection....");
delay(500);
}
}
str="";
while (client.available())//available()表示是否可以获取到数据
{
str+=char(client.read());
if(str.indexOf('\n')>0)
{
Serial.print(str);
if(str=="1\n")
{
digitalWrite(0, HIGH); //点亮小灯
}
else
{
digitalWrite(0, LOW); //关闭小灯
}
}
}
if(digitalRead(16)==HIGH){
if(status==0){
client.println("开机"); //如果16脚与3v3通路,则向服务器发送开机
status=1;
delay(1000);
}
}
else{
if(status==1){
client.println("关机");
status=0;
delay(1000);
}
}
}
服务端代码
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.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;
namespace TcpServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//在多线程编程中,如果子线程需要使用主线程中创建的对象
CheckForIllegalCrossThreadCalls = false;
}
Dictionary<string, Socket> clientList = new Dictionary<string, Socket>();
private void Setserver()
{
//1.创建服务器端电话
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
//2.创建手机卡
IPAddress iP = IPAddress.Parse(textBox1.Text);
IPEndPoint endPoint = new IPEndPoint(iP, int.Parse(textBox2.Text));
//3.将电话卡插入到电话中
server.Bind(endPoint);
//4.开始监听电话
//同一时刻允许同时加入链接的最大数量
server.Listen(20);
textBox3.Text = "服务器已经成功开启!\r\n" + textBox3.Text;
//5.等待来电接电话
while (true)
{
//接受接入的一个客户端
connectClient = server.Accept();
if (connectClient != null)
{
string info = connectClient.RemoteEndPoint.ToString();
clientList.Add(info, connectClient);
textBox3.Text = info + "加入服务器!\r\n" + textBox3.Text;
string msg = DateTime.Now + "你已经成功进入聊天室!";
//SendMsg(msg);
//每有一个客户端接入,需要有一个线程进行服务
Thread threadclient = new Thread(ReciveMsg);
threadclient.IsBackground = true;
//设置这个线程中的通信对象时对应的socket与客户端socket进行通信
threadclient.Start(connectClient);
}
}
}
void ReciveMsg(object o)
{
Socket client = o as Socket;
while (true)
{
try
{
byte[] arrMsg = new byte[1024 * 1024];
int length = client.Receive(arrMsg);
if (length > 0)
{
string recMsg = Encoding.UTF8.GetString(arrMsg, 0, length);
IPEndPoint endPoint = client.RemoteEndPoint as IPEndPoint;
textBox3.Text += DateTime.Now + "[" + endPoint.Port.ToString() + "]" + recMsg;
//SendMsg("[" + endPoint.Port.ToString() + "]" + recMsg);
}
}
catch (Exception)
{
try
{
client.Close();
clientList.Remove(client.RemoteEndPoint.ToString());
}
catch
{ }
}
}
}
Socket connectClient;
void SendMsg(string str)
{
foreach (var item in clientList)
{
byte[] arrMsg = Encoding.UTF8.GetBytes(str + "\n");
try
{
int x = item.Value.Send(arrMsg);
label3.Text = x.ToString();
}
catch (Exception ex)
{
label3.Text += ex.Message.ToString();
}
}
//byte[] arrMsg = Encoding.UTF8.GetBytes(str);
//clientList["192.168.6.101:53321"].Send(arrMsg);
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(Setserver);
thread.IsBackground = true;
thread.Start();
}
private void button2_Click(object sender, EventArgs e)
{
label3.Text = "";
if (textBox4.Text != null)
{
//SendMsg(DateTime.Now + textBox4.Text);
SendMsg(textBox4.Text);
textBox4.Text = "";
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}