2019年4月24日 星期三

[IoT]Line Things 初體驗

Line Things是Line推出的IoT平台 ,簡單來說就是透過Line 去控制附近的藍芽裝置,

介面則是透過Line去載入LIFF App中所設定的EndPoint URL,開發商只需依照Line的

規範去實作硬體及韌體,無須自行再開發APP。

1.首先要申請一個Line Bot ,然候掃描Bot QR Code加入好友!!!


























2.Fork 這個Github到您的Github帳戶 (若有自己的網頁空間亦可以將liff-app下的內容複制到您的個人空間中)

https://github.com/line/line-things-starter

















3.到您帳號下Fork出來的專案中Settings頁面

將Source設為master branch,並且點擊Change theme後任選一個 ,就會出現您的網頁URL


















4.接下來回到Line Bot,申請一個LIFF App















把剛才的URL貼在Endpoint URL中,記得補上/liff_app , 記下LIFF URL 最後數字及英文,就是LIFF APP ID ,記得BLE Feature要開

EX: https://flowercatswets.github.io/line-things-starter/liff-app/



























5.回到Channel Setting 記一下Token ,如果沒有出現按一下最右邊的Issue,選個24 HR










6.最重要的過程是註冊取得Service UUID ,在mac 或Linux可以透過指令


curl -X POST https://api.line.me/things/v1/trial/products -H 'Authorization: Bearer 剛才的Token' -H 'Content-Type:application/json' -d '{"name": "LIFF APP 名字(例如我的是LIFF_BOYWHY","liffId": "LIFF URL最後面的數字及英文"}'

在Windows可以透過Restlet Client


如果成功會回應如下內容,重要的只有圈起來的部份,就是我們要的UUID。












7.點擊您Fork出來的專案下的liff-app中的liff.js

















點擊右方的筆圖示編輯它



















把USER_SERVICE_UUID改成剛才得到的UUID

接下來拉到最下方按Commit存檔

7.在此以ESP32示範,官方的範例中亦支援nrf52 / Micro:bit等開發版的範例程式。

開啟Arduino,點擊Preferences,加入額外的開發版網址
https://dl.espressif.com/dl/package_esp32_index.json


接下來到版子管理員,搜尋ESP32並安裝
裝官方的Sample Code 貼到一個Arduino IDE中 ,並修改USER_SERVICE_UUID






























我用的版子是這一塊 ESP32 Bit Kit , 版子上有LED及Button , 腳位和程式碼中相同。























選擇開發版為ESP32 Dev Module ,注意一下您的序列埠設定可能與我不同。



















沒問題的上請上傳程式碼到ESP32,大概要1~2分鐘。































8.用手機掃描這個QR Code 開啟Line Things ,第一次開啟要同意資料存取。















接下來你就可以看到畫面上有你的LIFF APP名字


允許配對藍芽(iphone)


連線裝置成功。
至於為什麼頁面只有半面呢?這是剛才的選項中選擇了Compact,選擇FULL的話會是整頁。

接下來點一下Switch LED  ON , 畫面呈現如下,此時ESP32上的LED也亮起來了




按幾下右邊的按鈕(左邊的是重置,不要按到),你會發現Click Count累進了。


當你按下ESP32上的按鍵不放時,Button State也會變成Pressed









































以上是初次玩Line Things心得,如果我們把LIFF APP Size改成Tall及Full, 則如下




Line Things目前還比較麻煩,取得UUID必須靠注冊,每次註冊取得的UUID會不同。
即使你使用同一組Token,這點要稍微注意一下。


參考資料:





2019年4月19日 星期五

[Android] TextView 中顯示不同字體大小

效果如下


這時就要透過Spannable 來做對應的處理

TextView textView=(TextView)findViewById(R.id.txt);

String str="您今天已經寫了100行書法";
//找到數字1的位置
int startIndex = str.indexOf('1');
//數字只有3個所以是startIndex+2
int endIndex = startIndex+2;
//初始化Spannable
Spannable textSpan = new SpannableStringBuilder(str);
//將數字1之前的字串,字體大小設為28 像素
textSpan.setSpan(new AbsoluteSizeSpan(28), 0, startIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//將數字100字體大小設為45 像素
textSpan.setSpan(new AbsoluteSizeSpan(45), startIndex, endIndex+1 , Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//將100之後的內容字體大小設為28像素
textSpan.setSpan(new AbsoluteSizeSpan(28), endIndex+1 , str.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//將Spannable設定給TextView
textView.setText(textSpan);

若要使用dip做為單位,則可以改成如下


TextView textView=(TextView)findViewById(R.id.txt);

String str="您今天已經寫了100行書法";
//找到數字1的位置
int startIndex = str.indexOf('1');
//數字只有3個所以是startIndex+2
 int endIndex = startIndex+2;
//初始化Spannable
Spannable textSpan = new SpannableStringBuilder(str);
//將數字1之前的字串,字體大小設為28
textSpan.setSpan(new AbsoluteSizeSpan(28,true), 0, startIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//將數字100字體大小設為45
textSpan.setSpan(new AbsoluteSizeSpan(45,true), startIndex, endIndex+1 , Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//將100之後的內容字體大小設為28
textSpan.setSpan(new AbsoluteSizeSpan(28,true), endIndex+1 , str.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
//將Spannable設定給TextView
textView.setText(textSpan);



以下有針對幾個範圍的設定值做出解釋,但試起來還是有點怪怪的,多包函。

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
不包含StartIndex及EndIndex
Spans of type SPAN_EXCLUSIVE_EXCLUSIVE do not expand to include text inserted at either their starting or ending point.

Spanned.SPAN_EXCLUSIVE_INCLUSIVE
不包含startIndex , 但包含endIndex
Non-0-length spans of type SPAN_EXCLUSIVE_INCLUSIVE expand to include text inserted at their ending point but not at their starting point.

Spanned.SPAN_INCLUSIVE_EXCLUSIVE
包含startIndex 但不包含endIndex
Non-0-length spans of type SPAN_INCLUSIVE_EXCLUSIVE expand to include text inserted at their starting point but not at their ending point.

Spanned.SPAN_INCLUSIVE_INCLUSIVE
包含startIndex及endIndex
Spans of type SPAN_INCLUSIVE_INCLUSIVE expand to include text inserted at either their starting or ending point.