laoliu1982 发表于 2013-2-21 20:39:36

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

本帖最后由 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 :根绝dev id 做相关控制操作 */
      virtual bool updateValue(char* id,int val)   
      
      {   
   
            Serial.print("dev id = ");   
            Serial.println(id);   
            if(!strcmp(id,"DA"))
            {
            Serial.println("handle da routin"); //可以结合val 定义自己的操作   
            }
            if(!strcmp(id,"DA2"))
            {
            Serial.println("handle da2 routin");//可以结合val 定义自己的操作               
             }
            Serial.print("update actuator ");   
   
            Serial.println(val);   
   
            led=val;   
   
            return val;   
   
      }   
          /* 用户代码1结束 */



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



实验步骤:

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

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

3leweiclient下载:导入arduino library

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

5 实现代码:
实现代码:

#include <LeweiClient.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h> //BH1750 IIC Mode

#define LW_USERKEY "8xxxx05"
#define LW_GATEWAY "01"

#define MY_NAME    "UNO1"
#define MY_DESC    "UNO test case"
#define MY_ADDR    "http://192.168.1.233/api"

//delay between updates
#define POST_INTERVAL (10*1000)

LeWeiClient *lwc;

const unsigned long postingInterval = 10*1000;



class dummy_act: public LeWeiActuator   
   
{   
   
   private:char led;   
   
   public:   
   
      dummy_act(   
   
                const char *id,   
   
                const char *type,   
   
                const char *name) : LeWeiActuator(id, type, name)   
   
    {};   
   
       /* 用户代码1 :根绝dev id 做相关控制操作 */
      virtual bool updateValue(char* id,int val)   
      
      {   
   
            Serial.print("dev id = ");   
            Serial.println(id);   
            if(!strcmp(id,"DA"))
            {
            Serial.println("handle da routin");   
            }
            if(!strcmp(id,"DA2"))
            {
            Serial.println("handle da2 routin");   
            }
            Serial.print("update actuator ");   
   
            Serial.println(val);   
   
            led=val;   
   
            return val;   
   
      }   
          /* 用户代码1结束 */

      virtual bool getValue(int *val)   
   
      {   
   
            static int i = 0;   
   
            *val = led;   
   
            return true;   
   
      }   
   
};   

      /* 用户代码2 :注册 DA DA2 两个执行设备 */
dummy_act the_act("DA", "dummy actuator", "dummy-da");
dummy_act the_act2("DA2", "dummy actuator", "dummy-da2");
       /* 用户代码2 结束 */
void setup() {
    Serial.begin(9600);

    uint8_t mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
#if 1
    IPAddressmyip(192, 168, 1, 233);
    IPAddressdnsip(8, 8, 8, 8);
    IPAddressgateway(192, 168, 1, 253);
    Ethernet.begin(mac, myip, dnsip, gateway);
#else
    if (Ethernet.begin(mac) == 0)
    {
      Serial.print(F("Failed to configure Ethernet using DHCP "));
    }
    else
    {
      Serial.print(F("Ethernet configuration OK "));
    }
#endif

    // hope no exception here
    lwc = new LeWeiClient(LW_USERKEY, LW_GATEWAY,
            MY_NAME, MY_DESC, MY_ADDR, LeWeiClient::none);



    lwc->registerActuator(the_act);
    lwc->registerActuator(the_act2);

    Serial.print(lwc->nrSensors());
    Serial.println(F(" sensors registered."));
    Serial.print(lwc->nrActuators());
    Serial.println(F(" actuators registered."));

    lwc->initDevices();

    lwc->beginServe(80);

    Serial.println(F("upload gateway info to server"));
    int retry = 10;
    while (lwc->uploadInfo() < 0 && --retry)
    {
      delay(1000);
    }
    if (!retry)
      Serial.println(F("uploadInfo failed in 10 times"));
    else
      Serial.println(F("uploadInfo done"));
}

void loop() {
    static unsigned int loop_count;
    if (lwc) {
      loop_count++;

      Serial.print(F("*** loop nr: "));
      Serial.println(loop_count);
      /*
         *Serial.print(F("*** start log send "));
         *lwc->sendLog("I'm alive.");
         */
      //delay(POST_INTERVAL);
      Serial.println(F("*** serve"));
      for (int i = 0; i < 100; i++) {
            lwc->serve();
            delay(100);
      }
    }

}

laoliu1982 发表于 2013-3-3 10:13:22

代码更新到 https://github.com/lewei50/leweiclient   最近代码更新比较多 以github上面的为准。

philhoo 发表于 2013-6-2 13:47:05

试验了一上午都不行,最后用这个代码试验成功,手机连接上了。但这两个执行设备是做什么的啊?

问题不大 发表于 2013-8-13 20:11:06

感谢楼主分享。
页: [1]
查看完整版本: [arduino 接入乐联网-1]W5100同一网段内控制arduino