YX ZHANG
/
iot_example
IoT demo
Fork of my_example_esp8266 by
Revision 8:d5e340a59c71, committed 2018-03-19
- Comitter:
- zhangyx
- Date:
- Mon Mar 19 03:32:21 2018 +0000
- Parent:
- 7:49a823b5a935
- Commit message:
- demo with pi;
Changed in this revision
--- 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); //}
--- 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);
--- 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(); }