ESP8266WIFI模块SMQ服务LED应用示例

SMQ服务 esp8266
xdsnet
发布时间: 2018-07-16
阅读: 2528

现在有很多Iot服务平台,但大多是云平台,今天就介绍一个基于SMQ本地服务的ESP8266模块应用示例。

一、环境介绍

ESP8266Wifi模块(我用的是安信可的ESP-01s,也就是社区活动的哪款,相关资料见 http://wiki.ai-thinker.com/esp8266 )

一块面包板(因为电路不复杂,其实随便一块就好)

一块USB-TTL模块(我用的也是社区活动的,用的是2101芯片,提供了5V->3.3V)

2个LED(1个蓝色,1个黄色)

无线路由器(提供联网支持,等下所有设备都需要连接上去,在一个局域网段内)

1个连上局域网(互联网)的Linux主机(也可以是windows),用来部署SMQ server,服务器IP 192.168.10.111。

一些杜邦线,用于连接ESP-01s与USB-TTL模块,以及LED等。

Arduino编程环境(windows、linux、macos都可以,我采用的是1.8.4版本),已经部署好ESP8266编程支持(可参考 http://www.ickey.cc/community/thread-101186-1-1.html)。


二、MSQ Server的搭建(包含LED应用支持)

本次的MSQ Server是采用的mako server(https://makoserver.net/),在 https://makoserver.net/download/overview/ 介绍中提到了很多个系统版本服务下载安装,我实际用的是Linux(Debian 9 ,64bit,X86_64),安装比较简单,就是用root权限执行


bash -c "$(wget -q -O- makoserver.net/download/InstallMakoX86.sh)"
即可,因为我的系统中已经安装有其它http服务,所以会分配一个其它的端口解决端口冲突问题,这里假定端口是9357,这个端口需要记住,以保障后面联网使用正确,也可以直接下载windows版本的服务器,在windows下打开即可。至此,服务已经部署,用浏览器打开可以显示出一个页面,类似下图(1个404页面,只是表明服务已经部署,但没有具体应用支持)

屏幕快照 2018-07-08 10.55.01.png

但这还不能提供任何具体的服务,还需要部署应用支持。这里下载 http://makoserver.net/download/IoT-LED-Broker.tar.gz , 把所有文件解压到/home/mako/www下(linux平台)

支持搭建好了LED的IoT应用服务环境。这时再用浏览器访问http://192.168.10.111:9357/ 会出现如下的页面

屏幕快照 2018-07-08 11.02.33.png

这表明应用支持已经部署好,这个页面长时间也可能转换成

屏幕快照 2018-07-08 11.04.00.png


三、模拟LED-IoT测试服务支持是否可用

在linux下下载 realtimelogic.com/downloads/SMQ/SimpleMQ.zip ,这是一个linux下的LED-IoT模拟客户端程序,解压到SimpleMQ目录,修改其中

examples/m2m-led.c 文件中 


#define SIMPLEMQ_DOMAIN "http://simplemq.com"

根据你实际的IP地址和端口修改,比如我就修改为:


#define SIMPLEMQ_DOMAIN "http://192.168.10.111:9357"

然后执行make 编译(编译环境请参考其他文章),则目录下产生一个led-msq 的可执行文件,执行它,正常则窗口如下

屏幕快照 2018-07-08 11.14.58.png


这时浏览器窗口如下

屏幕快照 2018-07-08 11.15.19.png

这表明SMQ服务支持已经完全可用了(浏览器窗口进行操作,则命令行窗口有反映,命令行窗口操作也会反映到浏览器窗口,可自行实验),下面是时候实现ESP8266应用了。


四、ESP8266 wifi模块的应用系统搭建

下载https://realtimelogic.com/downloads/SMQ/SimpleMQ.zip 文件,这个就是ESP8266 简单应用SMQ的Arduino工程例子。解压它到一个目录下,用Arduino打开其中的SMQ.ino文件,即可编辑。


这里先插几句,因为原始工程是针对完整的ESP8266模块(引出了更多的IO接口环境)编写,而我的ESP8266 模块(安信可 ESP-01s)只引出了IO0和IO2,所以需要进行修改。


主要做如下修改,对SMQ.ino文件


#error remove this line and set credentials below
static const char* ssid = "";
static const char* password = "";
所有的ESP8266模块都需要根据路由器情况修改以保障联网,比如我修改为



//#error remove this line and set credentials below
static const char* ssid = "myrouter";//自己路由器的ap ssid
static const char* password = "router123456";// 自己路由器密码


此外根据我的模块个别的修改,把



#define D0 16 // Bultin LED on Geekcreit ESP8266
#define D7 13 // Wire LED between D7 and ground
#define D8 15 // Wire LED between D8 and ground

修改为


#define D0 0 // Bultin LED on Geekcreit ESP8266
#define D7 2 // Wire LED between D7 and ground
//#define D8 15 // Wire LED between D8 and ground


static const LedInfo ledInfo[] = {
   {
      "Bultin LED",
      LedColor_blue,
      1
   },
   {
      "LED D7",
      LedColor_red,
      2
   },
   {
      "LED D8",
      LedColor_red,
      3
   }
};
修改为:


static const LedInfo ledInfo[] = {
   {
      "Blue LED(IO0-Low-On)",
      LedColor_blue,
      1
   },
   {
      "Yellow LED(IO2-High-On)",
      LedColor_yellow,
      2
   }
};


void setup()
{
   Serial.begin(115200);
   delay(10);
 
   pinMode(D0, OUTPUT);
   digitalWrite(D0, HIGH);
   pinMode(D7, OUTPUT);
   digitalWrite(D7, LOW);
   pinMode(D8, OUTPUT);
   digitalWrite(D8, LOW);
 
   // Connect to WiFi network
   Serial.println();
   Serial.println();
   Serial.print("Connecting to ");
   Serial.println(ssid);
 
   WiFi.begin(ssid, password);
 
   while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
   }
   Serial.println("");
   Serial.println("WiFi connected");
}
修改为:


void setup()
{
   Serial.begin(115200);
   delay(10);
 
   pinMode(D0, OUTPUT);
   digitalWrite(D0, HIGH);
   pinMode(D7, OUTPUT);
   digitalWrite(D7, LOW);
   //pinMode(D8, OUTPUT);
   //digitalWrite(D8, LOW);
 
   // Connect to WiFi network
   Serial.println();
   Serial.println();
   Serial.print("Connecting to ");
   Serial.println(ssid);
 
   WiFi.begin(ssid, password);
 
   while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
   }
   Serial.println("");
   Serial.println("WiFi connected");
}


extern "C" int setLed(int ledId, int on)
{
   Serial.printf("Set led %d %s\n", ledId, on ? "on" : "off");
   if(ledId >= 1 && ledId <= LEDSLEN)
   {
      leds[ledId-1] = on;
      switch(ledId)
      {
         case 1: digitalWrite(D0, on ? LOW : HIGH); break;
         case 2: digitalWrite(D7, on ? HIGH : LOW); break;
         case 3: digitalWrite(D8, on ? HIGH : LOW); break;
      }
      return 0;
   }
   return -1;
}
修改为:


extern "C" int setLed(int ledId, int on)
{
   Serial.printf("Set led %d %s\n", ledId, on ? "on" : "off");
   if(ledId >= 1 && ledId <= LEDSLEN)
   {
      leds[ledId-1] = on;
      switch(ledId)
      {
         case 1: digitalWrite(D0, on ? LOW : HIGH); break;
         case 2: digitalWrite(D7, on ? HIGH : LOW); break;
         //case 3: digitalWrite(D8, on ? HIGH : LOW); break;
      }
      return 0;
   }
   return -1;
}



led-example.cpp文件


#define SIMPLEMQ_DOMAIN "http://simplemq.com"

修改为
// 填入实际SMQ服务地址和端口信息
#define SIMPLEMQ_DOMAIN "http://192.168.10.111:9357" 

至此,代码适配修改已经完成,利用Arduino编译并写入到模块(写入方法参考相关文档)。


五、连接好模块和LED实现完整电路,电路图如下:

实际连接情况如下图
ESP8266wif.jpg 


实现后可以进行测试了,模块通电,打开浏览器:如下,已经有新的设备连接上SMQ服务(这里是192.168.10.116)


屏幕快照 2018-07-08 12.36.03.png 


现在可以通过浏览器来控制灯的开关啦,演示视频地址: https://v.youku.com/v_show/id_XMzcxMTIyNzI2NA==.html


原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (0)
xdsnet 擅长:科研教育
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)