MTK learn
平台: MTK 6225, PC VC6.0
A. SMS Send
void send_shortmsg(const char* szNumber, const char* szMsg)
{
mmi_sms_send_msg_req_struct* sendSms;
unsigned char dyn_ref_count;
unsigned short dyn_msg_len;
sendSms = (mmi_sms_send_msg_req_struct*) OslConstructDataPtr(sizeof(mmi_sms_send_msg_req_struct));
dyn_ref_count = sendSms->ref_count;
dyn_msg_len = sendSms->msg_len;
memset(sendSms, 0, sizeof(mmi_sms_send_msg_req_struct));
sendSms->ref_count = dyn_ref_count;
sendSms->msg_len = dyn_msg_len;
sendSms->reply_index= 0xffff; //MMI_FRM_SMS_INVALID_INDEX;
sendSms->dest.type = 129;
sendSms->dest.length = strlen((char *)szNumber);
memcpy((S8*)sendSms->dest.number, szNumber, sendSms->dest.length);
sendSms->dcs = SMSAL_DEFAULT_DCS;
sendSms->length = strlen(szMsg);
memcpy((S8*)sendSms->msg, (S8*)szMsg, sendSms->length);
SetProtocolEventHandler(msg_send_msg_rsp, PRT_MSG_ID_MMI_SMS_SEND_MSG_RSP);
mmi_frm_sms_send_message(MOD_MMI, MOD_L
}
void msg_send_msg_rsp (void* sendSms)
{
mmi_sms_send_msg_rsp_struct *msgRsp = (mmi_sms_send_msg_rsp_struct *)sendSms;
if((msgRsp->result) == TRUE)
{
// Add Program;
return;
}
else
{
// Add Program
OnPaint();
return;
}
}
B. Socket
1. 使用gineerModeSocketDemoApp.c ,mmi_soc_demo_app_request() Function , 可以做到 Http Get 功能,
但移動手機上網必須透過代理服務器. 所以必須修改部分程式.
手機上運行時連接到
const char* url = {"http://
電腦模擬器上運行, 需先把模擬器中的手機裡移動網關設為
url 也改為如下直連的設置方式
const char* d1 = {"http://www.abc.com:80 GET /upload.asp?data=
程序中調用MTK的HTTP GET 程序, 第一個參數設為HTTP, 代表使用HTTP GET.
第二個參數10, 代表要使用的 gprs network account id.
目前使用的手機在網路連接方式的設定中 GSM數據裡面有10項, GPRS 里有10項.
我的手機裡GPRS里第1項是 cmwap. 設定為10就是選用這個cmwap連接方式.
TestEmSocketRsp 為回調函數
mmi_soc_demo_app_request(HTTP,10,NULL,Data_url,strlen(Data_url),NULL,0,TestEmSocketRsp);
執行這個程式後會返回server return 的值.
如果是在PC上運行可以得到server回應的數據. 但如果是真實的手機上運行因為連接的是移動網關
所以retrun的值中
http://
但mmi_soc_demo_app_request 程式在接收到 return value, 呼叫 TestEmSocketRsp 後便會 close
socket connect,
所以必須修改這地方檢查到有 go Href 後, 不要 close socket connect,
此時再發上面所列的url, 便可以得到真正的值.
PS: mtk bug 提醒.
我所使用的6225 source code, 在en_soc_demo_http_send_request 函數中有一 Bug:
原程序中
if (soc_demo_transaction->url_parsed_info->url_link)
{
strcat((char*)soc_demo_transaction->snd_buffer,
(char*)soc_demo_transaction->url_parsed_info->url_link);
soc_demo_transaction->snd_data_len += soc_demo_transaction->url_parsed_info->url_link_len;
strcat((char*)soc_demo_transaction->snd_buffer, " ");
soc_demo_transaction->snd_data_len += 2;
}
else
{
strcat((char*)soc_demo_transaction->snd_buffer, "/ ");
soc_demo_transaction->snd_data_len += 2;
}
紅字的2應改為1, 這裡程序多加了1個byte, 導致發出的訊息多了1個byte,
http的命令是以兩個CRLF為結束判斷,多發一個byte,
HTTP serve 將誤認為有新的 http command, 等待輸入,
產生 Http Error 400, 以及 連線中斷.
C. PhoneBook
1. 存電話號碼
將資料放到以下變數中執行程式便可:
------------------------------------------------------------------------------
姓名 pbName
电话号码 pbNumber
家庭电话 pbHomeNumber
公司名称 pbCompanyName
电子信箱 pbEmailAddress
公司电话 pbOfficeNumber
传真号码 pbFaxNumber
birthday pbBday
------------------------------------------------------------------------------
int jun_put_phb_entry(void) {
MSG_PHB_SET_ENRTY_REQ_STRUCT *myMsgPtr;
MYQUEUE Message;
myMsgPtr = (MSG_PHB_SET_ENRTY_REQ_STRUCT*) OslConstructDataPtr(sizeof(MSG_PHB_SET_ENRTY_REQ_STRUCT));
myMsgPtr->type = MMI_PHB_PHONEBOOK;
myMsgPtr->no_data = 1;
myMsgPtr->list.storage = 2; //根據各手機, 設定值可能不同
myMsgPtr->list.index = 0xFFFF;
myMsgPtr->list.record_index = 0xFFFF;
mmi_phb_op_set_entry_prepare_name_number(&myMsgPtr->list, pbName, pbNumber);
Message.oslSrcId = MOD_MMI;
Message.oslDestId = MOD_L
Message.oslMsgId = PRT_PHB_SET_ENTRY_REQ;
Message.oslDataPtr = (oslParaType*) myMsgPtr;
Message.oslPeerBuffPtr = NULL;
SetProtocolEventHandler(mmi_phb_op_add_entry_rsp, PRT_PHB_SET_ENTRY_RSP);
OslMsgSendExtQueue(&Message);
}
2. 讀電話號碼
程序如下, 讀到的資料存在上面所列的變數中:
int jun_get_phb_entry(int index)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
int t0;
U8 t1;
S8 *pbEntry[JUN_MAX_PB_FIELDS];
U16 DetailPbNameImageList[JUN_MAX_PB_FIELDS];
U8 *guiBuffer;
U8 field_index, item_index = 0;
#if !defined(__MMI_PHB_NO_OPTIONAL_FIELD__)
S16 pError;
#endif
U16 store_index;
U16 image_id;
PHB_OPTIONAL_IDS_STRUCT *opt_ids = NULL;
#if defined(__MMI_INCOMING_CALL_VIDEO__)
U16 video_id;
#endif
#if defined(__MMI_DOWNLOADABLE_THEMES_SUPPORT__)
BOOL found_theme_tone = TRUE;
#endif
g_phb_cntx.active_index = index;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if(index >= PhoneBookEntryCount )
return -1; //無資料
store_index = g_phb_name_index[g_phb_cntx.active_index];
mmi_ucs2cpy(pbName, (PS8) PhoneBook[store_index].alpha_id.name);
mmi_phb_convert_get_ucs2_number(pbNumber, store_index);
jun_mmi_phb_op_view_fill_item(
MMI_PHB_FIELD_NAME,
item_index,
&pbEntry[item_index],
TitleStrings,
DetailPbNameImageList);
item_index++;
jun_mmi_phb_op_view_fill_item(
MMI_PHB_FIELD_NUMBER,
item_index,
&pbEntry[item_index],
TitleStrings,
DetailPbNameImageList);
item_index++;
gPictureItemIndex = 0xff; /* Set to default before use. */
g_phb_cntx.selected_pic_index = 0;
gRingtoneItemIndex = 0xff;
g_phb_cntx.selected_ring_index = 0;
#if defined(__MMI_PHB_IMPS_FIELD__)
phb_imps_item_index = 0xff;
#endif
if (store_index >= MAX_PB_PHONE_ENTRIES) /* Record store in SIM, SIM index is begin from "MAX_PB_PHONE_ENTRIES" */
{
#if defined(__MMI_PHB_CALLERGROUP_IN_SIM__) /* Associate caller group in SIM card entry */
mmi_phb_build_caller_group_list();
mmi_phb_read_optional_ids(store_index);
opt_ids = (PHB_OPTIONAL_IDS_STRUCT*) g_phb_cntx.optional_ids;
g_phb_cntx.selected_grp_index = opt_ids->callerGroupID;
if (jun_mmi_phb_op_view_fill_item
(MMI_PHB_FIELD_GROUP, item_index, &pbEntry[item_index], TitleStrings, DetailPbNameImageList))
{
item_index++;
}
#elif defined(__MMI_PHB_USIM_FIELD__)
if (guiBuffer == NULL) /* First Time Enter */
{
mmi_phb_convert_get_ucs2_anr(pbHomeNumber, pbOfficeNumber, pbFaxNumber, store_index);
mmi_asc_to_ucs2(pbEmailAddress, (S8*) phb_email[store_index - MAX_PB_PHONE_ENTRIES].email_address);
}
mmi_phb_build_usim_group_list();
g_phb_cntx.selected_grp_index = g_phb_cntx.group_type[store_index - MAX_PB_PHONE_ENTRIES];
/* Fill inline item for each field */
for (field_index = (MMI_PHB_USIM_FIELD_ANRA); field_index <>
{
if (g_phb_cntx.support_field[field_index])
{
if (mmi_phb_op_view_fill_usim_item
(field_index, item_index, &pbEntry[item_index], TitleStrings, DetailPbNameImageList))
{
item_index++;
}
}
}
#endif
#ifdef __MMI_DUAL_SIM_MASTER__
if (store_index >= (MAX_PB_PHONE_ENTRIES + MAX_PB_SIM_ENTRIES))
{
image_id = IMG_ID_CARD2_PHB_STORAGE_SIM;
}
else
{
image_id = IMG_ID_CARD1_PHB_STORAGE_SIM;
}
#else /* __MMI_DUAL_SIM_MASTER__ */
image_id = IMG_STORAGE_SIM;
#endif /* __MMI_DUAL_SIM_MASTER__ */
}
else
{
mmi_phb_read_optional_ids(store_index);
opt_ids = (PHB_OPTIONAL_IDS_STRUCT*) g_phb_cntx.optional_ids;
ReadRecord(
NVRAM_EF_PHB_FIELDS_LID,
(U16) (store_index + 1),
(void*)&PhoneBookOptionalFields,
OPTIONAL_FIELDS_RECORD_SIZE,
&pError);
mmi_asc_to_ucs2(pbHomeNumber, (PS8) PhoneBookOptionalFields.homeNumber);
mmi_ucs2cpy(pbCompanyName, (PS8) PhoneBookOptionalFields.companyName);
mmi_asc_to_ucs2(pbEmailAddress, (PS8) PhoneBookOptionalFields.emailAddress);
mmi_asc_to_ucs2(pbOfficeNumber, (PS8) PhoneBookOptionalFields.officeNumber);
mmi_asc_to_ucs2(pbFaxNumber, (PS8) PhoneBookOptionalFields.faxNumber);
}
return 0;
}
static pBOOL jun_mmi_phb_op_view_fill_item(
U8 field_index,
U8 item_index,
S8 **entry_list,
U16 *title_list,
U16 *image_list)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
switch (field_index)
{
case MMI_PHB_FIELD_NAME:
*entry_list = pbName;
title_list[item_index] = STR_ID_PHB_NAME;
image_list[item_index] = IMG_NAME;
break;
case MMI_PHB_FIELD_NUMBER:
*entry_list = pbNumber;
title_list[item_index] = STR_ID_PHB_MOBILE_NUMBER;
image_list[item_index] = IMG_MOBILE_NUMBER;
break;
#if !defined(__MMI_PHB_NO_OPTIONAL_FIELD__)
case MMI_PHB_FIELD_HOME:
*entry_list = pbHomeNumber;
title_list[item_index] = STR_HOME_NUMBER;
image_list[item_index] = IMG_HOME_NUMBER;
break;
case MMI_PHB_FIELD_COMPANY_NAME:
*entry_list = pbCompanyName;
title_list[item_index] = STR_COMPNAY_NAME;
image_list[item_index] = IMG_COMPANY_NAME;
break;
case MMI_PHB_FIELD_EMAIL:
*entry_list = pbEmailAddress;
title_list[item_index] = STR_EMAIL_ADRESS;
image_list[item_index] = IMG_EMAIL_ADDRESS;
break;
case MMI_PHB_FIELD_OFFICE:
*entry_list = pbOfficeNumber;
title_list[item_index] = STR_OFFICE_NUMBER;
image_list[item_index] = IMG_OFFICE_NUMBER;
break;
case MMI_PHB_FIELD_FAX:
*entry_list = pbFaxNumber;
title_list[item_index] = STR_FAX_NUMBER;
image_list[item_index] = IMG_FAX_NUMBER;
break;
#endif /* !defined(__MMI_PHB_NO_OPTIONAL_FIELD__) */
case MMI_PHB_FIELD_PIC:
if (g_phb_cntx.selected_pic_index == 0)
{
return FALSE;
}
*entry_list = (PS8) g_phb_cntx.image_name_list[g_phb_cntx.selected_pic_index];
title_list[item_index] = STR_ASSOCIATE_PICTURE;
image_list[item_index] = IMG_PICTURE;
gPictureItemIndex = item_index;
return TRUE;
case MMI_PHB_FIELD_RING:
if (g_phb_cntx.selected_ring_index == 0)
{
return FALSE;
}
*entry_list = (PS8) g_phb_cntx.ring_tone_name_list[g_phb_cntx.selected_ring_index];
title_list[item_index] = STR_ASSOCIATE_SOUND;
image_list[item_index] = IMG_RING_TONE;
gRingtoneItemIndex = item_index;
return TRUE;
case MMI_PHB_FIELD_GROUP:
if (g_phb_cntx.selected_grp_index == 0)
{
return FALSE;
}
*entry_list = (PS8) myCallerGrpnames[g_phb_cntx.selected_grp_index];
title_list[item_index] = STR_CALLER_GROUP;
image_list[item_index] = IMG_CALLER_GROUP;
return TRUE;
#if defined(__MMI_PHB_BIRTHDAY_FIELD__)
case MMI_PHB_FIELD_BIRTHDAY:
if (mmi_ucs2cmp((const S8*)pbYear, (const S8*)MMI_PHB_BDAY_YEAR_STR) == 0 &&
mmi_ucs2cmp((const S8*)pbMon, (const S8*)MMI_PHB_BDAY_MON_STR) == 0 &&
mmi_ucs2cmp((const S8*)pbDay, (const S8*)MMI_PHB_BDAY_DAY_STR) == 0)
{
return FALSE;
}
else
{
mmi_ucs2cpy((S8*) pbBday, (S8*) pbYear);
mmi_ucs2cat((S8*) pbBday, (S8*) "/");
mmi_ucs2cat((S8*) pbBday, (S8*) pbMon);
mmi_ucs2cat((S8*) pbBday, (S8*) "/");
mmi_ucs2cat((S8*) pbBday, (S8*) pbDay);
*entry_list = (S8*) pbBday;
title_list[item_index] = STR_ID_PHB_BIRTHDAY;
image_list[item_index] = IMG_ID_PHB_BIRTHDAY;
return TRUE;
}
#endif /* defined(__MMI_PHB_BIRTHDAY_FIELD__) */
default:
return FALSE;
} // end of switch
if( field_index==9)
return FALSE;
if (field_index == MMI_PHB_FIELD_NAME || field_index == MMI_PHB_FIELD_NUMBER ||
(*entry_list && mmi_ucs2strlen(*entry_list) > 0))
{
return TRUE;
}
else
{
return FALSE;
}
}