草庐IT

AndroidStudio开发APP和ESP8266进行联网传输数据

嘻嘻子的呢 2023-04-05 原文

Android Studio开发APP篇


最近在用ESP8266做一个联网开发,准备做两个版本的来吧,一个是手机APP版本的,另一个是基于OneNET云的版本的来吧,具体的要用来实现什么项目还没有决定,应该做一些经典的项目吧,比如智能家居之类的吧,有这方面项目的可以在评论区和我说说哈,我准备自己搞搞练练手来。

这次的话就准备先做个APP版本,APP的难点主要在于手机APP怎么去实现联网的功能,这个功能可能对于一些软开的同学来说比较简单吧,毕竟上课就是学这个的,但是我电子类出身的人,做这个确实有一问三不知的感觉,做了几天看了很多书籍视频和还有一些大牛的博客,自己搞了一套出来,并且测试成功了,心理有点激动,写篇博客记录一下,下一步的话就准备写个ESP8266的测试用例来了,再再下一步就是搞个项目来试试了。


一、准备工作

准备工作其实不多就两个软件下载安装一下,一个是Android Studio,一个是网络调试助手我用的是NetAssist,只要是能调试网络就都行。

我的思路是这样的,将ESP8266作为服务器,手机APP根据ESP8266的IP地址和端口号去进行连接,连接成功后传输数据,下发指令和接收单片机采集的数据。

安装包在这里:
Android Studio安装包
链接:https://pan.baidu.com/s/1nE4Z4kjhaHiN5lKFfvvE6g
提取码:duol
NetAssist:
链接:https://pan.baidu.com/s/1jvtaYG_eibdvkJasalq2pw
提取码:03bj
失效了可以去在这个资源里面去下载

https://download.csdn.net/download/qq_45488746/85355880
安装的方式大家可以参考这个:https://blog.csdn.net/tao_789456/article/details/118093106

这里主要做联网测试也不多强调这些东西哈。有疑问大家评论区一起相互交流学习哈。

二、安卓APP开发

我这里主要是分为两个类,一个就是MainActivity这个就是主程序执行的入口了
还有一个就是TCP_Test类,里面写了关于连接服务器IP和端口,传输数据等方法。
还有一个就是网络权限要开放出来

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

将网络权限放到AndroidManifest.xml中去

MainActivity类,主要是做一些控件管理和执行TCP连接
MainActivity的一些属性

public class MainActivity extends AppCompatActivity {

    private EditText edit_port;
    private EditText edit_ip;
    private Button btn_connect;
    private Button btn_open;
    private Button btn_close;
    private TCP_Test tcp_client;

具体实现
TCP连接测试代码大家可以根据自己的需求去替换即可主要都是用到啥发送和接收数据这些东西

 	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获取控件
        setContentView(R.layout.activity_main);
        btn_close = findViewById(R.id.btn_close);
        btn_connect = findViewById(R.id.btn_connect);
        btn_open = findViewById(R.id.btn_open);
        edit_port = findViewById(R.id.edit_port);
        edit_ip = findViewById(R.id.edit_ip);
        //连接按键的事件
        btn_connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.v("按下连接后 ip--->","111");
                if(!edit_ip.getText().toString().isEmpty() && !edit_port.getText().toString().isEmpty()){
                    Log.v("按下连接后 ip--->",edit_ip.getText().toString());
                    Log.v("按下连接后 prot--->",edit_port.getText().toString());
                    My_TCP_Client_Test();		//TCP连接测试代码
                }
            }
        });
    }

TCP_Test类:
TCP_Test中的一些属性

client:是Socket的实例
out:输出流
in:输入流
server_State:当前TCP的连接状态标志位

连接方法

public boolean connect(String IP, int port){
        boolean isConnect = false;
        try{
            if(client == null) {
                client = new Socket();
            }
            SocketAddress socketAddress = new InetSocketAddress(IP, port);
            client.connect(socketAddress,2000);
            if(client.isConnected()) {
                Log.v("MyTcpClient----->", "成功连接上服务器");
                isConnect = true;
            }
        }catch (IOException e){
            Log.v("MyTcpClient----->", "失败"+e.getMessage());
            isConnect = false;
            e.printStackTrace();
        }
        return isConnect;
    }

发送和接收消息

    public void sendMsg(String msg){
        try{
            if(out == null) {
                out = client.getOutputStream();     //创建输出流
            }
            out.write(msg.getBytes());              //写入数据
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String rcvMsg(){
        byte[] msg = new byte[128];
        int msg_len;
        String Msg = null;
        try{
            if(in == null){
                in = client.getInputStream();       //创建获取流
            }
            msg_len = in.read(msg); //读取数据
            //数据长度为-1则服务器主动顿开连接
            if(msg_len == -1)
            {
                server_State = msg_len;
                Log.v("MyTcpClient----->", "服务器断开连接");
                closeAll();     //关闭所有接口
                return null;
            }
            Msg = new String(msg,0,msg_len);
        }catch (IOException e){
            e.printStackTrace();
        }
        return Msg;
    }

三、进行联网测试

网络调试助手打开TCP Server服务器
手机APP成功连接上

数据接收成功

到此整篇文章就到这里告一段落了,后面的用ESP8266联网的等后面来实现。
结论:完成了用Android Studio实现TCP连接服务器接收和发送数据的全过程测试。
源码的下载链接放在下面了

源码下载链接

源码下载链接:https://download.csdn.net/download/qq_45488746/85355720

有关AndroidStudio开发APP和ESP8266进行联网传输数据的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. 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(在整个项目的根目录中),然后当

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

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

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

  6. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  7. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

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

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

  9. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

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

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

随机推荐