草庐IT

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

IOT趣制作 2023-08-03 原文

最新版安卓TCP助手Android studio工程分享:Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换) 

第0章 简介

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

第1章 提前准备

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

二、 网络调试助手

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

第2章 详细步骤

一、 新建工程

二、 TCP服务

1、 新建TCP服务

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);

 

(3) 加入联网权限

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

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

 

4、 打开TCP Service

    打开网络调试助手

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

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

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

(4)点击打开

5、 运行APP

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

三、 界面配置

四、 手动输入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.添加到登陆按钮的事件代码中

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

五、 数据的收发

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字节,大家根据自己需要进行调整。

(4)接收处理

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

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);

 

五、 结语

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

 

 

有关基于TCP/IP协议的物联网安卓应用开发基础教程(Android Studio开发)的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  4. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  6. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐