Kylin V3.2开发板+OneNET MQ消息队列+Java+Mysql

Kylin V3.2开发板+OneNET MQ消息队列+Java+Mysql

(用以记录写代码时的思路以免遗忘

一、Kylin V3.2开发板上传数据之OneNET在之前的博客已经提及:

Kylin V3.2 to OneNET

二、Java接收、处理数据并存入数据库

-步骤:

  • 将接收到的数据转为json对象,方便处理
  • 使用alibaba.druid和Spring Template存入数据库

-依赖:

  • spring-jdbc-5.0.0.RELEASE.jar
  • druid-1.0.9.jar

1、Java接收、处理数据:

每收到一次数据控制台打印如下信息:
在这里插入图片描述
打印信息的代码From:\src\main\java\com\onenet\mq\PushCallback.java:

public void messageArrived(String topic, MqttMessage message) throws InvalidProtocolBufferException {
  byte[] payload = message.getPayload();
   OnenetMq.Msg obj = OnenetMq.Msg.parseFrom(payload);

  long at = obj.getTimestamp();
   long msgid = obj.getMsgid();
   String body = new String(obj.getData().toByteArray());
   JsonDemo jsonDemo = new JsonDemo();
//从收到的String body里提取出原始传感器数据
   double orihumidity = jsonDemo.getOriHumidity(body);
   double oritemperature = jsonDemo.getOriTemperature(body);
//分别存入数据库
   if (orihumidity!=0){
     Humidity humidity = new Humidity();
     humidity.setValue(orihumidity);
     HumidityDao humidityDao = new HumidityDao();
     humidityDao.UpdateHumidity(humidity);
   }
   if (oritemperature!=0) {
     Temperature temperature = new Temperature();
     temperature.setValue(oritemperature);
     TemperatureDao temperatureDao = new TemperatureDao();
     temperatureDao.UpdateTemperature(temperature);
   }
   SimpleDateFormat slf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss:S”);
   String time = slf.format(at);

   logger.info( "time = " + time +
   ",msg id: " + msgid +
   ", body: " + body);

}
可见,所有数据都存在String body中,而且是json格式,body中的数据如下所示:

{"sysProperty":
				{"messageType":"deviceDatapoint","productId":"312118"},
"appProperty":
				{"deviceId":"581205941","dataTimestamp":1578884925484,"datastream":"Tempreture"},
"body":"27.775230"
}


{ 
  "sysProperty":
                {"messageType":"deviceDatapoint","productId":"274535"},
 "appProperty":
                {"deviceId":"543970284","dataTimestamp":1578038610715,"datastream":"Humidity"},
  "body":"34.603668"
  }

需要做两件事:

  • (1) 将上面json中key=“body”的键值对的值取出来
  • (2)识别key=“datastream”的值是"Humidity"(湿度)还是“Tempreture”(温度,这里是OneNET的工程师英语垃圾拼错了单词,不是我拼错了,参考:牛津词典

(1)、编写JsonDemo类,用来操作json字符串**

      参考博客json操作类

(2)、取出需要的数据(温度、湿度)

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.Date;

public class JsonDemo {
//获取湿度
public double getOriHumidity(String body){

        JSONObject jsonObject = JSONObject.fromObject(body);
        String data = jsonObject.getString("appProperty");
        JSONObject jsonObject1 = JSONObject.fromObject(data);
        Date date = new Date(jsonObject1.getInt("dataTimestamp"));
        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss SSS a");

        long onenet = jsonObject1.getLong("dataTimestamp");
        long current = System.currentTimeMillis();
        System.out.println("onenet" + onenet + "   current" + current);
        System.out.println("当前延时" + (current - onenet));
        double value=0;
        if (jsonObject1.getString("datastream").equals("Humidity")){
            value = jsonObject.getDouble("body");
        }

        return value;
    }
    //获取温度
    public double getOriTemperature(String body){
        JSONObject jsonObject = JSONObject.fromObject(body);
        String data = jsonObject.getString("appProperty");
        JSONObject jsonObject1 = JSONObject.fromObject(data);
        double value=0;
        if (jsonObject1.getString("datastream").equals("Tempreture")){
            value = jsonObject.getDouble("body");
        }

        return value;
    }

}

2、实时存入数据库:

代码From:\src\main\java\com\onenet\mq\PushCallback.java:

	......
		JsonDemo jsonDemo = new JsonDemo();
        JsonDemo jsonDemo1 = new JsonDemo();
        //从收到的String body里提取出原始传感器数据
        double orihumidity = jsonDemo.getOriHumidity(body);
        double oritemperature = jsonDemo1.getOriTemperature(body);
        //System.out.printf("vvvvvvvvvvvvvalue: "+value);
       //分别存入数据库
        if (orihumidity!=0){
            Humidity humidity = new Humidity(); 
            humidity.setValue(orihumidity);
            HumidityDao humidityDao = new HumidityDao();
            humidityDao.UpdateHumidity(humidity);
        }

        if (oritemperature!=0) {
            Temperature temperature = new Temperature();
            temperature.setValue(oritemperature);
            TemperatureDao temperatureDao = new TemperatureDao();
            temperatureDao.UpdateTemperature(temperature);
        }
        ......

分为2个步骤:

  • 获取原始数据之后存入Humidity humidity实体中
  • 调用HumidityDao humidityDao中的UpdateHumidity(humidity)方法更新数据库
(1)、HumidityDao:
import JDBCUtils.JDBCUtils;
import domain.Humidity;
import org.springframework.jdbc.core.JdbcTemplate;

public class HumidityDao {
    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    public void addHumidity(Humidity humidity){
        String sql= "insert into humidity values(null,?,?)";
        template.update(sql,humidity.getLoca(),humidity.getValue());
    }
    public void UpdateHumidity(Humidity humidity){
        String sql = "update humidity set value =? where id =1";
        template.update(sql,humidity.getValue());
    }
}

**import了:

1)、JDBCUtils:

import alibaba.druid
内容:

  1. 定义成员变量DataSource
  2. 加载配置文件:(1)、加载配置文件(2)、获取DataSource
  3. 定义三种方法:获取链接、释放资源、获取连接池的方法
2)、springframework JdbcTemplate**

内容:

  1. 调用JDBCUtils获取数据库的链接:
  JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  1. 导入sql语句完成增删改查:
public void addHumidity(Humidity humidity){
        String sql= "insert into humidity values(null,?,?)";
        template.update(sql,humidity.getLoca(),humidity.getValue());
    }
    public void UpdateHumidity(Humidity humidity){
        String sql = "update humidity set value =? where id =1";
        template.update(sql,humidity.getValue());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值