8-51单片机ESP8266学习-AT指令(8266TCP服务器
http://www.cnblogs.com/yangfengwu/p/8776712.html
先把源码和资料链接放到这里
链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A密码:j1sz
先做手机的,然后做C#的
详细点的可以看我这篇文章,请参考着这篇看这篇文章,这篇文章会解决一些细节问题
http://www.cnblogs.com/yangfengwu/p/5212570.html
咱们不做很复杂的直接越简单越好,就做成这样
![](https://img.haomeiwen.com/i8454753/0f26a927848887cb.png)
![](https://img.haomeiwen.com/i8454753/0429a4b18c794dfb.png)
![](https://img.haomeiwen.com/i8454753/5e5588ed5ad49d55.png)
![](https://img.haomeiwen.com/i8454753/b419e8a93b1120ef.png)
![](https://img.haomeiwen.com/i8454753/dea2da7765d493fe.png)
先编译一下
![](https://img.haomeiwen.com/i8454753/8389c79770f1d727.png)
![](https://img.haomeiwen.com/i8454753/440e16c3b3296117.png)
![](https://img.haomeiwen.com/i8454753/ab054c4451dfb7a6.png)
![](https://img.haomeiwen.com/i8454753/c04c9fad2574b489.png)
![](https://img.haomeiwen.com/i8454753/ee085f45710632e9.png)
![](https://img.haomeiwen.com/i8454753/0eb619c7a11af25f.png)
不用管,后期的话咱会用一下
![](https://img.haomeiwen.com/i8454753/a1d22f727242f8ed.png)
![](https://img.haomeiwen.com/i8454753/919cd121e6858f19.png)
![](https://img.haomeiwen.com/i8454753/cf8d123b4e6289f2.png)
![](https://img.haomeiwen.com/i8454753/bb32b9dfff4b07c2.png)
![](https://img.haomeiwen.com/i8454753/56749654a96f4c98.png)
![](https://img.haomeiwen.com/i8454753/5bf9cc6dc16ee673.png)
![](https://img.haomeiwen.com/i8454753/46aa1705fe9cd0e1.png)
![](https://img.haomeiwen.com/i8454753/b91d2b3ca2c4d9b4.png)
![](https://img.haomeiwen.com/i8454753/beb55f5b729f161c.png)
![](https://img.haomeiwen.com/i8454753/43e63ab37aa44f2d.png)
最后做成这样子
![](https://img.haomeiwen.com/i8454753/4bc3f1b993e12e35.png)
![](https://img.haomeiwen.com/i8454753/123bbda31b768f79.png)
![](https://img.haomeiwen.com/i8454753/0af743b440dcea04.png)
![](https://img.haomeiwen.com/i8454753/9857d88112cfe1df.png)
![](https://img.haomeiwen.com/i8454753/dbc895fd44d60e84.png)
![](https://img.haomeiwen.com/i8454753/c906c472b17cce59.png)
![](https://img.haomeiwen.com/i8454753/bf57dd27c0a0d29c.png)
![](https://img.haomeiwen.com/i8454753/580408e4e9657ef4.png)
发现还是有点大..
![](https://img.haomeiwen.com/i8454753/3cbc6627bc54afad.png)
![](https://img.haomeiwen.com/i8454753/b7c0ec3a31e7944a.png)
把像素低的放到像素高的里面图片显示出来会缩小,把像素高的放到像素低的里面图片显示出来会放大
![](https://img.haomeiwen.com/i8454753/b76443ba728d2139.png)
![](https://img.haomeiwen.com/i8454753/3b4595eac5a094f1.png)
![](https://img.haomeiwen.com/i8454753/70ae90b25300938d.png)
![](https://img.haomeiwen.com/i8454753/f6cefb467fb329ae.png)
![](https://img.haomeiwen.com/i8454753/bf4e81cb67f2b34e.gif)
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageViewLamp = (ImageView) findViewById(R.id.imageView1);
switchLamp = (Switch) findViewById(R.id.switch1);
switchLamp.setOnCheckedChangeListener(switchLamplistener);//设置SWITCH的状态改变事件
}
privateOnCheckedChangeListener switchLamplistener =new OnCheckedChangeListener() {
@Override
publicvoid onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub// Toast.makeText(getApplicationContext(), isChecked+"", 500).show();if (isChecked) {//切换图片
imageViewLamp.setImageResource(R.drawable.ledon);
}
else {
imageViewLamp.setImageResource(R.drawable.ledoff);
}
}
};
![](https://img.haomeiwen.com/i8454753/3e274a354900e55d.gif)
![](https://img.haomeiwen.com/i8454753/b702ddcd1f6a0f7c.png)
现在做点击连接按钮就连接服务器
![](https://img.haomeiwen.com/i8454753/277286dd4314b541.png)
刚看到...............
![](https://img.haomeiwen.com/i8454753/47a7c751fccaed72.png)
有点迫不及待的想试一试腾讯云了,
下面做的是:点击连接按钮,连接TCP服务器,连接上以后启动数据接收任务,因为数据接收任务可以判断是不是和服务器断开了连接
然后按钮显示"断开",如果意外断开了连接也显示断开....
![](https://img.haomeiwen.com/i8454753/e570d27e5fd571be.gif)
publicclass MainActivity extends Activity {
ImageView imageViewLamp;//灯的图片Switch switchLamp;//灯的控制开关EditText editTextIPAdress,editTextPort;//ip地址和端口号的编辑框Button buttonConnect;//连接按钮Socket socket;//cocketboolean ConnectFlage =false;//连接标志,控制按钮显示连接和断开ThreadConnectService threadConnectService =newThreadConnectService();//建立一个连接任务的变量InputStream inputStream;//获取输入流,可以用来判断有没有断开连接ThreadReadData threadReadData =newThreadReadData();//接收数据的任务的变量boolean threadReadDataFlage =false;//接收数据任务一直运行控制byte[] ReadBuffer =newbyte[1024];//存储接收到的数据intReadBufferLengh =0;//接收到的数据个数
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextIPAdress = (EditText) findViewById(R.id.editText1);
editTextPort = (EditText) findViewById(R.id.editText2);
buttonConnect = (Button) findViewById(R.id.button1);
buttonConnect.setOnClickListener(buttonConnectClick);
imageViewLamp = (ImageView) findViewById(R.id.imageView1);
switchLamp = (Switch) findViewById(R.id.switch1);
switchLamp.setOnCheckedChangeListener(switchLamplistener);
}
/*指示灯控制开关*/privateOnCheckedChangeListener switchLamplistener =new OnCheckedChangeListener() {
@Override
publicvoid onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
imageViewLamp.setImageResource(R.drawable.ledon);
}
else {
imageViewLamp.setImageResource(R.drawable.ledoff);
}
}
};
/*按钮点击连接事件*/privateOnClickListener buttonConnectClick =new OnClickListener() {
@Override
publicvoid onClick(View v) {
if (ConnectFlage)
{
try {
threadConnectService.start();//启动连接任务 }
catch(Exception e)//预防任务还没关闭呢又点击开始 {
threadConnectService.run();
}
}
else
{
ConnectFlage =true;
buttonConnect.setText("连接");
try
{
socket.close();//关闭socketinputStream.close();//关闭数据流}catch (Exception e) {
// TODO: handle exception }
}
}
};
/**
* 连接服务器的任务
* @author yang
*
*/class ThreadConnectService extends Thread
{
publicvoid run()
{
InetAddress ipAddress;
try
{
ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//获取IP地址intport =Integer.valueOf(editTextPort.getText().toString());//获取端口号 socket =newSocket(ipAddress, port);//创建连接地址和端口inputStream = socket.getInputStream();//获得通道的数据流变量threadReadDataFlage =true;//一直接收数据try
{
threadReadData.start();
}
catch(Exception e) {//预防任务还没关闭呢又点击开始 threadReadData.run();
}
runOnUiThread(newRunnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用publicvoid run() {
ConnectFlage =false;
buttonConnect.setText("断开");
Toast.makeText(getApplicationContext(), "连接成功",500).show();
}
});
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* 接收数据的任务
* @author yang
*
*/class ThreadReadData extends Thread
{
publicvoid run()
{
while (threadReadDataFlage)
{
try
{
ReadBufferLengh = inputStream.read(ReadBuffer);//服务器断开会返回-1if(ReadBufferLengh == -1) {
threadReadDataFlage =false;
runOnUiThread(newRunnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用publicvoid run() {
ConnectFlage =true;
buttonConnect.setText("连接");
Toast.makeText(getApplicationContext(), "与服务器断开连接",500).show();
}
});
}
}
catch (Exception e)
{
// TODO Auto-generated catch blockLog.e("error", ReadBufferLengh+"");
e.printStackTrace();
}
}
}
}
/** 当活动(界面)不再可见时调用 */ @Override
protectedvoid onStop()
{
threadReadDataFlage =false;//结束接收数据任务 super.onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
intid = item.getItemId();
if(id == R.id.action_settings) {
returntrue;
}
return super.onOptionsItemSelected(item);
}
}
![](https://img.haomeiwen.com/i8454753/effb8096b4d5e7aa.gif)
![](https://img.haomeiwen.com/i8454753/669a7ffb2d4ec5a4.png)
![](https://img.haomeiwen.com/i8454753/2bbe66350be72648.png)
忘了说一件事情....加权限
![](https://img.haomeiwen.com/i8454753/526566a48b9f2ea4.png)
![](https://img.haomeiwen.com/i8454753/64e48e34b22dfdb9.png)
![](https://img.haomeiwen.com/i8454753/4b05d10c7fcf13c6.gif)
"
android:minSdkVersion="17" android:targetSdkVersion="21"/>
android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
![](https://img.haomeiwen.com/i8454753/e759d230032547c7.gif)
我把上面做的打包了
![](https://img.haomeiwen.com/i8454753/099208d29636bf26.png)
好现在接着写发数据(控制灯的亮灭)
![](https://img.haomeiwen.com/i8454753/a63f5b8ab3863c62.gif)
publicclass MainActivity extends Activity {
ImageView imageViewLamp;//灯的图片Switch switchLamp;//灯的控制开关EditText editTextIPAdress,editTextPort;//ip地址和端口号的编辑框Button buttonConnect;//连接按钮Socket socket;//cocketboolean ConnectFlage =true;//连接标志,控制按钮显示连接和断开ThreadConnectService threadConnectService =newThreadConnectService();//建立一个连接任务的变量InputStream inputStream;//获取输入流,可以用来判断有没有断开连接OutputStream outputStream;//获得输出流ThreadReadData threadReadData =newThreadReadData();//接收数据的任务ThreadSendData threadSendData =newThreadSendData();//发送数据的任务boolean threadReadDataFlage =false;//接收数据任务一直运行控制boolean threadSendDataFlage =false;//接收数据任务一直运行控制byte[] ReadBuffer =newbyte[1024];//存储接收到的数据byte[] SendBuffer =newbyte[1024];//存储发送的数据intReadBufferLengh =0;
intSendDataCnt =0;//控制发送数据的个数 @Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextIPAdress = (EditText) findViewById(R.id.editText1);
editTextPort = (EditText) findViewById(R.id.editText2);
buttonConnect = (Button) findViewById(R.id.button1);
buttonConnect.setOnClickListener(buttonConnectClick);
imageViewLamp = (ImageView) findViewById(R.id.imageView1);
switchLamp = (Switch) findViewById(R.id.switch1);
switchLamp.setOnCheckedChangeListener(switchLamplistener);
}
/*指示灯控制开关*/privateOnCheckedChangeListener switchLamplistener =new OnCheckedChangeListener() {
@Override
publicvoid onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
imageViewLamp.setImageResource(R.drawable.ledon);
SendBuffer[0] = (byte)0xaa;
SendBuffer[1] =0x55;
SendBuffer[2] =0x02;
SendBuffer[3] = (byte)0xff;
}
else {
imageViewLamp.setImageResource(R.drawable.ledoff);
SendBuffer[0] = (byte)0xaa;
SendBuffer[1] =0x55;
SendBuffer[2] =0x02;
SendBuffer[3] =0x00;
}
SendDataCnt =4;//控制发送数据的个数 }
};
/*按钮点击连接事件*/privateOnClickListener buttonConnectClick =new OnClickListener() {
@Override
publicvoid onClick(View v) {
if (ConnectFlage)
{
try
{
threadConnectService.start();//启动连接任务 }
catch(Exception e)//预防任务还没关闭呢又点击开始 {
threadConnectService.run();
}
}
else
{
ConnectFlage =true;
threadSendDataFlage =false;//关掉发送任务,预防产生多的任务threadReadDataFlage =false;//关掉接收任务,预防产生多的任务buttonConnect.setText("连接");
try
{
socket.close();//关闭socketinputStream.close();//关闭数据流}catch (Exception e) {
// TODO: handle exception }
}
}
};
/**
* 连接服务器的任务
* @author yang
*
*/class ThreadConnectService extends Thread
{
publicvoid run()
{
InetAddress ipAddress;
try
{
ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//获取IP地址intport =Integer.valueOf(editTextPort.getText().toString());//获取端口号 socket =newSocket(ipAddress, port);//创建连接地址和端口inputStream = socket.getInputStream();//获得通道的数据流outputStream = socket.getOutputStream();//获得通道的输出流threadReadDataFlage =true;//一直接收数据threadSendDataFlage =true;//一直循环的判断是否发送数据try
{
threadReadData.start();
}
catch(Exception e) {//预防任务还没关闭呢又点击开始 threadReadData.run();
}
try {
threadSendData.start();
} catch (Exception e) {
threadSendData.run();
}
runOnUiThread(newRunnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用publicvoid run() {
ConnectFlage =false;
buttonConnect.setText("断开");
Toast.makeText(getApplicationContext(), "连接成功",500).show();
}
});
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* 接收数据的任务
* @author yang
*
*/class ThreadReadData extends Thread
{
publicvoid run()
{
while (threadReadDataFlage)
{
try
{
ReadBufferLengh = inputStream.read(ReadBuffer);//服务器断开会返回-1if(ReadBufferLengh == -1) {
threadSendDataFlage =false;//关掉发送任务,预防产生多的任务threadReadDataFlage =false;//关掉接收任务,预防产生多的任务SendDataCnt =0;//清零发送的个数ConnectFlage =true;
runOnUiThread(newRunnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用publicvoid run() {
buttonConnect.setText("连接");
Toast.makeText(getApplicationContext(), "与服务器断开连接",500).show();
}
});
}
}
catch (Exception e)
{
// TODO Auto-generated catch blockLog.e("error", ReadBufferLengh+"");
e.printStackTrace();
runOnUiThread(newRunnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用publicvoid run() {
buttonConnect.setText("连接");
Toast.makeText(getApplicationContext(), "与服务器断开连接",500).show();
}
});
ConnectFlage =true;
threadSendDataFlage =false;//关掉发送任务,预防产生多的任务threadReadDataFlage =false;//关掉接收任务,预防产生多的任务SendDataCnt =0;//清零发送的个数 }
}
}
}
/**
* 发送数据任务
* @author yang
*
*/class ThreadSendData extends Thread
{
publicvoid run()
{
while (threadSendDataFlage)
{
if(SendDataCnt>0)//要发送的数据个数大于0 {
try
{
outputStream.write(SendBuffer,0,SendDataCnt);//发送数据SendDataCnt =0;//清零发送的个数 }
catch (Exception e)
{
runOnUiThread(newRunnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用publicvoid run() {
buttonConnect.setText("连接");
Toast.makeText(getApplicationContext(), "与服务器断开连接",500).show();
}
});
ConnectFlage =true;
threadSendDataFlage =false;//关掉发送任务,预防产生多的任务threadReadDataFlage =false;//关掉接收任务,预防产生多的任务SendDataCnt =0;
}
}
}
}
}
/** 当活动(界面)不再可见时调用 */ @Override
protectedvoid onStop()
{
threadReadDataFlage =false;//结束接收数据任务threadSendDataFlage =false;//结束发送数据任务SendDataCnt =0;
super.onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
intid = item.getItemId();
if(id == R.id.action_settings) {
returntrue;
}
return super.onOptionsItemSelected(item);
}
}
![](https://img.haomeiwen.com/i8454753/84501d2577d10c9f.gif)
发送数据是写在了一个任务里面
![](https://img.haomeiwen.com/i8454753/b3014d6cf6c4fd77.png)
![](https://img.haomeiwen.com/i8454753/c5727caf4ea09e92.png)
![](https://img.haomeiwen.com/i8454753/44aef4990100f436.png)
![](https://img.haomeiwen.com/i8454753/42393aada874a403.png)
![](https://img.haomeiwen.com/i8454753/e73707e169597cf7.png)
整体的源码
本来想这一节也写好C#的,不过感觉写的够多的了,所以C#的放到下一节
下一篇