经过一下午的不断测试修改,终于解决EMQX存入MySql数据库一直失败,写此文章,以致努力一下午的自己。

问题格式

虽然命中但是一直失败。

在此之前我已经跑通。

问题原因

废话不多说,直接上问题原因:mysql表中的格式跟我要存的数据格式不一样。

解决方法:

bool类型导致我的数据虽然命中但无法成功存入数据库,只需将false改为0,true改为1即可。

或者将表相对应的数据格式修改一下。

我的JSON数据格式:

{"Sensor":{
"air_temperature":-1,
"air_humidity":-1,
"air_pressure":-1,
"light_intensity":-1,
"pcb_temperature":-1
},"ActurStatus":{
"ActurStatus_Relay1":false,
"ActurStatus_Relay2":false,
"ActurStatus_Fin":false
}}

我的规则设计:
 

SELECT 
  clientid AS client_name,
  timestamp AS received_time,
  qos,
  payload.Sensor.air_temperature AS air_temperature,
  payload.Sensor.air_humidity AS air_humidity,
  payload.Sensor.air_pressure AS air_pressure,
  payload.Sensor.light_intensity AS light_intensity,
  payload.Sensor.pcb_temperature AS pcb_temperature,
  payload.ActurStatus.ActurStatus_Relay1 AS ActurStatus_Relay1,
  payload.ActurStatus.ActurStatus_Relay2 AS ActurStatus_Relay2,
  payload.ActurStatus.ActurStatus_Fin AS ActurStatus_Fin
FROM
  "solarCharge/Sensor"

使用我的数据进行运行测试,这里已通过测试,结果如下:

很显然我的数据全部解析了,这步算是已经完成。

之后是设计动作设计,选择MySql,填入相关信息,选择MySql服务,我的动作代码如下:

INSERT INTO sensor_data2 (
  client_name,
  received_time,
  qos,
  air_temperature,
  air_humidity,
  air_pressure,
  light_intensity,
  pcb_temperature,
  ActurStatus_Relay1,
  ActurStatus_Relay2,
  ActurStatus_Fin
) VALUES (
  ${client_name},  FROM_UNIXTIME(${received_time}/1000),
  ${qos},  ${air_temperature},
  ${air_humidity},  ${air_pressure},
  ${light_intensity},  ${pcb_temperature},
  ${ActurStatus_Relay1},  ${ActurStatus_Relay2},
  ${ActurStatus_Fin})

再此之前要现在数据库里创建sensor_data2表,其创建代码如下:

CREATE TABLE IF NOT EXISTS sensor_data2 (
  id INT AUTO_INCREMENT PRIMARY KEY,
  client_name VARCHAR(255) NOT NULL,
  received_time DATETIME NOT NULL,
  qos TINYINT NOT NULL,
  air_temperature DOUBLE,
  air_humidity DOUBLE,
  air_pressure DOUBLE,
  light_intensity DOUBLE,
  pcb_temperature DOUBLE,
  ActurStatus_Relay1 BOOLEAN,
  ActurStatus_Relay2 BOOLEAN,
  ActurStatus_Fin BOOLEAN,
  inserted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

之后对动作进行测试链接,这里已通过测试,结果如下:

到此,只需往EMQX发送数据即可将数据存到数据库。

。。。。。。

然而,我并没得到想象的效果,发生了如开头所讲的问题,虽然命中但是没有成功!

经过一下午的测试以及我对之前的测试方法进行测试修改,我认为不应该这样。最后我关注了最下面的bool格式:false,(这里是我在单片机上建立的bool类型,用来返回执行器的状态)。

最后发现将flase改为 ”0“ 就可成功,不仅命中还成功!此时我泪如雨下...来张成功的截图乐一下:

另一个解决思路

这样的话我就有了另一个解决思路了,既然数据库写的bool类型,在SQL表中把数据类型改一下不就完事了。(修改的时候发现这里的值只能是0或1,但我这里是false和true,不知道单片机里怎么给我的bool类型组成JSON数据的时候变成false和true了。)所以我修改为了tinytest类型了,完美解决!再次测试,依旧是已命中但失败。嘿嘿,这时候还是要动下脑汁的,这里的false和true没有加引号,,,再次测试,完成!回头把单片机上的bool类型转化为字符类型。附上成功截图:

总结:

1、多用点心,确保发送的数据格式和接收到的数据格式一致。

2、EMQX不成功你好歹报个错,可以吗?

3、AI确实好用,虽然我很早敲过sql的代码,但已经忘得一干二净,在AI的帮助下得以完成将单片机数据通过EMQX服务器存到Mysql数据库里!
4、虽然AI好用,但不理解其中的原理闷头往前冲,只会在一个个小小的错误打败你。

                                                                                                                        主攻:嵌入式硬件

                                                                                                                        专业:物联网工程

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐