目标是模仿一个Arduino项目:Ulink——基于微信的物联网平台 (http://www.arduino.cn/thread-7368-1-1.html)
但是我到开发板是iMX257,板上有网口,要借助这个网口连接路由器上网,就需要将Arduino+W5100平台的代码移植过来。
代码主要借鉴: Linux网络编程:基于TCP的程序开发回顾篇 (http://blog.chinaunix.net/uid-23069658-id-3273673.html)
同时也参考了:
(1) Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32 (http://blog.csdn.net/xukai871105/article/details/17101131)
(2) Yeelink平台查询开关量——套接字编程 Windows平台 (http://blog.csdn.net/xukai871105/article/details/17096319)
我的代码如下:
//TCP示例客户端 tcpclt.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main() { int skfd; char buf[1024] = {0}; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; char sinaserver[] = "1.tangerlink2.sinaapp.com"; portnumber = 80; char send_data[] = "GET /downup.php?token=doubleq&data=11 HTTP/1.1\r\nHost: 1.tangerlink2.sinaapp.com\r\n\ User-Agent: arduino-ethernet\r\nConnection: close\r\n\r\n"; if(NULL == (host=gethostbyname(sinaserver)))/*DNS解析*/ { perror("Gethostname error:"); exit(1); } /* 创建socket描述符 */ if(-1 == (skfd=socket(AF_INET,SOCK_STREAM,0))) { perror("Socket Error:"); exit(1); } /* 客户端填充需要连接的服务器的地址信息结构体 */ bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(portnumber); server_addr.sin_addr=*((struct in_addr *)host->h_addr); printf("My server IP Address %s\r\n" , inet_ntoa(server_addr.sin_addr)); /* 客户端调用connect主动发起连接请求 */ if(-1 == connect(skfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))) { perror("Connect Error:"); exit(1); } if(-1 == write(skfd,send_data,strlen(send_data))){ perror("Send error:"); } /*客户端只接收服务器发来的数据,然后就退出*/ if(-1 == read(skfd,buf,1024)){ perror("Recv Error:"); } printf("Date arrived:%s",buf); /* 拆除TCP连接 */ close(skfd); exit(0); }
执行 ./get ,然后遇到了问题:
1. Gethostname error: Resource temporarily unavailable
解决办法:在 /etc/resolv.conf 中添加:
nameserver 192.168.1.253
说明:这一句就是指定域名服务器的IP地址,即路由器地址。搜索/etc/resolv.conf查看更多。
2. Connect Error: Network is unreachable
#开发板<---网线--->路由器, 电脑<---wifi--->路由器
#按照以上的连接方法,电脑和开发板可以互相ping通
解决方法:执行以下命令设置了网关:
# route add default gw 192.168.1.253
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
default localhost 0.0.0.0 UG 0 0 0 eth0
3. 再执行./get ,终于成功了,在云服务器端查看数据库中data的值,已经被改成了11。
下面是开发板的打印信息。
########################################
My server IP Address 123.125.23.171
Date arrived:HTTP/1.1 200 OK
Server: nginx/1.4.4
Date: Tue, 10 Feb 2015 18:07:50 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.29
Via: 10.67.15.22
Set-Cookie: saeut=123.114.46.43.1423591670482511; path=/; max-age=311040000
3
{1}
0
##########################