基于局域网内物联网的androidAPP开发——实现消息上报与命令下达

本文介绍了如何在安卓APP中避免直接与MQTT服务器交互,通过Java客户端提供的接口,以HTTP请求方式高效控制设备。涉及子线程与主线程通信、数据更新和设备控制操作。

目录

写在前面

前提准备 

本次干的事情——编写安卓app

正文

比如 子线程定时获取数据库信息实时更新UI

 比如子线程判断主线程事件进行数据操作实现对设备的控制


写在前面

为实现第三方移动端控制的要求,我需要实现一个在个人局域网内控制设备的移动端APP。

前提准备 

一个已经实现好通信控制的硬件和相关外设(单片机)。

一块stm32主控板,若干块通信模块(esp32,lora模块)。

一个emqx的mqtt消息服务器。

一个自己写网络接口的java客户端(一个基于springboot整合mybatis的后端服务器,提供命令调用的接口和监听硬件采集的数据并转储于数据库)。

这个java客户端连接mqtt服务器,订阅数据获取的主题,发布对应主题的消息以控制硬件。

在以上的前提都准备后,理论上我已经干的差不多的,安卓只是一个写界面来更好地服务与我控制的操作而已。。。。我可以在网页上直接访问java客户端提供的接口,来访问硬件采集的数据,控制硬件的外设,以及干更多你想干的事情(比如RF高频卡感应来模拟门禁,通过发送的信息实现语音播报和语音控制等等)

本次干的事情——编写安卓app

我的想法就是越简单越好,这会让人更加地清晰和明白,我没有像网上一般的那样让安卓去连接

mqtt服务器,然后通过安卓与mqtt服务器直接打交道,(获取数据和命令控制)。但是,我只是想直接简单明了的调用接口,以最简单的http请求的方式实现我的目的。为了这个,java客户端干了所有的事,再提供访问的接口。

参考我的java客户端

局域网内用JAVA建立MQTT客户端监听MQTT服务器消息并持久化到数据库_昊月光华的博客-优快云博客_java mqtt服务端

java客户端运行

 提供接口(http请求)访问

发布命令

当然安卓连接mqtt服务器也不是一件难事,问题在于假如我有多个应用程序都要访问数据和控制呢?哪不是每一个都得连接mqtt服务器,每一个都要写监听对应主题以及发布主题消息的方法?

当然,目前很多的外网云平台正是提供第三方访问的接口请求。也就是API

比如巴法云平台,华为云平台等等。

正文

首先是编写界面和交互逻辑代码,最主要的也就是主线程与子线程的通信,也就是子线程获取数据,主线程更新界面。

这里有常见几种的情形:

  • 在一个页面内(activity)内,创建一个内部类(继承线程类,重写run方法),子线程不断地获取数据,然后通过runonUIthread 更新界面。
  • 主线程持有子线程的handler引用,子线程收到主线程发过来的message ,通过message.what判断是哪个控件发过来的,然后进行数据操作(访问数据库等等),数据操作完后,通过runonUIthread 更新UI界面。

比如 子线程定时获取数据库信息实时更新UI

在首页中

package com.example.yuezhenhao;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.yuezhenhao.HttpRequest.DAO;

import java.security.PrivateKey;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

    private View exit,mainpage,control,chart,querypage;

    private TextView runt, temp, humi, ls,tl,hl,ll,state,isc;
    private  String TAG="MAIN";
    int i=0;
    private Handler mHandler= new Handler(Looper.getMainLooper()) {
        @Override
        //重写handleMessage方法,根据msg中what的值判断是否执行后续操作
        public void handleMessage(Message msg) {

            if (msg.what == 0) {
                i++;
                runt.setText(String.valueOf(i));


            }
        }
    };





    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //开启工作线程
        WorkThread workThread = new WorkThread();
        workThread.sta
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值