手机APP的基本功能实现流程图如下图所示。

3.3.1 页面布局设计

(1)页面布局选择

手机客户端的app页面设计介绍以下三种布局:

①LinearLayout线性布局,将它所包含的控件在线性方向上次排列。

②RelativeLayout相对布局,更加随意一些,通过相对定位的方式布局在任何位置。

③ConstraintLayout约束布局,比相对布局更加随意一些,本身为了解决可视化编写界面的方式而出现的。代码是由Android Studio根据操作自动生成的。并且它可以有效地解决布局嵌套过多的问题。还可以提高程序的性能。(使用约束的方式来指定各个控件的位置和关系),比相对布局更加强大。

由于app功能需求较多,控件布局较复杂,因此采用ConstraintLayout约束布局来解决嵌套过多的问题。

(2)APP主页面设计

由于云服务器设备注册登录的唯一性(需要提前在平台登录注册设备ID),因此将客户端账号,APIkey以及平台地址在app后端进行登录验证以连接上服务器。

在页面最上方分别为左右两个textview文本框hello1和hello0,当接收到GPS的经纬度信息时可以显示定位到的经纬度信息。

下方则放置一个button按钮控件来清除定位标记,并且在下方放入四个控制垃圾桶开关的switch控件和右方还原垃圾桶成“未满”状态的button控件。另外放入四个可以切换“未满”和“已满”文本的textview用来满溢通知。最后,在屏幕的最下方放入mapview地图控件来显示基础地图并进行定位。

3.3.2 软件端连接服务器

(1)接入平台介绍

因为项目的设备需要和平台保持长连接并且要实现设备间的消息单播以及组播,所以决定通过MQTT协议接入OneNet云平台。MQTT协议在前文中已经描述,在这里不过多赘述。

下图为手机APP的MQTT接入协议示意图。

(2)手机APP连接OneNet平台

说明:若手机APP要连接服务器,首先先进行TCP连接和发送CONNECT请求,需要做的工作有:在后端配置服务器的地址和端口号以及客户端的鉴权信息;在CONNECT请求中设置cleanSession=false,平台将会保存设备的一些信息;设置心跳间隔为30秒,每隔30秒向服务器发送一个心跳包,用于给服务器判断客户端是否在线;设置一个超时时间为10秒,当超过超时时间客户端还没有连接上服务器,则进行重新连接。

连接服务器工作如下

①后端定义服务器地址和客户端信息。

②连接服务器的函数,当连接成功时将msg.what设置为31,否则设置为31。

(3)若连接失败或者设备掉线

设备掉线重连函数

说明:若设备掉线后进行重连

(4)Mqtt协议的主函数的连接服务器部分

3.3.3 控制开关模块

(1)模块描述

应用界面添加switch开关控件,按下不同的开关会给主题“123”发布不同的数据,如打开开关1会给服务器发送“sg1on”,关闭开关1会给服务器发送“sg1off”。当垃圾桶客户端订阅了主题“123”,就能接收该数据,从而打开或关闭不同的垃圾桶。

(2)工作原理

以控制垃圾桶1开关为例

先对switch控件进行初始化,并定义sg1_flag为标志位,赋初为0,activity生命周期oncreate进行初始化的操作,再调用setContentView()函数去加载界面,绑定主页面activity_main布局里的开关控件sw_1。

当开关控件打开时,调用Setoncheckedchangedlistenr函数进行开关的监听检测及对应事件,系统会根据你切换的开关的状态执行对应的事件:当调用checkedchanged函数检测到控件状态发生改变,且此时标志位(sg1_flag)为0,则通过publishmessageplus()函数向主题“123”发布打开指令“sg1on”,控制垃圾桶打开并将标志位置1

当开关控件关闭时,会通过publishmessageplus()函数向主题“123”发布打开指令“sg1off”,控制垃圾桶合上并将标志位置0。

发布函数publishmessageplus()如下

说明:发布函数向主题topic发布信息message2,发布消息的服务等级为0

3.3.4 满溢通知模块

(1)模块描述

手机客户端需要订阅主题“满溢”来接收垃圾桶发布的满溢信息数据,当识别到某个垃圾桶已满的消息,就将界面中的一个文本框从“未满”切换到“已满”,用于表示某个垃圾桶已满。例如收到“red1cut”表示垃圾桶已满。

此外在文本框旁边添加一个按钮控件,命名为“清空垃圾桶”,当按钮被按下,文本框的状态就能从“已满”切换到“未满”。表示垃圾桶已清空。如图所示。

(2)工作原理

以干垃圾桶满(垃圾桶1)溢为例。

先对文本框和按钮控件进行初始化,并且绑定到页面布局的Btn_5按钮控件和txt_1文本框。

通过点击按钮控件可以把文本框的状态从“已满”切换到“未满”,其初始化代码如下

当订阅了主题“满溢”并收到了从垃圾桶发布的满溢信息数据时,通过substring()函数对接收到的数据进行截取,若截取到字符串“red1cut”代表接收到垃圾桶1满溢信息,此时文本框由“未满”切换到“已满”状态,并且在客户端底部弹出消息框通知“干垃圾桶已经满了”字样。

若未接收到相应的数据则调用removeMessages()函数将handler对应的消息从进程3中清空。队列里面没有消息则handler会不工作,但不表示handler会停止。当队列中有新的消息进来以后handler还是会处理。

订阅主题代码如下

说明:订阅的主题有“满溢”“经度”“纬度”。服务等级均为0.

3.3.5 定位模块

(1)模块描述

根据应用包名等获取百度地图的key,导入百度地图的基础地图jar包,包括基础地图和基础定位,导入到工程中。当APP订阅主题“定位”并接收到来自单片机的经纬度信息,再经识别确认经纬度信息后,在百度地图上做出标记。

在页面的上方设置两个文本框显示出经纬度信息,另外,拓展出删除定位标记的功能,用于删除多余的定位标记。

(2)工作原理

首先在主函数界面对控件初始化,绑定页面的地图等控件,并且初始化全局bitmap信息。创建地图Activity,管理地图生命周期。

新建MyAppLication,继承Application,重写getApplicationContext,在其中初始化sdk

在AndroidManifest中添加开发密钥key、所需权限,application等信息,在application中添加开发密钥,添加所需权限,并添加Application。

在mqtt主函数里进程3收到消息回传中对数据进行处理,通过substring对接收到的数据进行截取,对经度以”Longitude:”和“E”为前后标志位截取中间的字符串并转换成双精度浮点型的经度数值,对纬度以“latitude:”和“N”为前后标志位截取中间的字符串并转换成双精度浮点型的纬度数值,并分别用文本框显示经纬度信息,程序底部弹出收到消息。

对已接收到的经纬度数值整合,并对地图进行初始化,设定中心点坐标,设置好地图状态,调用marker函数将图标定位在所给经纬度的坐标点,改变地图状态,更新地图。

另外调用按钮监听函数,一旦按钮状态发生变化,使用remove,将定位的图标进行清除。若未接收到相应的数据则调用removemessages函数将handler对应的消息从进程3中清空。队列里面没有消息则handler会不工作,但不表示handler会停止。当队列中有新的消息进来以后handler还是会处理。

基于onenet的开关定位接收消息的APP设计相关推荐

  1. 基于Android平台实现x的跑步应用App设计【附项目源码+论文说明】分享

    基于Android平台实现x的跑步应用App设计演示 摘要 随着手机使用的普及,人们获取与保存信息的方式已经发生了激动人心的转变.智能手机正在逐步融入我们的生活,并影响和改变着我们的生活.由于现在各种 ...

  2. 基于TensorFlow2.3.0的花卉识别Android APP设计

    一.前言 本设计为基于TensorFlow2.3.0的花卉识别Android APP.TensorFlow2.3.0的API简单易用,训练好后模型导出tflite格式供Anroid APP使用. 开发 ...

  3. 基于SpringBoot的仿饿了吗外卖APP设计与实现

    一.需求 本App主要实现了用户的登录,商品的浏览,购物车查询等功能,如下表所示 二.主体框架 2.1 整体框架 2.2 数据的流向 数据类型 数据流向 交易商品信息 数据库->客户 商品类别信 ...

  4. 基于XCode IOS开发系统实现的新闻APP设计

    一.项目概述 1.1 项目介绍 本次课程设计所实现的新闻阅读APP是基于XCode IOS开发系统上开发的一款可以查看,收藏以及删除新闻的一款IOS应用软件.它有着启动界面.登录界面,在输入正确的账号 ...

  5. 基于Android和SSH的旅游自助系统APP设计

    目录 一. 详细设计 1 [需求分析] 1 五类地方旅游类App下载量分布图 1 六大商店地方旅游类App下载量分布图 2 [可行性分析] 2 [用例建模] 3 [流程图] 4 [系统分析] 4 [时 ...

  6. 基于微信小程序的流动人口管理移动APP设计与实现-计算机毕业设计源码+LW文档

    摘  要 网络的广泛应用给生活带来了十分的便利.所以把流动人口管理移动与现在网络相结合,利用java技术建设流动人口管理移动app,实现流动人口管理移动的信息化.则对于进一步提高流动人口管理移动app ...

  7. 基于安卓AndroidStudio智慧医疗医院预约挂号app设计

    开发软件:AndroidStudio + sqlite数据库 利用原生安卓开发的一个医院管理app,包括了病人注册登录,填写流行病学调查表,预约核酸检查,查询核酸检查预约记录,预约新冠疫苗,查询疫苗预 ...

  8. 基于移动流媒体的在线课堂在线教学APP设计 文档+项目源码

    资源下载地址:https://download.csdn.net/download/sheziqiong/85821070 资源下载地址:https://download.csdn.net/downl ...

  9. PC微信逆向:发送与接收消息的分析与代码实现

    文章目录 定位微信的消息接收函数 定位消息接收函数的相关思路 定位消息内容的地址 分析接收消息函数 好友消息 群消息 总结 代码实现 定位微信的消息发送函数 定位消息发送函数的相关思路 过滤当前聊天窗 ...

最新文章

  1. 使用juery在iframe内部访问父页面元素
  2. python项目部署到url_项目上线部署
  3. 更改微软更新服务器地址,更新服务 | Microsoft Docs
  4. fcpx大胆流行标题插件 Bold Pop for mac
  5. 浅析MySQL存储引擎序列属性
  6. 什么叫枚举法_四年级:美妙数学之“巧用枚举法”1(0202四)
  7. 工具栏(UIToolbar)
  8. linux中split函数用法,Linux split命令参数及使用方法详解
  9. 手写深浅拷贝(js)
  10. Android Studio Xposed模块编写(二)
  11. IOS 之 NSBundle 使用
  12. 2021-02-20
  13. 华为P40怎么解账号锁P40Pro忘记密码ID账号锁解除方案开机设备解锁帐号软件使用方法
  14. SQL Server_SQL Server Windows NT - 64 bit
  15. 算法:(1)确定字符互异
  16. 高斯列主消元法 求非齐次线性方程组 C语言实现代码
  17. 惊!又一家知名企业被查!
  18. oracle面试题答案,Oracle面试题笔试题及参考答案
  19. 【我的读书】《薛兆丰经济学讲义》助你变得更理性、悦纳和进取
  20. 线程与进程之间的共享资源

热门文章

  1. redux与react-redux的区别:
  2. 虚拟机中安装linux系统步骤
  3. windows创建软链接和删除软链接
  4. Java实现递归查询树结构
  5. Vue引入百度地图警告:A Parser-blocking, cross site (i.e. different eTLD+1) script....
  6. Java8日期/时间使用
  7. c++对数函数 log() 操作
  8. 赵明荣耀鸿蒙,荣耀能升级华为鸿蒙吗赵明正式表态,老用户很幸运
  9. 使用kdevelop出现问题及解决
  10. 浅析STM32H7 FDCAN(一)