物联网:七天构建一个闭环的物联网DEMO-写一个API

基于DDD 思想,将业务逻辑再分层封装,开放 interface 给 Controller 层调用, 而非原始的 MVC 三层直接相互调用,这样有利于将数据处理逻辑与业务逻辑分层。因此这里提炼了一个 Manager:

复制代码
package com.ruoyi.project.business.controlcenter.iot.manager;

import com.ruoyi.project.business.controlcenter.iot.constant.CommonConstant;
import com.ruoyi.project.business.controlcenter.iot.mqtt.manager.MqttSendManager;
import com.ruoyi.project.business.controlcenter.iot.util.MqttParamUtil;
import com.ruoyi.project.business.controlcenter.iot.util.TopicUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class IotManager {

    @Resource
    private MqttSendManager mqttSendManager;

//    @Resource
//    private IotUserDeviceService userDeviceService;

    public void operateIndex(Integer index, String mac, Integer onOff) {
        String params = MqttParamUtil.getParams(index, mac, onOff, "pin");
        String topic = TopicUtil.extractTopic();
        mqttSendManager.sendToMqtt(topic, CommonConstant.QOS.ONLY_ONCE, params);
    }

    public void blink(Integer index, String mac, Integer onOff) {
        String params = MqttParamUtil.getParams(index, mac, onOff, "blink");
        String topic = TopicUtil.extractTopic();
        mqttSendManager.sendToMqtt(topic, CommonConstant.QOS.ONLY_ONCE, params);
    }

    public void blinkPwm(Integer index, String mac, Integer pmw) {
        String params = MqttParamUtil.getBlinkPwmParams(index, mac, pmw);
        String topic = TopicUtil.extractTopic();
        mqttSendManager.sendToMqtt(topic, CommonConstant.QOS.ONLY_ONCE, params);
    }

//    public void pwm(Integer index, String mac, Integer pmw) {
//        String params = MqttParamUtil.getPwmParams(index, mac, pmw);
//        String topic = TopicUtil.extractTopic();
//        mqttSendManager.sendToMqtt(topic, CommonConstant.QOS.ONLY_ONCE, params);
//    }
//
//    public void pwmOff(Integer index, String mac) {
//        String params = MqttParamUtil.getPwmOffParams(index, mac);
//        String topic = TopicUtil.extractTopic();
//        mqttSendManager.sendToMqtt(topic, CommonConstant.QOS.ONLY_ONCE, params);
//    }

    /**
     *
     * @param mac
     * @param reqType
     * @param seconds 执行时间
     */
//    public void deviceBleOperate(String mac, String reqType, Integer seconds) {
//        String params = MqttParamUtil.getBleAdvParam(mac, reqType, seconds);
//        String topic = TopicUtil.extractTopic();
//        mqttSendManager.sendToMqtt(topic, CommonConstant.QOS.ONLY_ONCE, params);
//    }


//    public void saveDeviceStorage(String ssid, String pwd, Long userDeviceId, Long userId) {
//        IotUserDevice device = userDeviceService.findById(userDeviceId, userId);
//        if(device == null) {
//            throw new ServiceException(ErrorCodeConstants.UNKNOWN_USER_DEVICE);
//        }
//        String params = MqttParamUtil.getSaveWifiParams(ssid, pwd, device.getMac());
//        String topic = TopicUtil.extractTopic();
//        mqttSendManager.sendToMqtt(topic, CommonConstant.QOS.ONLY_ONCE, params);
//    }


//    public void deviceBleCancel(String mac) {
//        String params = MqttParamUtil.getBleAdvCancelParam(mac);
//        String topic = TopicUtil.extractTopic();
//        mqttSendManager.sendToMqtt(topic, CommonConstant.QOS.ONLY_ONCE, params);
//    }
}

以上方法中, 被注释的部分是基于 esp32 的能力定制的接口, 我们可以主要先看未注释的几个方法:

复制代码
operateIndex : 向指定的引脚号写入指定的 value, 
参数:mac 是硬件设备固定的唯一识别码, index 是引脚号,onOff 分别对应 1 / 0 。

我们再看看 Controller 中的调用就比较简单了:

复制代码
package com.ruoyi.project.business.controlcenter;

import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.model.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.project.business.controlcenter.iot.manager.IotManager;
import com.ruoyi.project.business.controlcenter.request.IotRequest;
import com.ruoyi.project.business.gpiobiz.request.ListControlGpioBizRequest;
import com.ruoyi.project.business.gpiobiz.response.ControlGpioBizResponse;
import com.ruoyi.project.business.gpiobiz.service.IControlGpioBizService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 设备引脚业务Controller
 * 
 * @author ${author}
 * @date 2024-07-25
 */
@Slf4j
@RestController
@RequestMapping("/business/house")
public class HouseControlController extends BaseController {
    @Autowired
    private IotManager iotManager;
    @Autowired
    private IControlGpioBizService controlGpioBizService;

    /**
     * 查询家庭已支持远程控制的线路
     */
    @GetMapping("/list")
    public TableDataInfo list(ListControlGpioBizRequest request) {
        startPage();
        Long tenantId = getTenantId();
        List<ControlGpioBizResponse> list = controlGpioBizService.selectListWithMac(request, tenantId);
        return getDataTable(list);
    }

    /**
     * 开指定的 gipo
     */
    /**
     * turn
     * @param req
     * @return
     */
    @PostMapping("/turn")
    public AjaxResult turn(@RequestBody IotRequest req) {
        iotManager.operateIndex(req.getIndex(), req.getMac(), req.getOnOff());
        return AjaxResult.success("ok");
    }
}

通过 /turn 接口就能实现对指定设备的开关操作。如果有更多的操作需要, 可以在 esp32 中实现后, 再定制相应的 api 。

欢迎交流并三连。

(

开源地址:

wowiot: 基于ruoyi二开的一款开源智能硬件管理平台, 当前可支持硬件管理,并且支持 esp32 定制的api,可实现远程开关信号的下发,更多功能欢迎探索,有更多的功能性需求,欢迎入群讨论或者参与进来

)

相关推荐
搜佛说5 小时前
sfsEdgeStore轻量级边缘计算数据存储适配平台
数据库·人工智能·物联网·边缘计算·iot
csg11077 小时前
PIC单片机高阶实战(一):PIC32MX振荡器与定时器
单片机·嵌入式硬件·物联网
李boyang7 小时前
基于 STM32F103 + ESP8266 实现 DHT11 温湿度数据上传华为云 IoT 平台
stm32·物联网·华为云·esp8266
A-刘晨阳7 小时前
工业物联网时代时序数据库选型指南:从大数据架构视角深度解析Apache IoTDB
大数据·物联网·时序数据库·iotdb
DolphinDB智臾科技7 小时前
2026 工业时序数据库选型指南:抽象复用能力如何降低 80% 开发成本——DolphinDB vs InfluxDB/TimescaleDB 深度对比与实践
数据库·物联网·时序数据库·dolphindb
xcLeigh7 小时前
KWDB 跨界实战:当“时序数据库”遇上“草莓大棚”,数据如何指导种地?
数据库·物联网·智慧农业·时序数据库·农业·自动控制·kwdb
小龙报8 小时前
【数据结构与算法】环与相遇:链表带环问题的底层逻辑与工程实现
c语言·数据结构·c++·物联网·算法·链表·visualstudio
WangUnionpub9 小时前
别只盯着MDPI,又贵还卡单位,平替SCI/EI,免收版面费,这本15天录用!
大数据·人工智能·深度学习·物联网·计算机视觉
The Shio10 小时前
为什么我认为设备协议真正缺的,不是更多文档,而是代码生成能力?
网络·物联网·c#·.net·业界资讯
jonyleek19 小时前
物联网设备管理基石:深入解读JVS物联网产品管理之产品模板、物模型与规则联动
物联网