微信业务原理分析
随着通信技术和移动互联网飞速发展,移动互联网应用也越来越丰富多彩,以微信为代表的IM类应用最为流行。微信作为一款手机聊天软件,通过网络快速发送图片、文字和视频等,支持多人群聊。微信存在多种不同的操作对应着不同的场景,通过捕获微信在移动网络中的用户行为特征,重点开展微信登陆、微信收发图片、文字、视频等重要操作场景的分析,分析微信的操作业务信令过程,指导并制定相应的业务评估指标 ,为运营商优化网络提供参考。
当前使用的IM系统大都组合使用了C/S和P2P模式。在登陆IM进行身份认证阶段是工作在C/S方式,随后如果客户端之间可以直接通信则使用P2P方式工作,否则以C/S方式通过IM服务器通信微信的通信原理如下图:
1、微信登陆
微信登陆用户常用的方式分为二种:一种为不需要输入密码的直接登陆,另外一种是用户输入用户名和密码。通过流程分析,两种登陆方式都有登陆动作特征。打开后台运行的微信,不属于微信登陆过程,因此该过程不计入微信登陆。微信登录使用了TCP 80端口或者TCP 443端口进行通讯。
1.1 微信登陆流程
打开 微信客户端,用户输入用户名和密码,点击登陆,完成登陆过程。IM服务器通过读取用户数据库来验证用户身份,如果验证通过则会进行后续的信息交互,包括获取用户列表、新信息、设备信息更新等。登陆过程基于TCP/IP协议,如下:
微信登陆成功,例如输入正确的密码:(后台运行的登陆再抓包测试)
微信登陆过程都是在一个TCP流里实现,首先客户端发送微信登陆动作标识消息给服务器端,接着客户端接收服务器端回送回登陆动作标识消息,从客户端来看,一次微信登陆过程会有登陆动作的一发一收的完整过程。微信登陆过程重点还需针对TCP流的登陆特征字进行动作分析,识别登陆过程,并判断登陆过程的成功或者失败。
微信登陆失败,例如输入错误的密码:
微信登陆失败过程也是在同一个TCP流里实现,失败登陆过程也会有登陆动作的一发一收的完整过程,表面上与成功过程的特征字是一样的,从动作上无法识别出成功或者失败。由于数据是加密的,失败原因无法解析出来,因此从TCP流的登陆消息的数据头中识别出成功和失败的特点。特征码识别详细见下节分析。
1.2 微信登陆动作特征码识别
通过多次抓包测试,包括登陆成功和登陆失败,对特征字的分析提炼,微信登陆特征字的识别只需带有数据段的报文进行分析。对微信登陆业务的流程报文每个字节的值进行统计分析,遍历32个字节,数据段可识别报文发送的方向、报文的长度、报文的动作、对方微信号、本机用户微信号、后续所有payload。总结出以下微信登陆的动作过程识别。
登陆请求识别码为:00 10 00 01 00 00 00 b2 00 00 00 02,如下
登陆确认识别码为:00 10 00 01 3b 9a ca b2 00 00 00 02,如下
登陆成功和失败的区别可以从服务器端回送给客户端的动作识别消息中提取到差异。当微信登陆成功时,服务器会回送给客户端其在服务器端的对应微信号,而当登陆失败时,服务器端则回送给客户端所对应的微信号为0。
1.3 微信登陆建立成功后数据交互
微信登陆建立成功后,客户端会向服务端发起多个HTTP业务请求,请求依据系统及版本的不同有所差异,如下例子,包括有getcontactlabellist、iphonereg、getpackagelist、reportstrategy、getboundharddevices、oplog、mmsnssync等,不同用户不同场景下登陆对HTTP业务请求会稍有不同。而微信登陆失败则不会有后续的客户端会向服务端发起多个HTTP业务请求。
例子中发起了12个HTTP请求,登陆后进行了12对HTTP的交互,以上过程都是在TCP短连接中完成,短连接HOST为szexshort.weixin.qq.com, szshort.weixin.qq.com。
微信的连接包括两类连接:有短连接和长连接,短连接运行在80端口,HTTP BODY是二进制数据,提供用户验证、好友添加、好友获取、用户图像、行为日志上报等,如上的登陆后的交互信息。长连接提供接受\发送文本消息、接受\发送语音、接受\发送图片、接受\发送视频文件等。
1.4 业务登陆成功率
业务登陆成功率%:用户输入账号、密码点击登陆或者直接点击登陆微信APP(不需登陆密码),登陆进入微信的响应成功比例
l 指标定义:微信业务登陆成功率是指,微信业务下客户端与服务器成功建立TCP连接的条件下,IM服务器成功响应终端发起的微信业务登陆请求的比例。
l 指标算法:业务登陆成功率%=登陆响应次数/登陆请求次数*100%
l 信令标志:
- 登陆请求次数——微信业务,识别微信登陆动作的请求XDR次数。统计点如下图P1。
- 登陆响应次数——微信业务,识别微信登陆动作的响应,且能成功回送用户微信号的XDR次数。统计点如下图P2。
1.5 业务登陆时延
业务登陆时延:用户输入账号、密码点击登陆或者直接点击登陆微信APP(不需输入密码),用户登陆微信业务的时延
公式:
l 指标定义:微信业务登陆时延是指,微信业务下客户端与服务器成功建立TCP连接的条件下,IM服务器成功响应终端发起的微信业务登陆请求的时延。
l 指标算法:业务登陆成功时延(ms)=∑(登陆完成时间-登陆请求时间)/登陆响应次数
l 信令标志:
- 登陆请求时间——微信业务,识别微信登陆动作的请求时间。统计点如下图P1。
- 登陆完成时间——微信业务,识别微信登陆动作的响应,且能成功回送用户微信号的时间。统计点如下图P2。
- 登陆响应次数——微信业务,识别微信登陆动作的响应,且能成功回送用户微信号的XDR次数。统计点如下图P3。
1.6 业务登陆指标评估
1.6.1 业务登陆成功率
1.6.2 业务登陆时延
第二篇:微信原理课设报告
微机原理课程设计报告
数据采集(中断法)
学 院: 电子信息工程学院
专 业: 信息工程
姓名学号:
同实验者:
完成日期: 20##年6月21日
一、课设目的:
进一步掌握微机原理知识,了解微机在实时采集过程中的应用,学习、掌握编程和程序调试方法。
二、课设内容和要求:
用中断法,将ADC 0809通道0外接0 ~ 5V电压,转换成数字量后,在七段LED数码管上,以小数点后两位(几十毫伏)的精度,显示其模拟电压的十进值;0809通道0的数字量以线性控制方式送DAC0832输出,当通道0的电压为5V时,0832的OUT为0V; 当通道0的电压为0时,0832的OUT为2.5V。此模拟电压再送到ADC 0809通道1,转换后的数字量在CRT上以十六进制显示。
ADC 0809 的CLK 脉冲,由定时器8254的OUT0提供;ADC 0809的EOC信号,用作8259中断请求信号。
要有较好的人机对话界面;控制程序的运行。
三、硬件设计
因采用了PC机和微机实验箱, 硬件电路设计相对比较简单, 主要利用微机实验箱上的8255并行口、ADC 0809、DAC 0832、七段LED数码管单元、8254定时/计数器、74LS574输出接口、电位器等单元电路, 就构成了数据采集系统, 硬件电原理框图4-3-1所示。
四、软件设计
本设计通过软件编程,实现模/数转换器0809分别对IN0 0-5V直流电压的采样,和经0832线性控制后输出电压的IN1采样,IN0的值转换成十进制后,在七段数码管上显示;IN1的值在显示器上显示。CPU 根据IN0的值,使八位发光二极管根据题目的要求,指示相应的范围。
1、设计思想
数据采集系统分成六个功能模块,分别是主程序模块、量纲转换模块、数码管显示模块、中断服务子程序模块。
(1)主程序模块
根据题目要求,采用中断方式实现数据采集,因此可把读取IN0的值并保存,和此数字量经线性控制后送给0832输出, 作为0809 IN1的模拟电压和IN1的启动、读取以及IN0的BCD码转换, 放在中断服务子程序模块中完成。所以在主程序模块上主要实现启动0809 IN0、显示模块的调用、和中断结束部分程序。
(2) 量纲转换模块
量纲转换模块在中断服务程序内完成,只要将IN0的数字量分别除以51, 商存入显示IN0的个位存储单元; 余数乘以十,再除以51, 商存入十分位存储单元; 余数再乘以十,除以51, 若余数大于25,则商加1, 小于25则舍去, 这样就达到四舍五入的精度, 再把商存入百分位存储单元; 以供七段数码管显示时调用,BCD码转换模块可参考图10所示的流程图。
(3) 数码管显示模块
数码管显示模块比较简单,自编程序可参考图1-6所示的流程图,也可参考实验8255并行口中的显示模块,应注意的是在显示个位时, 要加上小数点的显示,这可以在查表获取个位段码后,再加上80H来实现,注意每一位显示后要适当延迟时间。
(4) 中断服务子程序模块
考虑到0832的输出是0809 IN1的输入,因此,为防止在执行中断服务子程序时,二次进入中断服务子程序,故在进入中断服务子程序后,应关闭中断,而在退出中断前开中断,以便下次中断进入。中断服务子程序模块主要完成对IN0数据的读取和保存,对IN1的启动和读取,对IN0数据的BCD转换等任务。
2. 参考流程图:
数据采集三主程序流程图如图4-3-2所示; 中断服务子程序如图4-3-3所示。
五.附加功能及实现说明
小键盘控制主菜单转向
硬件部分增加两条连线:8255的PC0-PC3端连接小键盘的Y1-Y4接口,8255的PC4-PC7端连接小键盘的X1-X4接口。软件相应增加一个键盘扫描模块TESTKEY,用于在主程序运行之前调整主菜单转向。当显示欢迎主菜单后,按“1”,转向主程序,按“2”,退出。
六.运行结果
程序正常运行跳出欢迎主菜单,通过小键盘选择“1”进入主程序运行。当调整电平控制旋钮时,数码管前三位依次显示电平实际数值的个位(含小数点)、十分位和百分位。同时显示屏不断显示当前0809通道1的输入模拟量值。
七.课设体会
经过几天的紧张编写和调试,我和同学终于成功实现了课程设计要求的全部功能,并在理解程序软硬件原理的基础上扩展了小键盘附加功能。
在刚接到课设要求任务时,我非常头大。后来仔细的研究了6种芯片的理论知识,经过认真的看书,发现许多程序其实在先前的微机实验中都用过,很多代码和课设中所需有相似之处,所以一部分代码直接可以拿来使用。但问题最难的部分在于把这些零散的一段段代码根据系统的要求组合在一起,特别是接口部分代码需要和硬件配合一起检查、调试,非常考验人的细心、耐心。
我们从数据采集的流程为主线,一步步检查软硬件,发现问题就两边同时检查,讨论修改。为了便于调试、修改,代码的绝大部分关键地方都加了注释语句,一目了然。每个模块都经过反复修改,特别是主程序和中断服务程序,虽然有流程图的辅助,但相关原理还是不太容易理解,后来和同学经过讨论和单步调试,清楚了程序运行过程中段寄存器等值的变化,思路渐渐清晰,程序也修改得更加流畅。
程序第一次运行时,数码管什么反应都没有,这让我们非常沮丧,后来耐下心来仔细检查连成一片的硬件,发现原来是8255芯片有一部分端口安装反了。后来当功能最终实现时,我们都很兴奋,如释重负的感觉,并且很有成就感。趁着一股子干劲,我们想添加一些附加功能,但由于能力有限,最终没能调出实现声音功能的附加功能,只是对照先前微机实验中有关小键盘的知识添加了小键盘的功能。
从不怎么懂到实现功能,再到自主增加功能,课程设计的过程就是强化基础知识,复习巩固实验,熟悉80X86软硬件环境的良好学习机会。希望以后的课程安排中能多一些这样的实践环节,这才是我们收获最大的地方。
图4-3-1 数据采集系统三电原理框图
图4-3-2 数据采集三主程序流程图
;数据采集系统三(中断法)程序清单
CRLF MACRO
MOV AH,02H
MOV DL,0DH ;显示回车
INT 21H
ENDM
DATA SEGMENT
MES0 DB 0DH,0AH,0DH,0AH,' ***************** WELCOME *****************',0DH,0AH,0DH,0AH
DB 0DH,0AH,0DH,0AH,' SIGNAL GATHERING PRORGRAM',0DH,0AH
DB 0DH,0AH,0DH,0AH,' MADE BY 040920108 Li Yuejiao&040920105 Wu Huan',0DH,0AH,0DH,0AH
DB ' PRESS 1 TO START PROGRAM',0DH,0AH,0DH,0AH
DB ' PRESS 2 TO QUIT',0DH,0AH,0DH,0AH
DB ' ***********************************************',0DH,0AH,'$'
MES1 DB ' THE VALUE IS:$ ',0DH,'$'
TABLE1 DB 11H,21H,41H,81H,12H,22H,42H,82H
DB 14H,24H,44H,84H,18H,28H,48H,88H
MY8254 EQU 306CH ;8254控制寄存器
MY82540 EQU 3060H ;8254计数器0
INTR_IVADD EQU 01C8H
IP_BAK DW ?
CS_BAK DW ?
IM_BAK DB ?
INTR_OCW1 EQU 0A1H
INTR_OCW2 EQU 0A0H
IN1 DB ?
IN0 DB ?
FLAG DB ?
KEY DB ?
KEYC DB ?
KEYR DB ?
GW DB ? ;个位存储单元
SF DB ? ;十分位存储单元
BF DB ? ;百分位存储单元
DCTBL DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DB 77H,7CH,39H,5EH,79H,71H
MY8259_ICW1 EQU 30E0H
MY8259_ICW2 EQU 30E4H
MY8259_ICW3 EQU 30E4H
MY8259_ICW4 EQU 30E4H
MY8259_OCW1 EQU 30E4H
MY8259_OCW2 EQU 30E0H
MY8259_OCW3 EQU 30E0H
DATA ENDS
STACK1 SEGMENT STACK
DW 256 DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK1,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DX,MES0
MOV AH,09
INT 21H
LOP1: CALL TESTKEY
CMP KEY,01H
JZ A
CMP KEY,02H
JZ B
JMP LOP1
;MOV AH,01H ;读键盘输入值
;INT 21H
;CMP AL, 31H ;如果输入为1 则跳转
;JZ A
;CMP AL, 32H ;如果为2则返回dos
;JZ EXIT2
B: MOV AH,4CH
INT 21H
TESTKEY PROC ;反转法小键盘子程序
KEY0: MOV AL,81H ;8255的控制字,PC0-3入,PC4-7出
MOV DX,302CH
OUT DX,AL
MOV AL,0 ;读行值
MOV DX,3028H
OUT DX,AL
IN AL,DX
AND AL,0FH ;屏蔽列值后保存
MOV KEYC,AL
KEY1: MOV AL,88H ; 8255的控制字,PC0-3出,PC4-7入
MOV DX,302CH
OUT DX,AL
MOV AL,0 ;读列值
MOV DX,3028H
OUT DX,AL
IN AL,DX
AND AL,0F0H ;读列值,屏蔽行值后合并取反
OR AL,KEYC
NOT AL
CMP AL,0 ;无键按下退出子程序
JZ KEYEND
MOV SI,OFFSET TABLE1
MOV CX,16
MOV DL,00H
KEY2: CMP AL,[SI]
JZ KEY3
INC SI
INC DL
DEC CX
JZ KEYEND
JMP KEY2
KEY3: MOV KEY,DL ;送键值到KEY
KEYEND: RET
TESTKEY ENDP
A: CLI
LEA DX,MES1
MOV AH,09
INT 21H
MOV AX,0000H ;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址
MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR的屏蔽位
IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字
AND AL,0FBH ;允许IR2
OUT DX,AL
MOV DX,MY8259_ICW1 ;初始化实验系统中8259的ICW1
MOV AL,13H ;边沿触发、单片8259、需要ICW4
OUT DX,AL
MOV DX,MY8259_ICW2 ;初始化实验系统中8259的ICW2
MOV AL,08H
OUT DX,AL
MOV DX,MY8259_ICW4 ;初始化实验系统中8259的ICW4
MOV AL,01H ;非自动结束EOI
OUT DX,AL
MOV DX,MY8259_OCW3 ;向8259的OCW3发送读取IRR命令
MOV AL,0AH
OUT DX,AL
MOV DX,MY8259_OCW1 ;初始化实验系统中8259的OCW1
MOV AL,0FEH ;打开IR0的屏蔽位
OUT DX,AL
MOV DX,MY8254 ;8254初始化
MOV AL,16H ;8254控制字,通道0 低位读写 方式3 二进制
OUT DX,AL
MOV DX,MY82540
MOV AL,4 ;8254给0809时钟信号
OUT DX,AL
MOV DX,302CH ;8255控制字,A口输出位码,B口输出段码
MOV AL,80H
OUT DX,AL
STI
WAIT1:
MOV DX,3000H ;启动0809的IN0
OUT DX,AL
CALL DELAY;延时,不是给0809处理的时间,而是让LED和屏幕显示延时
MOV AL,1
MOV FLAG,AL
CALL LEDDISP
MOV AH,2
MOV BH,0
MOV DH,27
MOV DL,26
INT 10H ;确定光标的位置
MOV AL,IN1 ;通道1的值给AL
MOV BL,AL
AND AL,0F0H ;取AL的高四位,先显示高四位(16进制)
MOV CL,4
ROR AL,CL ;AL高四位移到低四位
CALL CRT1
MOV AL,BL
AND AL,0FH ;显示低位
CALL CRT1 ;调用屏幕显示子程序,显示单个16字符
CRLF
INT 21H
MOV AH,1
INT 16H
LOP2:CALL TESTKEY ;若按KEY2,则退出程序
CMP KEY,02H
JZ QUIT
JMP WAIT1
JZ WAIT1
QUIT:CLI ;关中断,恢复原来INTR中断参数
MOV AX,0000H;恢复INTR原中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
MOV DX,INTR_OCW1
MOV AL,IM_BAK ;恢复INTR原中断屏蔽寄存器的屏蔽字
OUT DX,AL
STI ;开中断
MOV AX,4C00H
INT 21H
MYISR PROC NEAR ;中断服务程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
CLI
CMP FLAG,1;比较标识符
JZ PART1
CALL DELAY
MOV DX,3000H
IN AL,DX ;读IN1的值
MOV IN1,AL
JMP EXIT1
PART1:MOV DX,3000H ;读IN0值,保存在IN0中
IN AL,DX
MOV IN0,AL
NEG AL
SHR AL,1 ;线性转换
MOV DX, 3040H
OUT DX, AL ;启动0832,将线性变换后的数字量送给0832
MOV DX,3004H ;从IN1端口读IN1值,并保存
OUT DX,AL ;启动IN1
CALL DELAY
MOV AX,0
MOV FLAG,AL
EXIT1:MOV DX,INTR_OCW2 ;发中断结束命令
MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
POP DX
POP CX
POP BX
POP AX
STI
IRET
MYISR ENDP
CRT1 PROC ;在屏幕上显示16进制数值
ADD AL,30H
CMP AL,39H
JBE D0
ADD AL,7
D0:MOV DL,AL
MOV AH,2
INT 21H
RET
CRT1 ENDP
LEDDISP PROC ;数码管显示,实现小数点精确计算
MOV AL,IN0
XOR AH,AH
MOV DL,51
MOV DH,10
DIV DL
MOV GW,AL
XCHG AH,AL
XOR AH,AH
MUL DH
DIV DL
MOV SF,AL
XCHG AH,AL
XOR AH,AH
MUL DH
DIV DL
CMP AH,25
JB EXIT
ADD AL,1
EXIT:
MOV BF,AL
CALL DISP
RET
LEDDISP ENDP
DISP PROC
MOV AL,GW ;显示个位
XOR AH,AH
MOV SI,AX
LEA BX,DCTBL
MOV AL,[BX+SI]
ADD AL,80H
MOV DX,3024H
OUT DX,AL
MOV DX,3020H
MOV AL,01H
OUT DX,AL
CALL DELAY
MOV AL,SF ;显示十分位
MOV SI,AX
MOV AL,[BX+SI]
MOV DX,3024H
OUT DX,AL
MOV DX,3020H
MOV AL,02H
OUT DX,AL
CALL DELAY
MOV AL,BF ;显示百分位
MOV SI,AX
MOV AL,[BX+SI]
MOV DX,3024H
OUT DX,AL
MOV DX,3020H
MOV AL,04H
OUT DX,AL
CALL DELAY
RET
DISP ENDP
DELAY PROC NEAR ;延迟子程序
PUSH CX
MOV CX,0FFFFH
LOOP $
POP CX
RET
DELAY ENDP
CODE ENDS
END START