Symbian中的存取點

來源:互聯網
上載者:User

1.在Symbain OS中,網路連接相關的配置屬性是通過CommDb模組儲存的。CommDb模組是基於Symbian OS
的DBMS資料庫系統,其中存放了不同類型的資料表,典型的如IAP、OUTGOING_GPRS、Modems、Locations和WAP Setting等。

其中關於存取點資訊的儲存也存在多個表中,如:針對不同名稱、不同接入方式的網路存取點,其iapId是不一樣,該值體現在CommDb資料庫中的IAP表中,IAP表中儲存網路存取點(IAP),其真正的接入方式(APN)為CMNET還是CMWAP,這些屬性又是儲存在另一張表中OUTGOING_WCDMA或者OUTGOING_GPRS。

CommDb是資料庫系統,在Symbian OS中,有對資料庫的訪問串連類CCommsDatabase,及表操作類CCommsDbTableView。COMMDB_ID不是存取點的Id,而是每個表裡的一個欄位。COMMDB_ID和COMMDB_NAME是資料庫每個表裡都有的兩個欄位。可以查看相關的標頭檔,裡面有各個表的說明。

2.開啟資料庫並擷取某張表的一般操作如下:
(1)訪問IAP表
TUint32 iapId;
CCommsDatabase* commDb = CCommsDatabase::NewL(EDatabaseTypeIAP);
CleanupStack::PushL(commDb);
CCommsDbTableView* commView = commDb->OpenTableLC(TPtrC(IAP));
if(commView-> GotoFirstRecord() == KErrNone)
commView ->ReadUintL(TPtrC(COMMDB_ID), iapId);
//可以繼續遍曆commView表中的其他記錄
CleanupStack::PopAndDestroy(2);
(2)訪問OUTGOING_GPRS表
TUint32 fakeIapId;
TBuf<KCommsDbSvrMaxColumnNameLength> apnName;
CCommsDatabase* commDb = CCommsDatabase::NewL(EDatabaseTypeIAP);
CleanupStack::PushL(commDb);
CCommsDbTableView* commView =commDb->OpenTableLC(TPtrC(OUTGOING_GPRS));
if(commView-> GotoFirstRecord() == KErrNone)
{
commView->ReadTextL((TPtrC)GPRS_APN, testname);
commView->ReadUintL(TPtrC(COMMDB_ID), fakeIapId);     
//可以繼續遍曆commView表中的其他記錄
}
CleanupStack::PopAndDestroy(2);
(3)通過上述操作,可獲得行動電話通訊配置的APN名稱及對應的fakeIapId(這裡稱之為fake,是因為該IapId與IAP表中的IapId有差異,而真正起

作用的是IAP表中的IapId值)。APN值就包含了GPRS網路的兩種不同接入方式CMNET和CMWAP。
通過表OUTGOING_GPRS得到了手機中真正使用CMNET或者CMWAP的記錄,但其IapId不是真正需要的IapId;通過表IAP能得到行動電話通訊串連是真正

的IapId值,但不能確定其底層具體的接入方式是CMNET還是CMWAP。現在的問題就說,如何把兩張表聯合起來?
這其中就用到了OUTGOING_GPRS表中的COMMDB_ID欄位和IAP表中的IAP_SERVICE欄位,通過這兩個欄位,可將兩張表聯合。
以下代碼提供apn存取點名稱,得到存取點id
void SetDefaultIap(TInt aIapType, TUint32 &aIapId)
{
       TInt ret = KErrNone;
       TBuf<KCommsDbSvrMaxColumnNameLength> apnName;
       TBuf<10> defApn;
       TUint32 fakeIapId;
       aIapId = 0;
       if(aIapType == 0)
              defApn = _L("cmnet");
       else if(aIapType == 1)
              defApn = _L("cmwap");
       else if(aIapType == 2)  //模擬器
              defApn = _L("Winsock");
       TRAP(ret,
       {
              CCommsDatabase* commDb = CCommsDatabase::NewL(EDatabaseTypeIAP);
              CleanupStack::PushL(commDb);               
CCommsDbTableView* commView =commDb->OpenTableLC(TPtrC(OUTGOING_WCDMA));
              if (commView->GotoFirstRecord() == KErrNone)
              {
                     do
                     {
                            commView->ReadTextL((TPtrC)GPRS_APN, apnName);
                            commView->ReadUintL(TPtrC(COMMDB_ID), fakeIapId);
                            if (apnName.Find(defApn) >= 0)  //不區分大小寫
                            {
CCommsDbTableView* pIAPView = commDb->OpenViewMatchingUintLC(TPtrC(IAP), TPtrC(IAP_SERVICE), fakeIapId);
                                   TInt nErr = pIAPView->GotoFirstRecord();
                                   if(nErr == KErrNone)
                                   {
                                          pIAPView->ReadUintL(TPtrC(COMMDB_ID), fakeIapId);
                                          aIapId = fakeIapId;
                                          CleanupStack::PopAndDestroy();  //pIAPView
                                          break;
                                   }
                                   CleanupStack::PopAndDestroy();  //pIAPView
                            }
                     }while(commView->GotoNextRecord() == KErrNone);
              }
              CleanupStack::PopAndDestroy(2);
       });
}

 

3.控制應用軟體網路連接時不彈出IAP選擇框,那就需要在建立Symbian RSocket
對象時就指定已存在的連線物件,調用RSocket的Open方法:
TInt Open(RSocketServ &aServer, TUint addrFamily, TUint sockType, TUint protocol,
RConnection &aConnection)
而其中的RConnection對象參數是已經存在的連線物件。進而,要控制應用軟體網路連接時不彈出IAP選
擇框,前提是建立初始RConnection對象串連時,不彈出IAP選擇框,該機制可方便地如下方法實現:
RConnection gConnection;
TCommDbConnPref pref;
TUint32 iapId = 2; //該值應該是確實對應的查詢結果
pref.SetIapId(iapId);
pref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); //連網時不出現對話方塊
pref.SetBearerSet(ECommDbBearerPSD);
pref.SetDirection(ECommDbConnectionDirectionOutgoing );
gConnection.Start(pref); //同步建立隱藏IAP選擇框的網路連接
在上述TCommDbConnPref對象屬性中,最重要的就是iapId值的確定,因為其他屬性值都是固定的,只有該值是變化的.

4.彈出Iap選擇框,並獲得選擇的iapId.

可以iRConnection.Start(iStatus);//會彈出選擇框

在非同步響應後,可以TUint32 iapId=0;
 iRConnection.GetIntSetting(_L("IAP//Id"), iapId);

來取得選擇的IAP的id.

請查看協助文檔中GetIntSetting()的描述。

 

5.測試

使用處在串連狀態下的存取點,請求網路不會使等待進度停頓。 

發現好多軟體串連網路時,等待進度也很順暢,並且發現網路連接表徵圖在程式退出前,一直存在。

案頭上的連網表徵圖可能是和RSockeSrv串連著相關,RSocket每次收髮結束後都會關閉。

考慮將顯示請求進度放到請求網路的某個操作分步後....

 

6.iSocket.Connect( iAddress, iStatus )時,此函數不立即返回.有文章說這個是模擬器上才存在的bug, 手機上不存在.

7.統計系統流量

   http://bbs.51cto.com/archiver/tid-857253.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.