系统:Ubuntu9.10
开发板:飞凌OK6410
最近购入一块新的开发板,芯片是基于三星的S3C6410,ARM11,使用之后发现,速度果然很不错,跟ARM9的S3C2440不可同日而语。飞凌的开发板质量很不错,跟友善之臂相比,谁比较好一目了然,当然,这二家的主要市场不太一样,友善之臂主要面向的是学生市场,价格自然要低些,但是一份价格一份货,如果要作为产品开发,自然还是要选择可靠点。不过,我纯粹是拿来学习,增长功力的。
当然,新的开发板,总要为它搭建下开发环境,虽然已经是比较熟练了,但是记录下来,既可以当作笔记,也可以帮助其他人。
飞凌的开发板比较偏向wince,自然wince的支持就比较好,而linux上就稍微薄弱了点,linux版的用户手册里甚至没记录怎么linux下进行串口的连接,只简单描述了如何用windows的超级终端连接。
一般来说,在linux下可以使用minicom和C-kerimit两款通讯软件,而我个人比较偏向C-kermit,实际开发中,我也一直使用C-kermit,原因有两个,第一,当我第一次搭开发环境时,我选择了minicom,结果在ubuntu下既乱码,显示效果又很奇怪,折腾了很久才搞定;第二,C-kermit的确是一个很强大的软件,而且配合Uboot可以完成许多特性,并且显示效果也不错,所以就一直用到了现在。
目前,ubuntu里已经集成了C-kermit,使用命令kermint就可以打开,如果需要自己编译安装,可以去官网地址下载源码包。
C-kermit官网:http://www.columbia.edu/kermit/
官网上还附带了使用手册,可以帮助来学习这个强大的工具。
第一步,就是先配置使用的参数,当然可以打开kermit后来来配置,然后一开始配置好就可以省去很多麻烦。
如果选择全局的参数配置,就使用命令:
#sudo vi /etc/kermit/kermrc
如果只针对当前的用户,就使用命令:
#vi ~/.kermrc
打开文件后,把配置参数写入进入,网上通用的参数如下:
#----- kermrc for /dev/ttyUSB0 -------------------
#设置通信的目标串口,由于我的笔记本没有串口,使用了USB转串口,所以设备为/dev/ttyUSB0
set line /dev/ttyUSB0
#设置波特率
set speed 115200
#关闭通信监视
set carrier-watch off
#设置没有握手协议
set handshake none
#数据流控制为无
set flow-control none
#设置保守安全及缓慢的传输设置
robust
#设置可以传输二进制文件
set file type bin
#限制传输文件名
set file name lit
#设置接受文件包的大小为1000字节
set rec pack 1000
#设置传输文件包的大小为1000字节
set send pack 1000
#设置窗口大小
set window 5
#---------end------------------------------------
这些参数就足够保证能初步连上OK6410,当然,C-kermit其实还有更多参数,并且在配置里还可以定制不同情况下的参数,这些属于题外话,在以后可以慢慢探讨。
第二步,就是打开命令进行连接,不过这之前,可以先了解下C-kermit的知识。
kermit有两种模式,一种为终端模式,一种为命令模式
处于终端模式时,显示从串口发回来的数据,处于命令模式时,显示命令提示符,并等待用户输入命令后,执行命令。
运行kermit,进入命令模式,输入"connect"并回车,进入终端模式。
在终端模式按下Ctrl + \, 再按下C 返回命令模式


常用命令
connect : 连接串口设备,连接成功后进入终端模式,简写为c
quit: 退出kermit, 简写为q
send: 使用kermit协议发送文件,与uboot传送文件时使用
run : 运行外部命令,我们将用这个命令调用xmodem发送文件。
?   : 显示全部命令
!   : 运行一个shell,需要临时离开kermit进行其它的作业的时候,可以使用叹号命令。结果操作时使用exit退出shell,返回kermit。
了解了这些知识,可以去连接OK6410了。
最后,以运行C-kermint并且连接上OK6410来结束本篇文章,在未来还可以探讨在裸机的情况下将Uboot传输进去。
# kermit
?Not confirmed - robust
Command stack:
1. File  : /home/wangchen/.kermrc (line 5)
0. Prompt: (top level)
?No keywords match - sendd
Command stack:
1. File  : /home/wangchen/.kermrc (line 9)
0. Prompt: (top level)
C-Kermit 8.0.211, 10 Apr 2004, for Linux
Copyright (C) 1985, 2004,
Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/wangchen/Desktop/) C-Kermit>c
Connecting to /dev/ttyUSB0, speed 115200
Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
OK
U-Boot 1.1.6 (Jan 14 2010 - 00:48:10) for SMDK6410
****************************************
**    u-boot 1.1.6                    **
**    Updated for TE6410 Board        **
**    Version 1.0 (10-01-15)          **
**    OEM: Forlinx Embedded           **
**    Web: http://www.witech.com.cn   **
****************************************
CPU:     S3C6410 @532MHz
Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode)
Board:   SMDK6410
DRAM:    128 MB
Flash:   0 kB
NAND:    256 MB
In:      serial
Out:     serial
Err:     serial
Hit any key to stop autoboot:  0
NAND read: device 0 offset 0x100000, size 0x300000
3145728 bytes read: OK
Boot with zImage
Starting kernel ...
Uncompressing Linux............................................................................................................................................. done, booting the kernel.
Linux version 2.6.28.6 (jkeqiang@ubuntu) (gcc version 4.2.2) #213 Sun May 9 23:07:10 PDT 2010
CPU: ARMv6-compatible processor [410fb766] revision 6 (ARMv7), cr=00c5387f
CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: SMDK6410
Memory policy: ECC disabled, Data cache writeback
CPU S3C6410 (id 0x36410101)
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C64XX: PLL settings, A=532000000, M=532000000, E=24000000
S3C64XX: HCLKx2=266000000, HCLK=133000000, PCLK=66500000
div1: 00000555
mout_apll: source is fout_apll (1), rate is 532000000
mout_epll: source is fout_epll (1), rate is 24000000
mout_mpll: source is mpll (1), rate is 532000000
mmc_bus: source is dout_mpll (1), rate is 44333333
mmc_bus: source is dout_mpll (1), rate is 44333333
mmc_bus: source is dout_mpll (1), rate is 44333333
usb-host-bus: source is mout_epll (0), rate is 24000000
uclk1: source is dout_mpll (1), rate is 66500000
spi-bus: source is mout_epll (0), rate is 24000000
spi-bus: source is mout_epll (0), rate is 24000000
audio-bus0: source is mout_epll (0), rate is 24000000
audio-bus1: source is mout_epll (0), rate is 24000000
audio-bus2: source is mout_epll (0), rate is 24000000
irda-bus: source is mout_epll (0), rate is 24000000
s3c64xx: 15728640 bytes SDRAM reserved for fimc at 0x505a3000
s3c64xx: 8388608 bytes SDRAM reserved for pp at 0x514a3000
s3c64xx: 8388608 bytes SDRAM reserved for tv at 0x51ca3000
s3c64xx: 6291456 bytes SDRAM reserved for mfc at 0x524a3000
s3c64xx: 8388608 bytes SDRAM reserved for jpeg at 0x52aa3000
s3c64xx: 8388608 bytes SDRAM reserved for cmm at 0x532a3000
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
Kernel command line: root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80x30
s3c24xx_serial_init_ports: initialising ports=4...
console [ttySAC0] enabled
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 128MB = 128MB total
Memory: 70784KB available (3908K code, 494K data, 272K init)
SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Calibrating delay loop... 530.84 BogoMIPS (lpj=1327104)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 316 bytes
NET: Registered protocol family 16
S3C6410: Initialising architecture
S3C DMA-pl080 Controller Driver, (c) 2006-2007 Samsung Electronics
Total 32 DMA channels will be initialized.
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 4, 81920 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
NET: Registered protocol family 1
NetWinder Floating Point Emulator V0.97 (double precision)
yaffs May  9 2010 18:05:41 Installing.
msgmni has been set to 138
alg: No test for stdrng (krng)
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
S3C_LCD clock got enabled :: 133.000 Mhz
LCD TYPE :: LTE480WV will be initialized
Window[0] - FB1: map_video_memory: clear ff000000:0007f800
FB1: map_video_memory: dma=57180000 cpu=ff000000 size=0007f800
Window[0] - FB2: map_video_memory: clear ff03fc00:0003fc00
FB2: map_video_memory: dma=571bfc00 cpu=ff03fc00 size=0003fc00
[DEBUG]logo_lines 34, vc->vc_bottom 34
Console: switching to colour frame buffer device 60x34
fb0: s3cfb frame buffer device
Window[1] - FB1: map_video_memory: clear ff080000:0007f800
FB1: map_video_memory: dma=57200000 cpu=ff080000 size=0007f800
Window[1] - FB2: map_video_memory: clear ff0bfc00:0003fc00
FB2: map_video_memory: dma=5723fc00 cpu=ff0bfc00 size=0003fc00
fb1: s3cfb frame buffer device
Window[2] - FB1: map_video_memory: clear ff100000:0003fc00
FB1: map_video_memory: dma=57140000 cpu=ff100000 size=0003fc00
fb2: s3cfb frame buffer device
Window[3] - FB1: map_video_memory: clear ff140000:0003fc00
FB1: map_video_memory: dma=57280000 cpu=ff140000 size=0003fc00
fb3: s3cfb frame buffer device
enter s3c6410_leds_init
leds initialized
s3c6400-uart.0: s3c2410_serial0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10
s3c6400-uart.1: s3c2410_serial1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10
s3c6400-uart.2: s3c2410_serial2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10
s3c6400-uart.3: s3c2410_serial3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10
brd: module loaded
loop: module loaded
PPP generic driver version 2.4.2
dm9000 Ethernet Driver
eth%d: con201 Invalid ethernet MAC address. using default config,  Please set using ifconfig
eth0: dm9000 at f7b00300,f7b00304 IRQ 108 MAC: 00:e0:4a:bc:15:e7
Linux video capture interface: v2.00
s3c-fimc: controller 0 registered successfully
s3c-fimc: controller 1 registered successfully
printk ov965x_init
s3c-fimc: info ov965x_init
S3C6400 MFC Driver, (c) 2007 Samsung Electronics
S3C6400 MFC Driver, (c) 2007 Samsung Electronics
S3C PostProcessor Driver v3.12, (c) 2009 Samsung Electronics
S3C6410 TV encoder Driver, (c) 2008 Samsung Electronics
S3C6410 TV encoder Driver init OK.
S3C6410 TV scaler Driver, (c) 2008 Samsung Electronics
S3C6410 TV scaler Driver init OK.
S3C Rotator Driver, (c) 2008 Samsung Electronics
s3c_rotator_probe called
s3c_rotator_probe success
S3C JPEG Driver, (c) 2007 Samsung Electronics
s3c_g2d_probe called
s3c_g2d_probe Success
S3C G2D Init : Done
S3C G3D Driver, (c) 2007-2009 Samsung Electronics
s3c_g3d version : 0x1050000
S3C G3D Init : Done
S3C CMM Driver, (c) 2008 Samsung Electronics
Driver 'sd' needs updating - please use bus_type methods
S3C NAND Driver, (c) 2008 Samsung Electronics
S3C NAND Driver is using software ECC.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00040000 : "Bootloader"
0x00040000-0x00400000 : "Kernel"
0x00400000-0x05400000 : "Rootfs"
0x05400000-0x10000000 : "File System"
Samsung SoC SPI Driver loaded for SPI-0
Max,Min-Speed [33250000, 129882]Hz
Irq=80    IOmem=[0x7f00bfff-0x7f00b000]    DMA=[Rx-33, Tx-34]
Samsung SoC SPI Driver loaded for SPI-1
Max,Min-Speed [33250000, 129882]Hz
Irq=81    IOmem=[0x7f00cfff-0x7f00c000]    DMA=[Rx-35, Tx-36]
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 79, io mem 0x74300000
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
s3c-udc : S3C HS USB OTG Device Driver, (c) 2008-2009 Samsung Electronics
s3c-udc : version 15 March 2009 (DMA Mode)
mice: PS/2 mouse device common for all mice
gpio keys driver.
input: gpio-keys as /class/input/input0
S3C Touchscreen driver, (c) 2008 Samsung Electronics
S3C TouchScreen got loaded successfully : 12 bits
input: S3C TouchScreen as /class/input/input1
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c2410_rtc: tick irq 34, alarm irq 92
s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
i2c /dev entries driver
s3c2440-i2c s3c2440-i2c: slave address 0x10
s3c2440-i2c s3c2440-i2c: bus frequency set to 377 KHz
[OV965X]ov965x_attach_adapter.
[CAM]s3c_fimc_register_camera,cam->id=0
parent clock for camera: 266.000 MHz, divisor: 11
[CAM]RESET CAM.[CAM]Reset and init reg!1cam->client=0
[CAM]Reset and init reg!1
[CAM]Reset and init reg!3
s3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
s3c-sdhci s3c-sdhci.0: clock source 0: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 1: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 2: mmc_bus (44333333 Hz)
[SDHCI]to add external irq as a card detect signal......
[SDHCI]if (pdata->cfg_ext_cd)......
mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using ADMA
[SDHCI]request_irq......
sdhci: card inserted.
s3c-sdhci s3c-sdhci.1: clock source 0: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.1: clock source 1: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.1: clock source 2: mmc_bus (44333333 Hz)
[SDHCI]to add external irq as a card detect signal......
mmc1: SDHCI controller on samsung-hsmmc [s3c-sdhci.1] using ADMA
usbcore: registered new interface driver usbhid
usbhid: v2.6:USB HID core driver
Advanced Linux Sound Architecture Driver Version 1.0.18rc3.
ASoC version 0.13.2
WM9713/WM9714 SoC Audio Codec 0.15
playback: 1, capture : 1
asoc: AC97 HiFi <-> s3c64xx-ac97 mapping ok
[WM9713]Open speaker volume.
ALSA device list:
#0: SMDK6400 (WM9713)
TCP cubic registered
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
s3c2410-rtc s3c2410-rtc: setting system clock to 2000-01-04 22:07:28 UTC (947023648)
mtd->size = 5000000 blocks = 280
cheaking bad block...............
.................................................................................................................................................................................
bad block at 1620000
..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 272K
skip bad block b1
*************************************
http://www.witech.com.cn
*************************************
mkdir: cannot create directory '/mnt/disk': File exists
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
yaffs: restored from checkpoint
yaffs_read_super: isCheckpointed 1
Try to bring eth0 interface up......eth0: link down
Done
Starting Qtopia, please waiting...
touch...
Please press Enter to activate this console.
[root@OK6410 /]#
参考文章:
(1)Linux环境下配置AT91RM9200固件下载工具
(2)kermit使用

紧接着上章未完结的,继续分析WpaGui类中的函数。

void processMsg(char *msg)

从名字 上可以看出,这是处理消息的函数,处理的消息当然是wpa_supplicant向上层传递的函数。从前面的文章的分析我们可以得知,控制 wpa_supplicant的主要发式就是使用特定接口,将特定的命令字符串传送过去,而wpa_supplicant作为反馈的是及时的字符串消息, 以及当完成某项任务后的消息。比如,当扫描完成后,wpa_supplicant就会发送WPA_EVENT_SCAN_RESULTS表示已经可以接受 扫描结果了。而该函数,自然就根据wpa_spplicant发送过来的消息做相对应的处理。

void processCtrlReq(const char *req)

用来处理界面上用户发出的请求,具体有UserDataRequest类来完成。

void receiveMsgs()

既然要处理消息,就首先要获得消息,该函数就是用来接受wpa_supplicant发送过来的消息。

void connectB()

从字面上来看,是用来进行连接的,其实如果用网络链接的术语来说,是进行关联,使用的是REASSOCIATE命令让wpa_supplicant去连接上无线网络。

void selectNetwork( const QString &sel )

用来选择无线网络,非常好理解,使用SELECT_NETWORK命令操作。

void enableNetwork(const QString &sel)

void disableNetwork(const QString &sel)

这两个函数是想对应的,在连接一个无线网络之前,首先要使这个网络的参数配置可用,如果不想使用,则可以使它不可用。分别使用ENABLE_NETWORK和DISABLE_NETWORK命令。

void editNetwork(const QString &sel)

void editSelectedNetwork()

void editListedNetwork()

配 置无线网络的各项参数,具体部分由NetworkConfig来完成,而editSelectNetwork()是配置选择好的无线网络,是通过调用 editNetwork()实现的,editListedNetwork()也同样是通过调用editNetwork()实现,作用是配置已经列出来的无 线网络。
void triggerUpdate()

触发更新,用来更新网络的状态和参数。

void addNetwork()

增加一个新的网络,一般可以用来连接隐藏的无线网络,具体实现也是由NetworkConfig()完成。

void removeNetwork(const QString &sel)

void removeSelectedNetwork()

void removeListedNetwork()

与上面配置无线网络的三个函数类似,但作用不同在于是移除无线网络的配置。当从一个地点到里另外一个地点后,原有的无线网络可能会不存在,但是它的配置参数依旧还存在,这时可以使用这几个函数来移除无线网络无效的配置。使用的是REMOVE_NETWORK命令。

void enableAllNetworks()

void disableAllNetworks()

简单的两个函数,使全部配置好的无线网络可用或不可用,是在原来的ENABLE_NETWORK和DISABLE_NETWORK命令基础上,加上all参数来表示对全部网络生效。

void removeAllNetworks()

移除全部网络,是REMOVE_NETWORK命令后加上all的参数实现。

void saveConfig()

其实配置一个网络,在过程中都是在内存中进行的,如果这是没有保存,关闭程序的话,当下次重新启动时,会发现认为配置好的网络参数依旧不存在。而saveConfig()函数的作用就是将内存中的配置保存到文件中,使用的是SAVE_CONFIG命令。

以上就是大部分WpaGui类中函数的分析,其实还有很多函数并没有详细介绍,但是有一部分是与win下套接字变成有关,我并不是非常了解,还有一部分只是单纯的与程序的运行,比如隐藏在系统托盘上等有关,对我们了解wpa_gui的整体框架并不是有很大的帮助。

最后可以总结下,其实wpa_gui就是为wpa_supplicant底层程序增加了一套Qt4的图形交互界面,而这样的构架可以在对未来我们实际项目的设计上有一定的帮助,比如如何做到后台功能和前台界面的分离,如何做到跨平台,都有某种程度的启发。

在大致了接Wpa_gui的框架以及与wpa_supplicant交互的接口后,就可以详细分析源码。

正如前面所说的,WpaGui类是最为核心的部分,通过对该类源码的分析,就可以帮助我们了解整个程序,甚至是与wpa_supplicant的交互。

WpaGui类一共由三个文件组成:wpagui.ui,wpagui.h,wpagui.cpp。

wpagui.ui自然是由Qt设计器设计的界面文件,这部分不需要了解太多,使用Qt设计器打开后就可以看到控件和布局的细节部分。

wpagui.h头文件则声明变量函数等,因为函数可以在后面对wpagui.cpp文件的分析中,我将变量按照类型排列来分析:

QApplication *app;

定义了一个QApplicant的指针,用来在程序运行时指向wpagui对象的父对象。

ScanResults *scanres;

Peers *peers;

EventHistory *eh;

UserDataRequest *udr;

AddInterface *add_iface;

WpaMsgList msgs;
这些类已经在前面作过介绍,在这里声明了对应指针以便接下来实例化。

char *ctrl_iface;

char *ctrl_iface_dir;

bool networkMayHaveChanged;

struct wpa_ctrl *monitor_conn;

struct wpa_ctrl *ctrl_conn;

QSocketNotifier *msgNotifier;

QTimer *timer;

int pingsToStatusUpdate;
这里声明的是与wpa_supplican交互时所需要用到的变量

QAction *disconnectAction;

QAction *reconnectAction;

QAction *eventAction;

QAction *scanAction;

QAction *statAction;

QAction *showAction;

QAction *hideAction;

QAction *quitAction;

QAction *addInterfaceAction;

这里声明的是QAction的指针,实例化后来对应执行相应的动作

QMenu *tray_menu;

QSystemTrayIcon *tray_icon;

QMenu和QSystemTrayIcon的指针,用于程序隐藏于系统托盘时

bool ackTrayIcon;

bool startInTray;

bool wpsRunning;

bool connectedToService;

bool inTray;

判断各种状态的bool值变量

QString bssFromScan;

QString的字符串,用于获得扫描后使用bss得到的结果

#ifdef CONFIG_NATIVE_WINDOWS

QAction *fileStartServiceAction;

QAction *fileStopServiceAction;

bool serviceRunning();

#endif /* CONFIG_NATIVE_WINDOWS */

ifdef的宏,用于处理在windows平台时的行为。

wpagui.cpp里主要是各个函数的实现,通过这些函数,就能勾勒出系统运行全貌的大概,因此对每个函数一一进许分析:

static int wpagui_printf(const char *, …)

该静态函数的作用等同于printf,用于在向wpa_supplicant发送命令时接受不知名的反馈并打印出来。

WpaGui(QApplication *app, QWidget *parent = 0, const char *name = 0,Qt::WFlags fl = 0);

WpaGui类的构造函数,作用自然很清晰,就是实例化各个对象指针,连接了各个信号与槽,初始化了变量值,并且调用了如updateStatus()的函数。

~WpaGui()

WpaGui类的析构函数,作用也很清晰,就是在程序运行完毕时释放内存,作清理工作。

languageChange()

使用了Qt设计器的retranslateUi()函数用于语言的切换

parse_argv()

参数的解析函数,用于解析程序被执行时获取的参数,参数可以用来设定与wpa_supplicant交互用的套接字口及是否启动隐藏于任务栏。

openCtrlConnection(const char *ifname)

建立ctrl连接函数,在与wpa_supplicant交互前,首先要使用wpa_supllicant的接口来建立连接,该函数会通过默认的参 数或者程序执行时提供的参数,到指定目录下去寻找套接口文件,一旦找到,就建立连接。一般情况下,会建立两个连接,一个用于发送命令,一个用于监视状态, 也就是头文件里声明的变量monitor_conn和ctrl_conn;

ctrlRequest(const char *cmd, char *buf, size_t *buflen)

ctrl请求函数,用于向wpa_supplicnat发送各种命令,该函数需要openCtrlConnection函数先建立了与 wpa_supplicant的连接才能正常执行,使用发送命令的连接ctrl_conn来发送,函数内其实使用的是在前篇文章中提到的 wpa_ctrl_request接口函数。

wpaStateTranslate(char *state)

该函数的作用十分简单,就是将获得的状态字符串使用tr函数国际化。

updateStatus()

状态更新函数,使用ctrlRequest函数向wpa_supplicant发送STATUS命令,当执行成功后,wpa_supplicant会反馈具有固定格式的字符串,程序可以根据自己的需要来解析字符串,该函数解析完字符串后即将所需要的信息显示界面上。

updateNetworks()

类似于updateStatue函数,但是也有所不同,它更新的是wifi的network,使用的是LIST_NETWORKS命令,机制也十分 简单,当wpa_supplicant连接过或连接上一个wifi的ap,它会在定义好的配置文件里保存下该wifi节点的各种属性,而 LIST_NETWORKS命令使wpa_supplicant去读取该配置文件,然后反馈回去。updateNetworks()在封装了这一步骤的同 时,将读取出来的各个wifi的信息显示在界面上。

helpIndex(),helpContents(),helpAbout()

这几个函数只是打印帮助索引和内容,以及显示关于信息。

disconnect()

断开连接函数,当有与wifi的连接存在时,使用该函数即可断开网络连接,实际上是向wpa_supplicant发送了DISCONNECT命令。

scan()

扫描函数,用于扫描周边的wifi节点,实际上上是有ScanResults类来执行。

eventHistory()

事件历史函数,同上个类似,也是有EventHistory类来执行。

ping()

这个函数在WpaGui类中占了相当重要的地位,我们知道,wpa_supplicant的运行实际上是个循环,WpaGui类设置了一个定时器,每过1秒就将执行ping函数,而后在该函数里将调用如updateStatus的函数来进行整体内容的更新。

str_match(const char *a, const char *b)

封装了strcmp函数用于字符串的对比。

通过以上函数,我们可以大致得发现,程序运行的关键在于向wpa_supplicant发送命令,然后得到反馈信息的字符串,最后处理。由于的WpaGui类函数众多,剩余的函数我会在第三部分继续分析。

很久没写blog了,在忙于一个非常大的项目,虽然充满了激情在做,但是劳累之余,技术的总结少了很多。

最近对于Wi-Fi上层的应用开发获取了很多知识,并且有部分和Qt产生了一定的联系,其中Wpa_gui就是其中之一。

Wpa_gui是一个基于Wpa_supplicant的无线连接管理工具,可以简单的认为是由wpa_supplicant+Qt的一个小型软 件,它可以运行在linux,Windows及Unix操作系统下,作为配置连接无线网络使用。目前,在最新的Ubuntu系统下面,已经自动集成了该软 件。

其中具体界面可以查看:http://hostap.epitest.fi/wpa_supplicant/wpa_gui.html

如果要获取该软件,可以去网站http://hostap.epitest.fi/wpa_supplicant/,获取wpa_supplicant的源码包,在源码包里就包含了wpa_gui的源码,并且包含了分别由Qt3和Qt4完成界面,以供不同的Qt环境使用。

获取源码包后,解压,可以获得wpa_supplicant-0.x.x目录,Wpa_gui的Qt4源码目录位于其中的wpa_supplicant/wpa_gui-qt4下,可以使用Q他Creator打开对应的工程文件wpa_gui.pro,方便阅读分析。

该工具的本质其实就是为wpa_supplicant提供了一个友好的用户界面,交互的操作由Qt4提供,而实际的功能则由底层的wpa_supplicant完成。在wpa_gui源码中,可以发现,整个源码由以下几个类构成:

AddInterface类:用于增加硬件的驱动接口

EventListModel类:用来构成事件的模型

EventHistory类:用来纪录事件

NetworkConfig类:用来配置无线连接的参数

Peers类:显示搜索到的无线路由

ScanResults类:用来处理得到的扫描结果

StringQuery类:处理字符串询问

UserDataRequest类:处理用户的数据请求

WpaGui类:最核心的类,整合其他所有类,并且与wpa_supplicant进行数据报文的交换

WpaMsg类:简单的存储消息

可以说,整个源代码的类很少,代码量也不大,但是通过对其研究,却可以初步帮助我们学下Qt4作为前台界面,后台程序实现功能的一种模式。在这个程 序类里面,最主要的的类就是WpaGui类,是整个程序的核心,并且该类里实现了与wpa_supplicant交互的功能,因此主要的分析就是围绕 WpaGui类进行。

首先要知道怎么样与后台的wpa_supplicant进行交互,wpa_supplicant本身就提供了一套C/C++的接口,供外面程序调 用,接口的头文件为wpa_ctrl.h,在WpaGui类的cpp文件中,可以清楚的看见include的头文件里,有#include “common/wpa_ctrl.h”。

在wpa_ctrl.h头文件中,包含一组宏定义的事件消息和8个函数接口。由于wpa_supplicant交互的方式是基于数据报文的,通过向外界发送事先定义好的事件消息,而外面这根据这些事件消息来确定下步要执行的动作。

譬如:#define WPA_EVENT_CONNECTED “CTRL-EVENT-CONNECTED ”

当Wpa_gui程序从wpa_supplicant获得这个宏定义消息后,就可以确定已经连接上确定的Wifi网络了,而在获得消息后,外面程序则可以使用8个函数接口来操作wpa_spplicant的行为。

而这些函数接口为:

struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);

void wpa_ctrl_close(struct wpa_ctrl *ctrl);

int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
char *reply, size_t *reply_len,
void (*msg_cb)(char *msg, size_t len));

int wpa_ctrl_attach(struct wpa_ctrl *ctrl);

int wpa_ctrl_detach(struct wpa_ctrl *ctrl);

int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);

int wpa_ctrl_pending(struct wpa_ctrl *ctrl);

int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl);
wpa_ctrl_open接口用来打开wpa_supplicant的控制接口,在UNIX系统里使用UNIX domain sockets,而在Windows里则是使用UDP sockets,当然接口的路径并不是固定的,可以根据配置文件内的路径设置来改变。

wpa_ctrl_close接口自然是用于关闭控制接口。

wpa_ctrl_request接口是用来发送控制命令至wpa_supplicant,并且会接受命令成功执行与否的反馈消息。这是一个堵塞的动作,一般会至少等待2秒钟用来接受反馈的回复消息。如果有未经主动请求的消息接受,堵塞的时间则会更长。

wpa_ctrl_attach接口是为控制接口注册一个事件监视,但注册成功后就可以开始接口事件消息。

wpa_ctrl_detach接口则是取消控制接口的事件监视。

wpa_ctrl_recv接口是在控制接口的事件监视注册成功后,用来接受事件消息,这是一个堵塞的操作,当没有可用的消息时,就会一直堵塞。

wpa_ctrl_pending接口是用来检测是否有即将到来的事件消息。

wpa_ctrl_get_fd接口则是来获得控制接口的文件描述符号。

了解了以上这些,就可以为全面深入Wpa_gui作一个铺垫。

放在2010年的第四天来总结过去的2009年,似乎时间上有点晚了,但是最近忙碌的工作和在职研究生双重的生活,让我更加感觉到时间的宝贵。回想这一年,发现过得非常的快,快到很多事情似乎还在眼前,但其实过去很久了。仔细想想,发生的事还是蛮多的:

一.考研失败,这件事充分地证明了两个道理,第一个,去强做不感兴趣的事,效率会很差,第二个,没有努力,就没有结果。

二.毕业设计作的很认真,但最后去发现,程序不关键,导师盯的是论文,这真是大学教育莫大的悲哀,论文写得好能找到工作?

三.找工作远远没有想象的那么难,而唯一的前提是,你有实力。实力的来源就是大学里别人通宵玩游戏,我通宵写程序。(跟牛人比不了,牛人时每妙脑袋都在编程序)。

四.运气非常好,工作五个月后,经过推荐准备去盛大创新院,非常意外,其实觉得自己很菜,真的,很菜。但是,机遇来了,一定抓住。

五.毕业了,就这样大学毕业了,带着一丝茫然地毕业了。

其实大事就这么点,中间夹杂着无数的小事,最让我难以想象的地方就是,我的毕业和我的工作。曾经无比地讨厌痛恨学校,觉得这样的学校我永远不会去怀念。可出来才发现,四年的生活,最美好的青春,朋友们,亲亲老婆,都凝聚在那里。有时,吃着外面的快餐时,想起了学校的鸭排饭,放一勺子辣椒粉,再好吃不过。

而盛大创新院,更是想不到,那样的地方,是一个牛人云集的场所,而机遇,带给我加入奋斗的机会,并且,能去做感兴趣的工作,对于刚出来的学生来说,真是梦幻的开始。

新的一年已经开始,寄托着我对新工作的无限希望,我的大学生涯结束了,我的新的梦想,新的奋斗,开始了。

预谋这篇文章很久了,但是一直苦于没有时间来写,今日狠下心来写写。
首先人间是什么呢?
人间是一个网站,一个社交网站,一个还在内测中,但是具有很强的用户粘合的SNS网站。
地址是http://renjian.com/dd/index,主页图

renjian

可以从主页上发现,这是一个非常清新的网站。

简单来说,可以这样认为,起初这是类似于twitter的微博,但是经过几个月的发展,已经有了微社区的雏形,人与人的交互非常便捷。所谓微社区,就是人与人之间,通过类似围脖的交流方式,围绕某个主题,快速地发表简洁,而提供这样的场所。
个人总结了有如下优点:
一.当我第一次登录的第一直觉,就是干净,网站的UI设计简约得体,颜色的搭配也非常恰当。看我看来,第一感觉是最重要的,就像是相亲,第一面的感觉,如果不适合,那接下来再谈太多也没太多的用。可以看出,人间有很优秀的前端设计师,而且还是资深的那种。

renjian3
二.便捷的交流方式,这点是我最喜欢的,这点跟在BBS和其他围脖上不一样,BBS发帖速度有限制,围脖推又太过随意,而人间可以说介于两者之间,但是又不是那种四不象。首先,快捷的发布主题可以随时分享自己的思维流,如果是没有太多价值的主题,就会石沉大海,但是一旦是碰到有价值的话题,几个人甚至是数十人可以快速的交流,真正的即时地发布自己的思想,这点真的非常赞!
三.良好的团队,由于现在是内测,所以基本注册进去就有人间的开发团队进行交流。可以说,人间每天都在变化,他们会与用户交流,会即时根据用户的需求来调整。尊重用户的需求,这对于一个社交网站来说,是最宝贵的一个有点,用户才是一切。而且团队本生就是用户,自我融入进去,这点是其他网站难以相比的。自己都不去用,怎么能指望用户满意呢。
四.未知性??这点是很好玩很有趣的一点,那就是在人间里除了交流究竟能还能干什么呢?仅仅是聊天么,答案显然是多种多样的。对我来说,有一点很明确,那就是招聘。想不到吧,其实据说在twitter里已经有应届大学生推荐自己求职了。在人间里,同样可以做到,由于可以细分出圈子来,如果有招聘和应聘的人员可以迅速地定位,并且因为是快速地交流,去除了中间的HR,是直接面对有具体需求的人员。双方可以很清楚地判断出来是否合适。
总之,最后发现,想具体说清人间的魅力是一件很困难的事,想要知道是怎么样的网站,不如亲自去逛一逛吧。由于现在是内测,需要邀请码,想要注册的可以问我索要。

还有,强调一句,人间不是google wave的模仿,人间比google wave出来早得多!

这篇下隔了好几天才出来,这是因为本菜菜去了下北京,在北京可谓是收获非凡。
不仅bug大叔请俺和shiroki吃了饭,还见到了传说中的nokia的qtsoftware的技术顾问——Qt Everywhere的博主。不过据说,被我雷到了...(那时是去北京比赛,现在想想真是美好的大学生活啊)
不扯题外话了,在下里本菜菜会者重讲解嵌入式特有的参数,对于开发来说,这些参数相当重要,细微的区别就要可能造成出现一堆不知原因的问题。
下面,就针对每个参数来讲解:
-xplatform target
相当浅显的参数,即交叉编译的目标平台,一般来说根据你所要移植的目标板来确定。
-no-feature-<feature>
-feature-<feature> 全文阅读 »
好了,本菜菜承上启下,接着来讲参数,其实,如果是细心的人就会发现了,其实参数都是有规律的。
什么规律呢?我们来仔细看看在上篇中关于数据库驱动的参数是:
-no-sql-<driver>
-qt-sql-<driver>
-plugin-sql-<driver>
-system-sqlite 

这是相当明显的,如果这都看不出来,,囧,那您一定比我近视(本人800度近视。。)
就是说如果是-no-XX-,就说明编译时不选择这个参数,如过是-qt-XX-,说明我们可以编译直接选用qt自带的驱动,如果是 -plugin-XX-,就是将驱动以插件形式编译,而-system-XXX,当然是使用操作系统提供的驱动,不过那就需要您自己移植了,而且有时还要 用第三方的API,就方便来说非常麻烦,但是不排除您是牛人要好好玩玩的情况。
接下来,我们接着研究配置参数。

-qt-zlib
-system-zlib 

想必经过上面的讲解,参数的意思已经很快得知,就是选择qt带的zlib库还是系统的zlib。zlib库是用于文件和资料压缩的库,对于新入嵌入式的人来 说,可能并无太大的用处,但是在以后的实际开发中,特别是对于多媒体图像图形的工程师来说,就肯定用到,因为图形图像的压缩都要使用或涉及到这个库。

-no-gif
-qt-gif

这是选择gif的支持,如果选择qt支持的话,那在用qt开发的项目中,就能显示gif图,gif也是比较普遍的图片格式了,英文全称是Graphics Interchange Format。

-no-libtiff
-qt-libtiff
-system-libtiff

tiff是一种非常复杂的光栅图像格式,并且有直接现成的C语言实现库,因此选择参数时就有了qt和system,一般来说,科学相关的开发里可能会用到。
 全文阅读 »
这篇文章是于今年7月份时写的,当时对Qt的理解还仅仅处在非常浅薄的阶段,现在看来,很多
地方写得不是很到位,现在修改重新发布,知识也是需要温习巩固的。

经常有人会在BBSQQ群上大喊:怎么裁剪Qt,怎么安装那么困难啊。
每当我看见时,都是非常无奈,其实Qt有套良好的配置安装机制,跟大多数linux程序一样,典型的先configure,然后make,最后 make install三部曲。而如果要裁剪参数,其实可以在configure加上对应的参数来实现,通过合理的选择,完全可以做到满足项目的开发。对于嵌入式开发来说,资源是极其重要的,这就要求我们应该对应不同的项目开发,对Qte进行不同的裁剪来实现。 

其实,在前面的减少Qt编译时间暨简单Qt裁剪(cuteqt)已经对这个题目有了非常详细的概述,并且通过qconfig工具可以做到控件级的裁剪,但是如果能在configure阶段,能搞清楚参数,我想对于开发也是有很大的帮助。 

为了与时俱进,本人的参数来源都是参照qt-embedded-linux-opensource-src-4.5.3,至于Qt4.6.0,已经把所有平台融化在一起,参数也是,但是鉴于现在Qt4.6.0bug多得让人难以忍受,短时间内是不会去使用它作为开发的首选库。 

当进入解压好的源码包后,使用./configure –help命令,可以获得相应帮助,里面详细地介绍了各个参数,其实无需在网上大费周折,只要好好看懂这些参数就可以熟练掌握QtEmbedded的裁减配置。 

获得的帮助信息如下:
 全文阅读 »

QTestLib教程

前言:跟QTestLib手册一样,防止资源浪费,大部分来自已翻译好的大牛文章,补充了新出现的基准测试,可以视为非完全原创。大牛翻译的版本:http://blog.chinaunix.net/u2/75387/showart_1286497.html

本教程介绍了如何使用QTestLib框架的一些特性,共分为五章:

1.编写一个单元测试程序

2.数据驱动程序

3.模拟GUI事件

4.重复GUI事件

5.编写一个基准测试程序 全文阅读 »

cnnbboy's Dream © Copyright 2009, All Rights Reserved.