2024年7月25日 星期四

ANDROID STUDIO & BLE

ANDROID STUDIO & KT(連結)
ANDROID STUDIO & BLE(連結)

文章說明( 連結 ) 程式( 連結 ) 進度為:用KT連結PIXART,

log 1 2 3 4 5  這邊已經進行 device.connectGatt 完畢

log 10 BluetoothProfile.STATE_CONNECTED 進入這個狀態

從log看狀況

Timber.i("Connected to GATT server.")

Timber.i("Attempting to start service discovery: %s", bluetoothGatt?.discoverServices())  這會自動進行後面動作

log 50 52 BluetoothGatt.GATT_SUCCESS  應該可以繼續發展,傳送資料 但是因為沒有後續,之後就進入 log 11 BluetoothProfile.STATE_DISCONNECTED

log 10 > 後面重複循環 (應是系統自行connect)

過程中基礎知識薄弱,又參考(連結 github位置)

write的功能已經驗證,write完畢會收到onXXX,但是只是結果正確與否,而不是BLE裝置送出的項目
取得部分方式一read,只是BLE這邊沒有對應程式,先跳過
取得部分方式二notification
A.先設定enableIndicateNotification(APP自行設計 setCharacteristicNotification)
會啟動系統gatt.writeDescriptor
B.這裡應該是會收到訊息的地方
override fun onCharacteristicChanged(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
        val content = ByteUtils.bytesToHexString(characteristic.value)
        uiCallback.state("特性改变: 收到内容:$content")
}




DeviceListFragment

BluetoothAdapter.startDiscovery() -> 掃描經典藍芽和BLE藍芽兩種(  目前範例使用這個 )
BluetoothAdapter.startLeScan() -> 用來掃描低功耗藍芽 —- 已被棄用
BluetoothLeScanner.startScan() -> 新的BLE掃描方法
理論上,可以限定要搜尋的service,帶入代表該service的UUID
有四件事情
1.繼承一個BroadcastReceiver 然後使用receiver type的形式返回結果bleDevice
private val receiver = DeviceListBoardCast { bleDevice ->deviceViewModel.addDevice(bleDevice)}
這個在下一個
2.註冊監聽BluetoothDevice.ACTION_FOUND
val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
    requireContext().registerReceiver(receiver, filter)
掃描的結果會返回DeviceListBoardCast {}內,根據專案調整
3.private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
4.bluetoothAdapter!!.startDiscovery()

DeviceListBroadcast

取得資料的運作
val device: BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)!!
val rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE).toInt()
val uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID)

BlueToothLEService

找到藍芽裝置
建好service,當跟藍芽綁定時,就能互相溝通,並建立Binder,用來onBind時返回實例給fragment去調用。
準備幾個返回的callback
onConnectionStateChange新的連接狀態改變
onServicesDiscovered新的服務被發現
onCharacteristicRead新的東西讀到後
重要功能是啟動connect
進入點是前面DeviceListFragment
執行service中的connect
要跟裝置內的GATT Server連線mBluetoothGatt = device.connectGatt(this, false, mGattCallback);這會連線到藍芽裝置host的GATT Server。
bluetoothGatt = device.connectGatt(this, false, gattCallback)
把要連線的adress丟進去
拿到想要連線的BluetoothDevice
再用device內的方法connectGatt去綁定Gatt裝置
當然同時要丟入前面寫好的gattCallback

讀取資料

displayGattServices
藍芽最重要的就是終端之間的通訊
所以如果想要收送資料
必需要找出service與characteristic
這個範例並沒有提到如何讀取資料,如果真的要進行
gattServices.forEach { gattService ->
    取得各個charxxxx  有sample但實際code沒看到
fun readCharacteristic(characteristic: BluetoothGattCharacteristic) {
        bluetoothGatt?.let { gatt ->
            gatt.readCharacteristic(characteristic)
    這是取得characteristic內容 
private val bluetoothGattCallback = object : BluetoothGattCallback() {
        override fun onCharacteristicRead(
            gatt: BluetoothGatt,
            characteristic: BluetoothGattCharacteristic,
            status: Int
            ) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(BluetoothService.ACTION_DATA_AVAILABLE, characteristic)
            }
        }
    }
其他類似範例(連結)

其他

理論:Android BT API(連結)。

基本character:範例

  1. 對應ADAFRUIT IOS 有幾個不同的  連結 連結
  2. 落落長非常專業說明 連結 連結

進階HID:PIXART的範例聚集在HID(連結  連結)。


2024年7月24日 星期三

郊山健行:樂雪縱走















視障陪跑和陪游泳

路跑活動初期,偶爾會見到有視障朋友在跑馬拉松,當時就想著,怎麼可能看不到還出來跑步呢?但疑惑也僅止於疑惑,直到與敘蓉聊天得知她正參與視障路跑協會台北分會活動,建議我與新竹區負責人聯繫,開啟我視障陪跑經驗。

新竹視障朋友有四位,過往到現在都有參加活動者為交大區的冠冠和ROCK,距離比較遠但也會接觸到的小鵬,以及最新加入交大區的新夥伴,以及偶爾會出現其他跑團的視障朋友。

我們主要活動是陪跑,這部分很單純,就是拉著陪跑繩跑步,每周固定一天陪跑,周末偶爾陪長距離,正式的半馬活動參加過幾次。游泳是後期非常熟悉後才有的活動,與跑步相比,游泳的難度更高,主因是看不到水面位置易嗆水,但也不是完全無法克服,預計參加今年的泳渡日月潭。

一般人對於視障朋友,首先就是不知道如何與他們相處,藉由陪跑和陪游,自然掌握到了要領,依照他們的說法就當成明眼人相處就好,事實也是如此。與他們密切接觸後,會發現,即使遭遇到這麼大的變故,該過的日子還是要過,睡覺吃飯都得繼續,人的彈性是很大的,不需要過分照顧他們。

也正因為是朋友,後期膽子大了,我還會嘗試放開陪跑繩讓冠冠自己跑,或是讓小鵬在游泳池自己繞圈圈游泳,因為我知道他們的安全界線,而且他們也相信我,更是應該利用這種信任,讓他們有自由的感受。

另外一個發現是,雖然同樣是視障和個性願意走出家門,但彼此個性也有不同,分成三類。第一是越戰越勇型,像是小鵬和新夥伴或是年底要陪跑166公里那位,距離從半馬到全馬到超馬,時間逐漸拉長,形式上更嘗試游泳或騎車,他們會不斷地設定目標,踏出舒適圈,投入不同環境,嘗試新事物。第二種狀況是單純就是出來動一動,像是冠冠,怕熱會想多休息,聽說許多地區的視障朋友也是以出來走走路為目標。第三種是自身擁有更廣大活動圈,路跑只是一小部分,不希望被限制在小小的範圍中,如Rock。對於不同類型,自然要有不同應對方式,才能達到最大貢獻。

todostart2 2024/09/2X 找浮球回來 todoend

todostart2 2024/09/2X 低強度跑步十一月陪跑 todoend

todostart2 2024/11/24 視障陪跑冬山河 todoend

2024年7月17日 星期三

澎湖旅遊:觀光篇

這次澎湖行雖然時間短(僅五天),且海泳(連結)佔據主要心思,還是安排了眾多踩點行程。

例如搭觀光船至無人島.

姑婆嶼頂部

搭觀光船在港灣上吃合菜.

海上看花火節

跳島旅行。此次安排的跳島旅行目的地為望安。往來望安的交通船上大多是遊客和望安當地居民,因為一般來說馬公人是不會到各離島的。而望安島嶼居民,選擇遷移時,會跳過馬公直接到台南或是高雄。望安的工作機會少,人口都在流失中,新聞還報導過,只要大學畢業就能當老師(連結)。

追求悠閒感。現在年紀大了都希望行程能夠悠閒,澎湖的特點就是放眼所及都是寬廣的平面。這種開闊感,是培養悠閒心態的重要項目。此行中最有悠閒感受是在望安海邊民宿致仙居,窩在陽台翹著腳看大海,然後傍晚下到沙灘,望著平坦海岸線隨著蔚藍海水與高灘處馬鞍藤無盡向左右延伸。走完右邊走左邊,好不悠閒。


除了在海邊,即使在人口聚集處也是如此,初到澎湖就覺得這裡特別寬廣,仔細研究是與台灣相比,這裡少了電線杆和四處縱橫的電纜線(原因是近海空氣內鹽份高,為避免鏽蝕所以將電線地下化),沒有了分割天空的纜線,天空變得更廣大。


平坦潮間帶

望安西北 廣闊平坦高地


望安鄉間通海小路

景點??不知道怎麼歸類


遍歷這些景點,交通工具的選擇特別重要,此行安排了機車和汽車。機車的特點是靈活,不用費心尋找停車位,缺點是熱烘烘的氣候影響下,老婆在後座幾次快睡著,非常危險。汽車的特點是舒適,只不過在高溫環境下,進進出出的次數多了更會覺得頭昏腦脹。唉,人真是個麻煩的動物,既要機動性又想要舒適,很難兩全。

總結

很多人說,旅行就是從自己活膩的地方到別人活膩的地方,但我們夫妻從不覺得自己生活的地方會膩,更遑論從來沒認真到過的澎湖,即使在一些奇奇怪怪鳥無人煙的地方,也能駐足停留許久。雖然五天的時間不長,但也能稍作總結,列出四個喜歡和覺得困擾的項目。

首先,我非常推崇和喜愛澎湖的地質景觀,整理於此處(連結)。相較於寬闊景觀對於歷史遺跡就覺得失望,直覺上有四百年開發史,應該有更多可看之處,但卻付之闕如(連結)。

觀光部分,能感受到政府和社區民眾認真打造旅遊環境的心意,但從結果來看,整個島上鮮少有外國人蹤跡,這對於追求高品質向上提升的觀光產業來說是不利的。

最後一點,也是此行很深切體悟是,七月的澎湖實在太熱,對旅遊來說是個很大阻礙。面對酷暑,我以薄外套和墨鏡遮陽,老婆則是全副武裝,一層層包的密實不已。原本的高熱加上物理性防曬,我們同時都覺得昏昏沉沉,當然也影響玩興。日後若還要再來澎湖,必定得避開六月底和七月這時節。

全副武裝防曬

當地特有的仙人掌冰,口味類似桑葚

同場老婆遊記(連結

2024年7月8日 星期一

澎湖旅遊:歷史遺跡與當地人生活印記

澎湖旅遊

  • 海泳挑戰,基隆外木山,泳渡澎湖灣(連結)
  • 探訪由玄武岩所構成的地質與生態世界(連結)
  • 歷史遺跡與當地人生活印記(連結)
  • 觀光篇(連結)

相較於台灣本島,澎湖因為與中國距離更近,移民和治理的時間更早,理論上較台灣本島遺留有更多歷史痕跡(連結)。此次重點雖然是海泳,當然還是安排許多踩點行程,我們先前往天后宮附近中央老街,此處可追朔到明朝初期,理應擁有傳統歷史風情的街區。只是實際走來,兩側都是經過整修顏色斑斕的觀光小店,絲毫沒有思古之幽情。

街底是觀光景點四眼井,傳統的中藥鋪不再,只有一群人圍著茶葉蛋和風茹茶小舖。

馬公市區以外,沿海有著或大或小村落(除二崁村落地勢較高),少則十戶,多有三四十戶,村落中心可能有個帶水井的小廣場,然後以兩條或三條巷向外延伸。村落邊一定有間廟宇,近海處的漁港是生計中心,幾艘小漁船和浮球在海面上浮浮沉沉。

通榕古厝區整修後入口

村落中的房舍分為三種,一種是已經完全頹圮,院內藤蔓叢生無法進入更不可能住人,也因為風吹雨打侵蝕,可以方便直視內部。大多狀況是屋頂幾乎全毀,僅剩珊瑚礁石或黑色岩石由土夯堆出的壁面,隔出一個個空間,每個房間約五坪大小。穿行的通道都比現代窄小,常常要低頭才能通過的程度,這也是我每次經過類似舊宅都有的疑惑,過去時代不像現在人口如此稠密,也有許多可以擴展的空間,為什麼住宅並沒有蓋的更大呢。這些曾經住過一代代人的空間,或許曾經人丁旺盛,但隨著人口外移現在也僅留著支架,讓人唏噓。

第二種是勉勉強強仍能維持住人的狀態,隱約從窗口可聽到電風扇或是人在移動的聲音,可能是村裡老人吧。最後一類,也是最新穎的,是政府鼓勵注資修復的"聚落"。住宅呈現閩南形式,以當地玄武岩和咾咕石打造而成。這其中,二崁古厝群的面積很大,吸引了許多遊客。

通榕古厝,帶有漂亮的邊簷
萬物靜觀皆自得

尤其特別是陳家古宅,居然還帶有巴洛克式的門樓,正面屋頂上還放置了許多充滿符號意義的裝飾,此時正好有導覽團在解說,老鷹的意思是要飛天,燈的臺語為丁有添丁意思,時鐘拆字可得金童二字,這些都有保祐家丁興旺的涵義。


除古宅外,還參觀了當時生活相關建物,例如魚灶,昔日沒有冷凍技術,漁船捕撈到漁獲後要立刻進行漁產加工,魚灶就是當時加工廠的統稱(連結)。因為加工時需要以海水烹煮,位置多半建在海邊,此行參觀的紅柴魚灶(由島嶼出走修復)和望安花柴聚落都有完整的魚灶古蹟。

花宅海邊魚灶

望安石滬

望安石滬
曬魚場

種菜都要用牆壁擋風

路邊羊群,在紅羅村遇到數十隻放養羊,主人說傍晚四點出圈,滿山遍野自行照料。

牛群出現的頻率更高,紅羅村外,本島中間靠近機場處有許多,望安港北側更有多達百隻,還有在海邊聚集場景。

海邊類似燈塔的柱子


宗教信仰,天后宮拜拜(後續還願),沒有去看大媽祖有點可惜。

巧遇池東國小在天后宮前快閃表演(連結),我們夫妻出現在一分四十秒

一個村落搭配一個港灣一個廟宇,類似現代的活動中心。


許返古宅的小法展覽

還見到出巡隊伍(事實上是被交通管制了),車陣中還有會噴火的車子。

另外值得一提是參觀砲台,也就是過往戰爭留下的印記,澎湖曾經經歷過四次大型戰爭,礙於時間只參觀了砲台區。

在砲台區四處走動

而我年輕時,動輒有三萬駐軍的澎防部,最新統計只剩下三千人,曾經的哨所都任憑風吹雨打,等待毀壞殆盡了,唯一還有些關聯的僅剩潘安邦和張雨生的眷村紀念館。

總結幾天經驗,覺得歷史遺跡比想像的少很多,就算有也都戴著濃濃的斧鑿味。希望這只是停留時間太短的錯覺,不然真是辜負了牠四百年開發歷史的美名啊。

澎湖旅遊:探訪由玄武岩所構成的地質與生態世界

澎湖旅遊

  • 海泳挑戰,基隆外木山,泳渡澎湖灣(連結)
  • 探訪由玄武岩所構成的地質與生態世界(連結)
  • 歷史遺跡與當地人生活印記(連結)
  • 觀光篇(連結)

澎湖的地形非常奇特,資料表示(連結)數百萬年前,澎湖仍在海底時,海洋下的地殼因為張力改變開始產生裂縫,地底岩漿循著裂縫向上流出,此種岩漿因為屬於流動性高的玄武岩,噴發後並不是以印象中錐狀的方式向上堆疊,而是以水平方式緩緩平舖於大地之上形成大片平坦的地貌,直到邊緣處才以壁立的方式向下流,有如躺著的盾牌一般,因此稱為盾狀火山。若是要想像,就像是巧克力鍋中濃厚的巧克力流動過程吧。

後續隨著地形上升,海邊的珊瑚礁沉積和砂土堆積更促進這過程,因此,澎湖群島大部分都呈現上部平坦四周陡峭崖壁圍繞的方山地形,也就是如今開闊景緻的成因。

從地質凝固特性來看,此種玄武岩凝結時因為是以垂直方向為軸心,向內聚集,最終形成一根根垂直的五角或是六角柱。下面照片是在本島風櫃洞海邊拍攝,從這些巨大類似樓梯的斷面,不難想像牠的巨大,更讓人驚訝是其整齊劃一的程度,很像是經過精心排列後的結果。

從上向下看很像扎成一團的鉛筆

除了從近距離上方凝視,若從側邊且遠方看向這些柱子,更會覺得驚奇,這些長柱間的裂痕高度可達數十公尺,且整齊劃一,遠看就像扇子摺頁,成為澎湖特有標誌。

此行首次是在大菓葉探勘海泳路線時,見到左右距離達百公尺玄武岩,只可惜當時被海泳焦慮沖昏頭,且是傍晚逆光少了姿色。

繼續到大池火山頸玄武岩(西嶼西側)才真正欣賞到玄武岩海岸的壯麗景致。此處有三個入口,由南向北分別是海港北側、高地公墓階梯,及更北方的公墓臨海區。幾百公尺區域內有三處玄武岩壁,其中又以最北的最直得一看。因為鄰近海岸,建議要選擇退潮時候,且陽光從西側(傍晚時分前來)時,最能拍攝到壯麗景緻。

遠望這批從太古以來就被大地擠壓噴發凝塑的斷崖、層層疊疊形狀奇特而沉默無言的在寬廣的海邊佇立著,回望我這如同蜉蝣般的生命,只剩下沉靜了。

岩柱下方不是沙土地面,而是一塊塊如骰子造型的巨大石塊,推測是下方石柱容易受到重力影響或是海浪拍打侵蝕,較上半部更容易斷裂脫離,才形成這巨大石塊。

若是再近看,岩柱間並不是完全連結著,有許多縫隙,似乎隨時都有可能會自行斷裂。

此種方山地形,因為地勢低平無屏障,明顯結果就是夏天易受雨雲襲擊,冬天則被狂風吹拂。此行是盛夏,猛烈的陽光似乎可以把一切都融化,前十分鐘還只是遠方天邊的小小雲朵,轉瞬間就能來到頭頂,並以壓倒性方式覆蓋住四周,或許灑下暴雨,或許就是直接讓眼前世界轉為灰矇一片,但也就是十幾分鐘,又移往了其他島嶼,一切就像什麼都沒發生過似的,大地又恢復成先前的酷暑模式。起初對這感到非常驚奇,但經歷過兩次後,也就見怪不怪了。


欣賞巨大壯碩的雲也是種樂趣

聽說到了冬季,東北季風風勢驚人,雖無法親眼見證,但看許多公路東北方都會搭起水泥牆擋風,菜園四周也多圍有牆壁防風,就能想像一二。也因為風大,迎風面或台地上無法栽植樹木,形成廣大草坡地。幾次站在海邊眺望著遠方令人嘆為觀止,一望無際的寬闊綠色草原,快速低低流過的清晰的雲,隨風搖擺柔軟的草,海邊常見的小廟,像極了希臘導演安哲羅普洛斯的悲傷草原。我們在此眺望許久,心情之類的東西不知道跑去了哪裡,只剩下凝結的時空,我們只能盡可能花更長時間,以自己的眼睛去眺望,並將那些刻進腦海裡,只能收進記憶的不可靠的抽屜裡,等待有朝一日,靠自己的力量,搬運到某個地方去。

澎湖的海岸根據我的觀察大多數是礁岸,潮間帶有海星海膽和海水魚悠游其間。

海邊礁岩

除礁岩外也有些沙灘。例如我們在望安的民宿致仙居外就是片廣大沙灘,若在台灣肯定是熱門戲水景點,在這邊卻沒特別開發,現在被劃定為綠蠵龜產卵保護區。

從來沒見過這麼認真的玩沙人

礁岩外,少數沙灘點綴其間,例如我們在望安民宿致仙居外就是廣大沙灘,若在台灣肯定是熱門戲水景點,在這邊卻沒特別開發,就只是被劃定為綠蠵龜產卵保護區。

動植物

燕鷗,我們是搭乘旅遊船到鐵鉆嶼,接近時就引來大批燕鷗在空中盤旋。


綠蠵龜:為了找綠蠵龜(連結),晚上夜黑風高,在海灘上走了非常非常遠,難得景光願意花這麼長的時間漫步。下面照片是望安生態館中準備放生的二年龜,今年秋天野放後估計再回來就是二十年後,那時候我應該去世了,想到此腦中不免閃過一絲怪異感覺。

天人菊

仙人掌