290,537 total views, 182 views today

Linux – SD 壽命寫入控制

為了控制 SD 卡寫入次數限制達到最佳使用壽命,所以 Hoyo 先將自己開發的程式另外一個分割區,再把原系統分割區設定為唯讀,只要確定程式分割區所有的寫入動作皆在預想之下,如此就可以達到目的。

得知最近有被寫入的檔案

使用前記得校時

找出最近一個小時內有被寫入的檔案

  • -mtime 檔案有修改,單位:天
  • -mmin 檔案有修改,單位:分鐘

修正後

記憶體檔案

為什麼要排除 /proc /run /sys ? 首先可以看一下 df 資訊

可以知道系統預設掛載了很多 tmpfs 也就是使用記憶體的路徑,除了記憶體之外也有很多虛擬的檔案資訊,例如 /proc /sys ,這些路徑當然也是要排除

資料庫

原先使用 SQLite,使用前先將檔案複製到記憶體再從記憶體存取,當需要異動資料時再從記憶體複製到 SD 卡,這樣從邏輯也是控制了寫入,不過後來遇到頻繁遇到資料庫毀損以及最嚴重的 database disk image is malformed 問題,就改成使用 JSON 當作資料的儲存載體,當然需要犧牲一些系統功能,不過在這種應用穩定以及將問題可控制才是最重要的

(後來找到了 TinyDB 這種好像也是使用 JSON 為載體的資料儲存方式)

277 total views, 1 views today

大量 3306 TIME_WAIT 的邪道解法

不知道會不會衍生其他問題,有後續狀況再更新

出現大量的 TIME_WAIT 大概長這樣

通常 Google 找到的資料是這樣

會噴 cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: No such file or directory 錯誤,而且問題沒有改善,可以得知關鍵就是 tcp_tw_recycle 這個參數,只好繼續找答案

  • sysctl -p 設定啟用

312 total views, 1 views today

需量預測

參考

公式

  • P = 時間 t 時之累計電力量
  • Δt = 標本時間
  • ΔP = 標本時間內增加電力增加量
  • t = 開始測量時間

範例

假設有一個穩定的 100kW 負載,於某需量區間 4 分量測,取前一分鐘為標本時間

100kW = 100 度(kWh) ,需量區間  = 100 / 4 = 25 (每 15 分鐘一個結算)

每分鐘電度約等於 25 /15 = 1.667

P = 1.667 * 4 = 6.668

Δt =1

ΔP = 1.667

6.668 + (1.667/1) * (15-4)

= 6.668 + (1.667) * 11

= 6.668 + 18.337

= 25.005 kWh * 4 = 100.02 kW

由此得知此需量預測公式是準確的

LaTeX

109 total views, no views today

PHP 7 – OpCache

結論

  1. 主要作用在提昇 PHP 執行效能,以及簡易的程式加密
  2. 使用 OpCode 加密可以保護程式邏輯,不能保護「程式內的字串」

php.ini

  • opcache.enable=1 ; 啟用 OpCache
  • opcache.save_comments=0 ; 關閉 comments
  • opcache.file_cache=/opt/Server/OpCache ; 設定 OpCache Cache 路徑
  • opcache.validate_timestamps=0 ; 關閉檔案更新檢查,配合下面的程式保護
  • opcache.revalidate_freq=0 ; 檔案更新檢查時間
  • opcache.max_accelerated_files=4000 ; 最大 cache 檔案數,需要大於總 .php 數量

重新啟動 apache2 服務

保護程式作法

先將所有 .php 檔案編譯成 OpCache 之後就可以將 .php 原始碼檔案清空或是填入不相關內容

使用 PHP 官網範例稍加修改,將 require_once 替換為 opcache_compile_file(),官網有針對兩者之間的差異說明,請根據實際情況選用

在網路根目錄執行以下執行即可將所有 .php 檔案內容清空

更新

因為使用了禁用時間戳檢查,以及將原始碼清空,因此更新時,必須由開發主機提供 .php.bin 檔,OpCache 檔案皆是 www-data 使用者權限,可以使用 tar 打包及還原

.php.bin 檔案更新後,必須使用 opcache_reset() 或 opcache_invalidate() 來啟用新的 .php.bin 檔

計算 php 檔案數量

OpCache 長相

節錄內容

Preload

PHP 7.4 增加了 opcache.preload & opcache.preload_user 參數,因為原始碼後來會清空,因此不適用此參數

265 total views, 1 views today

MQTT – 使用 Let’s Encrypt SSL + EMQ X 建構 SSL WebSocket

原理

  • 網站的證書和 MQTT (WebSocket) 的證書必須一致
  • Let’s Encrypt 證書檔案必須讓 emqx 帳號有讀取權限

編輯emqx.conf

  • 請自行替換 {web url} 為你的網域
  • .ssl. 是 MQTT使用;.wss. 是 WebSocket 使用

Let’s Encrypt 證書檔案權限

要讓 emqx 可以讀取 Let’s Encrypt 產生的證書,最大的問題就是目錄和檔案的讀取權限。

預設的權限大多是只有 root 使用者可以讀,最方便的方式是將 /etc/letsencrypt 的 archive & live 的其他人讀取開放

可以使用一般使用者讀取證書檔案測試,如果沒問題就可以重啟 emqx 服務

HTML

在使用上和沒有 SSL 差別不到,注意 mqtt.connect() 的通訊協定是 wss:// 以及 port 的設定即可。

網路上可能會找到有關 MQTT.js 證書相關的設定,不過那些設定並沒有什麼卵用,因為當網站是 https:// 時瀏覽器就會檢查如果是同網站就需要使用相同證書,不同網站就會發生跨網站的相關錯誤,當然現在也是不能和 http 混用

在 F12 console 下如果沒有看到錯誤恭喜已經成功了。

195 total views, 1 views today

WT32-ETH01 – Web Bluetooth

使用 demo 參照 sample 互相驗證較容易搞懂,UUID 必須使用完整格式

運作條件

  1. 網頁必須 HTTPS
  2. 手機瀏覽器版本必須符合 Browser compatibility

範例:使用 Web Bluetooth 控制 WT32-ETH01 上的 LED

HTML

Arduino

演示

配對時,什麼可以選擇的時機很迷,控制的 LED 是右側的綠色 LED

問題

BLE notify 最長只能 20 bytes

167 total views, no views today

WT32-ETH01 – MicroPython 開發環境

準備開發環境

  1. 安裝 Python3
  2. 安裝 pip
  3. 下載 uPyCraft
  4. 測試你的第一支 LED 閃爍程式

考慮到需要 LAN 因此下載了 esp32-idf3-20210202-v1.14.bin 這個 firmware

通訊測試確認

可以使用 PuTTY 這類可以使用 COM 通訊軟體,使用 115200

Thonny IDE 開發環境

選擇 Thonny 不選 uPyCraft 是因為 uPyCraft 簡單過頭了

工具 → 選項 → 直譯器

安裝或更新韌體

燒錄時請參考「ESP – ESP-12F & ESP8266 & ESP-32 燒錄指南」將 IO0 接地,EN 短接地

LED for WT32 (其他的 ESP 差別只在於預設的LED 腳位不同)

參考資源

216 total views, no views today

ESP – ESP-12F & ESP8266 & ESP-32 燒錄指南

準備工具

根據晶片以及開發板情況不同,可能需要 3.3V 供電的 USB to TTL,另一種 4 pin 就只提供 5V 供電,使用上要注意

3.3V USB to TTL

DataSheet

Hoyo 使用的 ESP32 模組是包含 Ethernet 的 WT32-ETH01 ,沒有內建 USB to TTL,ESP8266 則是產品化因此無法使用 NodeMCU 這類有內建 USB to TTL 的開發板。

有關如何燒錄上傳 DataSheet 其實都有說明,網路上 Google 的資料大多數都是不合用,例如使用了多餘的腳位控制,或是需要額外的控制電路,有可能是使用場景不同導致。

至少看 Hoyo 的資料可以保障可執行以及線路都是最精簡的

ESP-12F (ESP8266MOD) 燒錄硬體準備

  1. 3.3V 供電
  2. 接地
  3. RX -> TX
  4. TX -> RX
  5. IO0 -> 接地
  6. TTL USB 接上 USB
  7. RST 短接地
  8. 開始燒錄上傳

正常使用,IO0 斷開,RST 短接地重啟

ESP8266MOD 燒錄接線

ESP32 燒錄硬體準備

  1. 5V 供電
  2. 接地
  3. RX -> TX
  4. TX -> RX
  5. IO0 -> 接地
  6. EN 短接地
  7. 開始燒錄上傳

正常使用,IO0 斷開,EN 短接地重啟

WT32-ETH01 正面

ESP32 EN 接地使用按鈕

ESP-12F (ESP8266MOD) 燒錄軟體

圖形介面

ESPTool.py 指令介面

  1. 安裝 Python 3 (Download Python | Python.org)
  2. 安裝 pip
  3. 安裝 serial module
  4. 安裝 pyserial module

安裝 pip

下載 get-pip.py (https://bootstrap.pypa.io/get-pip.py)

安裝 serial & pyserial module

ESPTool.py

上傳

下載

Arduino 的上傳

ESP-12F 和 ESP32 在使用 esptool.py 上並沒有很大的差異

讀取 MAC Address

其他參考資源

Data

301 total views, 2 views today

HOYO 的 2020 回顧

公司

  • 富邦銀行的 BEMS 案子褲子都脫了,什麼都沒看到。還好都不會浪費以後還用的到…
  • 使用 ESP8266 進行一些 RS485 Modbus 的通訊測試,在一些特定應用場合異常好用
  • 接手一個外包廠商花了一年半進度還做不到 50% 的需量網頁版系統,自己從頭到尾花了 3 個月就上線使用
  • 因為富邦銀行案子需求開始使用 NanoPi 開發通訊硬體,增加了 Python 以及 Linux 的熟練度
  • 年底的時候因為「班班有冷氣」政策,所有冷氣、電錶相關廠商雞飛狗跳,我們也不例外
  • 開始嘗試使用 MQTT 這個大家都已經用爛的通訊方式,並且花了 3 天將公司提的需量 APP做了一個產品

個人

  • 過年的時候終於嘗試了瓦斯爐韓式烤肉,好吃又好玩
  • 暑假的時候一家人去了日月潭、九族文化村,台灣 369 遊樂園終於湊齊了
  • 又是公司出差才第一次去宜蘭,實在是又窮又宅,主要是窮,有錢就到處玩樂了
  • 因為國慶煙火在台南,而且在安平,終於第一次看了台灣的國慶煙火
  • 因為又窮又宅,所以嘗試了使用壓克力顏料進行創作,好玩是好玩就是收捨麻煩
  • 受到神奇 YouTube 演算法,被安麗了一堆健身影片之後開始進行 168 斷食,以及在家做簡單的鍛鍊,

2020 代表字

健康、健身、我們下次健

960 total views, no views today

ESP8266 – RS485 Modbus 通訊

MAX485

最後的腳位對應為

SoftwareSerial

因為使用了 UART 轉 RS485 小板,因此只要設定好鮑率、傳送的資料及計算 CRC 即可

CRC

以 {0x01, 0x03, 0x00, 0x00, 0x00, 0x02} 為例,算出來應該是 0xC4, 0x0B 才對

硬體接線

正面

背面

程式範例

運行結果

注意事項

  • 如果選擇的 GPIO 會影響燒錄,那重新開機也會影響程式運作,必須先斷開開機完成才會運作,所以還是需要另外選不會影響的腳位。

454 total views, 2 views today