这几天废了一翻周折将自己的开发环境配置好了,结构如下图:
Linux服务器是一台闲置的笔记本,它使用无线连接到路由器,与台式机都是192.168.1.x网段。这样方便台式机ssh登录到server开发。并且server配置了samba服务将个人目录共享出来方便linux与windows之间的文件传输。另外Linux服务器与开发板之间利用网线连接,它们都在192.168.0.x网段。在Linux服务器上配置nfs服务,板子通过nfs挂载远程的根文件系统。这样开发工作完全可以在服务器上或者台式机上进行,省去了文件移植或传输等繁琐的过程。最后开发板的串口接在windows上,当然也可以接在linux上。这几天南方遇到了BOSS寒潮。在家里敲代码那叫一个冷啊,如果以后再给自己添一个笔记本的话,可以很方便的通过无线连接ssh到server或者windows开发,那么这样自己就可以躲在被窝里了。所有的代码管理使用git工具,这里Linux服务器也起到了代码备份的作用。不过,这样的配置摒弃了虚拟机花销还是挺大的。而且通过家庭的无线路由器做路由,网络环境并不是很好也并不安全。
同时也借助这个搭建开发环境的过程将交叉编译,u-boot,内核移植,busybox,根文件系统制作更为熟练一些。在这里就不详细的列出开发环境的配置步骤、服务程序的安装配置了。下面是两个值得参考的链接:
http://www.maiziedu.com/course/qrs/1-130/
http://www.maiziedu.com/course/qrs/486-6258/
开发环境配置好了,写个程序测试一下吧。当然首选的程序是 Hello world
#include <stdio.h> int main() { printf("Hello ARM-Linux\n"); return 0; }
编译执行,在开发板上运行 hello world 程序,是可以正确输出的,说明开发环境没什么大问题。那么以后就可以在这个简易的平台上进行开发了。接下来我打算学习无线技术里面的蓝牙。
比如让蓝牙传个文件或者语音,又或者利用蓝牙组一个ad-hoc的网络等等。那就要涉及到网络编程。下面这个例子引自 《UNIX网络编程》中的网络回射程序。Linux端作为服务器,开发板作为客户端。下面是代码:
/* * * * server * * */ #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <errno.h> #include <signal.h> #define LISTENQ 5 void conn_handle(int); void sig_child(int signo); int main() { int listenfd, connfd; socklen_t len; struct sockaddr_in serveraddr, cliaddr; char buff[128] = {0}; if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) goto errorout; memset(&serveraddr, 0, sizeof(struct sockaddr_in)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(3060); inet_pton(AF_INET, "192.168.0.1", &serveraddr.sin_addr.s_addr); if (bind(listenfd, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in)) < 0) goto errorout; if (listen(listenfd, LISTENQ) < 0) goto errorout; // SIGCHLD signal if (signal(SIGCHLD, sig_child) < 0) goto errorout; while (1) { len = sizeof(cliaddr); if ((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &len)) < 0) goto errorout; // hanle every connection with child-process pid_t pid; if((pid = fork()) < 0) goto errorout; else if (pid == 0) { // child process close(listenfd); conn_handle(connfd); close(connfd); exit(0); } // parent process close(connfd); } errorout: printf("something wrong\n"); int err = errno; if (listenfd > 0) { close(listenfd); } errno = err; printf("the errno is %s\n", strerror(errno)); return -1; } void conn_handle(int connfd) { // printf the connfd struct sockaddr_in connaddr; socklen_t connlen = sizeof(struct sockaddr_in); getpeername(connfd, (struct sockaddr *)&connaddr, &connlen); char buff[128] = {0}; printf("connect from %s, port %d\n", inet_ntop(AF_INET, &connaddr.sin_addr, buff, sizeof(buff)), ntohs(connaddr.sin_port)); // recv from client int nRead = 0; int nWrite = 0; // main loop to handle data while (1) { memset(buff, 0, sizeof(buff)); if ((nRead = recv(connfd, buff, sizeof(buff), 0)) <= 0) { printf("read error\n"); // read error handle // return; } printf("have recv %s", buff); nWrite = send(connfd, buff, nRead, 0); if (nWrite < 0) { printf("write error\n"); // write error handle // return; } } } void sig_child(int signo) { pid_t pid; int status; if((pid = wait(&status)) < 0) return; printf("child %d terminated\n", pid); return; }
下面是客户端的代码:
/* * * * client * * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <errno.h> int main() { int clientfd; struct sockaddr_in addr; const char interface[] = "127.0.0.1"; char buff[128] = {0}; int nRead, nWrite; clientfd = socket(AF_INET, SOCK_STREAM, 0); if (clientfd < 0) { goto errorout; } addr.sin_family = AF_INET; inet_pton(AF_INET, interface, &addr.sin_addr.s_addr); addr.sin_port = htons(3060); if (connect(clientfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { goto errorout; } // read from stdin while (1) { printf("input you words to send to server:\n"); if (fgets(buff, 128, stdin) == NULL) { close(clientfd); return 0; } // else send buff nWrite = send(clientfd, buff, strlen(buff), 0); if (nWrite < 0) { goto errorout; } //recv from net memset(buff, 0, sizeof(buff)); nRead = recv(clientfd, buff, sizeof(buff), 0); if (nRead < 0) { goto errorout; } else if (nRead == 0) { printf("server has shutdown\n"); close(clientfd); return 0; } else { printf("server echo %s", buff); } } errorout: printf("something wrong\n"); int err = errno; if (clientfd > 0) { close(clientfd); } errno = err; printf("the errno is %s\n", strerror(errno)); return -1; }
下面是测试的结果,
客户端
服务器端