博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 Arduino Uno 与MQTT,echarts,java自己手动撸一个IOT平台
阅读量:6871 次
发布时间:2019-06-26

本文共 3963 字,大约阅读时间需要 13 分钟。

引言:如果你也跟我一样,需要实时监控发酵箱,花盆。。。之类的东西的温度湿度什么的。又被各种物联网平台的标准及网络搞到头大的话,可以考虑自己搭建一个物联网平台。

好在互联网发展到今天程序世界拥有巨大的资源,感谢程序猿们的奉献,不用造太多轮子,废话少说,撸起袖子直接干:

项目结构:

Arduino 主板(连接到一个温度传感器)通过 MTTQ 协议定期将温度和湿度信息发送到自建iot平台,并使用 echarts中的将收集到的数据描绘成图表。

图片描述

至于为什么选择MQTT作为传输协议,因为我一开始就用了IBM的IOT平台。MQTT是IBM专为了物联网设计的传输协议,但是不知为何IBM的IOT平台我家的网老连不上。

项目安全:

鉴于去年美国发生了一起物联网攻击大戏,因此我们也得考虑项目安全因素。
1、设备层安全: MQTT 协议在 CONNECT 消息中提供了 username 和 password 字段来执行设备身份验证。我们可以要求设备在连接 MQTT 代理时必须发送用户名和密码。
2、传输层安全:可以使用SSL加密传输。
3、应用层安全:MQTT都是明文传输信息,考虑用AES加密所有信息。

本人是物联网新手,手头只有一个arduino 板跟一张网卡,暂时没有办法解决在Arduino 主板使用SSL,如果要使用SSL的小伙伴可以考虑使用草莓派。这样系统存在安全缺陷就是存在被钓鱼网站冒充身份的可能。

构建Arduion:

1、把网卡叠插上去之后,DHT11 的接地引脚(在网格面向前面时,最右侧的一个引脚)通过黑线连接到 Arduino 上的 GND 引脚。DHT11 上的 VDD 引脚(最左侧的引脚)通过红线连接到 Arduino 上的 5V 电源引脚。最后,DTA 引脚(左起第二个)连接到 Arduino 上的数字引脚 3。

图片描述
2、下载 Arduino 的客户端MQTT 库
3、下载 Arduino 的客户端AES库
4、把下载的库导入 Arduino IDE 目录的 libraries 子目录,然后新建一个项目,下面是示例项目。

程序初始化自定义信息列表:1、网卡MAC地址:mac 2、 IP:ip3、服务器地址:localserver4、AES密钥:uint8_t key5、MQTT验证用户名:username6、MQTT验证密码:password系统变量:1、DHT11感应器:DHT112、获取DHT11感应器 的实时数据函数:getData()3、将获取的数据拼接成json字符串函数:buildJson()
#include 
#include
#include
#include
#include
// MAC addressbyte mac[] = {0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0x4D };char macstr[] = "deedbafefeed";// local MQTT serverbyte localserver[] = {192, 168, 1, 5 };// IPbyte ip[] = {192, 168, 1, 22 };String clientName = String("Arduino:") + macstr;uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5};char username[]="test";char password[]="test";void callback(char* topic, byte* payload, unsigned int length);dht11 DHT11;float tempF = 0.0;float tempC = 0.0;float humidity = 0.0;unsigned long time = 0;EthernetClient ethClient;PubSubClient client(localserver, 8088, 0, ethClient);void setup(){ // Start the ethernet client, open up serial port for debugging, and attach the DHT11 sensor Ethernet.begin(mac, ip); Serial.begin(9600); DHT11.attach(3);}void getData() { int chk = DHT11.read(); switch (chk) { case 0: Serial.println("Read OK"); humidity = (float)DHT11.humidity; tempF = DHT11.fahrenheit(); tempC = DHT11.temperature; break; case -1: Serial.println("Checksum error"); break; case -2: Serial.println("Time out error"); break; default: Serial.println("Unknown error"); break; }}String buildJson() { String data = "{"; data+="\n"; data+="\"temperatureF\": "; data+=(int)tempF; data+= ","; data+="\n"; data+="\"temperatureC\": "; data+=(int)tempC; data+= ","; data+="\n"; data+="\"humidity\": "; data+=(int)humidity; data+="\n"; data+="}"; //data+="\n"; //data+="}"; return data;}void loop(){ char clientStr[29]; clientName.toCharArray(clientStr,29); char topicStr[26]; getData(); if (!client.connected()) { Serial.print("Trying to connect to: "); Serial.println(clientStr); aes128_enc_single(key,username); aes128_enc_single(key, password); client.connect(clientStr,username,password); } if (client.connected()) { client.subscribe ("test", 0); String json = buildJson(); char jsonStr[200]; json.toCharArray(jsonStr,200); boolean pubresult = client.publish("test",jsonStr); Serial.print("attempt to send "); Serial.println(jsonStr); Serial.print("to "); Serial.println(topicStr); if(pubresult) Serial.println("successfully sent"); else Serial.println("unsuccessfully sent"); } delay(20000);}

构建IOT数据接收服务:

1、下载国人开源的MQTT服务器:

2、修改一下主程序,com.syxy.protocol.mqttImp.process.ProtocolProcess.java,将校验用户名与密码标识的判断语句注释掉,要求所有CONNECT 消息中必须提供 username 和 password 字段,if (connectMessage.getVariableHeader().isHasUsername() &&connectMessage.getVariableHeader().isHasPassword())
3、自己写一个AES类,并提供对应的密钥字段 key。用户名与密码进行解密并校验。
4、由于 netty框架中ByteBuf在创建时需要指定一个maxCapacity(最大容量),由于我们使用了AES加密,原代码中设置内存太小,存在内存溢出问题,需要修改
com.syxy.util.BufferPool.java 中maxBufferPoolSize 定义值。
5、通讯成功后将publish消息Payload写入数据库保存即可。

构建部署数据图表:

百度的echarts做的不错,将数据导出,按文件配置好即可产出了。

转载地址:http://whpfl.baihongyu.com/

你可能感兴趣的文章
[轉載]史上最强php生成pdf文件,html转pdf文件方法
查看>>
[leetcode]Rotate List @ Python
查看>>
C#-Mdi多文档窗体及其子窗体的排列 ---ShinePans
查看>>
hive 权限:Authorization failed:No privilege 'Create' found for outputs .
查看>>
Unit Test单元测试时如何模拟HttpContext
查看>>
高级PHP应用程序漏洞审核技术
查看>>
菜鸟教程之工具使用(一)——Git的基本使用
查看>>
如何处理数组越界而不会让程序崩溃?
查看>>
比较排序算法
查看>>
Quartz.NET作业调度框架详解
查看>>
Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
查看>>
C++内存未释放的情况
查看>>
请保护我们的地球
查看>>
内存优化之封装九宫格
查看>>
LeetCode——Largest Number
查看>>
shell的定义
查看>>
S5PV210的IRAM应用
查看>>
svn:database disk image is malformed问题解决方法
查看>>
开源工具DbUtils的使用(数据库的增删改查)
查看>>
Oracle性能分析3:TKPROF简介
查看>>