目录
写在前面
为实现第三方移动端控制的要求,我需要实现一个在个人局域网内控制设备的移动端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

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





