当前位置:   article > 正文

使用 Arduino Uno 与MQTT,echarts,java自己手动撸一个IOT平台

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

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

项目结构:
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 库http://pubsubclient.knolleary...
3、下载 Arduino 的客户端AES库 https://github.com/DavyLandma...
4、把下载的库导入 Arduino IDE 目录的 libraries 子目录,然后新建一个项目,下面是示例项目。

  1. 程序初始化自定义信息列表:
  2. 1、网卡MAC地址:mac
  3. 2、 IP:ip
  4. 3、服务器地址:localserver
  5. 4、AES密钥:uint8_t key
  6. 5、MQTT验证用户名:username
  7. 6、MQTT验证密码:password
  8. 系统变量:
  9. 1、DHT11感应器:DHT11
  10. 2、获取DHT11感应器 的实时数据函数:getData()
  11. 3、将获取的数据拼接成json字符串函数:buildJson()
  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3. #include <PubSubClient.h>
  4. #include <dht11.h>
  5. #include <AESLib.h>
  6. // MAC address
  7. byte mac[] = {0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0x4D };
  8. char macstr[] = "deedbafefeed";
  9. // local MQTT server
  10. byte localserver[] = {192, 168, 1, 5 };
  11. // IP
  12. byte ip[] = {192, 168, 1, 22 };
  13. String clientName = String("Arduino:") + macstr;
  14. uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5};
  15. char username[]="test";
  16. char password[]="test";
  17. void callback(char* topic, byte* payload, unsigned int length);
  18. dht11 DHT11;
  19. float tempF = 0.0;
  20. float tempC = 0.0;
  21. float humidity = 0.0;
  22. unsigned long time = 0;
  23. EthernetClient ethClient;
  24. PubSubClient client(localserver, 8088, 0, ethClient);
  25. void setup()
  26. {
  27. // Start the ethernet client, open up serial port for debugging, and attach the DHT11 sensor
  28. Ethernet.begin(mac, ip);
  29. Serial.begin(9600);
  30. DHT11.attach(3);
  31. }
  32. void getData() {
  33. int chk = DHT11.read();
  34. switch (chk)
  35. {
  36. case 0:
  37. Serial.println("Read OK");
  38. humidity = (float)DHT11.humidity;
  39. tempF = DHT11.fahrenheit();
  40. tempC = DHT11.temperature;
  41. break;
  42. case -1:
  43. Serial.println("Checksum error");
  44. break;
  45. case -2:
  46. Serial.println("Time out error");
  47. break;
  48. default:
  49. Serial.println("Unknown error");
  50. break;
  51. }
  52. }
  53. String buildJson() {
  54. String data = "{";
  55. data+="\n";
  56. data+="\"temperatureF\": ";
  57. data+=(int)tempF;
  58. data+= ",";
  59. data+="\n";
  60. data+="\"temperatureC\": ";
  61. data+=(int)tempC;
  62. data+= ",";
  63. data+="\n";
  64. data+="\"humidity\": ";
  65. data+=(int)humidity;
  66. data+="\n";
  67. data+="}";
  68. //data+="\n";
  69. //data+="}";
  70. return data;
  71. }
  72. void loop()
  73. {
  74. char clientStr[29];
  75. clientName.toCharArray(clientStr,29);
  76. char topicStr[26];
  77. getData();
  78. if (!client.connected()) {
  79. Serial.print("Trying to connect to: ");
  80. Serial.println(clientStr);
  81. aes128_enc_single(key,username);
  82. aes128_enc_single(key, password);
  83. client.connect(clientStr,username,password);
  84. }
  85. if (client.connected()) {
  86. client.subscribe ("test", 0);
  87. String json = buildJson();
  88. char jsonStr[200];
  89. json.toCharArray(jsonStr,200);
  90. boolean pubresult = client.publish("test",jsonStr);
  91. Serial.print("attempt to send ");
  92. Serial.println(jsonStr);
  93. Serial.print("to ");
  94. Serial.println(topicStr);
  95. if(pubresult)
  96. Serial.println("successfully sent");
  97. else
  98. Serial.println("unsuccessfully sent");
  99. }
  100. delay(20000);
  101. }

构建IOT数据接收服务:

1、下载国人开源的MQTT服务器:https://github.com/zer0Black/...
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://echarts.baidu.com/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/176296
推荐阅读
相关标签
  

闽ICP备14008679号