[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);
}
}
} 代码更新到 https://github.com/lewei50/leweiclient 最近代码更新比较多 以github上面的为准。 试验了一上午都不行,最后用这个代码试验成功,手机连接上了。但这两个执行设备是做什么的啊? 感谢楼主分享。
页:
[1]