好在互联网发展到今天程序世界拥有巨大的资源,感谢程序猿们的奉献,不用造太多轮子,废话少说,撸起袖子直接干:
项目结构:
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 子目录,然后新建一个项目,下面是示例项目。
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <dht11.h>
#include <AESLib.h>
// MAC address
byte mac[] = {0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0x4D };
char macstr[] = "deedbafefeed";
// local MQTT server
byte localserver[] = {192, 168, 1, 5 };
// IP
byte 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);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
构建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做的不错,将数据导出,按文件配置好即可产出了。
原文作者: 酒缸的9