极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 39705|回复: 24

乐联网功能介绍-控制设备

[复制链接]
发表于 2013-8-5 15:11:20 | 显示全部楼层 |阅读模式
本帖最后由 瘦网虫 于 2014-12-24 09:27 编辑

最近陆陆续续很多人玩了乐联网的反向控制功能,实现了自己的反向控制函数的调用,而且可以通过网页控制自己的设备了。

于是很多人想更进一步,通过手机等设备来控制自己的设备。但是发现乐联网里面的“控制设备”这个功能不是那么好用。

这里简单介绍一下,并且附加一些arduino代码,供有兴趣的人参考。





同样是反向控制,但是,是有区别的。

它们在乐联网上的实现,也是所不同的。

对于“控制设备”,可以是个继电器、开关、调速器等,它需要向服务器(例如你的手机,或者网页)报告它所有设备的当前状态(通过响应“getAllSensors”命令),例如设备名,id,类型,当前状态等。在进行完“切换”操作后,还要再汇报一次自己的当前状态,已更新服务器端存储的信息。


  1. /*
  2. {"method":"response","result":{"successful":true,"message":"null","data":[{"id":"POWER","type":"jdq","name":"POWER","value":"1","status":"ok"}]}}&^!
  3. 你的控制开关叫 POWER,你就发上面的数据
  4. 服务器向你发getAllSensors你就返回上面的
  5. */
复制代码


对于“执行命令”,就没有那么多讲究了。只要接收到服务器发来的命令,跟自己名字匹配上了,就执行就可以了。不需要向请求方发送自己的执行结果等。

下面结合个实例,让玩家可以简单的实现自己的“控制设备”,并且希望能有更深刻的理解:

首先你要有个乐联网的E-KIT,不好意思,嵌入广告了。
或者你可以用个arduino UNO+w5100搭一个平台也可以实现,最好是用arduino mega 2560+w5100来测试这个代码。
然后,你要有乐联网帐号什么的,这个不多说了。

然后下载https://github.com/lewei50/LeweiTcpClient/tree/LeweiTcpClientliteBeta,这个库支持了自定义的“控制设备”。
下面的代码里还用到了自己写的IRremoteLite库,在这里下载
https://github.com/yangbo1979/IRremoteLite
如果你不需要红外控制的话,可以自行删除对应的代码。我这里控制的是“格力”的挂机开关。
下面的代码里面用到了dht11传感器测温湿度,一个红外2极管发射红外指令。
接线如下:
DHT11 vcc pin->+5v
DHT11 data pin->d2(数字引脚2,从d0开始数,第三个孔)
DHT11 gnd pin->gnd


红外接线:
GND->红外的瘦的那个针脚
D3->红外发射管里面那个碗状的针脚。

把下面的代码,改下userkey和gateway后刷入你的设备。


  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3. #include <LeweiTcpClient.h>//乐联网的类库
  4. #include <EEPROM.h>
  5. #include <IRremoteLite.h> //红外控制的自定义精简库
  6. #include <dht11.h>
  7. //#include <EthernetUdp.h>

  8. #define LW_USERKEY "your api key here"//change your api key here,这里要改
  9. #define LW_GATEWAY "01"//change your gateway number here,这里看着改

  10. //unsigned int localPort = 9959;
  11. // buffers for receiving and sending data
  12. //char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
  13. //char  ReplyBuffer[] ="{"deviceName":"01","api":"http://tcp.lewei50.com:9965/?method=send&gatewayNo=01","requestType":"get"}";       // a string to send back
  14. //EthernetUDP Udp;

  15. dht11 DHT11;
  16. #define DHT11PIN 2

  17. IRsend irsend;

  18. //use PROGMEM to defined the 'large' variables into flash,not using the ram
  19. //开关格力空调的红外原始编码
  20. PROGMEM unsigned int rawCodes_ac_open[200] = {4397,4368,561,1578,560,537,557,1581,584,1582,584,486,558,537,584,1554,560,538,558,510,558,1607,557,513,585,511,556,1585,581,1583,583,486,557,1609,556,513,558,538,557,512,558,1607,558,1583,557,1608,558,1608,557,1580,559,1606,559,1581,556,1609,557,512,559,537,558,512,557,539,557,512,558,1607,558,1582,558,537,584,1555,558,1607,556,514,559,537,556,513,558,537,556,514,558,1606,559,511,583,513,558,1582,557,1608,558,1580,585,5154,4419,4347,584,1555,558,539,557,1581,584,1581,571,501,577,516,571,1568,557,541,581,487,557,1608,557,513,558,538,557,1582,583,1582,584,487,557,1608,557,511,611,486,558,510,558,1607,557,1609,556,1583,583,1582,583,1555,558,1607,558,1607,559,1582,557,537,585,486,558,510,558,540,558,509,557,1608,558,1608,557,512,559,1606,559,1581,558,537,581,490,558,510,587,511,557,511,559,1606,559,510,569,527,558,1582,560,1604,561,1605,561};
  21. PROGMEM unsigned int rawCodes_ac_close[200] ={4193,4096,595,1451,589,432,588,1453,589,1454,587,432,587,434,563,1475,591,433,564,458,586,1453,587,434,587,433,563,1476,590,1454,587,434,565,1475,566,456,563,1476,590,1453,587,1452,564,1477,566,457,585,1453,567,1477,587,1452,564,460,584,434,564,457,562,460,562,1475,587,434,588,433,562,1476,589,1455,563,1476,588,433,586,436,562,459,586,433,563,458,609,410,563,458,586,433,587,1454,587,1453,563,1477,564,1477,565,1476,581,4858,4237,4074,593,1453,562,460,563,1477,563,1477,565,458,587,434,584,1454,590,433,562,458,587,1453,588,436,584,436,562,1476,588,1453,590,434,562,1480,586,435,586,1453,565,1476,589,1453,589,1451,565,461,583,1453,589,1453,588,1454,564,457,587,434,587,433,587,435,561,1479,586,435,562,458,588,1452,590,1452,565,1476,564,458,587,436,584,433,562,458,588,432,562,461,585,434,584,435,589,1451,588,1453,588,1453,590,1453,590,1451,590};
  22. //下面的地址什么的,根据需要自己改
  23. byte mac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
  24. IPAddress ip(192,168,1, 15);
  25. IPAddress mydns(8,8,8,8);
  26. IPAddress gw(192,168,1,1);
  27. IPAddress subnet(255,255,255,0);

  28. LeweiTcpClient *client;
  29. long starttime;
  30. int postInterval = 10000;//10秒更新一次温湿度
  31. void setup()
  32. {
  33.   Serial.begin(9600);
  34.   pinMode(3, OUTPUT);
  35.   starttime = millis();
  36.   //you can use 3 ways to init your network
  37.   //1.simplest
  38.   //client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY);
  39.   //2.set mac only
  40.   //client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY,mac);
  41.   //3.full setting for your network
  42. //使用了自定义的ip地址来初始化乐联网的库
  43.   client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY,mac,ip,mydns,gw,subnet);
  44. //  Udp.begin(localPort);
  45.   
  46.   //test1 is the function you write below to handle your program
  47.   //"testFunction" is the function name you set on website:[url]http://www.lewei50.com/[/url]
  48.   //on "controll command manager" menu
  49.   //we test transfer 1-5 para from website(you defined on it) to your arduino
  50.   //enjoy it
  51.   
  52. //  UserFunction ufChangeLed(changeLed,"changeLed");
  53. //  client->addUserFunction(ufChangeLed);
  54. //这里是乐联网的“控制命令”的自定义
  55.   UserFunction uf1(openAc,"openMyAC");
  56.   client->addUserFunction(uf1);
  57.   UserFunction uf2 (closeAc,"closeMyAc");
  58.   client->addUserFunction(uf2);
  59. //这里是乐联网的“控制设备”的自定义,设备的开始默认状态为开(1)
  60.   UserSwitch us1 (switchTest,"swTest",1);
  61.   client->addUserSwitch(us1);
  62. //  client->easySetupMode(true);
  63.   client->checkFreeMem();
  64. }

  65. void loop()
  66. {
  67.     client->keepOnline();
  68.     if ((millis()-starttime) > postInterval)
  69.     {
  70.       sendDht11Value();
  71.       starttime = millis();
  72.     }
  73.     /*
  74.   int packetSize = Udp.parsePacket();
  75.   if(packetSize)
  76.   {
  77.    
  78.     Serial.print("Received packet of size ");
  79.     Serial.println(packetSize);
  80.     Serial.print("From ");
  81.     IPAddress remote = Udp.remoteIP();
  82.     for (int i =0; i < 4; i++)
  83.     {
  84.       Serial.print(remote[i], DEC);
  85.       if (i < 3)
  86.       {
  87.         Serial.print(".");
  88.       }
  89.     }
  90.     Serial.print(", port ");
  91.     Serial.println(Udp.remotePort());

  92.     // read the packet into packetBufffer
  93.     Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
  94.     Serial.println("Contents:");
  95.     Serial.println(packetBuffer);

  96.     // send a reply, to the IP address and port that sent us the packet we received
  97.     Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
  98.     Udp.write(ReplyBuffer);
  99.     Udp.endPacket();
  100.   }
  101.   */
  102. }

  103. void sendDht11Value()
  104. {
  105.   //read DHT11 sensor
  106.       int chk = DHT11.read(DHT11PIN);
  107.       switch (chk)
  108.       {
  109.         case DHTLIB_OK:
  110. //                    Serial.println("OK");
  111.                     
  112.                     //Serial.print("*** start data collection ");
  113.                     //Serial.println(DHT11.temperature);
  114.                     
  115. //                    client->sendSensorValue("tcp1","20");
  116.                     client->sendSensorValue("temperature",(String)DHT11.temperature);
  117.                     client->sendSensorValue("humidity",(String)DHT11.humidity);
  118.                     
  119.                     client->checkFreeMem();
  120.                     break;
  121.                     
  122. //        case DHTLIB_ERROR_CHECKSUM:
  123. //                    Serial.println("Checksum error");
  124. //                    break;
  125. //        case DHTLIB_ERROR_TIMEOUT:
  126. //                    Serial.println("Time out error");
  127. //                    break;
  128. //        default:
  129. //                    Serial.println("Unknown error");
  130. //                    break;
  131.                     
  132.       }
  133.    
  134. }

  135. //function functionIWrote use 1 parameter,on the website,it point to "p1"
  136. void changeLed(char * p1)
  137. {
  138.   client->setRevCtrlMsg("true","ok");
  139.   Serial.println(p1);
  140. }


  141. //function without parameter
  142. void openAc(char* p1)
  143. {
  144.   client->setRevCtrlMsg("true","o");
  145.   client->checkFreeMem();
  146.   irsend.sendRaw(rawCodes_ac_open,200, 38);  
  147. }

  148. void closeAc(char* p1)
  149. {
  150.   client->setRevCtrlMsg("true","c");
  151.   client->checkFreeMem();
  152.   irsend.sendRaw(rawCodes_ac_close,200, 38);   
  153. }

  154. void switchTest(char* p1)
  155. {
  156.   Serial.println("switch test");  
  157.   client->setRevCtrlMsg("true","switch changed");
  158.   /*
  159.   if(String(p1).equals("1"))
  160.   {
  161.     openAc("1");
  162.   }
  163.   else
  164.   {
  165.     closeAc("0");
  166.   }
  167.   */
  168.   client->checkFreeMem();
  169. }

复制代码


代码的62、63行指定了网页中你设定的“控制设备”的名字,默认为“开”。

  1.   UserSwitch us1 (switchTest,"swTest",1);
  2.   client->addUserSwitch(us1);
复制代码

网页里是这么设置的


刷入代码后,通过网页应该可以控制你的“控制设备”了。
通过手机控制的话,需要从github下载最新的手机端软件:
https://github.com/lewei50/LeweiApp/
下载bin目录下的LoginActivity.apk


上面代码实现的功能是发布你的温度到乐联网,并且可以控制空调开关。

我的截屏中的其它控制设备的联合使用效果见下面的视频:

Enjoy it~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-8-5 15:17:07 | 显示全部楼层
传说中的沙发。。。谢谢胖网虫{:soso_e113:} {:soso_e113:}
回复 支持 反对

使用道具 举报

发表于 2013-8-5 20:21:04 | 显示全部楼层
又有大作发布,来晚了
回复 支持 反对

使用道具 举报

发表于 2013-8-6 02:04:49 | 显示全部楼层
为拍这个视频浪费了不少电。。。
回复 支持 反对

使用道具 举报

发表于 2013-8-13 21:03:03 | 显示全部楼层
又有大作发布
回复 支持 反对

使用道具 举报

发表于 2013-8-15 21:42:51 | 显示全部楼层
高级啊
回复 支持 反对

使用道具 举报

发表于 2013-8-16 22:03:18 | 显示全部楼层
顶 这个能否实现用手机的APP控制继电器的开关啊~
回复 支持 反对

使用道具 举报

发表于 2013-11-7 15:56:11 | 显示全部楼层
请问对应下面这段程序在物联网上是否是要作相应的设置?怎么设置(最好给你一下设置界面)?谢谢!
“这里是乐联网的“控制命令”的自定义
  UserFunction uf1(openAc,"openMyAC");
  client->addUserFunction(uf1);
  UserFunction uf2 (closeAc,"closeMyAc");
  client->addUserFunction(uf2); ”
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-8 14:52:51 | 显示全部楼层
本帖最后由 瘦网虫 于 2013-11-8 14:57 编辑
ntwhq 发表于 2013-11-7 15:56
请问对应下面这段程序在物联网上是否是要作相应的设置?怎么设置(最好给你一下设置界面)?谢谢!
“这里 ...


  UserFunction uf1(openAc,"openMyAC");
这句话是设置一个对应关系,
前面的openAc是个函数名,在程序里面你能搜到这个代码段,函数功能就是为了开空调(囧),
后面的"openMyAC"是你在网站上设置的函数名称,是给你自己看的。


通过这个库可以把你的arduino设备和乐联网保持一个连接,arduino端负责解析openAc这一段,网站那边负责解析openMyAC这一段,通过这个影射关系,你就可以轻松控制你的arduino了。

不过这个帖子目的是演示下面这段代码。呵呵。
UserSwitch us1 (switchTest,"swTest",1);
client->addUserSwitch(us1);

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-8 14:55:30 | 显示全部楼层
万马奔腾 发表于 2013-8-16 22:03
顶 这个能否实现用手机的APP控制继电器的开关啊~

可以的。。函数作什么用完全取决于你自己,这个实质上是给你一个通道。
回复 支持 反对

使用道具 举报

发表于 2013-11-9 11:36:07 | 显示全部楼层
本帖最后由 ntwhq 于 2013-11-9 11:48 编辑
瘦网虫 发表于 2013-11-8 14:52
UserFunction uf1(openAc,"openMyAC");
这句话是设置一个对应关系,
前面的openAc是个函数名,在程 ...


谢谢赐教!我现在还是连不成功(同样设备arduino+w5100在Yeelink上能实现远程控制,说明设备和我的网络环境没有问题),不知道问题出在哪儿?您帮看一下,相关信息如下:
网关设置:


设备设置:


点击“控制设置”后对话框:


点击“切换”后对话框:


手机登录乐联网后也找不到设备:


再请教两个问题:
1、Yeelink网设备不接时也能正常发送命令,设备接上后就能再执行,乐联网是否设备没有正常工作,就出现找不到设备的接示?即出现上面的相关提示说明我的设备没有正常工作,而不是网站设置上的问题?
2、按照您说的:
“不过这个帖子目的是演示下面这段代码。呵呵。
UserSwitch us1 (switchTest,"swTest",1);
client->addUserSwitch(us1);”
这里openMyAC和closeMyAc这两个方法在网站是否就不要设置了,我只有一个网关,只能设置两个中的一个,不设置这两个不影响您说的测试吧?

对于乐联网反向控制的设置,没有找到一个比较完整的教程,您能否推荐一个,比如点亮一个二极管,第一关过了以后学习就方便了。
再次谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-11-12 14:20:01 | 显示全部楼层
本帖最后由 ntwhq 于 2013-11-12 14:33 编辑

谢谢楼主点评回复.
       我的arduino设备本地地址:192.168.1.15是可以ping通的,您说的“设置成固定ip地址试试看”,现在arduino设备IP地址是固定的,如果指外网IP地址固定不大可能,即使在单位出口是固定IP地址,但在内网使用还要做net转换,显然不方便。网站的API地址填http://tcp.lewei50.com:9965/?method=send&gatewayNo=01应该没问题吧?
       看了你推荐的帖子 :http://www.lewei50.com/dev/doc/142 不明白远程控制LED开关为什么要设置成测量设备,为什么不用控制设备?我试了,在网站是可能控制的,但用手机就无法控制了。
       再次谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-13 09:59:23 | 显示全部楼层
远程控制led可以用测量设备也可以用控制设备,乐联网对这两种都支持,但是实现方式不一样而已。
控制“测量设备”的方式是通过设置“智能物联”里面的“控制命令管理“来实现的,需要你自己在你的arduino端写点代码;
控制”控制设备“的方式是在你的arduino端必须要实现乐联网规定的"getAllSensors”方法来实时回报你的控制设备状态(这个方法我在库里面帮你实现了)。
手机客户端目前不支持读取网站上设置的“自定义函数”,所以,手机端想远程控制你的设备,就需要把你的设备设置为“控制设备”。
这就是2者的区别。你需要深入测试使用后才能体会。
回复 支持 反对

使用道具 举报

发表于 2013-11-13 15:22:49 | 显示全部楼层
瘦网虫 发表于 2013-11-13 09:59
远程控制led可以用测量设备也可以用控制设备,乐联网对这两种都支持,但是实现方式不一样而已。
控制“测量 ...

谢谢指点,我以后再慢慢学习体会。
回复 支持 反对

使用道具 举报

发表于 2013-11-19 10:38:31 | 显示全部楼层
本帖最后由 ntwhq 于 2013-11-19 11:57 编辑

      程序经过修改,已经能反向控制继电器了,用乐联网上的“切换”按钮控制完全正常,手机上也能看到可控设备列表并进行反向控制了,但每切换一下都要弹出下面的对话框:



     然后要重新登录才能继续控制。是不是乐联网手机app软件有问题?我用的版本是20130116:beta0.2 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-18 20:29 , Processed in 0.053527 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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