android,手机控制各种设备的实现,~~物联网福利第一弹

走过路过不要错过,相信通过手机来控制各种设备大家已不再陌生,比如通过手机来控制家里的灯光、窗帘、空调、地暖等,更高级的比如亚马逊出的Echo,可以直接通过说话,发送命令比如:小黑开灯,小黑播放音乐等,简单说几句话来到达自己想要的效果, 那么他们都是如何实现的呢,作为一名专业的android开发者,我是不会把这些秘密告诉你们的,哈哈,除非大家觉得我很帅!!

ps:没办法,群众的眼光是雪亮啊,不告诉你们我都不好意思,呐!言归正传喽!!

一个设备控制另一个设备,首先要解决它们之间的通讯问题,市面上设备众多,这些设备也是很有脾气的,不是你手机随便给我发点什么,我都照做的,一定要按照一定的通讯协议,和特定的一些字符串发给我,我才会听话照做。首先来说通讯协议。

常用的协议一般就几种,1、网络通信(UDP,Tcp),2、Moudlebus通讯(485,232),3、ZigBee通讯,4、RF无线通讯,5、蓝牙通讯等。

本章我们着重讨论下大家比较熟悉的网络通讯,Moudlebus通讯会在下一篇为大家介绍,这两个通讯方式比较常用。

 首先我们来看看UDP和TCP的特性,TCP和UDP是TCP/IP协议中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,起到通道的作用。  ps:http为应用层协议,大家不要弄混哦!

TCP协议需要三次握手通信成功后进行建立连接,安全可靠,可控制,接收和发送成功,会有明确的判定。而UDP协议是直接发送,不会判断是否接收和发送成功。

好了,铺垫这么多终于可以上代码了,首先我们来个TCP通讯的代码:

跟指定ip及端口号建立连接

建立tcp通讯长连接

 

Socket socket=null;
socket = new Socket(mainIP, mainPort);
	socket.setSoTimeout(socketTimeoutMS);
	os = socket.getOutputStream();
//通过os.write发送命令
os.write(“指定命令字符”);
 

建立while循环,接收数据

 

 

//
while (判断条件){ 
    
      
      InputStream  is = socket.getInputStream();
       
      // ͨ��socket���õ������������ֽ�����
      byte[] buffer = new byte[256];
      int len = 0;
      len = is.read(buffer);

 

 

buffer为接收到的数据。

 

大概逻辑是这样,但为了保证程序的稳定性,我们需要增加很多判断,比如最基本的空判断等。

 

 

UDP通讯代码直接上一个项目中封装的代码块:

 

//
static DatagramSocket datagramsocket;
public class Udpclient extends AsyncTask<Void, Void, Void> {
      boolean running = true;
      private static final int DATA_LEN = 100;
      


      @Override
      protected Void doInBackground(Void... params) {
         
         run();
         // TODO Auto-generated method stub
         return null;
      }


      public boolean isconnet() {
         return running;
      }


     


      public void close() {
         running = false;
      }
        public void send(byte[] data){
           InetAddress inetAdd;
         try {
            inetAdd = InetAddress.getByName(IP);
//          
            if (data != null) {
               System.out.println("客户端向服务器端发送数据--:"
                     + new String(data, US_ASCII));
               DatagramPacket sendPacket = new DatagramPacket(
                     data, data.length, inetAdd,
                     端口号);
                if (datagramsocket == null) {
                datagramsocket = new DatagramSocket();
                datagramsocket.setSoTimeout(6000);
                }
               datagramsocket.send(sendPacket);               
               data = null;
            }
         }catch(SocketException e){
            data = null;
         } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            data = null;
         } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            data = null;
         }
         
        }
        
        
       
      public void run() {
         // TODO Auto-generated method stub
//       DatagramSocket ds = null;
         // InetSocketAddress sa = new InetSocketAddress(host, port);
        
         try {
            datagramsocket = new DatagramSocket(端口号);
         } catch (SocketException e) {
            e.printStackTrace();
         }
        
         while (running) {
            Log.e("aaa", "aaaaa");
            try {
              
               // 定义接收网络数据的字节数组
               
               byte[] inBuff = new byte[DATA_LEN];
               // 以指定字节数组创建准备接受数据的DatagramPacket对象
               
                  
                     DatagramPacket inPacket = new DatagramPacket(inBuff,
                           inBuff.length);
                     
                     datagramsocket.receive(inPacket);
                     
                     String result = new String(inPacket.getData(), 0,
                           inPacket.getLength());
                    
                     Log.e("打印返回的值", result);
                     
               
               
            } catch (ClosedSelectorException e) {
               running = false;
            } catch (Exception e) {
               e.printStackTrace();
               continue;
            }
            
            try {
               Thread.sleep(100);
            } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
            
         }
      }
   }
 

代码大致就是这样,具体数据的发送以及具体数据的接收,需要根据设备厂家给的协议来定,先看协议,根据协议来搞代码,来同志们,我们放松下,跟我唱,我是一只粉刷匠,粉刷本领强,我要把我的新房子,刷的变了样。嘿!!

 

  thank you!!

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值