展讯基础知识介绍.ppt_第1页
展讯基础知识介绍.ppt_第2页
展讯基础知识介绍.ppt_第3页
展讯基础知识介绍.ppt_第4页
展讯基础知识介绍.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、展讯基础知识介绍,在线客户端部:曾献 2009.10.13,目录,展讯平台简介 展讯平台MMI软件开发介绍(对比MTK平台差异) 开发工具介绍 参考文献,第一章,展讯平台简介,展讯平台简介,展讯通信有限公司,成立于2001年,总部上海,主要致力于无线通信及多媒体终端的核心芯片、专用软件和参考设计平台的开发。 展讯手机平台: 1)硬件资源cpu:一般为ARM7 2)操作系统:ThreadX实时操作系统 3)GSM/GPRS协议栈,物理层软件 4)外设(LCD, keypad等),串口SIO等 5)AT命令接口 6)产品型号(基带芯片):SC6600H、SC6600I、SC6600R(这3种是目前

2、市场上最常用的也是我们目前开发用的2G系列的平台)最新出了一个SC6600L.,第二章,展讯平台MMI软件开发介绍(对比MTK平台差异),MMI模块三个重要概念,Application:应用,指MMI中的应用模块。例如:SMS,CC等。一个应用可以有多个窗口。 Window:窗口,用于显示和处理送给此窗口的各种消息。例如:按键消息,Timer消息等。一个窗口可以有多个控件。 Control:控件,可以完成某种特定的功能。例如:编辑框,文本显示框,动画,弹出框等。,1.窗口/屏幕(对比MTK),a.框架的区别 1)展讯平台,窗口是仿windows系统的框架,更多的使用消息处理机制,没有层的概念,

3、显示效果比较单一化。 2)MTK平台,屏幕上有层的特效。 示例: 在mtk 上,进入一个新屏调用 EntryNewScreen (SCR_ID, ExitFunc, EntryFunc, NULL); 其中SCR_ID是自己定义的一个窗口枚举ID。 在展讯上,调用 MMK_CreateWin(uint32*)TEST_WIN_TAB, PNULL); 其中TEST_WIN_TAB是自己定义的一个uint32*型的全局常量,窗口/屏幕(续上),LOCAL MMI_RESULT_E / LOCAL = static HandleTestWinMsg (MMI_WIN_ID_T win_id , M

4、MI_MESSAGE_ID_E msg_id, DPARAM param); WINDOW_TABLE(TEST_WIN_TAB) = /WINDOW_TABLE是一个宏,值为const uint32 TEST_WIN_TAB CLEAR_LCD, / 清除 lcd buffer WIN_PRIO(WIN_ONE_LEVEL), / 窗口的优先级,WIN_ONE_LEVEL该值是一般优先级。 WIN_FUNC(uint32)HandleTestWinMsg), /该窗口对应的消息处理函数。 WIN_ID(TEST_WIN_ID), / TEST_WIN_ID为该窗口的ID,相当于MTK上的SC

5、R_ID。 END_WIN / 系统解析该窗口时的尾部标识 ; Window Table实际上是一个Const数组,主要是为了简化应用的界面开发,在MMI应用开发过程中,开发人员可以将一些固定的元素,如窗口的处理函数、优先级、ID、控件的固定属性等等放入这个 Tabel中,再通过 MMK_CreateWin 创建打开这个窗口,同时MMI Kernel会自动去解析这张Table中的内容,并搭建好整个窗口关系(窗口的空间分配、属性设置、与控件的组织等)。这些可以将很多界面性的开发独立处理,方便以后的扩充和修改。可以参考看下 window_prase.h这个头文件. TEST_WIN_TAB一般定义

6、在 Win.def 内,使用例如:WIN_DEF(TEST_WIN_TAB ) TEST_WIN_ID定义在头文件(比如mmiacc_id.def)里,使用例如 WIN_DEF_ID(TEST_WIN_ID,”TEST_WIN_ID”),窗口/屏幕(续上),b.按键注册的区别 在MTK上: 一般使用: SetKeyHandler ( Func_Ptr, KEY_VALUE, KEY_EVENT);来进行按键的注册。其中第一个参数 Func_Ptr是该按键所调用的函数, KEY_VALUE为该按键的键值,KEY_EVENT为该按键的事件。 在展讯上: 按键的注册只需要在窗口消息处理函数里加上一个

7、对应的switch消息即可。如注册一个左软键事件为: LOCAL MMI_RESULT_E / LOCAL = static HandleTestWinMsg(MMI_WIN_ID_T win_id, MMI_MESSAGE_ID_E msg_id, DPARAM param) switch (msg_id) case MSG_KEYDOWN_OK: / 该消息对应MTK上的就是左软键按下时的操作 Func_Ptr();/对应的处理函数 break; ,窗口/屏幕(续上),c.启动一个窗口(进入一个新屏) 在MTK上,只要函数里有调用EntryNewScreen(),就会进入一个新屏幕。 而在

8、展讯上,启动一个新窗口需要调用:MMK_CreateWin(uint32*)WIN_TAB, NULL);该函数对WIN_TAB这个窗口表格进行解析,然后往WIN_TAB里边的消息处理函数发送消息。首先发送的第一条消息是:MSG_OPEN_WINDOW, 接着发送第二条消息: MSG_FULL_PAINT, 第一条消息可以做一些初始化操作等,第二条消息可用于绘制图形以及显示字符串等。如: LOCAL MMI_RESULT_E HandleTestWinMsg(MMI_WIN_ID_T win_id, MMI_MESSAGE_ID_E msg_id, DPARAM param) static G

9、UI_RECT_T rect = 0; GUI_LCD_DEV_INFO lcd_dev_info = GUI_LCD_0, GUI_BLOCK_0; switch( msg_id) case MSG_OPEN_WINDOW: / 第一条消息,一般做些初始化. rect = CreateRect(0, 0, LCD_WIDTH 1, LCD_HEIGHT 1); break; case MSG_FULL_PAINT: / 第二条消息,一般在这里do action. LCD_FillRect ( ,窗口/屏幕(续上),d.窗口(屏幕)历史 在MTK上,只要在EntryNewScreen(1, 2

10、, 3, 4)的第3个参数写入调用该函数的主函数,该屏幕就会被压入屏幕历史堆栈。如: void MyAppScreenEntry (void) EntryNewScreen (SCR_ID, NULL, MyAppScreenEntry , MMI_FULL_SCREEN); 而在展讯上,只要启动一个窗口,该窗口就会自动被压入窗口堆栈中,如果不关闭该窗口,它一直都是存在的。调用的接口是MMK_CreateWin(uint32*)WIN_TAB, NULL)。 e.窗口(屏幕)关闭 在MTK上,关闭当前窗口直接调用:GoBackHistory ();即可返回上一个历史屏幕,调用GoBacknHi

11、story (n)即可返回到前第n个历史屏幕。调用GoBacktoHistory (SCR_ID)即可返回到指定的历史屏幕。红键按下时会回到IDLE界面。 而在展讯上,关闭当前的窗口,调用的函数是:MMK_CloseWin (win_id), 而返回到某个已经打开的窗口,可调用函数是:MMK_ReturnAppintedWin(win_id),而红键按下的时候,系统会有一个默认的处理函数直接返回到IDLE界面,即MMK_HandleRedKeyProcess(),当然,也可以注册自己的红键处理事件。,2.定时器,在MTK上,定时器的创建只需要在定时器枚举里声明一个ID即可直接拿来使用,没有周期

12、性的说法(运行一次还是循环运行),而且定时器与窗口无关。 在展讯平台上,定时器的ID就是一个变量,该定时器可以跟窗口有关亦可以无关,而且还可分为一次性或者周期性运行。 1)若该定时器与窗口有关,创建该定时器时,定时器timeout一到就会往该窗口的消息处理函数发送MSG_TIMER消息,收到该消息后就可以做想做的事情。如: LOCAL MMI_RESULT_E HandleTestWinMsg(MMI_WIN_ID_T win_id, MMI_MESSAGE_ID_E msg_id, DPARAM param) static uint8 s_test_timer_id = 0; / 定时器声明

13、,初始化为0。 switch(msg_id) case MSG_OPEN_WINDOW: / 第一条消息 s_test_timer_id = MMK_CreateWinTimer (win_id, 1000, FALSE); / 创建该窗口的一个定时器,定时1秒,一次性运行。 break; case MSG_TIMER: / 定时器到来时传过来的消息ID MMK_StopTimer (s_test_timer_id ); s_test_timer_id =0; Timer_CallBack (); / 定时器到来时做的操作 break; 注:展讯上最多可以同时运行16个定时器。,定时器是否 循

14、环使用,定时器(续上),2)与窗口无关的定时器: PUBLIC SCI_TIMER_PTR SCI_CreateTimer( / 创建成功则返回定时器指针,否则返回SCI_NULL. const char * timer_name, / 定时器的名称 TIMER_FUN timer_func, / 定时器的回调函数 uint32 input, / 回调函数的输入参数 uint32 timer_expire, / 定时器的定时时间,单位为毫秒 uint32 auto_activate ); / 是否自动启动 其中TIMER_FUN的定义为:typedef void (*TIMER_FUN)(ui

15、nt32); 例: void TestTimerCallBack(uint32 value)/回调函数 / To Do: LOCAL MMI_RESULT_E HandleTestWinMsg(MMI_WIN_ID_T win_id, MMI_MESSAGE_ID_E msg_id, DPARAM param) SCI_TIMER_PTR Timer_Ptr = SCI_NULL; switch(msg_id) case MSG_OPEN_WINDOW: / 第一条消息 / 创建与窗口无关的一个定时器,定时1秒,一次性运行。自动运行。 Timer_Ptr = SCI_CreateTimer (

16、“Test Timer”, TestTimerCallBack, 0, 1000, SCI_AUTO_ACTIVATE); break; ,若为SCI_NO_ACTIVATE,则需要调用SCI_ActiveTimer 使之生效;,3.文件操作,文件操作接口的区别 在MTK上,文件操作没有异步操作这种说法,但文件操作接口很丰富,诸如文件的创建、读写、定位、删除以及截断(Truncate)等。 而展讯上,文件操作有同步异步两种操作,涉及到文件读写操作就有异步操作,但接口没MTK上的丰富,比如展讯上没有文件截断。展讯的盘符必须是大写的字母,否则系统找不到路径,如T卡的盘符为“E”盘,而不能写成“e”

17、盘。下面主要针对展讯常用的文件操作接口进行简述: (1)文件的创建: SFS_HANDLE SFS_CreateFile ( / SFS_HANDLE为文件的句柄,是uint32型,返回值大于0表示操作成功。 const uint16 *file_name , / 文件路径为Unicode,记得要转码。 uint32 access_mode , / 访问模式:创建读写等方式,用或操作。 uint32 share_mode , / 共享模式:文件系统暂时无法实现 uint32 file_attri ); / 文件的属性:文件系统暂时无法实现。 例如在T卡根目录下创建一个文本文件“123.txt“

18、: SFS_HANDLE file_handle = 0; uint8 *file_path = “E:123.txt”; uint16 path_unicode32 = 0; GUI_GB2UCS(path_unicode, file_path, strlen(file_path);/转码 unicode file_handle = SFS_CreateFile (path_unicode, SFS_MODE_CREATE_NEW | SFS_MODE_READ, 0, 0); If (file_handle 0) ,文件操作(续上),(2)文件的读取 SFS_ERROR_E SFS_Rea

19、dFile (/ SFS_ERROR_E是一个枚举,返回0代码成功,其它看对应的枚举值说明。 SFS_HANDLE handle, / 文件的句柄 void *buffer, / 读取的缓存存放指针 uint32 bytes_to_read , / 要读取的字节数 uint32 *bytes_read , / 实际读取的字节数 SFS_OVERLAPPED_T *overlapped); / 异步操作参数 例如读取“E:123.txt”里边的内容: SFS_HANDLE file_handle = 0; uint8 *file_path = “E:123.txt”; uint16 path_u

20、nicode32 = 0; char read_buffer256 = 0; uint32 have_read = 0; GUI_GB2UCS(path_unicode, file_path, strlen(file_path); file_handle = SFS_CreateFile (path_unicode, SFS_MODE_OPEN_EXISTING | SFS_MODE_READ, 0, 0); if (file_handle 0) / 句柄大于0表示操作成功。 SFS_ReadFile (file_handle, read_buffer , 256, ,打开已存在的文件,支持读

21、文件操作,文件操作(续上),(3)文件的写入 SFS_ERROR_E SFS_WriteFile( / SFS_ERROR_E是一个枚举,返回0代码成功,其它看对应的枚举值说明。 SFS_HANDLE handle, / 文件的句柄 void *buffer, / 读取的缓存存放指针 uint32 bytes_to_write, / 要写入的字节数 uint32 *bytes_written, / 实际写入的字节数 SFS_OVERLAPPED_T *overlapped); / 异步操作参数 例如往“E:123.txt”里边的内容“Hello, World”: SFS_HANDLE file

22、_handle = 0; uint8 *file_path = “E:123.txt”; uint16 path_unicode32 = 0; char write_buffer256 = “Hello, World”; uint32 have_written = 0; GUI_GB2UCS(path_unicode, file_path, strlen(file_path); file_handle = SFS_CreateFile(path_unicode, SFS_MODE_OPEN_EXISTING | SFS_MODE_WRITE, 0, 0); if (file_handle 0)

23、 SFS_WriteFile(file_handle, write_buffer, strlen(write_buffer), ,支持写文件操作,文件操作(续上),(4)获取文件大小 SFS_ERROR_E SFS_GetFileSize / SFS_ERROR_E是一个枚举,返回0代码成功,其它看对应的枚举值说明。 (SFS_HANDLE sfs_handle , uint32* size);/输出参数,函数操作成功后,该指针存储的是文件的大小. 例如需要获取“E:123.txt”的文件大小 : SFS_HANDLE file_handle = 0; uint8 *file_path = “

24、E:123.txt”; uint16 path_unicode32 = 0; char write_buffer256 = “Hello, World”; uint32 file_length = 0; GUI_GB2UCS(path_unicode, file_path, strlen(file_path); file_handle = SFS_CreateFile(path_unicode, SFS_MODE_OPEN_EXISTING | SFS_MODE_READ, 0, 0); if (file_handle 0) SFS_GetFileSize(path_unicode, ,文件大

25、小,文件操作(续上),(5)文件的定位 SFS_ERROR_E SFS_SetFilePointer(/ SFS_ERROR_E是一个枚举,返回0代码成功,其它看对应的枚举值说明。 SFS_HANDLE handle, int32 offset, / 偏移量 uint32 origin); / SFS_SEEK_BEGIN / SFS_SEEK_CUR / SFS_SEEK_END 例如将文件指针定位到末尾,然后再将缓存写入: SFS_HANDLE file_handle = 0; uint8 *file_path = “E:123.txt”; uint16 path_unicode32 =

26、0; char write_buffer256 = “Hello, World”; uint32 have_written = 0; GUI_GB2UCS(path_unicode, file_path, strlen(file_path); file_handle = SFS_CreateFile(path_unicode, SFS_MODE_OPEN_EXISTING | SFS_MODE_WRITE, 0, 0); if (file_handle 0) SFS_SetFilePointer(file_handle, 0, SFS_SEEK_END); / 将文件指针定位到文件末尾 SFS

27、_WriteFile(file_handle, write_buffer, strlen(write_buffer), / 确定文件句柄有效时才能关闭,即handle 0,4.GUI接口,(1)文本的输出 a.通过字符串ID来打印: #define LCD_DisplayLabelString( lcd_id, startpoint, text_id, space, font_color, font, line_space ) GUI_RECT_T box = 0; LCD_DisplayCustomString( 0 x01, lcd_id, startpoint, box, text_id

28、, PNULL, 0, FALSE, space, 0, font_color, font, ALIGN_LEFT, line_space ); 例: GUI_POINT_T start_point = 0, 0; GUI_LCD_DEV_INFO lcd_dev_info = GUI_LCD_0, GUI_BLOCK_0; LCD_DisplayLabelString(,GUI接口(续上),b.通过字符串缓存来进行打印: PUBLIC void LCD_DisplayString( GUI_LCD_DEV_INFO const *dev_info_ptr, / 屏幕ID GUI_POINT_

29、T startpoint, / 显示位置,起始坐标 uint8 *text_ptr,/ 字符串缓存 uint16 len, / 字符串长度 uint16 space, / 字与字之间的距离,单位为像素 GUI_COLOR_T color, / 字体颜色 GUI_FONT_T font, / 字体类型 BOOLEAN is_ucs2, / 字符编码 uint8 line_space) / 行与行之间的距离,单位为像素 例,在坐标为(0, 0)打印字符串”Hello World”: GUI_POINT_T start_point = 0, 0; GUI_LCD_DEV_INFO lcd_dev_i

30、nfo = GUI_LCD_0, GUI_BLOCK_0; uint8 *text_buffer = “Hello World”; LCD_DisplayString(,GUI接口(续上),C.通过字符串缓存来进行打印(在固定矩形框内): PUBLIC void LCD_DisplayStringInRect( / 在固定的矩形框内显示文本,自动换行。 GUI_LCD_DEV_INFO const *dev_info_ptr, / 屏幕ID GUI_RECT_T box, / 显示所在的矩形 uint8 *text_ptr, / 字符串缓存 uint16 len, / 字符串长度 uint16

31、 space, / 字与字之间的距离,单位为像素 GUI_COLOR_T color, / 字体颜色 GUI_FONT_T font, / 字体类型 BOOLEAN is_ucs2, / 字符编码 uint8 line_space) / 行与行之间的距离,单位为像素 例,在固定的一个矩形内打印字符串”Hello World”: GUI_POINT_T rect = CreateRect(50, 100, 100, 200); / 创建矩形 GUI_LCD_DEV_INFO lcd_dev_info = GUI_LCD_0, GUI_BLOCK_0; uint8 *text_buffer = “

32、Hello World”; LCD_DisplayString(,GUI接口(续上),(2)字符串以及字体的宽高 1)字符串的宽度/高度 PUBLIC uint16 GUI_GetStringWidth( / 获取字符串的宽度,返回该字符串的宽度 GUI_FONT_T font_type, / 字体类型 uint8* str_ptr, / 字符串缓存 uint16 str_len, / 字符串长度 BOOLEAN is_ucs) / 是否为unicode编码 PUBLIC uint16 GUI_GetStringHeight( / 获取字符串的高度,返回该字符串高度最高的字符的高度 GUI_F

33、ONT_T font_type, / 字体类型 uint8* str_ptr, / 字符串缓存 uint16 str_len, / 字符串长度 BOOLEAN is_ucs) / 是否为unicode编码 2)字体的宽度/高度 uint8 GUI_GetFontWidth( / 获取字体的宽度,返回该字体的宽度 GUI_FONT_T font_type, /字库类型 uint16 unicode) / UNICODE_ASCII / UNICODE_HANZI uint8 GUI_GetFontHeight( / 获取字体的高度,返回该字体的高度 GUI_FONT_T font_type, /

34、字库类型 uint16 unicode) / UNICODE_ASCII / UNICODE_HANZI,GUI接口(续上),(3)线、矩形 1)画线 PUBLIC void LCD_DrawLine( GUI_LCD_DEV_INFO const *dev_info_ptr,/ 屏幕ID uint16x1, / x1坐标值 uint16y1, / y1坐标值 uint16x2, / x2 uint16y2, / y2 GUI_COLOR_T color) / 线的颜色 2)画矩形 PUBLIC void LCD_DrawRect( GUI_LCD_DEV_INFO const * dev_i

35、nfo_ptr,/ 屏幕ID GUI_RECT_T box, / 矩形 GUI_COLOR_T color)/ 矩形颜色 3)填充矩形 PUBLIC void LCD_FillRect( GUI_LCD_DEV_INFO const * dev_info_ptr,/ 屏幕ID GUI_RECT_T box, / 矩形 GUI_COLOR_T color)/ 填充的颜色,GUI接口(续上),(4)图 展讯上对画图片支持比较差,系统只提供了通过资源ID画静态BMP,而JPG、GIF图片要用第三方的程序来画。 1)通过ID画静态BMP void GUI_DisplayStaticBmp( GUI_L

36、CD_DEV_INFO const *dev_info_ptr,/ 屏幕ID uint16x, / x 坐标 uint16y, / y 坐标 MMI_IMAGE_ID_Timage_id, / 图片id MMI_WIN_ID_T win_id) / 当前窗口的ID 2)通过路径画JPG图片 int32 recode = 0; int32 offset_x = 0; int32 offset_y = 0; int32 resized_width = 48; int32 resized_height = 48; uint8 *image_path = “E:123.jpg”; uint16 ima

37、ge_path_unicode64 = 0; T_GUI_Bitmap bitmap_ptr = 0; / 位图结构体,用于JPG解码 GUI_RECT_T rect = CreateRect (0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1); / 显示所在的区域 GUI_LCD_DEV_INFO lcd_dev_info = GUI_LCD_0, GUI_BLOCK_0;,GUI接口(续上),(续上) SCI_MEMSET( / 释放生成的位图缓存 ,图片显示的矩形框,GUI接口(续上),3)通过缓存画JPG图片 uint8 * image_buffer;/存放jp

38、g图片的缓存 int32 recode = 0; int32 offset_x = 0; int32 offset_y = 0; int32 resized_width = 48; int32 resized_height = 48; T_GUI_Bitmap bitmap_ptr = 0; / 位图结构体,用于JPG解码 GUI_RECT_T rect = CreateRect (0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1); / 显示所在的区域 GUI_LCD_DEV_INFO lcd_dev_info = GUI_LCD_0, GUI_BLOCK_0; SCI

39、_MEMSET( / 释放生成的位图缓存,GUI接口(续上),Gif图片(画的操作和jpg差不多) 这里特别介绍下有关gif图片的帧数获取的问题,它无法像mtk一样,可以直接通过某个系统的函数去获取,展讯上需要自己去解析gif图片来用计数器计算出其帧数的大小. 例: char picture_buff80 *1024 = 0;/存放图片缓存信息,一般复用内存块 int32 frame_count = 1;/gif图片帧数 SFS_HANDLE file_handle = 0;/文件句柄 uint32 bytes_read = 0;/读取文件长度 GIF_CONTEXT_INFO_T *gif_

40、context_ptr = PNULL;/当前帧的gif图片指针 char *image_path = “E:123.gif”; uint16 *image_path_unicode64 = 0;,GUI接口(续上),(续上) GUI_GB2UCS(image_path_unicode, image_path, strlen (image_path); file_handle = SFS_CreateFile (image_path_unicode, SFS_MODE_OPEN_EXISTING | SFS_MODE_READ, PNULL, PNULL); if (file_handle 0

41、) /这里用文件操作将图片信息读入到一个buf缓存里面 SFS_ReadFile ( file_handle, picture_buff, 80*1024, gif_context_ptr - gif_info_next_ptr = gif_context_ptr- gif_info_next_ptr- gif_info_next_ptr 这里的frame_count 值就是图片帧数值.,5.网络gprs以及socket,1)gprs激活/去活 a. gprs激活 相比于mtk创建socket时自动启动gprs而言,展讯的gprs需要手动去激活. 1.设置PDP上下文参数: ERR_MNGPR

42、S_CODE_E MNGPRS_SetPdpContextProEx /返回0表示调用成功 (MN_DUAL_SYS_E dual_sys, /sim卡信息 uint32 pdp_id, /本地的pdp上下文标识,一般我们设为1 uint8*user_ptr, /用户名,一般我们设为空的” ” uint8 *passwd_ptr); /用户密码,一般我们设为空的” ” 2.设置缺省的pdp上下文参数,并激活此pdp的上下文,和网络层建立个pdp连接: ERR_MNGPRS_CODE_E MNGPRS_SetAndActivePdpContextEx /0表示调用成功 (MN_DUAL_SYS_

43、E dual_sys, /sim卡信息 uint8* APNcn); /Access Point Name,一般设为”cmwap” 3.处理网络协议栈消息: 上面两个函数执行完成以后,底层会发消息到网络协议栈函数 mmiwap.c的HandleWapPsMsg里做相应的处理. APP_MN_ACTIVATE_PDP_CONTEXT_CNF/激活时的消息 APP_MN_DEACTIVATE_PDP_CONTEXT_CNF /去活时的消息 若result为MN_GPRS_ERR_SUCCESS则表示成功,其他表示失败,对应可以看错误类型。(MN_GPRS_ERR_E枚举里),网络gprs以及soc

44、ket(续上),(续上) 示例: char* apn = “cmwap ”; MNGPRS_SetPdpContextProEx(MN_DUAL_SYS_1, 1, (uint8*)“”, (uint8*)“”); MNGPRS_SetAndActivePdpContextEx(MN_DUAL_SYS_1, (uint8*)apn); 这里处理完成以后,在mmiwap.c的HandleWapPsMsg里收到APP_MN_ACTIVATE_PDP_CONTEXT_CNF消息,对应里面的ProcessGprsActiveCnf函数,signal-result结果若为MN_GPRS_ERR_SUCC

45、ESS,则成功. 此时可用 MMK_PostMsg (win_id, msg_id, param_ptr, size_of_param)函数来向我们需要对应处理的窗口消息处理函数,发送一个msg消息. 例如 MMK_PostMsg (TEST_WIN_ID, MSG_MYAPP_ACTIVE, PNULL, 0); LOCAL MMI_RESULT_E / LOCAL = static HandleTestWinMsg (MMI_WIN_ID_T win_id, MMI_MESSAGE_ID_E msg_id, DPARAM param) switch (msg_id) case MSG_MY

46、APP_ACTIVE: / 该消息做gprs激活后的操作 Func_Ptr(); break; ,网络gprs以及socket(续上),b.去活gprs 去活已经激活的PDP上下文,即断开和网络的PDP连接,则不能在继续进行数据的传输. ERR_MNGPRS_CODE_E MNGPRS_ReSetAndDeactivePdpContextEx /0表示调用成功 (MN_DUAL_SYS_E dual_sys, /sim卡信息); 当你不需要再继续使用网络数据的传输时, 直接调用这个函数断开gprs MNGPRS_ReSetAndDeactivePdpContextEx (MN_DUAL_SYS

47、_1);,网络gprs以及socket(续上),2)socket操作 1.创建socket: int sci_sock_socket (int family, int type, int protocol); 参数: family : 地址族,目前都设置为AF_INET; type : socket类型,目前有3种 SOCK_STREAM(TCP)SCOK_DGRAM(UDP)SOCK_RAW(IP) 我们现在都采用SOCK_STREAM; protocol : 协议,一般设置为0; 返回值: int型的socket描述符,返回值非负时表示成功,否则失败. 例:int socket_handl

48、e (socket描述符); socket_handle = sci_sock_socket (AF_INET, SOCK_STREAM, 0);,网络gprs以及socket(续上),2.socket连接 int sci_sock_connect(long s, struct sci_sockaddr *name, int namelen); 参数: s: socket描述符(创建socket时返回的值); name: socket地址结构体信息; namelen: 上述结构体的长度,sizeof (struct sci_sockaddr ); 返回值: 0表示成功,-1表示失败;可以用sc

49、i_sock_error来看错误类型,具体在后面会讲述怎么使用. 例:int socket_handle (socket描述符); int con_ret; struct sci_sockaddr my_addr = 0; char *szaddr = “72”;/移动的网关 socket_handle = sci_sock_socket(AF_INET, SOCK_STREAM, 0); if (socket_handle 0) return; my_addr .family = AF_INET; my_addr .port = htons(80); my_addr .ip_addr = inet_addr(szaddr); (注:这里inet_addr函数,就是将char型变量转变成unsigned long型) SCI_MEMSET (void*) my_addr.sa_data, 0, 8*sizeof(char); con_ret = sci_sock_connect (long)socket_handle , ,存放连接地址的结构体,网络gprs以及socket(续上),3.socket发送请求 int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论