IoT demo

Dependencies:   mbed

Fork of my_example_esp8266 by liang brain

Files at this revision

API Documentation at this revision

Comitter:
zhangyx
Date:
Mon Mar 19 03:32:21 2018 +0000
Parent:
7:49a823b5a935
Commit message:
demo with pi;

Changed in this revision

esp8266.cpp Show annotated file Show diff for this revision Revisions of this file
esp8266.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 49a823b5a935 -r d5e340a59c71 esp8266.cpp
--- a/esp8266.cpp	Wed Dec 13 10:09:44 2017 +0000
+++ b/esp8266.cpp	Mon Mar 19 03:32:21 2018 +0000
@@ -27,25 +27,16 @@
     sprintf(cmdbuf, format "\r", ##__VA_ARGS__);\
     for(p=cmdbuf;*p;p++){\
         ser2esp8266.putc(*p);\
-        wait(0.05);\
+        wait(0.02);\
     }\
     wait(0.3);\
 }while(0)
 
 
-#ifdef DEBUG
-static void cb1() {                                                                    //将USB串口上得到的消息通过WIFI模块发出去
-    //ser2esp8266.putc(getchar());
-}
-#endif
-
-static void simple_callback() {                                                        //将WIFI模块得到的消息通过USB串口打印到电脑上
-//    putchar(ser2esp8266.getc());
-}
-//#endif
 
 void Esp8266::gotResponse(char *token, char *param)
 {
+    if(*token<'a' || *token>'z') return;
     ser2usb.printf("gotResponse %s %s\r\n", token, param);
     if(strcmp(token, "connected") == 0)
         mqtt_start = true;
@@ -82,6 +73,7 @@
 // 数据格式约定: #token+data
 void Esp8266::esp8266_rxCallback() {
     char in = ser2esp8266.getc();
+//    ser2usb.putc(in);
     enum{STATE_WAIT, STATE_TOKEN, STATE_PARAM};
     static uint8_t state = STATE_WAIT;
     static int tokenLen, paramLen;
@@ -185,8 +177,9 @@
     }
 }
 
-bool Esp8266::connect_mqtt_broker(char *ip, const char* sensors[][2], const char* actuator[][2]) {  //定义类的函数
+bool Esp8266::connect_mqtt_broker(char *ip, const char *node_name, const char* sensors[][2], const char* actuator[][2]) {  //定义类的函数
 
+    ESP_CMD("node_name = '%s'", node_name);
     ESP_CMD("m = mqtt.Client('i_' .. node.chipid(), 120)");
     ESP_CMD("m:connect(\"%s\",1883,0,function(conn)print (\"\\035connected\"); end)", ip);
 
@@ -201,19 +194,19 @@
     ESP_CMD("end");
     ESP_CMD("end)");
 
-    ESP_CMD("m:publish('/events/i_'..node.chipid()..'/online','',1,0)");
+    ESP_CMD("m:publish('/events/'..node_name..'/online','',1,0)");
     wait(0.1);
 
     char * capabilities = new char[512];
 
     if(sensors){
         buildCapability(capabilities, sensors);
-        ESP_CMD("m:publish('/capability/i_'..node.chipid()..'/values','%s',1,1)", capabilities);
+        ESP_CMD("m:publish('/capability/'..node_name..'/values','%s',1,1)", capabilities);
         wait(0.1);
     }
     if(actuator){
         buildCapability(capabilities, actuator);
-        ESP_CMD("m:publish('/capability/i_'..node.chipid()..'/control','%s',1,1)", capabilities);
+        ESP_CMD("m:publish('/capability/'..node_name..'/control','%s',1,1)", capabilities);
         wait(0.1);
         for (int i = 0; actuator[i][0]; ++i)
             subscribe_control(actuator[i][0]);
@@ -226,7 +219,7 @@
     
 bool Esp8266::publish_value(const char *topic, const char *data) {                      //定义类的函数
     //if (mqtt_start) {
-        ESP_CMD("m:publish('/values/i_'..node.chipid()..'/%s',\"%s\",0,1)", topic, data);
+        ESP_CMD("m:publish('/values/'..node_name..'/%s',\"%s\",0,1)", topic, data);
         wait(0.1);
     //}
     return true;
@@ -234,7 +227,7 @@
 
 bool Esp8266::subscribe_control(const char *topic, const char *data) {               //定义类的函数
     //if (mqtt_start) {
-        ESP_CMD("m:subscribe('/control/i_'..node.chipid()..'/%s', 0)", topic);
+        ESP_CMD("m:subscribe('/control/'..node_name..'/%s', 0)", topic);
         wait(0.1);
     //}
 
diff -r 49a823b5a935 -r d5e340a59c71 esp8266.h
--- a/esp8266.h	Wed Dec 13 10:09:44 2017 +0000
+++ b/esp8266.h	Mon Mar 19 03:32:21 2018 +0000
@@ -23,7 +23,7 @@
     // 连接模式
     bool connect_wifi(const char *wifi_ssid, const char *wifi_passwd);
     bool weblogin();
-    bool connect_mqtt_broker(char *ip, const char* sensors[][2], const char* actuator[][2]);
+    bool connect_mqtt_broker(char *ip, const char *node_name, const char* sensors[][2], const char* actuator[][2]);
     bool is_connected();
     
     bool publish_value(const char *topic, const char *data);
diff -r 49a823b5a935 -r d5e340a59c71 main.cpp
--- a/main.cpp	Wed Dec 13 10:09:44 2017 +0000
+++ b/main.cpp	Mon Mar 19 03:32:21 2018 +0000
@@ -11,49 +11,36 @@
 #include "esp8266.h"
 
 Serial ser2usb(PA_2, PA_3, 115200);
-DigitalOut LED(PD_2);
-DigitalIn humansensor(PA_0); 
-
-int test_main(void){
-    Serial esp8266(PA_9, PA_10, 9600);
-    while(1){
-        if(ser2usb.readable())
-            esp8266.putc(ser2usb.getc());
-        if(esp8266.readable())
-            ser2usb.putc(esp8266.getc());
-    }
-}
+DigitalIn ref(PA_12);
+DigitalOut LED(PC_13);
 
 int main(void) {
+    ser2usb.printf("starting\r\n");
     
     // 选定与 esp8266 相连接的串口,WiFi 名称和密码
-    // 参数分别为 TX pin / RX pin / SSID / Password
-    Esp8266 client(PA_9, PA_10, "TSINGHUA.iCenter", "TS.icenter");
+    Esp8266 client(PA_9, PA_10, "iot_b827eb91bf24", "b827ebc4ea71");// 参数分别为 TX pin / RX pin / SSID / Password
 
     //声明所有的传感器,每行一个,每个由名字、单位两部分组成,最后一行必须为空指针作为结尾
-    //服务器收到声明后,将在网页上显示这些传感器
     const char* sensors[][2] = {
-        //"pressure", "Pa",
-//        "temperature", "C",
-//        "humidity", "%",
-        "huamn","person",
+        "light", "lx",
+        "reflection"," ",
         NULL, NULL //最后一行以空指针作为结束标记
     };
 
     //声明所有的执行器,每行一个,每个由名字、参数类型两部分组成,最后一行必须为空指针作为结尾
-    //服务器收到声明后,将在网页上显示这些执行器
     const char* actuators[][2] = {
-        "servo1", "int",
-        "switch2", "int",
+        "led", "int",
         NULL, NULL //最后一行以空指针作为结束标记
     };
+    ser2usb.printf("connecting...\r\n");
 
     //连接到服务器
-    client.connect_mqtt_broker("tdxls-iot.xicp.net", sensors, actuators);
+    client.connect_mqtt_broker("192.168.12.1", "alpha", sensors, actuators);
 
     ser2usb.printf("Initialization done.\r\n");
 
     char actuator_name[32], control_value[32];
+    bool ref_last;
     float last_report=0;
     Timer t;// 定时器用于计量发送传感器数据的时间
     t.start();
@@ -61,23 +48,29 @@
     while(1) {
         //检查有没有收到新的执行器控制指令
         if(client.get_control_cmd(actuator_name, control_value)){
-            ser2usb.printf("Received CMD %s, %s\r\n", actuator_name, control_value);
+            ser2usb.printf("Received CMD %s %s\r\n", actuator_name, control_value);
             //判断哪个执行器收到命令
-            if(strcmp(actuator_name, "switch1")){
-                //do something for switch1
+            if(strcmp(actuator_name, "led")==0){
                 LED = atoi(control_value);
-            }else if(strcmp(actuator_name, "switch2")){
-                //do something for switch2
             }
         }
+        
+        bool reflection = ref;
+        if(reflection != ref_last){ //仅在传感器发生变化时汇报数据
+        
+            ref_last = reflection;
+
+            char val[4];
+            sprintf(val, "%d", (int)reflection);
+            
+            //汇报传感器数据,两个参数分别是传感器名字和值
+            client.publish_value("reflection", val);
+        }
 
         if(t.read() - last_report > 1){ // 每1s发送汇报一次传感器数据
 
             //汇报传感器数据,两个参数分别是传感器名字和值
-            //client.publish_value("pressure", "100000 Pa");
-//            client.publish_value("temperature", "20 C");
-//            client.publish_value("humidity", "30 %");
-            client.publish_value("huamn", "30 %");
+            //client.publish_value("light", "30 lx");
             
             last_report = t.read();
         }