我是靠谱客的博主 殷勤乌冬面,最近开发中收集的这篇文章主要介绍基于onenet的开关定位接收消息的APP设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

手机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设计的全部内容,希望文章能够帮你解决基于onenet的开关定位接收消息的APP设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部