本帖最后由 俯首观天 于 2013-7-2 09:54 编辑
在很久之前,我曾用arduino接入过乐联网平台,测试过其强大的数据处理能力,之后就没有再折腾。前几天上网,偶然发现乐联网开始支持tcp长连接的反向控制,顿时来了兴趣。像我等小菜,如果能依靠乐联完成自动化智能化控制,必是一种莫大的喜悦。于是在瘦网虫等大牛的耐心帮助下,终于完成了自己的想法。
废话不多说,先来说下tcp长连接的优势,之前我们对设备控制的方式比较繁琐,内网控制要知道内网ip,外网控制则需要知道外网ip,并且在路由上转发端口。其工作方式为设备每次动作时都会与服务器连接,完成动作当即断开。而且由于ip地址会在每次申请时改变,这就对远控造成了不变。tcp长连接却很好的解决了这个问题,它的运作方式是通过保持服务器与设备的连接形成直接的交互。好比打通了 设备与服务器的隧道,不管服务器与设备之间有几层墙,数据依旧可以依靠这个隧道自由穿行。上面是小菜个人理解,不对的地方欢迎大侠批评。
说了这么多,好像很复杂的样子,其实瘦网虫大牛早就写好了相关库文件,我们只需要配置一下就可以使用了。
瘦网虫的代码托管在https://github.com/lewei50/LeweiTcpClient,点击就可以下载。
下载到电脑上,解压缩到Arduino IDE的libraries文件夹里,注意,解压出来的文件夹不能包含中文或是特殊字符。这一切都完成后,我们就可以开始打开IDE调出示例了。
要与服务器正常联通,有三个关键因素,一是你的userkey,二是网关ID,还有就是传感器标识。当然如果你还没有乐联网账号,可以先申请一下,过程也是非常简单,这里我只是把注册后的三个要素点说明一下。
userkey
网关ID
设备标识
这三者都要用到,尤其是userkey,它是你在乐联网的身份证,点击重新生成要慎重。
下面就可以看看我们打开的示例,其中有几处需要修改。
如图所示,标注的地方,上面要写你的userkey,下面填写网关号。
之后就可以写入arduino了。
同时按照示例的内容,乐联网的后台要这样配置:
好了,现在就可以试试反控了,TCP长连接的关键点在client->keepOnline();这行,它写在loop里,程序通过它保持与服务器的连接,所以如果你要在loop里加入自己的函数,记得要控制好执行时间,否则连接会断开,造成反控失败。
下面是小菜我写的程序,它可以上传数据的同时执行反控,贴出来欢迎大家批评。 - #include <SPI.h>
- #include <Ethernet.h>
- #include <LeweiTcpClient.h>
- #include <EEPROM.h>
- #include <dht11.h>
- dht11 DHT11;
- #define DHT11PIN 2
- float a;
- byte mac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
- #define LW_USERKEY "你的userkey"
- #define LW_GATEWAY "01"
- IPAddress ip(192,168,1, 15);
- IPAddress mydns(8,8,8,8);
- IPAddress gw(192,168,1,1);
- IPAddress subnet(255,255,255,0);
-
- LeweiTcpClient *client;
- void setup()
- {
-
- pinMode(3,OUTPUT);//反控继电器引脚
- digitalWrite(3,LOW);
- Serial.begin(9600);
- client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY);
- client->easySetupMode(false);
- UserFunction uf1(test1,"upSensor");
- client->addUserFunction(uf1);
- }
- void loop()
- {
- sjsc();//读取模拟5口的读数并上传
- client->keepOnline();
- }
- void test1(char * p1)
- {
- client->setRevCtrlMsg("true","that's OK");
- Serial.println("test function recall1");
- Serial.println(p1);
- if (String(p1)=="1"){digitalWrite(3,HIGH);Serial.println("lamp is ON");}//继电器开
- else if (String(p1)=="0"){digitalWrite(3,LOW);Serial.println("lamp is OFF");}//继电器关
-
- }
- void sjsc()
- {
- a = analogRead(5);
- Serial.println("update...");
- client->sendSensorValue("sd",a);//sd是你的设备标识
- Serial.println(a);
- }
复制代码
效果:
最后说下我认为需要注意的地方。
一,由于数据上传和远控很占用内存,所以328和168的板子运行不起来,至少是我手头的运行不了。
二, client->easySetupMode(false);这句如果改成ture,同时在串口里得到设备IP,可以在浏览器里配置网关和userkey,这是一个非常好非常实用的创意。这点让我很佩服作者。
三,IPAddress ip(192,168,1, 15);IPAddress mydns(8,8,8,8);IPAddress gw(192,168,1,1);IPAddress subnet(255,255,255,0);这几句是用来手动设置IP的,如果要手动设置,后面的client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY);应该改为client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY,mac,ip,mydns,gw,subnet);
还是那句话,本人小菜,写这个意在向大家推荐好的平台和好的库文件,视频什么的就不传了,有不足的希望大家批评指正。 |