基于TCP/IP协议的物联网安卓应用开发基础教程(Android Studio开发)

这个教程版本不够详细,请参考最新版安卓TCP助手Android studio教程分享:Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换) 

------------------------------------

--请参考上面链接的最新版教程--

------------------------------------

第0章 简介

    大家好,在上上上期发布的教程中,教大家如何利用Android Studio开发出一款接入华为云物联网平台并调用相关API完成设备属性查询、设备命令下发等功能,那个是采用的MQTT协议借助华为云物联网平台完成数据收发,本次教程带大家完成一款基于TCP/IP协议的物联网安卓应用开发,实现TCP连接与数据收发,下一期将在此APP上进行修改,并配置ESP8266接入APP完成内网控制物联网设备、查看设备属性信息等功能,首先还是给大家先看一下APP的最终效果:

b31bc8b864ea6683b1239bb8901816e1.png

第1章 提前准备

一、Android Studio IDE(※确保模拟器网络功能正常或使用真机※)

二、 网络调试助手

(下载地址https://www.pcsoft.com.cn/soft/194484.html)

第2章 详细步骤

一、 新建工程

434f1c591d07fdbf1833544cdef3b31f.png

3f91a9891183a3104d086f1c08242ac9.png

二、 TCP服务

1、 新建TCP服务

9357ad7bdab21c57ba8be682ec9d7e0b.png

c655455421bb35bb9342c6f715993241.png

2、 TCP服务功能代码补充

(1) 导入可能需要的类:

import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.Looper;import java.io.IOException;import java.io.InputStream;import java.io.PrintStream;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;

 

(2) 修改服务代码(可左右滑动)

public class TCPService extends Service { public static Socket socket;    public static PrintStream output;    boolean conn = false;    String ip="192.168.1.15";    String port="8087";    public TCPService() {    }    @Override    public IBinder onBind(Intent intent) {        // TODO: Return the communication channel to the service.        throw new UnsupportedOperationException("Not yet implemented");    }    @Override    public int onStartCommand(Intent intent, int flags, int startId){        MyThread myThread = new MyThread();        new Thread(myThread).start();        //********在最终应用时取消注释下行,用于动态改变的IP和端口的连接********        //ip=intent.getStringExtra("ipaddress");        //port=intent.getStringExtra("port");        //System.out.println("新的TCP连接,新的IP:"+intent.getStringExtra("ipaddress")+"新的端口号:"+intent.getStringExtra("port"));        //********可在其他activity中设置IP和端口号通过上面的方式进行获取******** return super.onStartCommand(intent, flags, startId);         return super.onStartCommand(intent, flags, startId);    }    //socket连接线程    class MyThread implements Runnable{        @Override        public void run(){            try {                socket = new Socket();                SocketAddress socAddress = new InetSocketAddress(ip ,Integer.valueOf(port));                try{                    socket.connect(socAddress, 5000);                }                catch (Exception e)                {                    e.printStackTrace();                    System.out.println("连接失败");                }                if(socket.isConnected())System.out.println("连接成功");                InputStream inputstream = socket.getInputStream();                /* 获取输出流 */                output = new PrintStream(socket.getOutputStream(), true, "utf-8");                conn = true;                byte buffer[] = new byte[100];//接收数组的长度                int len2 ;                String receiveData;                //非阻塞式连接                while(conn){                    //接收网络数据                    if( (len2 = inputstream.read(buffer)) != -1){                        receiveData = new String(buffer, 0, len2);                        Intent CMDintent = new Intent();                        CMDintent.setAction("com.example.communication.data");                        CMDintent.putExtra("data", buffer);//buffer为数组,receivedata为文本                        sendBroadcast(CMDintent);                    }else{                        break;                    }                }                output.close();                socket.close();                Looper.loop();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();                // Looper.prepare();            }        }    };    //发送方法((可以把参数改成Byte[]):    public static void send(final byte[] arr){        new Thread(new Runnable() {            public void run() {                if (socket.isConnected()) {                    try {                        output.write(arr);                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }).start();    }

 

3、 MainActivity中启动服务

(1) 导入可能需要的类  

import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;

 

(2) 启动服务

Intent intent=new Intent(this,TCPService.class);startService(intent);

 

9af4d8b06f36e3f399562b3bbf020daa.png

(3) 加入联网权限

    在AndroidMainfest.xml文件中加入下面这句:

<uses-permission android:name="android.permission.INTERNET" />

 

04f0a714001f139dbf6aa51182ff785f.png

4、 打开TCP Service

    打开网络调试助手

(1) 协议类型:“TCP Server”

(2) 本机地址:不做修改,并且在APP的TCPService中的IP地址要与此一致

(3) 端口选择:根据需要选择合适的端口,同样在APP的TCPService中的端口号要与此一致基本补充

(4)点击打开

3b9156d3b5ffb713abf451496c158f53.png

5、 运行APP

此时我们可以看到APP已经连接上了网络调试助手

66d6900292da902321174d2114085ecf.png

三、 界面配置

bbf5511995ecbb9eeea30ba3f08deade.png

四、 手动输入IP与端口号进行连接

 1.实现过程

    为登陆按钮的ImageButton添加事件,获取IP地址和端口号输入框的值后启动连接,相比较于上一步的初始化连接测试,这次的IP地址和端口号是变化的,我们这使用putExtra方式将ip和端口号发送出去,在TCPService中接收

  2.修改启动服务语句

    此处我们将一开始测试的程序语句

Intent intent=new Intent(this,TCPService.class);startService(intent);

    改为

Intent intent = new Intent(this, TCPService.class);intent.putExtra("ipaddress", ip);intent.putExtra("port", port);startService(intent);

  3.添加到登陆按钮的事件代码中

084ddee0794db5807a20fcce5cb3c746.png

4.在TCPService.java中接收IP和端口号,并启动新的连接

4d083744cc1ab121bbf1eeb5e03c26f7.png

五、 数据的收发

1. 数据的接收

(1) 广播接收器

我们通过广播接收器进行数据接收,首先在MainActivity中新建一个接收器:

private class cmdReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {  byte[] receive=intent.getByteArrayExtra("data");  System.out.println("接收到数据:"+recieveData);  }}

(2)注册接收器

public cmdReceiver cmdReceiver;cmdReceiver =new cmdReceiver();IntentFilter intentFilter=new IntentFilter();intentFilter.addAction("com.example.communication.data");registerReceiver(cmdReceiver,intentFilter);

(3)网络调试助手进行数据发送

由于我们在TCPService中定义了接收数据格式为100字节,大家根据自己需要进行调整。

32107c41e3f5e18813ed0b21f2851553.png

(4)接收处理

我们在广播接收器中读取接收的数据并显示:

1080c8a6f63476a66db0e5989829d945.png

2.数据发送

    发送的时候我们可以调用TCPService.send(buff);方法,其中buff为字节数组,例如:

//发送十六进制数据byte[] buff = {0x00,0x01,0x02,0x03};TCPService.send(buff);//发送字符串String str=”FUNIOT is very fun”;byte[] buffstr = str.getBytes();TCPService.send(buffstr);

 

b57576e2eeec4f6a87a47256fb3efc21.png

五、 结语

    接下来我们就可以连接我们的设备,使用APP进行通信,完成数据上报或命令控制等其功能,关键代码已经在文章中给出,如果需要上述文章Android  Studio的工程文件,在公众号“IOT趣制作”回复关键字“TCP基础应用”即可。

5773eb9e6f04d4f7261f689f218480a6.png

 

 

 

  • 17
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOT趣制作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值