Register

  • 点击获取
  •   

已有账号直接登录    

公告:

热门文章 实现ESP8266模块同远程web服务器交互请求

时间:2017-7-21 作者:RainFly   分类: Linux嵌入式   热度: 10936°  评论:7  
时间:2017-7-21   分类: Linux嵌入式    热度:10936   评论:7

实验材料: 1.ESP 8266模块 

                 2 有公网IPv4的web服务器(当然也可以通过域名访问,这里先测试通过IP地址建立TCP连接)

实验原理:

      原理很简单,通过串口向ESP8266发送一系列指令,由于8266内置了TCP协议栈,我们只需要通过指令建立TCP连接,当连接建立完成后,直接发送GET/POST请求,接受到web服务器传输过来的数据链接,通过这些交互数据分析,从而实现开发板和web服务器之间的数据互换。

步骤:

    1. 配置ESP为站点模式,连接到可以正常访问英特网的热点上面。

    2. 配置模块为透传模式 

    3.建立TCP连接   IP 端口号等

    4直接发送 请求查看串口返回的参数值 GET /index.html  HTTP/1.1      (TCP请求可以加密)

注意事项

   测试的时候 发送指令总是回复400 错误,经过查找发现由于协议中回车换行为加上引起无法提交POST请求

    POST /1.php HTTP/1.1\r\nHost: 192.168.0.107\r\nConnection: keep-alive\r\nContent-Length: 34\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nfirstname=hello&lastname=123&age=123\r\n

<html> <body> <form action="" method="post"> Firstname: <input type="text" name="firstname" /> Lastname: <input type="text" name="lastname" /> Age: <input type="text" name="age" /> <input type="submit" /> </form> </body> </html> <?php $con = mysql_connect("localhost","root","root"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("test", $con); $sql="INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } echo "1 record added"; mysql_close($con) ?>

由于是网络配置器 所以发送的数据很正常,但是通过wifi串口发送的时候 /r/n会由于ascii编码 而不是回车 继而串口发送总是失败,我利用ASCII码转HEX工具将 所有发送文件转为十六进制

然后通过十六进制 进行串口数据发送

至此通过串口芯片发送POST请求到指定云服务,实例完成。以下提供所用到的软件

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

热门文章 STM32F107VC互联型芯片建立Keil5工程

时间:2017-7-5 作者:RainFly   分类: STM32   热度: 5449°  评论:5  
时间:2017-7-5   分类: STM32    热度:5449   评论:5

    使用STM32F107VC芯片配置工程的时候,出现一些报错,继而写此文档。

建立三个文件夹

文件夹CORE内包含

FW 是官方提供固件库 USER 是编译的主文件,和一些重要文件

建立keil 5工程

添加两个宏和头文件

运行后基本上没有错误和警告了, 

注意事项:

1. .s启动文件选择

 

2.宏定义的选择

选择的文件是 startup_stm32f10x_cl.s 和 STM32F10X_CL

热门文章 STM32学习笔记之IIC总线

时间:2017-6-28 作者:RainFly   分类: STM32   热度: 8143°  评论:1  
时间:2017-6-28   分类: STM32    热度:8143   评论:1

        基于对STM32F103的手册可以看出来,具备两路IIC总线端口,其实我们不使用系统提供的IIC硬件,通过做成普通IO口来模拟ICC总线,完成对IIC总线的了解和学习。

首先是对IIC总线的工作原理进行了解:

IIC系统由一条串行数据线SDA和一条串行时钟线SCL组成。主机按一定的通信协议向从机寻址和进行信息 传输。在数据传输时,由主机初始化一次数据传输,主机使数据在SDA线上传输的同时还通过SCL线传输时钟。信息传输的对象和方向以及信息传输的开始和终 止均由主机决定。

每个器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD驱动器)或者可以接收也可以发送的器件(例如:存储器)。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。

//初始化IIC void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; 配置IIC引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); }

通过对PB10 PB11配置IO来做成对其初始化要求。

开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

//启动IIC void IIC_Start(void) { SDA_OUT(); IIC_SDA=1; //将SDA和SCL都拉置高电平,然后进行一定的延时 IIC_SCL=1; delay_us(4); IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4); //SDA产生由高电平向低电平的跳变的时候,从而产生一个启动信号 IIC_SCL=0; //锁住IIC总线 } //终止信号 void IIC_Stop(void) { SDA_OUT(); IIC_SCL=0; IIC_SDA=0;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SCL=1; IIC_SDA=1; //发送iic终止信号 delay_us(4); //延时产生一个控制信号 }

热门文章 STM32学习笔记1之通用GPIO

时间:2017-6-19 作者:RainFly   分类: STM32   热度: 6842°  评论:5  
时间:2017-6-19   分类: STM32    热度:6842   评论:5

开篇:

        已经很久未更新相关内容,由于工作原因,开始学习STM32,会将学习和工作遇到的任何问题和进展,都写下来,如果需要的伙伴可以加上书签在下面留言给我,共同探讨进步。

学习平台:    芯片:STM32F10x     库函数版本:V3.5.0         开发板:百为

由于需要马上上手,继而对于底层寄存器操作认识先行搁置,只要是已开发为主,所以采用官方提供的API接口 通过这些接口来实现对STM3210X的软件编写,

官方提供的固件库 :http://pan.baidu.com/s/1bp6bgcf

GPIO的函数和变量 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; typedef struct { uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. //0-15对应的管脚号 This parameter can be any value of @ref GPIO_pins_define */ GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. //io口传输频率 This parameter can be a value of @ref GPIOSpeed_TypeDef */ GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. 选择输入或输出且是否其他功能 This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef;

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */ #define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */ #define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */ #define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */ #define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */ #define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */ #define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */ #define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */ #define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */ #define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */ #define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */ #define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */ #define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */ #define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */ #define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */ #define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */ #define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */ typedef enum { GPIO_Speed_10MHz = 1, //选择传输MHz GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef; typedef enum { GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, GPIO_Mode_Out_PP = 0x10, GPIO_Mode_AF_OD = 0x1C, GPIO_Mode_AF_PP = 0x18 }GPIOMode_TypeDef; GPIO_Init(GPIOB, &GPIO_InitStructure); //设置GPIOB为初始化的IO引脚,且将GPIO_IniStructure对应刚才设置的结构体     指针所包含的 PIN SPEED MODE)初始化 GPIO_SetBits(GPIOB,GPIO_Pin_5);//置1   GPIO_ResetBits(GPIOB,GPIO_Pin_5); //清0 还有很多复用功能,继续添加

热门文章 串级控制系统的基本原理

时间:2017-3-31 作者:RainFly   分类:   热度: 18534°  评论:2  
时间:2017-3-31   分类:    热度:18534   评论:2

    由于笔者毕业设计用到串级控制系统,所以稍加研究了一下。

串级控制系统的基本原理     采用不止一个控制器,而且控制器间相串接,一个控制器的输出作为另‘—个控制器的设定值的系统,称为串级控制系统。串级控制系统是按其结构命名的。     例如,铝炉锅筒液位是一个重要的工艺参数。液位过低,影响产汽量,且易烧干而发生事故;液位过高,影响蒸汽质量,因此对锅筒液位府严加控制。锅简液位有多种控制方案:     (1)图5—1a所示是结水流量定值控制。该控制方案保持给水流量为定值,对于克服给水流员或压力的波动有效,但由于锅简液位是开环,因此,锅筒液位不能保持恒定。     (2)图5—1b所示是锅筒液位定值控制。该控制方案选择锅简液位作为被控变量,选择给水流量作为操纵变量。由于被控过程的滞后大,时间常数大,因此,锅筒液位控制系统的控制品质不佳。尤其当给水流量和压力波动时影响更大。

   (3)锅简液位为主被控变量,给水流量为副被控变量,给水流量为操纵变量组成串级控制,如图5—1c所示。该控制方案以锅筒液位作为主被控变量,抓住了生产过程的主要矛盾;通过副被控变量组成的副回路.能够及时克服给水流量或压力的波动,大大削弱了它们 的波动对锅筒液他的影响。该控制系统投运后,取得了良好的控制效果。     图5—1中,IJ、叮分别为液位、给水流量变送器,Lc、rc分别为液位

   图5。2中,主被控变量yI是串级控制系统中要保持平稳控制的主要被控变量。例如, 示例中的锅筒液位。副被控变量72是串级控制系统的辅助被控变量。例如,示例中的给水流量。通常,控制系统中的主要扰动影响首先在副被控变量反映。氏(z)和氏(‘)分别是主、副控制器的传递函数。主控制器的输出作为副控制器的设定值,组成串联连接的结构。 因此,主控制器输出QI等于副控制器的设定L o由于主控制器的输出随偏差e J而变化.即副控制器是在外部设定情况下工作,此时是随动控制。主控制器在内部设定情况下工作,因此是定值控制。示例中的液位控制器是主控制器,给水流量控制器是副控制器。rI和r2是主、副控制器的设定。G p、(‘)和G4(‘)分别是主、副被控对象传递函数。GmI(‘)和612d(‘)分别是主、副被控变量的检测变送环节传递函数。7“和yd分别是主、副被控变量的测量值。风和F2分别是进入主、副被控对象的扰动。扰动通道传递函数分别为cf2(s)和GR(‘)。把由G6(‘)、G,(‘)、c4(‘)和Gd(s)组成的控制回路称为副(控制)回路,或副环。把由氏 (s)和副回路、汽(s)和G,。l(‘)组成的控制回路称为主(控制)回路,或主环。控制系统的调节过程如下:当给水压力或流量波动时,锅筒液位还没有变化,因此,主控制器输出不变,给水流量控制器因扰动的影响,使给水流量测量值变化,按定值控制系统 的调节过程,副控制器改变控制阀开度,使给水流量稳定。与此同时,给水流量的变化也影响锅筒液位,使主控制器输出.即副控制器的设定变化,副控制器的设定和测旦的同时变化,进一步加速了控制系统克服扰动的调节过程,使主被控变量锅筒液位回复到设定值。当锅简液位和给水流量同时变化时.主控制器通过主环及时调节副控制器的设定,使给水流量变化保持锅筒液位恒定,而副控制器一方面接收主控制器的输出信号,同时、根据给水流量测量值的变化进行调节,使给水流量跟踪设定值变化,使给水流量能根据锅筒液伦及时调整,最终使锚筒液位迅速回复到设定值。     串级控制系统中有关的传递函数如下:

  串级控制系统是由两个或两个以上的控制器串联连接,一个控制器输出是另一个控制器 设定。主控制回路是定值控制系统。对主控制器的输出而言,副控制回路是随动控制系统, 对进入副问路的扰动而言,副控制回路是定值控制系统。

热门文章 国内域名供应商将更改至实名认证

时间:2017-3-31 作者:RainFly   分类: 计算机知识   热度: 9528°  评论:4  
时间:2017-3-31   分类: 计算机知识    热度:9528   评论:4

    

       国内域名注册商阿里云发布通知称,将对所有域名全面展开域名实名认证工作,如果在5月份还未完成域名实名认证工作,将强制暂停解析域名,使域名无法正常访问,待实名认证通过后方可恢复正常使用。

自2016年8月开始,阿里云所有新注册的网站域名都需要实名认证,完成域名所有者实名认证后才能正常使用,否则域名就会被注册局锁定。此次则涉及到老域名的实名认证,所有2016年前注册或转入的老域名也被要求实名认证。

通知原文如下:

        尊敬的用户,您好! 根据《中国互联网络域名管理办法》的规定,域名注册申请者应提交真实、准确、完整的域名注册信息。 按照工信部2017年全面域名实名认证的要求,目前阿里云已接到相关注册局通知,若您的域名在规定时间内未通过实名审核,注册局将暂停解析(Serverhold),无法正常访问。待实名认证通过后方可恢复正常使用。涉及的域名包括:.com/.net /.top/.xyz/.vip /.club/.shop/.wang/.ren: a)截止2017年5月15日,未完成实名认证的.top/.xyz/.vip/.club/.shop/.wang/.ren域名将被注册局暂停解析; b)截止2017年5月31日,未完成实名认证的.com/.net域名将被注册局暂停解析。 请您务必按以下要求,尽快完成以上后缀域名的实名认证,以避免由于未通过实名审核而影响您网站/邮箱或网络应用的正常使用。具体如下: 1、如果您的域名属于上述域名后缀,且目前尚未完成实名认证的,请尽快提交资料完成实名认证审核。 实名认证提交的资料包括: ①  居民身份证扫描件(个人) ②公司营业执照或组织机构代码证扫描件(企业) 2、如果您的域名属于上述域名后缀,目前显示为“已实名认证”,但属于相关注册局实名认证开始时间(详见下表)之前注册的存量历史域名,请注意相关注册局将对其实名认证资料进行核验(二次复审)。 复审结果将于2017年4月1日左右更新,若复审不通过,则需要您重新提交资料进行实名认证。 请您届时留意阿里云系统通知,登录查看复审后域名的实名认证状态,并按提示操作。 3、为了配合尽快完成实名认证审核工作, 自2017年4月30日起,如果您的域名属于上述域名后缀,仍未提交实名认证或审核失败的域名,其管理功能将受到限制,届时您将不能进行新增&修改解析、DNS修改及其他相关等操作。通过实名认证后,上述限制解除。

热门文章 centos 6 编译nodejs环境并部署nodejs应用

时间:2017-1-3 作者:RainFly   分类: Web程序设计   热度: 10944°  评论:8  
时间:2017-1-3   分类: Web程序设计    热度:10944   评论:8

该环境安装非常简单,这里简单记录下linux(centos环境下)的源码安装,做个记录。

平台:centos 6 环境:python 2.6 环境安装包地址:http://nodejs.cn/download/  可以这里下载源码编译。

安装步骤:

1,安装编译代码的开发工具

yum -y groupinstall "Development Tools"

2,下载安装包。 到node官网下载,这里下载源码编译最新安装包:https://nodejs.org/dist/v6.2.0/node-v6.2.0.tar.gz 进入/usr/local/src

wget https://nodejs.org/dist/v6.2.0/node-v6.2.0.tar.gz tar zxvf node-v6.2.0.tar.gz cd node-v6.2.0 ./configure make make install

3,安装模块express和forever。

现在已经安装了Node.js, 准备部署应用程序, 首先要使用Node.js的模块管理器npm安装Express middleware 和forever:

npm -g install express forever

4,建立超级链接。

ln -s /usr/local/bin/node /usr/bin/node ln -s /usr/local/lib/node /usr/lib/node ln -s /usr/local/bin/npm /usr/bin/npm ln -s /usr/local/bin/node-waf /usr/bin/node-waf ln -s /usr/local/bin/forever /usr/bin/forever

运行node -v可以看到版本说明没问题。

5,部署应用程序。 比如:

forever start app.js &

这样扔到后台运行,端口默认1337. 查看运行当中的应用:

forever list

退出应用:

forever stop 0

热门文章 利用Wireshark分析TCP/IP协议三次握手

时间:2016-8-25 作者:RainFly   分类: Web程序设计   热度: 11379°  评论:3  
时间:2016-8-25   分类: Web程序设计    热度:11379   评论:3

        关于wireshark做APP或者网站开发应该不会不熟悉,关于这类查看网络数据封包的工具有很多 Charles ,sniffer ,network monitor, Fiddler等等,当然有的需要收费,这款软件是免费使用的基于WinPcap的网络嗅探工具,当你看到真正的计算机网络协议包,会发现对此了解会网络协议层更加深刻理解。

我所使用的是经过汉化的wireshak喜欢的朋友可以在下方下载,其中包含了使用手册。

开始抓包

wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。 点击Caputre->Interfaces.. 出现下面对话框,选择正确的网卡。然后点击"Start"按钮, 开始抓包

WireShark 主要分为这几个界面

1. Display Filter(显示过滤器),  用于过滤

2. Packet List Pane(封包列表), 显示捕获到的封包, 有源地址和目标地址,端口号。 颜色不同,代表

3. Packet Details Pane(封包详细信息), 显示封包中的字段

4. Dissector Pane(16进制数据)

5. Miscellanous(地址栏,杂项)

 

使用过滤是非常重要的, 初学者使用wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。搞得晕头转向。 过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。 过滤器有两种, 一种是显示过滤器,就是主界面上那个,用来在捕获的记录中找到所需要的记录 一种是捕获过滤器,用来过滤捕获的封包,以免捕获太多的记录。 在Capture -> Capture Filters 中设置

在Filter栏上,填好Filter的表达式后,点击Save按钮, 取个名字。比如"Filter 102",

 

Filter栏上就多了个"Filter 102" 的按钮。 

表达式规则  1. 协议过滤 比如TCP,只显示TCP协议。 2. IP 过滤 比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102, ip.dst==192.168.1.102, 目标地址为192.168.1.102 3. 端口过滤 tcp.port ==80,  端口为80的 tcp.srcport == 80,  只显示TCP协议的愿端口为80的。 4. Http模式过滤 http.request.method=="GET",   只显示HTTP GET方法的。 5. 逻辑运算符为 AND/ OR 常用的过滤表达式 过滤表达式 用途 http 只查看HTTP协议的记录 ip.src ==192.168.1.102 or ip.dst==192.168.1.102 源地址或者目标地址是192.168.1.102    

封包列表(Packet List Pane) 封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 你可以看到不同的协议用了不同的颜色显示。 你也可以修改这些显示颜色的规则,  View ->Coloring Rules.

封包详细信息 (Packet Details Pane) 这个面板是我们最重要的,用来查看协议中的每一个字段。 各行信息分别为 Frame:   物理层的数据帧概况 Ethernet II: 数据链路层以太网帧头部信息 Internet Protocol Version 4: 互联网层IP包头部信息 Transmission Control Protocol:  传输层T的数据段头部信息,此处是TCP Hypertext Transfer Protocol:  应用层的信息,此处是HTTP协议

wireshark与对应的OSI七层模型

TCP包的具体内容  从下图可以看到wireshark捕获到的TCP包中的每个字段。

实例分析TCP三次握手过程 看到这, 基本上对wireshak有了初步了解, 现在我们看一个TCP三次握手的实例    三次握手过程为

这图我都看过很多遍了, 这次我们用wireshark实际分析下三次握手的过程。 打开wireshark, 打开浏览器输入 http://www.cnblogs.com/tankxiao 在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击"Follow TCP Stream", 这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图

图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。   第一次握手数据包 客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图

第二次握手的数据包 服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图  

第三次握手的数据包 客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:

 就这样通过了TCP三次握手,建立了连接

本文转自:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html

Wireshark安装包+使用教程来源:百度云网盘  | 大小:22MB  | 提取密码:um1w | 解压密码:www.rainfly.cn 已经过安全软件检测无毒,请您放心下载。          若链接失效可联系管理员!

热门文章 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 已经过安全软件检测无毒,请您放心下载。          若链接失效可联系管理员!

热门文章 谷歌最新研发Project Soil芯片,可能将结束触摸屏时代

时间:2016-8-23 作者:RainFly   分类: 随手乱写   热度: 10552°  评论:4  
时间:2016-8-23   分类: 随手乱写    热度:10552   评论:4

   当今科技的飞速发展,许多黑科技不断涌现,或许人们已经厌倦了从手机到平板电脑等大大小小的触摸屏了。当然不可否认触摸屏给我们使用带来了便捷,但是Google依然不懈努力这追求更为科技的方式。

热门文章 ECS云主机Ubuntu14.04搭建Apache2+PHP5+MySQL环境

时间:2016-8-19 作者:RainFly   分类: Web程序设计   热度: 6874°  评论:1  
时间:2016-8-19   分类: Web程序设计    热度:6874   评论:1

摘要:所谓好记性不如烂笔头,笔者记忆力太差,虽然对linux也很熟悉,接触了三年多了,但是总是会丢三落四,以前买过的云主机都是用Windows2008,IIS配置PHP MySQL极为方便,也尝试安装了SSL证书,折腾了HTTPS ,但即便是图形界面,步骤却忘记了,所以此次配置全程记录,留已备用。

安装步骤

1.更新软件源

apt-get  update

2.安装Apache2 服务器

apt-get  install apache2    

    校验Apache2 是否正常安装

    使用apache -v 查看是否正常安装

root@iZ286x0azp7Z:~# apache2 -v Server version: Apache/2.4.7 (Ubuntu) Server built: Jul 28 2016 20:50:32

查看端口是否正常开启

root@iZ286x0azp7Z: netstat -aunpt | grep LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2952/apache2 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 733/sshd

如果没用选择好配置文件    apt-get 安装 httpd.conf 默认是空没有的

root@iZ286x0azp7Z:/etc/apache2# vi /etc/apache2/apache2.conf 

加上ServerName localhost:80

然后重新启动

/etc/init.d/apache2  start

   在公网输入IP地址查看Apache是否显示下画面

( 由于是apt-get的简易安装 所以web root 直接给你定在了/var/www/html/ 下面这是index.html)

3.安装PHP5

apt-get install php5

用 php5 -v 查看输出结果如下

root@iZ286x0azp7Z:~# php5 -v PHP 5.5.9-1ubuntu4.19 (cli) (built: Jul 28 2016 19:26:04) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

sudo apt-get install php5-curl    如果函数curl_init(); 不存在

4.查看Apache是否已经加载libphp5.so模块,该模块是Apache用来指挥PHP解析器来执行PHP代码的模块 cat /etc/apache2/mods-enabled/php5.load

root@iZ286x0azp7Z:~# cat /etc/apache2/mods-enabled/php5.load LoadModule php5_module /usr/lib/apache2/modules/libphp5.so

表示该模块已经加载了

5.安装MySQL数据库

由于我用的secureCRT中间会出现乱码,其实是设置问题,选项->会话选项->外观->字符编码 后面修改为UTF-8 即可

中间会弹提示输入密码,这是账号root的MySQL数据库管理员密码,输入两次即可。

apt-get install mysql-server          

6.检查是否加载了mysql.so的扩展,PHP通过该扩展链接mysql执行CURD操作,

root@iZ286x0azp7Z:~# cat /etc/php5/mods-available/mysql.ini cat: /etc/php5/mods-available/mysql.ini: No such file or directory

输入以上命令查看发现 No such file or directory 表示PHP默认没有安装该操作数据库的扩展,需要自行安装

7.安装操作数据库拓展(如果第六步成功可以跳过了)

apt-get install php5-mysql

root@iZ286x0azp7Z:~# apt-get install php5-mysql Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package php5-mysql

如何出现以上问题,表明需要重新更新一下源 apt-get update    在重新 apt-get install php5-mysql   

root@iZ286x0azp7Z:~# cat /etc/php5/mods-available/mysql.ini ; configuration for php MySQL module ; priority=20

  表示mysql.so扩展已经安装成功。

8.重启mysql和Apache

root@iZ286x0azp7Z:~#  /etc/init.d/mysql restart root@iZ286x0azp7Z:~#   /etc/init.d/apache2 restart 

 中间问题   

 当中断输入  mysql -u   root -p  命令提示错误解决办法

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

#1.停止mysql数据库 /etc/init.d/mysql stop  #2.执行如下命令 mysqld_safe --user=mysql --skip-grant-tables --skip-networking &  #3.使用root登录mysql数据库 mysql -u root mysql  #4.更新root密码 mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root'; #5.刷新权限  mysql> FLUSH PRIVILEGES;  #6.退出mysql mysql> quit  #7.重启mysql /etc/init.d/mysql restart  #8.使用root用户重新登录mysql mysql -u   root -p  Enter password: <输入新设的密码newpassword>

MySQL数据库操作命令http://www.rainfly.cn/?post=161

9.给php安装常用扩展

apt-get install php5-gd curl libcurl3 libcurl3-dev php5-curl

10.安装完成之后,重启Apache

/etc/init.d/apache2 restart

配置多虚拟主机(这里是将www/目录下放置多个web站点,占未测试 )

1.创建虚拟目录

现在需要安装虚拟主机,我添加一台虚拟主机命名为rainfly

首先,让我们为rainfly这个站点创建一个目录:    mkdir -p /var/www/rainfly/public_html

2.设置所有者和权限 上面目录现在只有root拥有权限。我们需要修改这2个目录的拥有权给普通用户,而不仅仅是root用户。 chown -R $USER:$USER /var/www/rainfly/public_html/

“$USER”变量指向了当前的登录用户。  设置读写权限给apache网页根目录(/var/www)及其子目录,这样每个人都可以从目录中读取文件。 chmod -R 755 /var/www/ 这样,我们就创建好了一些文件夹来保存网络相关数据并分配必要的权限和所属用户。

3.为虚拟主机创建示例页面

现在,我们给网站增加示例页。第一步,让我们给虚拟主机rainfly创建一个示例页。 给rainfly虚拟主机创建一个示例页, vi /var/www/rainfly/public_html/index.html 添加以下内容: <html><head><title>www.rainfly</title></head><body><h1>Welcome To rainfly website</h1></body></html> 保存并关闭文件。

4.创建虚拟主机配置文件

默认情况下,apache有一个默认的虚拟主机文件叫000-default.conf。我们将会复制000-default.conf文件内容到我们新的虚拟主机配置文件中。

cp /etc/apache2/sites-available/000-default.conf  /etc/apache2/sites-available/rainfly.conf   

确保虚拟主机配置文件末尾包含.conf扩展名。

现在,修改rainfly.conf   文件以符合需求。

vi /etc/apache2/sites-available/rainfly.conf

使相关的变化直接呈现在rainfly站点中(译注:以“#”开头的注释行可以忽略。)。

<VirtualHost *:80># The ServerName directive sets the request scheme, hostname and port that# the server uses to identify itself. This is used when creating# redirection URLs. In the context of virtual hosts, the ServerName# specifies what hostname must appear in the request's Host: header to# match this virtual host. For the default virtual host (this file) this# value is not decisive as it is used as a last resort host regardless.# However, you must set it for any further virtual host explicitly.#ServerName www.example.comServerAdmin webmaster@rainflyServerName rainflyServerAlias www.rainflyDocumentRoot /var/www/rainfly/public_html# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,# error, crit, alert, emerg.# It is also possible to configure the loglevel for particular# modules, e.g.#LogLevel info ssl:warnErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined# For most configuration files from conf-available/, which are# enabled or disabled at a global level, it is possible to# include a line for only one particular virtual host. For example the# following line enables the CGI configuration for this host only# after it has been globally disabled with "a2disconf".#Include conf-available/serve-cgi-bin.conf</VirtualHost>

修改虚拟主机文件后,禁用默认的虚拟主机配置(000.default.conf),然后启用新的虚拟主机配置,如下所示。

sudo a2dissite 000-default.conf

sudo a2ensite rainfly.conf

sudo a2ensite unixmen2.local.conf  (已经使root用户不用sudo)

最后,重启apache服务器。  /etc/init.d/apache2 restart 就是这样。现在,我们成功地配置了apach虚拟主机在我们的Ubuntu服务器上

参考文献:http://httpd.apache.org/docs/2.4/

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