MTK Socket連線API介紹

2021-06-26 19:56:21 字數 2609 閱讀 4983

1. 建立socket連線

kal_int8 soc_create(kal_uint8  domain,

socket_type_enum  type,

kal_uint8  protocol,

module_type mod_id,

kal_uint32 nwk_account_id)

建立socket連線,成功後將返回乙個socket_id供下面的函式使用.上面的api中有個非常重要的引數nwk_account_id,這個引數決定了用哪個接入點,什麼方式進行聯網。一般情況下,gsm和gprs分別各有10個賬號,也即data account。gsm的10個賬號資料對應的id是從0-9,gprs的10個賬號資料對應的id是從10-19。每個賬號資料裡面最關鍵的是接入點,通常情況下,接入點是cmwap或cmnet。代表是使用cmwap還是cmnet聯網方式。這兩種聯網方式的區別在於,使用cmwap需要經過中國移動的**伺服器10.0.0.172,才能連線到最終的伺服器上去。而cmnet則直接連線到最終要訪問的伺服器。所以當前手機使用的data account是第乙個,那麼nwk_account_id的值就是10,後面的data account在此基礎上累加。

若雙卡手機使用sim2上網,那麼這個nwk_account_id還要使用到下面這個api來轉換一下:

引數sim_id表示當前使用哪張卡上網,sim1值為0,sim2值為1。若有sim3那麼值應該就是2,這只是猜測,自己未證實。

2. 設定socket非阻塞模式

kal_int8 soc_setsockopt(kal_int8 s, kal_uint16 option, kal_uint8 *val, kal_uint8 val_size)

阻塞模式下, 程式在呼叫接收函式時(如recv), 如果沒有資料到達, 此函式會一直等待, 即當前執行緒會被阻塞, 直到有資料時才返回! 

換句話說,沒有資料到達時,程式回在這行**上等待,不繼續往下執行。這樣資料未到達時使用者介面就會定屏不動,形成假死現象,一般不推薦使用這種模式。

非阻塞模式下, 程式在呼叫接收函式時, 接收函式會立即返回, 呼叫方還可以進行其它操作。而當有資料到達進, 作業系統會通過某些方法(如事件)來通知你! 也就是說,不論是否有資料到達,程式一直往下執行。而資料到達後,作業系統會通知程式,程式根據作業系統通知的資訊來做相應處理。一般推薦設定非阻塞模式。

實際**裡,設定模式一般要連續設定兩次,第一次設定為非阻塞,第二次設定非同步連線,讀,寫,關閉。示例**如下:

kal_uint8 val = 1;

soc_setsockopt(socket_id,soc_nbio,&val, sizeof(val))

val = soc_read | soc_write | soc_close | soc_connect;

soc_setsockopt(socket_id,soc_async,&val,sizeof(val))

3. 連線到指定ip位址的伺服器

kal_int8 soc_connect(kal_int8 s, sockaddr_struct *addr)

連線操作前要填充伺服器ip位址引數addr。若是採用cmnet直連方式,伺服器位址是通過網域名稱解析過來的,若採用cmwap**連線,那麼addr的值就是中國移動閘道器位址10.0.0.172:801。

4. 傳送http請求

kal_int32 soc_send(kal_int8 s, kal_uint8 *buf, kal_int32 len, kal_uint8 flags)

連上伺服器後就可以傳送http請求了,其中buf字串需要遵守http連線協議。標準的http請求頭如下所示:

host:*** (解析出來的ip位址或者中移動閘道器10.0.0.172)

connection: closed

5. 接收資料

kal_int32 soc_recv(kal_int8 s, kal_uint8 *buf, kal_int32 len, kal_uint8 flags)

buf用來儲存接收到的字串,在我們的應用中我們採用全域性大陣列來儲存資料。soc_recv一次接收的資料最好不要過大,最好不要超過2k,一次接收太多資料容易接收不過來。程式中我們可以使用乙個迴圈來接收資料,soc_recv返回的值是接收到的資料位元組數,若無資料接收時返回0,這樣我們就可以判斷資料接收完了。

在實際開發過程中,我們碰到了乙個怪異的現象,在斷點除錯的時候能很好地接收到資料,但是直接執行的時候,往往接收不到資料。猜測可能是資料的時延引起的,就像串列埠傳輸資料時的時延一樣。所以在這裡往往需要將task休眠一會才能接收到資料。但休眠時間的多少不好控制,少了有丟失資料的危險,多了影響響應速度。最後我們的程式未採用迴圈體接收資料,而是採用遞迴呼叫接收資料。這裡沒想太明白...有想法的朋友可以告知一下。

6. 關閉socket連線

kal_int8 soc_close(kal_int8 socket_id)

接收完資料後可以將此socket連線關閉,socket_id引數是soc_create的返回值。

至此乙個比較完整的socket連線便介紹完了,當然構建完整的應用還要考慮更多的細節,比如網域名稱解析,出錯處理等。想要進一步了解的朋友可以參看mtk工程模式下的乙個例子,我也是從那個例子一步一步構建完成我們的應用的。耐心點的話,你會發現這也不是很難!

百度API連線

1 使用api key和secret key獲取token 2 連線呼叫方法。1 獲取token。public static string getauth 獲取api訪問token 該token有一定的有效期,需要自行管理,當失效時需重新獲取.return assess token 示例 對位元組陣...

企業級微服務API閘道器Fizz 常用外掛程式介紹

社群貢獻的外掛程式在 下,一般以 fizz plugin 或 fizz plugin 命名,下面介紹一些常用的外掛程式。用例 若閘道器 的後端介面響應 json 資料 然後需要對手機號作掩碼處理,則可為介面的路由配置外掛程式 配置後,請求介面時帶 sourcetype 請求頭,其值為 ch1,收到響...

Linux下用C語言API連線MySQL資料庫

像php和perl一樣,mysql也提供的c語言使用的api.c 的api是隨mysql一起發布的.它包含在mysqlclient庫中,可以使c程式來訪問資料庫.mysql原始碼包中的許多客戶端都是用c寫的.如果你正在找使用這些c api的例子,可以看看客戶端的寫法.你可以在mysql原始碼包的cl...