從這篇開始,我會逐步介紹moblin2 sdk中引入的api與中介軟體,希望能對大家有所幫助。
在詳細介紹之前,先講講geoclue的來龍去脈。大家知道,原先在應用程式中要獲取裝置的當前位置,最常見的做法是通過gps定位,程式設計師往往需要直接訪問串列埠讀取gps裝置發來的nmea幀,然後通過分析獲得需要的位置資料。這種做法有2個缺點:第一,工作量大;第二,gps為某個程序獨佔,其他應用如果也有類似需求就只能說抱歉了。在這種情況下,引入了gps daemon,就是daemon獨佔了gps裝置,分析nmea幀獲取位置資訊,並把位置資訊提供給應用程式。這樣gps daemon就可以同時為多個程序服務,並且大大減輕了程式設計師的工作量,不用再為編寫分析nmea資料的**而頭大了。目前linux上比較流行的gps daemon有gpsd和gypsy。不過使用gps定位有一定的侷限性,首先帶有gps的裝置並不普及,其次,室內無法收到gps訊號。隨著技術的發展,越來越多的定位方式出現在世人面前,如ip位址定位,wifi定位,基站定位等,這些新出現的定位技術對傳統的定位方式起到了補充的作用。於是程式設計師想在程式中採用多種定位技術結合,自動選取最優定位技術來獲取位置資訊。問題又來了:又要自己寫**分析位置了,程式裡要加不少**來判斷最優,如果需要支援新的定位技術怎麼辦?在這種情況下,geoclue出現了。
geoclue是架構在d-bus上的一套提供位置相關資訊的中介軟體,遵循lgpl。這裡的位置相關資訊包括了位置、位址和運動速度等等。geoclue下有若干provider提供位置相關資訊。同乙個provider可能提供若干種不同型別的資訊,比如gypsy可以提供位置資訊與速度;不同的provider也可能提供相同型別的資訊,比如gypsy與hostip都可以提供位置資訊,所不同的是前者的資訊是通過gps獲得,而後者則是通過網際網路上ip轉經緯度的服務而獲得。geoclue提供了2套api**用程式使用,一套是c語言api,另一套是d-bus api,使用者可以根據實際情況選擇。
geoclue api通過provider inte***ce讓使用者訪問provider,目前支援的inte***ce有:
•
geoclueposition
•
geocluevelocity
•
geoclueaddress
•
geocluegeocode
•
geocluereversegeocode
下面貼一段示例**:
#include
/ * device name or bluetooth address * /
#define
gps_device_name "00:02:76:c5:81:bf"
static
void
position_changed (geoclueposition *position,
geocluepositionfields fields,
inttimestamp,
double latitude,
double longitude,
double
altitude,
geoclueaccuracy *accuracy,
gpointer userdata)
else }
intmain()
g_hash_table_destroy (options);
/ * connect to signal * /
g_signal_connect (g_object (pos), "position-changed",
g_callback (position_changed), null);
g_print ("waiting for position change signals.../n");
loop = g_main_loop_new (null, false);
g_main_loop_run (loop);
g_main_loop_unref (loop);
g_object_unref (pos);
return 0; }
通過這段**我們發現,還是需要顯式制定要訪問的provider。可對於應用程式的程式設計師來說,他們更關心的是與自身應用、業務相關的內容,他們所要的是乙個位置資訊,而並不需要太關心資料的具體**。有沒有更好的方法?geoclue的開發團隊也想到了這一點,他們在api中提供了稱為master provider的功能,我的理解是provider總管j。程式設計師只需在**中告訴總管所需要的資料精度和資料大致**,總管就能自動的返回乙個最優的provider來。我們再來看一段示例**:
#include
static
void
position_changed (geoclueposition *position,
geocluepositionfields fields,
inttimestamp,
double latitude,
double longitude,
double
altitude,
geoclueaccuracy *accuracy,
gpointer userdata)
else }
intmain()
/ * set our requirements: we want at least city level accuracy, require signals,
and allow the use of network (but not e.g. gps) * /
if (!geoclue_master_client_set_requirements (client,
geoclue_accuracy_level_locality,
0, true,
geoclue_resource_network,
&error))
/ * get a position object * /
pos = geoclue_master_client_create_position (client, null);
if (!pos)
/ * call get_position. we do not know which provider actually provides
the answer (although we could find out using masterclient api) * /
fields = geoclue_position_get_position (pos, null,
&lat, &lon, null,
null, &error);
if (error) else }
g_signal_connect (g_object (pos), "position-changed",
g_callback (position_changed), null);
g_print ("waiting for position change signals.../n");
loop = g_main_loop_new (null, false);
g_main_loop_run (loop);
g_main_loop_unref (loop);
g_object_unref (pos);
g_object_unref (client);
return0;
} 無論是直接使用provider inte***ce還是master provider,使用geoclue開發時需要注意以下兩點:
1.
不能在程式中假設函式呼叫能夠立即返回或者返回的資料均是有效資料。比如gps
初次定位需要一定時間;網路上的資料請求可能有延遲等等。
2.
盡量使用signal
或者非同步呼叫。同步呼叫會阻塞執行緒。
。
使用skaffold持續開發應用
skaffold是乙個命令列工具,它為kubernetes native應用程式的持續開發提供了便利。skaffold處理build push和deploy應用程式的工作流,並提供用於建立ci cd管道的構建塊。這使您能夠在skaffold不斷部署到本地或遠端kubernetes集群時,專注於應用開...
使用qt開發ros應用
利用qtcreator編寫ros程式,你必須先確保在啟動qtcreator環境時把ros環境也新增進了。類似於你啟動終端 會先載入 bashrc配置相應環境變數資訊 修改 exec 變數一行,在中間新增 bash i c 即改為 exec bash i c home 儲存並退出。新增 bash i ...
使用qt開發ros應用
利用qtcreator編寫ros程式,你必須先確保在啟動qtcreator環境時把ros環境也新增進了。類似於你啟動終端 會先載入 bashrc配置相應環境變數資訊 修改 exec 變數一行,在中間新增 bash i c 即改為 exec bash i c home 儲存並退出。新增 bash i ...