玩转OneNET物联网平台之HTTP服务③ —— OneNet智能灯 HTTP版本

授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

快速导航
单片机菜鸟的博客快速索引(快速找到你要的)

如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。

1.前言

    在前面的博文 玩转OneNET物联网平台之MQTT服务④ —— 远程控制LED(数量无限制)+ Android App控制 中,这个版本的App控制消息的发送是通过Mqtt客户端去操作,这就意味着一个长连接。博主仔细翻阅了一下OneNet的官方文档,发现可以通过HTTP协议的请求去完成MQTT相同的操作,对于一些适用短连接的场合我们可以使用这个方式去实现。

具体可以参考 OneNet发布消息,读者重点关注红色框框。

在这里插入图片描述

2.ESP8266端代码

  • 完全不需要改造,沿用之前博文的代码即可

3. App端代码

重点改造几个地方,读者直接看注释地方:

3.1 MVP三剑客

public interface IMainContract {

    interface IMainModel extends IBaseModel {
        void loadData(Context context, ICallBack<List<OneNetDeviceModel>> callBack);
        void updateDeviceDetail(Context context,OneNetDeviceModel model, ICallBack<String> callBack);
        //加入http方式
        void publishMsgToOneNet(String topic,int qos,String payload);
    }

    interface IMainView extends IBaseView {
        void showLoading(String loadmsg);
        void dismissLoading(OnDismissCallbackListener callback);
        void refreshList(List<OneNetDeviceModel> list);
    }
}
3.1.1 Model层

model层实现上面多加入的方法 publishMsgToOneNet

public class MainModel implements IMainContract.IMainModel {

    SimpleTask task;

    @Override
    public void loadData(Context context, final ICallBack<List<OneNetDeviceModel>> callBack) {

        if(task != null && task.getStatus()== AsyncTask.Status.RUNNING){
            task.cancel(true);
        }
        task = new SimpleTask() {

            GetOneNetDeviceListEntity entity;

            @Override
            protected void onPreExecute() {
                entity = new GetOneNetDeviceListEntity();
            }

            @Override
            protected Object doInBackground(String... strings) {
                return entity.request();
            }

            @Override
            protected void onPostExecute(Object o) {
                String result = (String) o;
                if("200".equals(result)){
                   if(entity.data != null && entity.data.devices.size()!=0) {
                       List<OneNetDeviceModel> list = new ArrayList<>();
                       for(OneNetDeviceModel model:entity.data.devices){
                           if(!model.getId().equals(PreferenceUtil.getInstance().getDeviceId())){
                               list.add(model);
                           }
                       }

                       callBack.onSuccess(list);
                   }
                }else {
                    callBack.onFaild(result);
                }
            }
        };
        task.startTask();
    }

    @Override
    public void updateDeviceDetail(Context context, final OneNetDeviceModel model, final ICallBack<String> callBack) {
        if(task != null && task.getStatus()== AsyncTask.Status.RUNNING){
            task.cancel(true);
        }
        task = new SimpleTask() {

            UpdateOneNetDeviceDetailEntity entity;

            @Override
            protected void onPreExecute() {
                entity = new UpdateOneNetDeviceDetailEntity(model.getId());
            }

            @Override
            protected Object doInBackground(String... strings) {
                return entity.request(model);
            }

            @Override
            protected void onPostExecute(Object o) {
                String result = (String) o;
                if("200".equals(result)){
                    callBack.onSuccess("更新成功");
                }else {
                    callBack.onFaild(result);
                }
            }
        };
        task.startTask();
    }

    @Override
    //实现http具体逻辑 也就是访问onenet的发布消息接口
    public void publishMsgToOneNet(final String topic, int qos, final String payload) {
        if(task != null && task.getStatus()== AsyncTask.Status.RUNNING){
            task.cancel(true);
        }
        task = new SimpleTask() {

            PublishMsgToOneNetlEntity entity;

            @Override
            protected void onPreExecute() {
                entity = new PublishMsgToOneNetlEntity(topic);
            }

            @Override
            protected Object doInBackground(String... strings) {
                return entity.request(payload);
            }

            @Override
            protected void onPostExecute(Object o) {
                String result = (String) o;
                if("200".equals(result)){

                }else {

                }
            }
        };
        task.startTask();
    }
}
3.1.2 View层
  • V层直接调用P层的方法,两种方式二选一
open.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                JSONObject obj = new JSONObject();
                try {
                    obj.put("Did",item.getId());
                    obj.put("sta",1);
                    //http方式
                    presenter.httpPublishMsgToOneNet(AppConstant.Topic.Default_Topic,1,obj.toString());
                    //mqtt方式
                    //presenter.mqttPublishMsgToOneNet(AppConstant.Topic.Default_Topic,1,obj.toString());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                JSONObject obj = new JSONObject();
                try {
                    obj.put("Did",item.getId());
                    obj.put("sta",0);
                    //http方式
                    presenter.httpPublishMsgToOneNet(AppConstant.Topic.Default_Topic,1,obj.toString());
                    //mqtt方式
                    // presenter.mqttPublishMsgToOneNet(AppConstant.Topic.Default_Topic,1,obj.toString());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
3.1.3 Presenter层
  • P层同时预留了Http和mqtt的请求方式
public class MainPresenter extends BasePresenter<IMainContract.IMainView> {

    private IMainContract.IMainModel mMainModel;

    public MainPresenter(){
        mMainModel = new MainModel();
    }

    public void refreshList(Context context){
        mView.showLoading("获取设备列表中...");

        mMainModel.loadData(context, new ICallBack<List<OneNetDeviceModel>>() {
            @Override
            public void onSuccess(final List<OneNetDeviceModel> list) {
                mView.refreshList(list);
                mView.dismissLoading();
            }

            @Override
            public void onFaild(String msg) {
                mView.dismissLoading(new OnDismissCallbackListener(msg, SweetAlertDialog.ERROR_TYPE));
            }
        });
    }

    public void updateDeviceDetail(final Context context, OneNetDeviceModel model){
        mView.showLoading("更新设备信息中...");

        mMainModel.updateDeviceDetail(context,model, new ICallBack<String>() {
            @Override
            public void onSuccess(final String result) {
                mView.dismissLoading();
                refreshList(context);
            }

            @Override
            public void onFaild(String msg) {
                mView.dismissLoading(new OnDismissCallbackListener(msg, SweetAlertDialog.ERROR_TYPE));
            }
        });
    }

    /**
     * 以应用层mqtt协议发布消息
     **/
    public void mqttPublishMsgToOneNet(String topic,int qos,String payload ){
        MqttManager.getInstance().publish(AppConstant.Topic.Default_Topic,qos,payload);
    }

    /**
     * 以应用层http协议发布消息
     **/
    public void httpPublishMsgToOneNet(String topic,int qos,String payload ){
        mMainModel.publishMsgToOneNet(topic,qos,payload);
    }
}

4.测试结果

5.总结

  • 本篇干货不多,只是以另一种方式去实现mqtt的操作,可供参考。
基于单片机STM32和ESP8266的智能家居安防OneNET物联网系统可以具备以下功能点: 1. 远程监控与控制:通过连接到OneNET物联网平台,用户可以通过手机APP或者网页等远程监控和控制智能家居安防系统。例如,用户可以实时查看家庭摄像头的画面、远程开关、调节温度等。 2. 安全监测与报警:系统集成门磁、窗磁、红外感应器等传感器,实时监测家居的入侵情况。一旦有异常情况发生,系统会发出警报并向用户发送通知,提醒用户注意家庭安全。 3. 环境监测与控制:系统通过温湿度传感器、光照传感器等监测家居环境参数,例如温度、湿度、光照强度等。用户可以根据需求调节空调、加湿器、光等设备,提高家居的舒适性。 4. 省能节能管理:系统可以根据用户设置的时间表或自动感应,智能地控制家电设备的开关。例如,在用户离开家时自动关闭电器设备,实现节能管理。 5. 数据存储与分析:系统将监测到的数据上传到OneNET物联网平台,实现数据的存储和分析。用户可以通过手机APP或者网页查看历史数据,并根据数据分析报告做出相应的调整。 6. 安全权限管理:系统可以设置不同用户的权限,例如家庭成员和访客可以拥有不同的操作权限,保证系统的安全性。 通过以上功能点,基于单片机STM32和ESP8266的智能家居安防OneNET物联网系统能够提供全面的家居安全解决方案,并实现远程监控、环境控制、省能节能等智能化操作,提高家居的便利性和舒适度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机菜鸟哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值