首页
AI
爬虫
爬虫案例
JS逆向技巧
APP逆向
嵌入式开发
C语言入门视频教程
模电数电
51/52单片机
STM32
Linux嵌入式
文学修养
感动和励志文字
生活哲理
随手乱写
IT计算机
QT学习之路
数据库设计
网站搭建
微信开发
Java
计算机知识
NCRE全国计算机等级考试
编程语言
Web程序设计
关于我们
广告招租
表白网页制作
搜索
登录
搜索
RainFly
明确一个目标,这很重要!
累计撰写
206
篇文章
累计收到
4771
条评论
首页
栏目
首页
AI
爬虫
爬虫案例
JS逆向技巧
APP逆向
嵌入式开发
C语言入门视频教程
模电数电
51/52单片机
STM32
Linux嵌入式
文学修养
感动和励志文字
生活哲理
随手乱写
IT计算机
QT学习之路
数据库设计
网站搭建
微信开发
Java
计算机知识
NCRE全国计算机等级考试
编程语言
Web程序设计
关于我们
广告招租
表白网页制作
会声会影X9
会声会影X9
会声会影X9
最新文章
2017-8-17
IC卡系统研究
最近项目上面需要用到刷卡系统,继而研究了一下对IC 相关的资料进行学习 项目平台 Windows 10 刷卡器 ZLG600A-T2 V1.03 上位机 QT4.8和zlg调试工具 IC卡 S50普通白卡 普通S50 IC卡存储结构: MF1 卡分为 16 个扇区,每区有 4 块(块 0~块 3),共 64 块,按块号编址为 0~63。第 0 扇区的块 0(即 绝对地址块 0)用于存放芯片商,卡商相关代码,已经固化不可更改。其他各扇区的块 0,块 1,块 2 为数 据块,用于存贮用户数据;块 3 为各扇区控制块,用于存放密码 A,存取控制条件设置,密码 B。各区控 制块结构相同,具体如下图所示: 如果需要对其IC进行读写就需要验证秘钥AB,验证完成后可以对数据块(0~63块)进行任意读写 每个块拥有 16个字节空间,16x64=1024Bytes= 1K Bytes 即 容量为 8K 位 EEPROM; 注意:密码验证正确后,直接往第三区写数据就可以了,可以修改整个扇区的秘钥A,控制位,秘钥B, 注意控制位,因为控制位代表了新密码的权限及对数据位的控制,如果写入进去后就会把卡锁死了! 控制位 FF 07 80 69 参考文档 http://pan.baidu.com/s/1o85Id1C
2017年-8月-17日
9207 阅读
6 评论
Linux嵌入式
2017-7-28
快速将VIM打造成IDE工具
SUPER TAB 工具 从http://www.vim.org/scripts/script.php?script_id=1643下载安装版。这个安装包跟先前的几个Vim插件不同,它是一个vba文件,即Vimball格式的安装包,这种格式安装包提供傻瓜式的安装插件的方法。 1)用Vim打开.vba安装包文件。 2)在Vim命令行下运行命令“UseVimball ~/.vim”。此命令将安装包解压缩到~/.vim目录。VImball安装方式的便利之处在于你可以在任何目录打开.vba包安装,而不用切换到安装目的地目录。而且不用运行helptags命令安装帮助文档。 3)在~/.vimrc文件中加入以下这行: let g:SuperTabDefaultCompletionType="context" CTAGS http://www.cnblogs.com/willsonli/p/6555179.html
2017年-7月-28日
7917 阅读
1 评论
Linux嵌入式
2017-7-21
实现ESP8266模块同远程web服务器交互请求
实验材料: 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 已经过安全软件检测无毒,请您放心下载。 若链接失效可联系管理员!
2017年-7月-21日
12300 阅读
7 评论
Linux嵌入式
2017-7-5
STM32F107VC互联型芯片建立Keil5工程
使用STM32F107VC芯片配置工程的时候,出现一些报错,继而写此文档。 建立三个文件夹 文件夹CORE内包含 FW 是官方提供固件库 USER 是编译的主文件,和一些重要文件 建立keil 5工程 添加两个宏和头文件 运行后基本上没有错误和警告了, 注意事项: 1. .s启动文件选择 2.宏定义的选择 选择的文件是 startup_stm32f10x_cl.s 和 STM32F10X_CL
2017年-7月-5日
6266 阅读
5 评论
STM32
2017-6-28
STM32学习笔记之IIC总线
基于对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); //延时产生一个控制信号 }
2017年-6月-28日
9048 阅读
1 评论
STM32
2017-6-19
STM32学习笔记1之通用GPIO
开篇: 已经很久未更新相关内容,由于工作原因,开始学习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年-6月-19日
7664 阅读
5 评论
STM32
2017-3-31
串级控制系统的基本原理
由于笔者毕业设计用到串级控制系统,所以稍加研究了一下。 串级控制系统的基本原理 采用不止一个控制器,而且控制器间相串接,一个控制器的输出作为另‘—个控制器的设定值的系统,称为串级控制系统。串级控制系统是按其结构命名的。 例如,铝炉锅筒液位是一个重要的工艺参数。液位过低,影响产汽量,且易烧干而发生事故;液位过高,影响蒸汽质量,因此对锅筒液位府严加控制。锅简液位有多种控制方案: (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日
20788 阅读
2 评论
未分类
2017-3-31
国内域名供应商将更改至实名认证
国内域名注册商阿里云发布通知称,将对所有域名全面展开域名实名认证工作,如果在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修改及其他相关等操作。通过实名认证后,上述限制解除。
2017年-3月-31日
10290 阅读
4 评论
计算机知识
2017-1-3
centos 6 编译nodejs环境并部署nodejs应用
该环境安装非常简单,这里简单记录下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
2017年-1月-3日
11736 阅读
8 评论
Web程序设计
2016-8-25
利用Wireshark分析TCP/IP协议三次握手
关于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 已经过安全软件检测无毒,请您放心下载。 若链接失效可联系管理员!
2016年-8月-25日
12270 阅读
3 评论
Web程序设计
2016-8-24
ARM9与远程web服务器交互之灯控实验
摘要:网上又不少历程关于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 已经过安全软件检测无毒,请您放心下载。 若链接失效可联系管理员!
2016年-8月-24日
10302 阅读
11 评论
Linux嵌入式
3
4
5
6
7