极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4449|回复: 3

基于tcp长连接的乐联网反控

[复制链接]
发表于 2013-7-2 09:52:28 | 显示全部楼层 |阅读模式
本帖最后由 俯首观天 于 2013-7-2 09:54 编辑

在很久之前,我曾用arduino接入过乐联网平台,测试过其强大的数据处理能力,之后就没有再折腾。前几天上网,偶然发现乐联网开始支持tcp长连接的反向控制,顿时来了兴趣。像我等小菜,如果能依靠乐联完成自动化智能化控制,必是一种莫大的喜悦。于是在瘦网虫等大牛的耐心帮助下,终于完成了自己的想法。

废话不多说,先来说下tcp长连接的优势,之前我们对设备控制的方式比较繁琐,内网控制要知道内网ip,外网控制则需要知道外网ip,并且在路由上转发端口。其工作方式为设备每次动作时都会与服务器连接,完成动作当即断开。而且由于ip地址会在每次申请时改变,这就对远控造成了不变。tcp长连接却很好的解决了这个问题,它的运作方式是通过保持服务器与设备的连接形成直接的交互。好比打通了 设备与服务器的隧道,不管服务器与设备之间有几层墙,数据依旧可以依靠这个隧道自由穿行。上面是小菜个人理解,不对的地方欢迎大侠批评。

说了这么多,好像很复杂的样子,其实瘦网虫大牛早就写好了相关库文件,我们只需要配置一下就可以使用了。
瘦网虫的代码托管在https://github.com/lewei50/LeweiTcpClient,点击就可以下载。


下载到电脑上,解压缩到Arduino IDE的libraries文件夹里,注意,解压出来的文件夹不能包含中文或是特殊字符。这一切都完成后,我们就可以开始打开IDE调出示例了。

1.bmp

要与服务器正常联通,有三个关键因素,一是你的userkey,二是网关ID,还有就是传感器标识。当然如果你还没有乐联网账号,可以先申请一下,过程也是非常简单,这里我只是把注册后的三个要素点说明一下。

userkey




网关ID

2.jpg


设备标识

3.jpg

这三者都要用到,尤其是userkey,它是你在乐联网的身份证,点击重新生成要慎重。

下面就可以看看我们打开的示例,其中有几处需要修改。

4.jpg

如图所示,标注的地方,上面要写你的userkey,下面填写网关号。
之后就可以写入arduino了。
同时按照示例的内容,乐联网的后台要这样配置:
5.jpg

6.jpg

好了,现在就可以试试反控了,TCP长连接的关键点在client->keepOnline();这行,它写在loop里,程序通过它保持与服务器的连接,所以如果你要在loop里加入自己的函数,记得要控制好执行时间,否则连接会断开,造成反控失败。

下面是小菜我写的程序,它可以上传数据的同时执行反控,贴出来欢迎大家批评。
  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3. #include <LeweiTcpClient.h>
  4. #include <EEPROM.h>
  5. #include <dht11.h>
  6. dht11 DHT11;
  7. #define DHT11PIN 2
  8. float a;

  9. byte mac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};

  10. #define LW_USERKEY "你的userkey"
  11. #define LW_GATEWAY "01"

  12. IPAddress ip(192,168,1, 15);
  13. IPAddress mydns(8,8,8,8);
  14. IPAddress gw(192,168,1,1);
  15. IPAddress subnet(255,255,255,0);

  16. LeweiTcpClient *client;
  17. void setup()
  18. {
  19.   
  20.   pinMode(3,OUTPUT);//反控继电器引脚
  21.   digitalWrite(3,LOW);
  22.   Serial.begin(9600);
  23.   client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY);
  24.   client->easySetupMode(false);
  25.   UserFunction uf1(test1,"upSensor");
  26.   client->addUserFunction(uf1);
  27. }

  28. void loop()
  29. {
  30.     sjsc();//读取模拟5口的读数并上传
  31.     client->keepOnline();
  32. }



  33. void test1(char * p1)
  34. {
  35.   client->setRevCtrlMsg("true","that's OK");
  36.   Serial.println("test function recall1");

  37.   Serial.println(p1);
  38.   if (String(p1)=="1"){digitalWrite(3,HIGH);Serial.println("lamp is ON");}//继电器开
  39.   else if (String(p1)=="0"){digitalWrite(3,LOW);Serial.println("lamp is OFF");}//继电器关
  40.   
  41. }
  42. void sjsc()
  43. {
  44. a = analogRead(5);
  45. Serial.println("update...");
  46. client->sendSensorValue("sd",a);//sd是你的设备标识
  47. Serial.println(a);
  48. }
复制代码


效果:
7.jpg
8.jpg
9.jpg
图片 001.jpg

最后说下我认为需要注意的地方。
一,由于数据上传和远控很占用内存,所以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);

还是那句话,本人小菜,写这个意在向大家推荐好的平台和好的库文件,视频什么的就不传了,有不足的希望大家批评指正。
回复

使用道具 举报

发表于 2013-7-2 13:02:55 | 显示全部楼层
328的板子是指arduino UNO吗?
UNO可以使用LeweiTcpClient的分支LeweiTcpClientLite来执行反向控制,你自己的代码不需要变,重新下载Lite库就可以了。

btw,不是大牛,大牛不会被电到好几次。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-3 18:32:17 | 显示全部楼层
瘦网虫 发表于 2013-7-2 13:02
328的板子是指arduino UNO吗?
UNO可以使用LeweiTcpClient的分支LeweiTcpClientLite来执行反向控制,你自己 ...

328指的是328p那个板子,不死UNO。就我第一次死活连不上的那个
回复 支持 反对

使用道具 举报

发表于 2013-12-25 15:09:31 | 显示全部楼层
LZ我也刚接触这个,学习了你的之后,测试命令的时候显示gateway offline,这是为什么么啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-8-25 02:38 , Processed in 0.051461 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表