极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12869|回复: 3

[arduino 接入乐联网-1]W5100同一网段内控制arduino

[复制链接]
发表于 2013-2-21 20:39:36 | 显示全部楼层 |阅读模式
本帖最后由 laoliu1982 于 2013-2-22 11:24 编辑

题外话:
之前发过enc28J60+乐联网app 的arduino控制例子(http://www.geek-workshop.com/thread-3099-1-1.html
一段时间的使用发现如下问题:
ethercardd 软件实现简单ip 协议栈的方式,对于了解tcp/ip 各层协议数据封装模式确实很好。但是由于arduino资源极其有限,用软件方式来实现ip协议栈不一定合理(最主要是无法提供类似socket的编程模式),加之长期数据发送的时候总是会随机的中断(W5100就没事),感觉arduino选择搭配w5100还是有道理的。

转回正题:这回发的帖子字多,图少了。


通过我们提供的app 对arduino(W5100)实现控制(限同一网段内,不同网段方法后面介绍)。








亮点:整个代码用户只需要定义两个地方就可以

  1. /* 用户代码1 :根绝dev id 做相关控制操作 */
  2.         virtual bool updateValue(char* id,int val)   
  3.         
  4.         {   
  5.    
  6.             Serial.print("dev id = ");     
  7.             Serial.println(id);   
  8.             if(!strcmp(id,"DA"))  
  9.             {  
  10.               Serial.println("handle da routin"); //可以结合val 定义自己的操作   
  11.             }  
  12.             if(!strcmp(id,"DA2"))  
  13.             {  
  14.               Serial.println("handle da2 routin");  //可以结合val 定义自己的操作                 
  15.              }  
  16.             Serial.print("update actuator ");   
  17.    
  18.             Serial.println(val);   
  19.    
  20.             led=val;   
  21.    
  22.             return val;   
  23.    
  24.         }   
  25.           /* 用户代码1结束 */
复制代码


  1.       /* 用户代码2 :注册 DA DA2 两个执行设备 */
  2. dummy_act the_act("DA", "dummy actuator", "dummy-da");  
  3. dummy_act the_act2("DA2", "dummy actuator", "dummy-da2");  
  4.        /* 用户代码2 结束 */  
复制代码




实验步骤:

1 注册一个乐联网账号(这个现在跳不过,因为登陆app需要,以后考虑提供一个不用注册登陆的app版本)
open.lewei50.com

2 下载乐联网app http://open.lewei50.com/home/sitecontent/ydkhd

3  leweiclient下载:  导入arduino library

4 登陆乐联网用户,建立网关,配置arduino内网地址 (这里不能用dhcp模式,因为后面还会介绍怎么在不同网段实现arduino的控制,比如你用3G上网,控制家里路由器下面的arduino)设置方法见 http://open.lewei50.com/home/news/90

5 实现代码:
实现代码:

  1. #include <LeweiClient.h>  
  2. #include <SPI.h>  
  3. #include <Ethernet.h>  
  4. #include <Wire.h> //BH1750 IIC Mode  
  5.   
  6. #define LW_USERKEY "8xxxx05"  
  7. #define LW_GATEWAY "01"  
  8.   
  9. #define MY_NAME    "UNO1"  
  10. #define MY_DESC    "UNO test case"  
  11. #define MY_ADDR    "http://192.168.1.233/api"  
  12.   
  13. //delay between updates  
  14. #define POST_INTERVAL (10*1000)  
  15.   
  16. LeWeiClient *lwc;  
  17.   
  18. const unsigned long postingInterval = 10*1000;  
  19.   
  20.   
  21.   
  22. class dummy_act: public LeWeiActuator   
  23.    
  24. {   
  25.    
  26.    private:char led;     
  27.    
  28.    public:   
  29.    
  30.         dummy_act(   
  31.    
  32.                 const char *id,   
  33.    
  34.                 const char *type,     
  35.    
  36.                 const char *name) : LeWeiActuator(id, type, name)   
  37.    
  38.     {};   
  39.    
  40.        /* 用户代码1 :根绝dev id 做相关控制操作 */
  41.         virtual bool updateValue(char* id,int val)   
  42.         
  43.         {   
  44.    
  45.             Serial.print("dev id = ");     
  46.             Serial.println(id);   
  47.             if(!strcmp(id,"DA"))  
  48.             {  
  49.               Serial.println("handle da routin");   
  50.             }  
  51.             if(!strcmp(id,"DA2"))  
  52.             {  
  53.               Serial.println("handle da2 routin");   
  54.             }  
  55.             Serial.print("update actuator ");   
  56.    
  57.             Serial.println(val);   
  58.    
  59.             led=val;   
  60.    
  61.             return val;   
  62.    
  63.         }   
  64.           /* 用户代码1结束 */

  65.         virtual bool getValue(int *val)   
  66.    
  67.         {   
  68.    
  69.             static int i = 0;   
  70.    
  71.             *val = led;   
  72.    
  73.             return true;   
  74.    
  75.         }   
  76.    
  77. };   
  78.   
  79.       /* 用户代码2 :注册 DA DA2 两个执行设备 */
  80. dummy_act the_act("DA", "dummy actuator", "dummy-da");  
  81. dummy_act the_act2("DA2", "dummy actuator", "dummy-da2");  
  82.        /* 用户代码2 结束 */  
  83. void setup() {  
  84.     Serial.begin(9600);  
  85.   
  86.     uint8_t mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};  
  87. #if 1  
  88.     IPAddress  myip(192, 168, 1, 233);  
  89.     IPAddress  dnsip(8, 8, 8, 8);  
  90.     IPAddress  gateway(192, 168, 1, 253);  
  91.     Ethernet.begin(mac, myip, dnsip, gateway);  
  92. #else  
  93.     if (Ethernet.begin(mac) == 0)  
  94.     {  
  95.         Serial.print(F("Failed to configure Ethernet using DHCP "));  
  96.     }  
  97.     else  
  98.     {  
  99.         Serial.print(F("Ethernet configuration OK "));  
  100.     }  
  101. #endif  
  102.   
  103.     // hope no exception here  
  104.     lwc = new LeWeiClient(LW_USERKEY, LW_GATEWAY,  
  105.             MY_NAME, MY_DESC, MY_ADDR, LeWeiClient::none);  
  106.   
  107.   
  108.   
  109.     lwc->registerActuator(the_act);  
  110.     lwc->registerActuator(the_act2);  
  111.   
  112.     Serial.print(lwc->nrSensors());  
  113.     Serial.println(F(" sensors registered."));  
  114.     Serial.print(lwc->nrActuators());  
  115.     Serial.println(F(" actuators registered."));  
  116.   
  117.     lwc->initDevices();  
  118.   
  119.     lwc->beginServe(80);  
  120.   
  121.     Serial.println(F("upload gateway info to server"));  
  122.     int retry = 10;  
  123.     while (lwc->uploadInfo() < 0 && --retry)  
  124.     {  
  125.         delay(1000);  
  126.     }  
  127.     if (!retry)  
  128.         Serial.println(F("uploadInfo failed in 10 times"));  
  129.     else  
  130.         Serial.println(F("uploadInfo done"));  
  131. }  
  132.   
  133. void loop() {  
  134.     static unsigned int loop_count;  
  135.     if (lwc) {  
  136.         loop_count++;  
  137.   
  138.         Serial.print(F("*** loop nr: "));  
  139.         Serial.println(loop_count);  
  140.         /*
  141.          *Serial.print(F("*** start log send "));
  142.          *lwc->sendLog("I'm alive.");
  143.          */  
  144.         //delay(POST_INTERVAL);  
  145.         Serial.println(F("*** serve"));  
  146.         for (int i = 0; i < 100; i++) {  
  147.             lwc->serve();  
  148.             delay(100);  
  149.         }  
  150.     }  
  151.   
  152. }  
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2013-3-3 10:13:22 | 显示全部楼层
代码更新到 https://github.com/lewei50/leweiclient     最近代码更新比较多 以github上面的为准。
回复 支持 反对

使用道具 举报

发表于 2013-6-2 13:47:05 | 显示全部楼层
试验了一上午都不行,最后用这个代码试验成功,手机连接上了。但这两个执行设备是做什么的啊?
回复 支持 反对

使用道具 举报

发表于 2013-8-13 20:11:06 | 显示全部楼层
感谢楼主分享。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 14:09 , Processed in 0.036807 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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