【转】Arduino官方WIFI模块----开发记录
发布时间:2012-12-24 08:59
发布者:coocox
WIFI开发计划 CooCox Cedar@Wuhan 说明: 本来计划开发SparkFun的WiFly模块,后来发现Arduino官网出了WIFI模块,就优先开发Arduino WIFI Shield。 官方的WIFI Shield资料如下: *:原理图 *:PCB文件 *:WIFI库 *:固件代码(用于实现IP栈) 以上所有资料均可从Arduino官网下载,需要说明的是WIFI Shield的核心芯片是HDG104,进入HD官网下载资料时, 需要注册账户,注册后,不知为何,始终无法登陆,所有没有下载到任何手册。如果您有HDG104的手册,可以分享 一下,非常感谢。 因为换WIFI模块,需要重新熟悉代码和资料,现制定一份初步计划 计划如下:
PS:如果有任何疑问,请跟帖或email我,3Q Email: renjun@coocox.com Socket软件包使用说明 综述 本Socket软件包作为Arduino WIFI shield入门指导中的一部分,用于说明如何在windows下用TCP/IP Socket编程,如何建立链接,绑定端口,收发数据,深入理解这部分,更利于后期学习HTTP客户端和服务器代码。这里用Socket写了一个简单的局域网聊天工具,在不同的机器上分别运行客户端和服务器,然后就像QQ一样聊天。 软硬件环境 操作系统: Win7 开发环境: VS2008 开发语言:C 注:所有代码在上述环境中测试通过,理论上在其它环境(如VC++6.0,windows XP)可以编译通过,但未测试 目录结构 使用时只需要重点关注红色字体标注的文件(夹)
使用方法 A:体验 1:双击打开server 目录下exe文件夹下exe文件,启动聊天服务器 B:开发 1:确保您已经正确安装VS2008 2:双击软件包中的server.vcproj和client.vcproj,打开对应的工程文件 3:编译和调试server和client代码 发布 如果想要将生成的exe文件在其他电脑上运行,只复制exe文件过去,打开时,会出现下面的错误 ![]() file:///C:/Users/RENJUN/AppData/Local/youdao/ynote/images/6286383C8E6B40F6B8A017F7F6E13A14/R%5DQEAS%257BW%40)%40%5B8QENKYFPA67.jpg 这是因为缺少对应的dll,所以我们需要同时复制dll,exe和描述文件过去,别人才能正常运行 这里以打包client为例,来说明如何正确发布软件 1:新建一个文件夹,文件夹名字随便起,这里我们将文件夹命名为dist,该文件夹用于存放exe文件和对应的依赖文件 2:打开软件包中Debug文件夹,找到 client .exe和 client .exe.embed.manifest文件 如没有这些文件,进入VS2008,rebuild一下 3:打开 client.exe.embed.manifest文件,查看exe依赖的dll 在我电脑上,client.exe.embed.manifest内容如下: 文件组织方式为标准xml结构,在此重点关注
知道缺少了哪些dll,只需要将这些dll复制到exe文件夹下即可 4:进入VS2008安装目录,找到Microsoft.VC90.DebugCRT这个文件夹,在我的电脑上路径如下: D:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86 不同电脑,路径可能不一样,但大致结构相同 5:将Microsoft.VC90.DebugCRT文件夹整体拷贝到第1步建立的dist文件夹中 6:现在所有的必须的文件都已经复制完毕,dist文件夹下目录组织结构如下
7:检查dist目录下client.exe.embed.manifest和Microsoft.VC90.DebugCRT.manifest版本号(9.0.21022.8)是否一致 8:现在您可以将dist文件夹打包,发送给朋友了 ^_^ 软件包下载 所有代码可以从github网站下载: https://github.com/cedar-renjun/Socket_server_client_chat_Example Socket Http WebClient 说明:直接用Socket连接百度web服务器,然后发送HTTP Get请求来获取百度首页,VS2008工程在上个帖子中有链接,这次直接发代码,使用时,将代码复制到.c文件中,rebuild生成exe文件,然后点击运行,就可以看到获取的html网页了 #include #include #include // Need to link with Ws2_32.lib #pragma comment (lib, "Ws2_32.lib") #define DEFAULT_BUFLEN 512 #define DEFAULT_PORT 80 WSADATA wsaData; SOCKET ConnectSocket = INVALID_SOCKET; char *HttpRequst ="GET / HTTP/1.1\r\nConnection: close\r\n\r\n"; char RecvBuf[DEFAULT_BUFLEN]; char *IP = "119.75.217.56"; struct sockaddr_in ServerCfg; char WelcomeInfo[] = { "\t===============WIFI Shield Dirver================\r\n" "\tName: HTTP WebClient Example\r\n" "\tHOST : http://www.baidu.com\r\n" "\tIP : 119.75.217.56\r\n" "\tPORT : 80\r\n" "\t=============== CooCox Team =====================\r\n" }; int main(void) { int tmp = 0; int cnt = 0; int iResult = 0; printf(WelcomeInfo); // Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\r\n", iResult); return 1; } printf("Initial WinSock OK\r\r\n"); // Create a SOCKET for connecting to server ConnectSocket = socket(AF_INET, SOCK_STREAM, 0); if (ConnectSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\r\n", WSAGetLastError()); WSACleanup(); return 1; } printf("Create Socket OK\r\n"); //Connect to Server ServerCfg.sin_family = AF_INET; ServerCfg.sin_port = htons(DEFAULT_PORT); ServerCfg.sin_addr.s_addr = inet_addr(IP); printf("Try to connect server\r\n"); iResult = connect(ConnectSocket, (struct sockaddr *)&ServerCfg, sizeof(struct sockaddr)); if (iResult == SOCKET_ERROR) { printf("Unable to connect to server!\n"); WSACleanup(); return 1; } printf("Connect to server!\r\n"); // Send Message to Server printf("Send HTTP Requst\r\n%s", HttpRequst); iResult = send( ConnectSocket, HttpRequst, strlen(HttpRequst), 0); if (iResult == SOCKET_ERROR) { printf("send failed with error: %d\r\n", WSAGetLastError()); } printf("-----------Receive Respon Message---------\r\n"); // Receive Full response message while(1) { // Important,MUST NOT comment this memset(RecvBuf, '\0', DEFAULT_BUFLEN); iResult = recv( ConnectSocket, RecvBuf, DEFAULT_BUFLEN, 0); if (iResult < 0) { printf("receive failed with error: %d\r\n", WSAGetLastError()); } else if(iResult > 0) { puts(RecvBuf); } else { printf("\r\n----------------------------------------------"); printf("\r\nReceive OK\r\n"); break; } } // clean printf("Now Release resource\r\n"); closesocket(ConnectSocket); WSACleanup(); printf("Closed! Example is over\r\n"); printf("Press Enter to exit\r\n"); getch(); //while(1); } Socket Http WebServer #include #include #include #include #include // Need to link with Ws2_32.lib #pragma comment(lib, "Ws2_32.lib") #define DEFAULT_BUFLEN 2048 #define DEFAULT_PORT 27013 char RecvBuf[DEFAULT_BUFLEN]; char SendBuf[DEFAULT_BUFLEN]; struct sockaddr_in ServerCfg; SOCKET ListenSocket = INVALID_SOCKET; SOCKET ClientSocket = INVALID_SOCKET; char WelcomeInfo[] = { "\t===============WIFI Shield Dirver================\r\n" "\tName: TCP Socket Http Webserver Example\r\n" "\tPORT : 8080\r\n" "\t=============== CooCox Team =====================\r\n" }; char RespondInfo[] = { "HTTP/1.1 200 OK\r\n" "Content-Type: text/html\r\n" "Connnection: close\r\n" "\r\n" "\r\n" "\r\n" "\r\n" " ""================= WIFI Shield Dirver=============== " "Name: TCP Socket Http Webserver Example " "PORT : 27013 " "===================" "CooCox Team===================== " " |
网友评论