6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)...
http://www.cnblogs.com/yangfengwu/p/8776712.html
先把源码和资料链接放到这里
链接: https://pan.baidu.com/s/1jpHZjW_7pQKNfN9G4B6ZjA密码:nhn3
先做手机的,然后做C#的
详细点的可以看我这篇文章,这篇文章会解决一些细节问题
http://www.cnblogs.com/yangfengwu/p/5212570.html
咱们不做很复杂的直接越简单越好,就做成这样
文章图片
文章图片
文章图片
文章图片
文章图片
先编译一下
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
【6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)...】不用管,后期的话咱会用一下
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
最后做成这样子
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
发现还是有点大..
文章图片
文章图片
把像素低的放到像素高的里面图片显示出来会缩小,把像素高的放到像素低的里面图片显示出来会放大
文章图片
文章图片
文章图片
文章图片
protected void 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的状态改变事件 } private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void 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); } } };
文章图片
现在做点击连接按钮就连接服务器
文章图片
有点迫不及待的想试一试腾讯云了,
下面做的是:点击连接按钮,连接TCP服务器,连接上以后启动数据接收任务,因为数据接收任务可以判断是不是和服务器断开了连接
然后按钮显示"断开",如果意外断开了连接也显示断开....
public class MainActivity extends Activity {ImageView imageViewLamp; //灯的图片 Switch switchLamp; //灯的控制开关 EditText editTextIPAdress,editTextPort; //ip地址和端口号的编辑框 Button buttonConnect; //连接按钮 Socket socket; //cocket boolean ConnectFlage = false; //连接标志,控制按钮显示连接和断开 ThreadConnectService threadConnectService = new ThreadConnectService(); //建立一个连接任务的变量 InputStream inputStream; //获取输入流,可以用来判断有没有断开连接 ThreadReadData threadReadData = https://www.it610.com/article/new ThreadReadData(); //接收数据的任务的变量 boolean threadReadDataFlage = false; //接收数据任务一直运行控制 byte[] ReadBuffer = new byte[1024]; //存储接收到的数据 int ReadBufferLengh = 0; //接收到的数据个数@Override protected void 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); } /*指示灯控制开关*/ private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { imageViewLamp.setImageResource(R.drawable.ledon); } else { imageViewLamp.setImageResource(R.drawable.ledoff); } } }; /*按钮点击连接事件*/ private OnClickListener buttonConnectClick = new OnClickListener() { @Override public void onClick(View v) { if (ConnectFlage) { try { threadConnectService.start(); //启动连接任务 } catch (Exception e) //预防任务还没关闭呢又点击开始 { threadConnectService.run(); } } else { ConnectFlage = true; buttonConnect.setText("连接"); try { socket.close(); //关闭socket inputStream.close(); //关闭数据流 } catch (Exception e) { // TODO: handle exception } } } }; /** * 连接服务器的任务 * @author yang * */ class ThreadConnectService extends Thread { public void run() { InetAddress ipAddress; try { ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString()); //获取IP地址 int port =Integer.valueOf(editTextPort.getText().toString()); //获取端口号 socket = new Socket(ipAddress, port); //创建连接地址和端口 inputStream = socket.getInputStream(); //获得通道的数据流变量 threadReadDataFlage = true; //一直接收数据 try { threadReadData.start(); } catch (Exception e) {//预防任务还没关闭呢又点击开始 threadReadData.run(); }runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = false; buttonConnect.setText("断开"); Toast.makeText(getApplicationContext(), "连接成功", 500).show(); } }); } catch (Exception e) { e.printStackTrace(); } } }/** * 接收数据的任务 * @author yang * */ class ThreadReadData extends Thread { public void run() { while (threadReadDataFlage) { try { ReadBufferLengh = inputStream.read(ReadBuffer); //服务器断开会返回-1 if (ReadBufferLengh == -1) { threadReadDataFlage = false; runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = true; buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); } } catch (Exception e) { // TODO Auto-generated catch block Log.e("error", ReadBufferLengh+""); e.printStackTrace(); } } } }/** 当活动(界面)不再可见时调用 */ @Override protected void onStop() { threadReadDataFlage = false; //结束接收数据任务 super.onStop(); }@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
文章图片
文章图片
忘了说一件事情....加权限
文章图片
文章图片
"
我把上面做的打包了
文章图片
好现在接着写发数据(控制灯的亮灭)
public class MainActivity extends Activity {ImageView imageViewLamp; //灯的图片 Switch switchLamp; //灯的控制开关 EditText editTextIPAdress,editTextPort; //ip地址和端口号的编辑框 Button buttonConnect; //连接按钮 Socket socket; //cocket boolean ConnectFlage = true; //连接标志,控制按钮显示连接和断开 ThreadConnectService threadConnectService = new ThreadConnectService(); //建立一个连接任务的变量 InputStream inputStream; //获取输入流,可以用来判断有没有断开连接 OutputStream outputStream; //获得输出流 ThreadReadData threadReadData = https://www.it610.com/article/new ThreadReadData(); //接收数据的任务 ThreadSendData threadSendData = new ThreadSendData(); //发送数据的任务 boolean threadReadDataFlage = false; //接收数据任务一直运行控制 boolean threadSendDataFlage = false; //接收数据任务一直运行控制 byte[] ReadBuffer = new byte[1024]; //存储接收到的数据 byte[] SendBuffer = new byte[1024]; //存储发送的数据 int ReadBufferLengh = 0; int SendDataCnt = 0; //控制发送数据的个数 @Override protected void 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); } /*指示灯控制开关*/ private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void 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; //控制发送数据的个数 } }; /*按钮点击连接事件*/ private OnClickListener buttonConnectClick = new OnClickListener() { @Override public void 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(); //关闭socket inputStream.close(); //关闭数据流 } catch (Exception e) { // TODO: handle exception } } } }; /** * 连接服务器的任务 * @author yang * */ class ThreadConnectService extends Thread { public void run() { InetAddress ipAddress; try { ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString()); //获取IP地址 int port =Integer.valueOf(editTextPort.getText().toString()); //获取端口号 socket = new Socket(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(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = false; buttonConnect.setText("断开"); Toast.makeText(getApplicationContext(), "连接成功", 500).show(); } }); } catch (Exception e) { e.printStackTrace(); } } }/** * 接收数据的任务 * @author yang * */ class ThreadReadData extends Thread { public void run() { while (threadReadDataFlage) { try { ReadBufferLengh = inputStream.read(ReadBuffer); //服务器断开会返回-1 if (ReadBufferLengh == -1) { threadSendDataFlage = false; //关掉发送任务,预防产生多的任务 threadReadDataFlage = false; //关掉接收任务,预防产生多的任务 SendDataCnt = 0; //清零发送的个数 ConnectFlage = true; runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); } } catch (Exception e) { // TODO Auto-generated catch block Log.e("error", ReadBufferLengh+""); e.printStackTrace(); runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); ConnectFlage = true; threadSendDataFlage = false; //关掉发送任务,预防产生多的任务 threadReadDataFlage = false; //关掉接收任务,预防产生多的任务 SendDataCnt = 0; //清零发送的个数 } } } }/** * 发送数据任务 * @author yang * */ class ThreadSendData extends Thread { public void run() { while (threadSendDataFlage) { if (SendDataCnt>0) //要发送的数据个数大于0 { try { outputStream.write(SendBuffer,0,SendDataCnt); //发送数据 SendDataCnt = 0; //清零发送的个数 } catch (Exception e) { runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); ConnectFlage = true; threadSendDataFlage = false; //关掉发送任务,预防产生多的任务 threadReadDataFlage = false; //关掉接收任务,预防产生多的任务 SendDataCnt = 0; } } } } }/** 当活动(界面)不再可见时调用 */ @Override protected void onStop() { threadReadDataFlage = false; //结束接收数据任务 threadSendDataFlage = false; //结束发送数据任务 SendDataCnt = 0; super.onStop(); }@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
发送数据是写在了一个任务里面
文章图片
文章图片
文章图片
文章图片
文章图片
整体的源码
本来想这一节也写好C#的,不过感觉写的够多的了,所以C#的放到下一节
下一篇
http://www.cnblogs.com/yangfengwu/p/8785516.html
推荐阅读
- 单片机|单片机初学者做项目为什么这么难(单片机初学者心得有哪些)
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- 单片机|Arduino、arm、树莓派、单片机四者有什么不同()
- LUA|单片机脚本语言移植lua到stm32MDK
- Android|Android 应用与HC-06蓝牙单片机控制LED灯(下)
- 安卓基于蓝牙控制单片机与数据传输——目录
- 单片机生成二维码|单片机生成二维码 C语言代码
- 灵动微MM32F0130国产32位单片机电子货架标签应用案例参考