Register

  • 点击获取
  •   

已有账号直接登录    

公告:

热门文章 ARM9与远程web服务器交互之灯控实验

时间:2016-8-24 作者:RainFly   分类: Linux嵌入式   热度: 9445°  评论:11  
时间:2016-8-24   分类: Linux嵌入式    热度:9445   评论:11

     摘要:网上又不少历程关于ARM平台的web实验,基本上都是在内网完成的,本地搭建好web服务器,而ARM平台的web服务器不支持内网穿透,继而无法从外网访问控制,或许你有公网IP可以进行端口映射访问,不过本次实验目的不在此,本次主要完成ARM9开发板通过HTTP协议与Apache服务器数据交互。如有错误或者建议,敬请批评指正。

实验设备:  EasyARM i.mx283(周立功ARM9板子)  linux2.6.35系统

                   ECS云服务器 具备公网IP  120.27.4.152 (ubunut14.04系统 Apache2+PHP5+MySQL)  配置方法 —>点此

                   交叉编译工具 arm-none-linux-gnueabi-gcc 

                   宿主机 Ubuntu14.04 

语言需求:C ,HTML,JavaScript,jquery,PHP,MySQL,shell脚本(了解)   

实验原理: 

                通过ARM开发板不断向web服务器发送POST/GET请求,来获得服务器返回的数据,数据中携带了light0的value值,通过C对字符串分析获得服务器数据库类light0的value值,来更改P2.4引脚的电平高低,从而达到下位机控灯,至于web页面通过ajax GET方式提交至相应PHP文件,从而修改数据库类light0 的value值。完成web服务器控灯实验

开发板方面不做过多介绍,周立功官网上面提供了手册, 提一下重要操作就是关于灯控的高低点平,/sys/class/gpio/在这个类下面(GPIO驱动已经提供了,先拿来用) 我们按照手册上面所提供的数据建立好一个 68 P2.4引脚的虚拟控制文件, (linux下面一切皆为文件),生成了引脚电平控制文件 /sys/devices/virtual/gpio/gpio68/value   通过echo 1(0) > value 可以更改P2.4引脚高低电平。

C语言文件

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<fcntl.h> #include<unistd.h> #define IP_ADDR "120.27.4.152" #define ARCHIVE "/data/light.php" #define PORT 80 #define DEV_PATH "/sys/devices/virtual/gpio/gpio68/value" #define HIGH "1" #define LOW "0" int main(int argc, char *argv[]){ int fd; int sockfd; int len; struct sockaddr_in address; int result; char data[1024]; memset(data, 'a', 1024); char httpstring[2048]; sprintf(httpstring,"POST /%s HTTP/1.1\r\n" "Host: %s\r\n" "Content-Length: %d\r\n" "Connection:Close\r\n\r\n" "Content-Type: Application/octet-stream\r\n\r\n" "$name=rainfly" "%s", ARCHIVE, IP_ADDR, strlen(data), data); char ch; sockfd = socket(AF_INET, SOCK_STREAM, 0); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(IP_ADDR); address.sin_port = htons(PORT); len = sizeof(address); result = connect(sockfd,(struct sockaddr *)&address,len); if(result == -1) { perror("oops: client"); return 1; } write(sockfd,httpstring,strlen(httpstring)); while(read(sockfd,&ch,1)) { // printf("%c", ch); } // printf("%c",ch); int a= ch-48;//ASCII change // printf("%d",a); if(a==1) { printf("open"); fd=open(DEV_PATH,O_WRONLY); if(fd<0){printf("open value fail!");} write(fd,HIGH,strlen(HIGH)); close(fd); } else{ printf("close"); fd=open(DEV_PATH,O_WRONLY); if(fd<0){printf("open value fail!");} write(fd,LOW,strlen(LOW)); close(fd); } close(sockfd); printf("\n"); return 0; }

 注意: 不管data的数据内容是什么上面我发送的是1024个'a' 虽然这毫无用出,关于这个POST GET提交方式,在本次实验都是可以的携带的data数据并没有实质性作用,(PS:或许在以后的实验中,需要用到数据提交给服务器)。这里仅实现对服务器发送POST请求,然后通过服务器判断是否携带了数据参数来进行输出,或者修改数据库

核心PHP脚本。 /data/light.php

<?PHP $lnk = mysql_connect("127.0.0.1:3306","root","Dyf1314520"); if (!$lnk){ die('Could not connect: ' . mysql_error()); } if(mysql_query("CREATE DATABASE smarthome",$lnk)){ mysql_select_db('smarthome', $lnk); $sql = "CREATE TABLE light ( LightName varchar(7), value int )"; mysql_query($sql,$lnk);//创建表结构 mysql_query("INSERT INTO light (LightName, value) VALUES ('light0', '1')"); //插入新表项 } mysql_select_db('smarthome', $lnk); //选中数据库 //带参数访问更改 数据库中 light0的值 if (isset($_GET['light0'])) { $light0=$_GET['light0']; mysql_query("UPDATE light SET value = ".$light0." WHERE LightName = 'light0'"); echo $light0; } else { //如果直接访问就获得数据库数据 $result = mysql_query("SELECT * FROM light WHERE LightName='light0'"); //mysql系的函数中都是逐行读取的,即第一次mysql_fetch_array得到第一行,第二次得到第二行 //实际上一个灯只需要第一行 while($row = mysql_fetch_array($result)) { echo $row['value']; } } ?>

该文件既处理Ajax提交过来的GET请求,将数据库中light0 的value值进行修改,也应答下位机POST请求,将value值通过HTTP协议发送给下位机。 

  home_light.php 页面AJAX提交源码

//去除str的前后空格 function trim(str){ return str.replace(/^(\s|\u00A0)+/,'').replace(/(\s|\u00A0)+$/,''); } var light0_temp=1; var light0; $(document).ready(function(){ $("#light0").click(function(){ light0_temp = ~ light0_temp; if(light0_temp!='1'){light0=0;} else {light0=1;} //js判断 var url = '/data/light.php'; // 取Form中要提交的链接 var param = {}; // 组装发送参数 param['light0'] = light0; $.get(url, param, function(dom) { dom=trim(dom); if (dom=='1') { $('#light0_img').attr("src","img/light_on.png"); } else { $('#light0_img').attr("src","img/light_off.png"); } }) ; // 发送并显示返回内容 }); })

源码在下方下载,其余功能正在开发中.....

实验文档来源:360  | 大小:0MB  | 提取密码:f579 | 解压密码:www.rainfly.cn 已经过安全软件检测无毒,请您放心下载。          若链接失效可联系管理员!

热门文章 HTTP协议原理结构分析

时间:2016-8-15 作者:RainFly   分类: Linux嵌入式   热度: 5039°  评论:1  
时间:2016-8-15   分类: Linux嵌入式    热度:5039   评论:1

1.协议特点 

 a.C/S模式

 b.客户端向服务器发出Request 只需传送请求方法和路径, 通信速度快

方法: GET 通过请求URI得到资源 浏览器向服务器一般请求 POST,用于添加新的内容 发送form表单 PUT 用于修改某个内容 DELETE, 删除某个内容 CONNECT, 用于代理进行传输,如使用SSL OPTIONS 询问可以执行哪些方法 PATCH, 部分文档更改 PROPFIND 查看属性 PROPPATCH 设置属性 MKCOL 创建集合(文件夹) COPY 拷贝 MOVE 移动 LOCK 加锁 UNLOCK 解锁 TRACE 用于远程诊断服务器 HEAD 类似于GET, 但是不返回body信息,用于检查对象是否存在,以及得到对象的元数据

c. 传输类型很灵活:只需要给它加上Content-Type  MIME类型值即可

d.发送完请求报文,立即和服务器断开连接(PS:虽然TCP的80端口可以建立多个Socket连接但是如果连接过多服务器响应其他请求放慢),服务器所需要完成的是将端口接受请求放入等待队列,根据算法进行选择相应的连接请求进行处理。 节省了客户端进行等待的时间

e.发送完数据包之后,如果服务器不Response,需要将所有的数据包重新发送。

 2.文件格式

                 Request: 请求报文格式

                

            请求报文可以用Google浏览器进行查看其发送 

发送的报文实例

POST报文头如下: POST /sn/index.php HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection:close sn=123&n=asa 在http头后边有一空行,空行后边接着发送post数据,长度通过Content-Length: 12 指出,此post数据中包含两项 sn=123 n=asa 其中:Content-Type: application/x-www-form-urlencoded 指定POST数据的编码类型 Content-Length: 12 POST数据的长度

GET: GET报问头如下: GET /sn/index.php?sn=123&n=asa HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection:close

 

                   Response :响应报文格式

                

相应阶段报文,给一个API 调试工具 使用GET请求获得数据 http://apistore.baidu.com/astore/toolshttpproxy

我给http:www.baidu.com服务器发送了一个GET请求下面是相应回复的报文 

Response Header HTTP/1.1 200 OK Date: Tue, 16 Aug 2016 01:58:22 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: Keep-Alive Vary: Accept-Encoding Set-Cookie: BAIDUID=E6BADB45ADCAFAF36BAE6C63E46613C9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: BIDUPSID=E6BADB45ADCAFAF36BAE6C63E46613C9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: PSTM=1471312702; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: BDSVRTM=0; path=/ Set-Cookie: BD_HOME=0; path=/ Set-Cookie: H_PS_PSSID=1465_18241_17949_18560_17001_11693_20848_20856_20837_20771_20719; path=/; domain=.baidu.com P3P: CP=" OTI DSP COR IVA OUR IND COM " Cache-Control: private Cxy_all: baidu+955142e509dca9cdda759e1be73fb859 Expires: Tue, 16 Aug 2016 01:57:59 GMT X-Powered-By: HPHP Server: BWS/1.1 X-UA-Compatible: IE=Edge,chrome=1 BDPAGETYPE: 1 BDQID: 0xc83e2bbf001302cc BDUSERID: 0 Content-Encoding: gzip

 这里可以看到对应上面图二的结果

版本信息:HTTP/1.1   

HTTP 1.1中的五类状态码:  

100-199 用于指定客户端应相应的某些动作。   

200-299 用于表示请求成功。   

300-399  用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。   

400-499 用于指出客户端的错误。  

 500-599 用于支持服务器错误。 

OK:就是OK

剩余的都是头部行,携带了一些关于发送时间 格式 编码之类的信息

Content-Encoding: gzip  此处是指服务器将Response文件进行GZIP压缩, 当客户端接收后根据Content-Encoding: gzip执行解压缩 (这种方法会降低服务器宽带压力,但是增加了服务器压力,加快网页打开速度)

对文件部分解码的到了Response Body, 就是HTML信息。

在HTTP协议是建立在TCP/IP传输控制协议基础上的,所以所有的文件必须是客户端和服务器TCP三次握手已经建立连接,后面我还会继续了解剖学习 , 还会用C语言实现 HTTP FTP等应用层协议!

热门文章 Linux局域网工具wpa_supplicant 与 wireless tools 区别

时间:2016-8-2 作者:RainFly   分类: Linux嵌入式   热度: 8611°  评论:2  
时间:2016-8-2   分类: Linux嵌入式    热度:8611   评论:2

    前段时间已经给imx283移植过RTL8192EU的无线网卡,使用了wireless tool工具 http://www.rainfly.cn/?post=185

这个命令行工具很强大基本满足很多种wlan硬件驱动,可惜不能连接上那些只支持WPA和AP的信号上面,(当然2.4G的这种路由器已经灭绝了)。

关于wireless tool的编译及用法,在上一个帖子已经说得很清楚了,今天主要研究一下 wap_supplicant工具

一、编译wpa_supplicant http://hostap.epitest.fi/wpa_supplicant/  下载wpa_supplication http://www.openssl.org/source/   下载openssl 1.把补丁拷贝到openssl cp wpa_supplicant-0.7.3/patches/openssl-0.9.8i-tls-extensions.patch openssl-1.0.1c/ 2.修改openssl Makefile

CC= arm-none-linux-gnueabi-gcc AR= arm-none-linux-gnueabi-ar $(ARFLAGS) r RANLIB= arm-none-linux-gnueabi-ranlib

3.make  && make install 4.进入wpa_supplicant目录

#cp defconfig .config #vim .config CC= arm-linux-gcc -L/usr/local/ssl/lib/ CFLAGS += -I/usr/local/ssl/include/ LIBS += -L/usr/local/ssl/lib/ #make

编译后将产生的wpa_supplicant和wpa_cli拷贝到开发板根文件系统的sbin目录下(/sbin);没有sbin目录就放在bin下面,查看tab键能否补齐工具,基本安装完成。 二.wpa_supplicant用法:

在根文件系统/etc(此路径为开发板路径)下添加wpa_supplicant配置文件wpa_supplicant.conf 

其中wpa_supplicant.config 可参考内容如下:

ctrl_interface=/var/run/wpa_supplicant ap_scan=1 network= { proto=RSN key_mgmt=WPA-PSK pairwise=CCMP TKIP group=CCMP TKIP ssid="IDEASK" #连接的ap psk="12345678" #wifi密码 }

wpa_supplicant -D wext -c ./wpa_supplicant.conf -i wlan0 -B

热门文章 DHCP:解析开发板上动态获取ip的2种实现方法详解

时间:2016-7-10 作者:RainFly   分类: Linux嵌入式   热度: 6686°  评论:1  
时间:2016-7-10   分类: Linux嵌入式    热度:6686   评论:1

本篇文章是对开发板上动态获取ip的2种实现方法进行了详细的分析介绍,需要的朋友参考下 动态主机设置协议(Dynamic Host Configuration Protocol, DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途: 1.给内部网络或网络服务供应商自动分配IP地址 2.给用户给内部网络管理员作为对所有计算机作中央管理的手段。 方法一:dhclient     1.下载     https://www.isc.org/software/dhcp/ 2.解压     tar-zxvf dhcp-3.1.3.tar.gz 3.配置     cddhcp-3.1.3     ./configure     成功之后生成work.linux-2.2文件夹. 4.编译     make "CC=/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc-static"     可以在work.linux-2.2/client目录,也可以在dhcp-3.1.3目录下make, 5.拷贝     在work.linux-2.2\client编译生成dhclient。     拷贝配置文件dhcp-3.1.3/client/dhclient.conf和/dhcp-3.1.3/client/scripts/linux 到开发板的/sbin/目录下,并linux文件重命名为dhclient-script,并修改该文件的第一行#! /bin/bash 为#! /bin/sh,保存后,修改权限 chmod +x /sbin/dhclient-script 6.创建目录     mkdir-p /var/state/dhcp     在/var目录下创建state目录,再在state目录下创建dhcp目录。 7.运行     dhclient ra0

方法二、udhcpc udhcpc是一个面向嵌入式系统的非常小的DHCP客户端,字母的缩写微- DHCP -客户端(μDHCPc)。 1.udhcpc -i eth0 udhcpc只是获取一个IP,我们需要把\busybox-1.1.2\examples\udhcp下的脚本simple.script改名为default.script,放在开发板上的/usr/share/dhcpc/目录下,才能将获取的IP写到指定的网卡中。 2.ifconfig

文章转载:http://www.jb51.net/article/37379.htm

热门文章 移植OpenSSH到Easy-ARM9 Linux开发板

时间:2016-7-10 作者:RainFly   分类: Linux嵌入式   热度: 11439°  评论:2  
时间:2016-7-10   分类: Linux嵌入式    热度:11439   评论:2

      EasyARM-iMX283 以前版本的SSH服务器移植的有些问题,可以登录但是不能传文件,每次都要用NFS挂载,实在麻烦,继而折腾了一下,重新编译移植了一下SHH服务。

热门文章 Easy-ARM IMX283移植TP-LinkW823N无线网卡驱动

时间:2016-5-22 作者:RainFly   分类: Linux嵌入式   热度: 14335°  评论:3  
时间:2016-5-22   分类: Linux嵌入式    热度:14335   评论:3

实验材料  (所有下载资源在文章页尾提供)

1,AMR9开发板(周立功的imx283)

2.  SUB网卡 (TP-link WN823N) 300M迷你型无线USB网卡       

3. rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911    网卡驱动        

4,Ubuntu宿主机 (配置好交叉编译环境)      

安装步骤:

先在宿主机中解压网卡驱动,官网上面提供的文件包目录  \0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911\RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911\driver\rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911\rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911\打开之后对应的驱动程序就可以看到了

首先将USB网卡插上  输入lsusb之后,查看对应的编码 我这输出对应的ID是 0bda  818b    

对应的芯片是RTL 8192EU芯片   去官网下载了驱动之后,可以跳过以下步骤,USB依然可以识别出来 不必再添加usb_intf.c 的设备PID

打开RTL8188C_8192飞USB_linux_v4.0.2_9000.20130911 I driver I rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911 I os_dep I linux I usb_intf.c,将usb_intf.c 这个文件打开,找到下面这个地方,修改添加对应的ID  (注意它注释是否对应芯片编号8182EU此图上写的是8192eu,有些USB端口已经给出了)

以上步骤在Linux可以识别USB网卡的时候可以跳过,如不能识别添加

然后打开Makefile

选择一个 编译架构(i386 ,ARM之类的) 

将后面的 n改成y (其实无所谓哪一种后面修改一下交叉编译器即可)

修改源代码对应路径(linux内核源代码需要先编译,否则会出现无对应文件和目录),交叉编译器对应路径,之后保存即可, 然后记得在Makefile前面选择生成了

然后执行make 命令, 生成 xxxx.ko文件 ,拷贝至开发板,安装驱动模块, insmod   8192eu.ko

发现开发板没有 iwconfig 命令 ,在利用下载好的wireless_tools_29.tar 解压到宿主机,修改Makefile中 AR GCC的参数,交叉工具链和源代码路径,make之后得到iwconfig等命令,将命令全部复制到开发板 /bin  (此为root)用户  普通用户/usr/bin  ,目录下面 ,将动态链接库libiw.so.29 文件,复制到开发 /lib 文件夹中,否则将会报错,丢失libiw.so.29文件

其中遇到问题重新烧写内核,仍然未解决掉。

#sudo apt-get install u-boot-tools

然后make uImage 在 /arch/arm/boot 目录下面找到uiamge 烧写到开发板

查看是否安装成功

插上USB网卡,若未加载驱动,则出现不支持此设备,

将iw命令全部复制到开发板上后可以, 开启网卡  ifconfig wlan0 up 

成功打开出现

root@EasyARM-iMX283 /# ifconfig wlan0 up RTL871X: +871x_drv - drv_open, bup=0 RTL871X: ==>_InitPowerOn8192EU RTL871X: ===> FirmwareDownload88E() fw source from Header. RTL871X: ===> Firmware for NIC fw:FirmwareDownload8192E, size: 31990 RTL871X: FirmwareDownload8192E: fw_ver=4 fw_subver=1 sig=0x92e1 RTL871X: _FWFreeToGo8192E: Checksum report OK! REG_MCUFWDL:0x00070304 RTL871X: =====> _8051Reset88E(): 8051 reset success . RTL871X: _FWFreeToGo8192E: Polling FW ready success!! REG_MCUFWDL:0x000706c6 RTL871X: ===> phy_BB8192E_Config_ParaFile() EEPROMRegulatory 1 RTL871X: PHY_BBConfig8192E ==> CrystalCap:0x22

可以正常使用了

Wireless tools for Linux介绍 Wireless tools for Linux是一个Linux命令行工具包,用来设置支持Linux Wireless Extension的无线设备。Wireless tools for Linux 和 Linux Wireless Extension 由 Jean Tourrilhes在维护,由Hewlett-Packard(HP惠普)赞助。 大多数基于Linux内核的操作系统都包含Wireless tools。在许多GNU/Linux 发行版中,都缺省安装这个工具包,即使是没有自动安装,也能很容易地找到其二进制代码安装包。 Wireless Extension (WE)是一组通用的API,能在用户空间对通用Wireless LANs进行配置和统计。它的好处在于仅通过一组单一的工具就能对各种各样的Wireless LANs进行管理,不过它们是什么类型,只要其驱动支持Wireless Extension就行;另一个好处就是不用重启驱动或Linux就能改变这些参数。        Wireless Tools (WT)就是用来操作Wireless Extensions的工具集,它们使用字符界面,虽然粗糙,但支持所有Wireless Extension。虽然还有很多其他管理Wireless Extensions的工具,但Wireless Tools是参考实现,它包括以下工具:         iwconfig:设置基本无线参数         iwlist:扫描、列出频率,比特率,密钥等         iwspy:获取每个节点链接的质量         iwpriv:操作Wireless Extensions 特定驱动         ifrename: 基于各种静态标准命名接口 大多数 Linux 发行版本都在其网络初始化脚本中集成Wireless Extension,以便启动时配置无线接口。他们还将Wireless Tools作为其标准封装包。 无线配置也可以使用hotplug或uDev脚本来完成,需要发行版特定的支持,这样能支持任何可移动的无线接口(Pcmcia,CardBus,USB接口...)。 Wireless Tools(从版本19)开始完全支持IEEE 802.11标准参数和设备,支持旧风格的设备和最专有协议,并准备处理HiperLan。较新版本增加了更多802.11支持。但不幸的是,并非所有的驱动程序支持所有这些功能。 最新的稳定版本的Wireless Tools是版本29,大多数愚蠢的错误已被删除,并支持所有的Wireless Extension(从版本v11至v21)。可以从http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz下载最新的Wireless Tools。     我们经常会用到的主要是iwlist、iwconfig、 iwpriv: iwlist的使用 命令行:(ap不需要验证密码) iwlist mlan0 scan //搜索ap iwconfig mlan0 essid “linksys” //连接ap udhcpc –i mlan0  //获得动态IP   命令行:(ap需要验证密码) iwlist mlan0 scan //搜索ap iwconfig mlan0 key  xxxxxxxxxx  // 输入验证密码 iwconfig mlan0 key open //密码验证功能打开 iwconfig mlan0 essid “linksys” //连接ap udhcpc –i mlan0 //获得动态IP

链接完成后需要设置一下 自动获取IP地址

DHCP或者udhcpc   关于这两个动态获取IP地址   

关于上面两种动态获取IP安装客户端,自动链接: http://www.rainfly.cn/?post=190

查看IP: ifconfig wlan0 设置IP: ifconfig wlan0 10.3.1.74 把IP: 129.158.215.204 , netmask: 255.255.255.0分配给rh0, # ifconfig rh0 129.158.215.204 netmask 255.255.255.0 获取IP; ifconfig wlan0 dhcp start (从wlan0走,不需要ip即可dhcp) udhcpc -i wlan0     udhcpc --help

相关文件来源:360网盘  | 大小:MB  | 提取密码:18a6 | 解压密码:www.rainfly.cn 已经过安全软件检测无毒,请您放心下载。          若链接失效可联系管理员!

热门文章 ARM9 触摸校准,鼠标驱动

时间:2016-5-22 作者:RainFly   分类: Linux嵌入式   热度: 9699°  评论:1  
时间:2016-5-22   分类: Linux嵌入式    热度:9699   评论:1

前段时间被触摸屏校准弄得摸不着头脑,网上的资料对我的移植都不具有可操作性。尽管如此,我还是很感谢网络,上面有几个网页给了我很大的启示,估计做触摸屏校准的都会首先搜到这些网页一睹究竟。其中,一篇最全的竟然是武大的一位女士写的,让我佩服不已。可能受这些优秀的网友的启发吧,我在经过连续三天的奋战后,终于校准成功,并将生成的pointercal校准文件放到移植的系统中,触摸屏正常工作了。现在把碰到的问题及解决方法写在这里,供各位网友参考。 1.tslib-1.3 选用的校准程序就是网上比较流行的这个版本,下载出处可以到武大的那位朋友那里下载,基本能用。如果想从我这里得到,可以把信箱留下共同讨论。 2.准备工作 在移植tslib前,首先需要将linux移植好,并载入合适的文件系统(呵呵,此处有点废话了)。我使用的文件系统是实验板自带的MyRootfs.cramfs系统,移植成功后,使用minicom看触摸屏设备文件是什么。方法是:通过打开/dev/下touchscreen文件夹(这是触摸屏驱动自动生成的文件),看里面的文件是哪个。我的设备文件是:/dev/touchscreen/0,/dev/h3600_tsraw,/dev/h3600_ts,这对后续的环境变量设置有重要用途。当然,所用实验板不同,此设备文件亦不同,大家需要注意了解自己的系统即可。 知道触摸屏的设备文件后,要保证移植的系统在上电运行时,没有打开任何应用程序——或者说只是单纯的运行系统,即所产生的现象是只有那只企鹅孤零零的呆在你的LCD的左上角。这时就可以开始安装tslib-1.3了。 3.安装tsilib 设置好CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc CXX=/usr/local/arm/2.95.3/bin/arm-linux-g++ 使用./autogen.sh生成configure文件,并运行 ./configure --host=arm-linux --target=arm-linux --prefix=$PWD/build --enable-inputapi=no 修改src/ts_read_raw.c中的char *defaulttseventtype="H3600",因为我的触摸屏驱动对应此结构。 make make install 将生成的build文件夹全部拷入一个可以作为nfs挂接的文件夹下。我的是拷到自己的文件系统中的/root/tslib 目录下(mkdir 生成)。 4.nfs挂接 打开nfs服务后,在minicom中mount -t nfs -o nolock 10.0.0.10:/root/Myjob/MyRootfs/root /tmp (此处tmp是目标文件系统上的临时文件夹) 5.环境变量设置 当nfs挂接成功后,就能够在minicom中看到挂接的/tmp/root/tslib/build,此时 cd build  #开始设置环境变量 /tmp/root/tslib # export V_ROOT=/tmp/root/tslib/build /tmp/root/tslib # export TSLIB_CONSOLEDEVICE=none /tmp/root/tslib # export TSLIB_FBDEVICE=/dev/fb0 /tmp/root/tslib # export TSLIB_TSDEVICE=/dev/touchscreen/0  /tmp/root/tslib # export TSLIB_CALIBFILE=$V_ROOT/etc/pointercal /tmp/root/tslib # export TSLIB_CONFFILE=$V_ROOT/etc/ts.conf /tmp/root/tslib # export TSLIB_PLUGINDIR=$V_ROOT/share/ts/plugins /tmp/root/tslib # export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/0 /tmp/root/tslib # export LD_LIBRARY_PATH=$V_ROOT/lib /tmp/root/tslib # ln -s /dev/touchscreen/0 /dev/h3600_tsraw /tmp/root/tslib # ln -s /dev/fb/0 /dev/fb0 /tmp/root/tslib/build/bin/ # ./ts_calibrate   此时就可以使用5点校准了。生成的文件放在哪里可以从环境变量TSLIB_CALIBFILE处得到。将这个文件拷出,就可以使用了。

热门文章 BOA服务器ARM开发板上无法加载CSS样式处理方法

时间:2016-3-9 作者:RainFly   分类: Linux嵌入式   热度: 11605°  评论:2  
时间:2016-3-9   分类: Linux嵌入式    热度:11605   评论:2

        背景:前段时间刚移植了BOA服务器到我的EasyARM283的开发板上面了,CGI程序运行正常但是当写入一下css样式文本后,浏览器始终无法正常显示 发现可以调用JS文件,按照相应的CSS文件路径也可以找到对应文件,百度Google了很多资料都没有得到什么有效的解决办法,最终在看火狐浏览器对应的source路径找到css文件加载不了的实际原因

 如同图上的报错所说  样式表单未载入 因为它的MIME类型是“text/plain” 不是“test/css”

查了一下服务器的配置文件发现了解决途径 

在/etc/boa/boa.conf 文件第165行 有一个定义缺省MIME类型

 将 text/plain   更改为text/css

成功完成css加载!

热门文章 EasyARM-imx28开发板嵌入web服务器

时间:2016-3-5 作者:RainFly   分类: Linux嵌入式   热度: 7844°  评论:1  
时间:2016-3-5   分类: Linux嵌入式    热度:7844   评论:1

     

      随着互联网应用的普及,越来越多的信息化产品需要接入互联网通过Web页面进行远程访问。嵌入式Web系统提供了一种经济、实用的互联网嵌入式接入方案。这里结合一种嵌入式Web Server BOA来介绍嵌入式Linux系统下的CGI程序设计技术。

关于实现项目所出现的相关问题解决办法

 一、编译配置boa服务器 1 、[root@localhost /]#mkdir web                           //在根目录下创建web目录 2 、[root@localhost /]# cd /web/ 3 、[root@localhost web]# rz 4 、[root@localhost web]# tar –zxvf boa-0.94.13.tar.gz      //将源码解压到/web目录下 5 、[root@localhost web]# cd boa-0.94.13/ 6 、[root@localhost boa-0.94.13]# cd src/    7 、[root@localhost src]# ls 8 、[root@localhost src]# ./configure                         //运行./configure使之生成Makefile文件 9 、[root@localhost src]# vi Makefile 修改内容如下: 把CC=gcc 和CPP=gcc -E改写成CC=arm-none-linux-gnueabi-gcc    CPP=arm-none-linux-gnueabi-g++ -E 10 、[root@localhost src]# vi compat.h 在一般模式下输入:set nu显示行编号,再用120进到120行,修改内容如下: 120 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff   改为define TIMEZONE_OFFSET(foo) foo->tm_gmtoff 把120行foo后两个#号去掉

11 、[root@localhost src]# make                       //编译 12 、[root@localhost src]# arm-linux-strip boa        //优化boa可执行文件(此步非必须) 13 、[root@localhost web]# cd boa-0.94.13/      14 、[root@localhost boa-0.94.13]# vi boa.conf         //修改boa的配置文件 在一般模式下输入:set nu显示行编号,再用111进到111行,  修改内容如下:  把111 DocumentRoot /var/www 改为111 DocumentRoot /var/www //指明html文件所放的路径 把193 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 改为193 ScriptAlias /cgi-bin/ /var/www/cgi-bin/ //指明cgi脚本的虚拟路径所对应的实际路径 15、将/src目录下新生成的boa文件下载到目标板的/bin目录下,将boa.conf文件下载到目标板的/etc/boa/目录下。 16、进入开发板的/bin目录,运行boa。 二、可能遇到的问题 1、Could not chdir to "/etc/boa": aborting       必须创建/etc/boa目录 2、Could not open mime.types file, "/etc/mime.types", for reading      /etc/目录下缺少mime.types文件,从它处拷贝。 3、gethostbyname:: Connection timed out      把“#ServersName www.your.org.here”的“#”去掉。   三、修改boa.conf文件 # 监听的端口号,缺省都是80 ,一般无需修改 Port 80 # bind 调用的IP 地址,一般注释掉,表明绑定到INADDR_ANY ,通配于服务器的所有IP 地址 #Listen 192.68.0.5 User 0 Group 0 # 当服务器发生问题时发送报警的email 地址,目前未用,注释掉 #ServerAdmin root@localhost  # 错误日志文件。如果没有以/ 开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null 。在下面设置时,注意一定要建立/var/log/boa 目录 ErrorLog /mnt/log/boa/error_log # 访问日志文件。如果没有以/ 开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null 或直接注释掉。在下面设置时,注意一定要建立/var/log/boa 目录 #AccessLog /var/log/boa/access_log # 是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC 时间 #UseLocaltime # 是否记录CGI 运行信息,如果没有注释掉,则记录,注释掉则不记录 #VerboseCGILogs # 服务器名字 ServerName www.hyesco.com  # 是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web 服 # 务器。一般注释掉,即不需要启动 #VirtualHost # 非常重要,HTML 文档的主目录。如果没有以/ 开始,则表示从服务器的根路径开始。 DocumentRoot /var/www # 如果收到一个用户请求的话,在用户主目录后再增加的目录名 UserDir public_html #HTML 目录索引的文件名,也是没有用户只指明访问目录时返回的文件名 DirectoryIndex index.html # 当HTML 目录没有索引文件时,用户只指明访问目录时,boa 会调用该程序生成索引文件然后 # 返回给用户,因为该过程比较慢最好不执行,可以注释掉或者给每个HTML 目录加上#DirectoryIndex 指明的文件 #DirectoryMaker /usr/lib/boa/boa_indexer # 如果DirectoryIndex 不存在,并且DirectoryMaker 被注释,那么就用Boa 自带的索引 # 生成程序来生成目录的索引文件并输出到下面目录,该目录必须是Boa 能读写 # DirectoryCache /var/spool/boa/dircache # 一个连接所允许的HTTP 持续作用请求最大数目,注释或设为0 都将关闭HTTP 持续作用 KeepAliveMax 1000 #HTTP 持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接 KeepAliveTimeout 10 # 指明mime.types 文件位置。如果没有以/ 开始,则表示从服务器的根路径开始。可以注释掉 # 避免使用mime.types 文件,此时需要用AddType 在本文件里指明 MimeTypes /etc/mime.types # 文件扩展名没有或未知的话,使用的缺省MIME 类型 DefaultType text/plain # 提供CGI 程序的PATH 环境变量值 CGIPath /bin:/usr/bin:/usr/local/bin # 将文件扩展名和MIME 类型关联起来,和mime.types 文件作用一样。如果用mime.types # 文件,则注释掉,如果不使用mime.types 文件,则必须使用 #AddType application/x-httpd-cgi cgi # 指明文档重定向路径 #Redirect /bar http://elsewhere/feh/bar  # 为路径加上别名 Alias /doc /usr/doc # 非常重要,指明CGI 脚本的虚拟路径对应的实际路径。一般所有的CGI 脚本都要放在实际路径 # 里,用户访问执行时输入站点+ 虚拟路径+CGI 脚本名 ScriptAlias /cgi-bin/ /var/www/cgi-bin/     用户可以根据自己需要,对boa.conf 进行修改,但必须要保证其他的辅助文件和设置必须和boa.conf 里的配置相符,不然Boa 就不能正常工作。 在上面的例子中,我们还需要创建日志文件所在目录/var/log/boa ,创建HTML 文档的主目录/var/www ,将mime.types 文件拷贝 到/etc 目录,创建CGI 脚本所在目录/var/www/cgi-bin/ . www 目录放index.html 文件。mime.types 文件用来指明不同文件扩展名对应的MIME 类型,一般 可以直接从Linux 主机上拷贝一个,大部分也都是在主机的/etc 目录下。访问方式:http://192.168.3.223/index.html

BOA源文件编译出错解决方案

        

编译boa时提示:      

make: yacc:命令未找到 make: *** [y.tab.c] 错误 127 make: lex:命令未找到 make: *** [lex.yy.c] 错误 127 解决方法:

安装需要工具         apt-get install bison

        apt-get install flex

编译会出错: util.c: 100: 1: pasting “t” and “->” does not give a valid preprocessing token make: [util.o] Error1 解决方法,修改compat.h中的 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 为: #define TIMEZONE_OFFSET(foo) foo->tm_gmtoff

1.必须要在板子的/etc下建一个boa目录(错误代码忘了) 2.”can't open boa.conf for reading“ 解决:不仅要在你自己放置boa的目录下放入boa.conf配置文件,而且要在板子的/etc/boa下也要放入boa.conf文件,这样系统在运行boa的时候才可以读取到boa.conf文件。 3.“unable to dup2 the error log bad file descriptor” 解决:在boa源码里,即src文件夹下把log.c中的第73行的if语句注释掉。

其实主要原因在于没有创建/var/log/boa/文件夹下面的 两个记录文件 error_log access_log  创建完成后重新运行boa 4."unable to dup2 the error log:Bad file descriptor" 解决:在boa.conf里,把“#AccessLog /var/log/boa/access_log”注释掉(即去掉#号)。 5.“[01/Jan/2031:00:12:25 +0000] boa.c:226 - icky Linux kernel bug!: No such file or directory” 解决:在boa源码里,即src文件夹下把boa.c中的第226行的if语句注释掉。  6."gethostbyname:: Resource temporarily unavailable" 解决:把“#ServerName www.your.org.here”的“#”号去掉。  7."./boa: 1: syntax error: "(" unexpected" 解决:没有修改Makefile,是用gcc编译的,应该改成是arm-linux-gcc编译。 8.如果页面上是:“502 Bad Gateway The CGI was not CGI/1.1 compliant.“ 解决:给你要执行的cgi可执行程序赋个权限。chmod 777 filename 9.在<form action="cgi-bin/test2.cgi" method="get">中,cgi可执行程序的路径就直接写“cgi-bin/test2.cgi”就可以了,不要写板子上的绝对路径,这样就重复了,因为cgi执行时会自动去boa.conf的指定的路径里找。 10.出现警告:“control reaches end of non-void function”,是因为某个函数没有return,而函数定义时是非void型的。所以需要有个返回值。比如int cgiMain()这个函数就一定要有个返回值的,否则会报这个错误。 12.运行网页时老出现错误:“mkstemp:No such file or diectory” 解决:不能用post,只能用get。因为post方式需要新建一个临时文件,这就需要用到mkstemp函数。这个函数是在系统中以唯一的文件名创建一个文件并打开,且只有当前用户才能访问这个临时文件。故权限不够,或其他什么问题都会报这个错误。那么就用get吧!这里具体原因细节笔者暂时也不是很清楚... 13.直接写的含有system()函数的c程序用arm-linux-gcc编译到板子上的可以执行,而如果写在cgi中的就不一定能执行了。因为牵涉到一个cgi的权限的问题。即使给你的cgi-bin文件夹下的所有cgi可执行文件都赋了权限,也不一定能执行。

boa程序无法运行  如果要将运行用户为 root 则还要改, 首先在 boa.conf 中  48行   User nobody 改为   User root 如果这样重新运行boa 则会邮错,请看 error_log 中的提示        src/boa.c:226 - icky Linux kernel bug!: Success 在linux中很少以root 用户作为应用程的运行者,一般的应用程序也会禁止认root作为程序的运行者  所以在boa.c 的225行中有       if (setuid(0) != -1)    }注释掉下面语句: if(setuid(0) != -1) { DIE(”icky Linux kernel bug!”); } 即修改为: #if 0 if(setuid(0) != -1) {    DIE(”icky Linux kernel bug!”);    } #endif 上面修改完成 查看/var/log/error/boa/error_log   

继而可以打开浏览器查看是否能打开index.html

cgi文件也可以正常打开!

写写改改一天终于完成了在imx283开发版上面移植web服务器了,本想上传一些大的网页素材结果发现 /var 目录分配的时候给的太小了 只有512k,需要重新做个根文件,(笔者想更改掉网站的根目录 DocumentRoot 结果发现CGI程序无法正常运行,改日再继续修改!)

通过修改了DocumentRoot /www 和ScriptAlias          /www/cgi-bin/   

将网站文件放到了根目录,boa服务器顺利完成搭建!

参考资料

            基于嵌入式web服务器的远程数据采集系统的应用   韩改宁,梁新月      

资源网盘              

           http://pan.baidu.com/s/1dEh0lLf

热门文章 iMX283开发板实践历程-LED实验

时间:2016-1-21 作者:RainFly   分类: Linux嵌入式   热度: 11817°  评论:1  
时间:2016-1-21   分类: Linux嵌入式    热度:11817   评论:1

通过在开发板中输入命令 mount -t nfs 192.168.1.2:/nfsroot  /mnt  -o nolock

将开发板/mnt挂载到linux主机nfsroot目录下 实现文件传输共享!

在nfsroot目录下新建文件flash.c Makefile 

Makefile 用交叉编译器实现编译

# this makefile is to compile the light flashing! EXE =flash SRC =flash.c CC = arm-none-linux-gnueabi-gcc .PHONY:all clean all: $(CC) $(SRC) $^ clean: -rm -v $(EXE)

flash.c文件内容

#include<stdio.h> #include<fcntl.h> #include<unistd.h> void delaytime(); int main() { int time; int t_fd,b_fd; int t_ret,b_ret; const char t_path[]="/sys/class/leds/led-err/trigger"; const char b_path[]="/sys/class/leds/led-err/brightness"; const char t_none[]="none"; const char b_true[1]="1";  //只写入一个字符'1'进入缓冲区 const char b_false[1]="0"; //同上 t_fd =open(t_path,O_RDWR); printf("%s file describer is %d \n",t_path,t_fd); b_fd =open(b_path,O_RDWR); printf("%s file describer is %d \n",b_path,b_fd); t_ret=write(t_fd,t_none,sizeof(t_none)); printf("write to trigger fd  %d\n",t_ret); while(1) { for(time=2;time>0;time--) { if(2 == time) { b_ret=write(b_fd,b_true,1); delaytime(); printf("%d\n",b_ret); printf("write the 1 to b\n"); } else { b_ret=write(b_fd,b_false,1); delaytime(); printf("%d\n",b_ret); printf("write the 0 to b\n"); } } } return 0; } void  delaytime()   //延时函数 { int i,j; for(i=1000;i>0;i--) for(j=10000;j>0;j--); }

返回顶部    首页    捐赠支持    手气不错    友情链接    关于我们    站长工具    站长介绍    手机版本    后台登陆   
版权所有:雨夜轩    站长:RainFly    特别鸣谢   文章归档   皖ICP备15003600号-1   百度统计
Copyright©2015雨夜轩 Powered by emlog强力驱动 七牛CDN全球加速 360站长联盟安全认证 中国博客联盟荣誉成员 可信赖网站 谷歌地图   百度地图   
页面加载耗时:0.072秒 数据库查询次数:60次
背景设置
$