· 6 years ago · Jun 28, 2019, 07:40 AM
1#include <ArduinoJson.h>
2#include <PubSubClient.h>
3#include <ESP8266WiFi.h>
4
5#define WIFI_AP "linksys"
6#define WIFI_PASSWORD ""
7#define clientId "b356cdd0-9973-11e9-b8f5-5335fd44659d"
8
9char Thingsboard_Server[] = "192.168.1.122";
10#define User_name "11111111"
11WiFiClient wifiClient;
12
13int status = WL_IDLE_STATUS;
14
15PubSubClient client(wifiClient);
16
17boolean gpioStatus[] = {false,false,false};
18void setup() {
19 // put your setup code here, to run once:
20 Serial.begin(115200);
21 delay(10);
22 pinMode(D0,OUTPUT);
23 pinMode(D1,OUTPUT);
24 pinMode(D2,OUTPUT);
25 digitalWrite(D0,HIGH);
26 digitalWrite(D1,HIGH);
27 digitalWrite(D2,HIGH);
28 InitWiFi();
29 client.setServer(Thingsboard_Server,1883);
30 client.setCallback(callback);
31}
32
33void loop() {
34 // put your main code here, to run repeatedly:
35 if(!client.connected()){
36 reconnect();
37 }
38 client.loop();
39}
40void callback(const char* topic, byte* payload, unsigned int length){
41 //Serial.println("On message");
42 char json[length + 1];
43 strncpy (json, (char*)payload, length);
44 json[length] = '\0';
45
46 Serial.println("Topic: ");
47 Serial.println(topic);
48
49 Serial.println("Message: ");
50
51 Serial.println(json);
52
53 StaticJsonBuffer<200> jsonBuffer;
54
55 JsonObject &data = jsonBuffer.parseObject((char*)json);
56
57 if (!data.success()){
58 Serial.println("parseObject() failed");
59 return;
60 }
61 String methodName = String((const char*)data["method"]);
62 if(methodName.equals("R1")){
63 if(data["params"]==true){
64 digitalWrite(D0,LOW);
65 gpioStatus[0]=true;
66 }
67 else{
68 digitalWrite(D0,HIGH);
69 gpioStatus[0]=false;
70 }
71 }
72/**************************************************/
73 if(methodName.equals("R2")){
74 if(data["params"]==true){
75 digitalWrite(D1,LOW);
76 gpioStatus[1]=true;
77 }
78 else{
79 digitalWrite(D1,HIGH);
80 gpioStatus[1]=false;
81 }
82 }
83/**************************************************/
84 if(methodName.equals("R3")){
85 if(data["params"]==true){
86 digitalWrite(D2,LOW);
87 gpioStatus[2]=true;
88 }
89 else{
90 digitalWrite(D2,HIGH);
91 gpioStatus[2]=false;
92 }
93 }
94/**************************************************/
95 client.publish("v1/devices/me/attributes", get_gpio_status().c_str());
96 }
97void reconnect(){
98// Loop until we're reconnected
99 while (!client.connected()){
100 status = WiFi.status();
101 if( status != WL_CONNECTED){
102 WiFi.begin(WIFI_AP, WIFI_PASSWORD);
103 while (WiFi.status() != WL_CONNECTED){
104 delay(500);
105 Serial.print(".");
106 }
107 Serial.println("Connected to AP");
108 }
109 Serial.print("Connecting to Thingsboard node ...");
110// Attempt to connect (clientId, username, password)
111 if(client.connect(clientId,User_name,NULL)){
112 Serial.println( "[DONE]" );
113 client.subscribe("v1/devices/me/rpc/request/+");//dang ky nhan cas lenh rpc tu cloud
114 client.publish("v1/devices/me/attributes", get_gpio_status().c_str());
115 }
116 else{
117 Serial.print( "[FAILED] [ rc = " );
118 Serial.print( client.state());
119 Serial.println(" : retrying in 5 seconds]");
120 // Wait 5 seconds before retrying
121 delay( 5000 );
122 }
123 }
124}
125String get_gpio_status(){
126 // Prepare gpios JSON payload string
127 StaticJsonBuffer<200> jsonBuffer;
128
129 JsonObject& data = jsonBuffer.createObject();
130
131 data["R1"]=gpioStatus[0] ? true : false;
132 data["R2"]=gpioStatus[1] ? true : false;
133 data["R3"]=gpioStatus[2] ? true : false;
134 char payload[256];
135 data.printTo(payload, sizeof(payload));
136 String strPayload = String(payload);
137 Serial.println("Get gpio status: ");
138 Serial.println(strPayload);
139 return strPayload;
140}
141void InitWiFi(){
142 Serial.println("Connecting to AP ...");
143// attempt to connect to WiFi network
144 WiFi.begin(WIFI_AP, WIFI_PASSWORD);
145 while (WiFi.status() != WL_CONNECTED){
146 delay(500);
147 Serial.print(".");
148 }
149 Serial.println("Connected to AP");
150}