今天下班回到家水某說要帶菁菁去漢神看手環, 因為她從 15 歲起每年都用自己存的零用錢生日時去買一條手鍊 (聽來好像有點心酸), 現在 18 歲算成年了, 想買個手環給她當生日禮物, 姊姊也是一月壽星, 她滿 20 歲時在台北也沒買個禮物 (姊姊通常都說不用啦), 所以也買了一個給她, 當然還有水某她自己. 想想我好像只有姊姊她們小時候買過生日禮物耶 (慚愧), 上國中之後就都是去聚餐了 (因為買禮物很傷腦筋), 嗯, 為了寵一下家裡的三個女人, 那就老爸我買單吧 (突然覺得自己很霸氣, 呵呵)!
小狐狸事務所
2021年1月27日 星期三
樹莓派學習筆記 : GPIO 輸出入介面
樹莓派的 GPIO (General Purpose Input Output, 通用輸出入介面) 是樹莓派與外界感測器 (sensor, 例如溫溼度, 亮度, 聲音, 氣壓等) 與致動器 (actuator, 例如馬達, LED, 繼電器等) 溝通的介面, 早期第一代樹莓派 Pi B+ 的 GPIO 為 26 支接腳, 但 Pi 2 之後的樹莓派板子則都是 40 支腳, 前 26 支接腳與 Pi B+ 的完全一樣 (即腳位相容), 因此以前為 Pi 1 B+ 所寫的 GPIO 程式仍可在 Pi 2 以後的樹莓派上順利執行, 參考 :
1. GPIO 硬體接腳配置 :
GPIO 腳的編號方式有兩種 :
- BCM : 與 CPU 的 IO 腳編號相同.
- BOARD : 腳座在上, 下排最左為腳 1, 上排最左為 2, 上下交替排列至上排最右為腳 40.
通常使用 BCM 編號較方便.
配合 RPi.GPIO 模組, 部分 GPIO 接腳有特定用途, 如下表所示 :
特定功能 | 說明 |
UART | 14 (TX), 15 (RX) |
I2C | 0 (EEPROM Data), 1 (EEPROM clock), 2 (SDA), 3 (SCL) |
SPI0 | 7 (CE1), 8 (CE0), 9 (MISO), 10 (MOSI), 11 (SCLK) |
SPI1 | 16 (CE2), 17 (CE1), 18 (CE2), 19 (MISO), 20 (MOSI), 21 (SCLK) |
PWM | 12, 13, 18, 19 (硬體 PWM), 全部 GPIO 均可軟體設定為 PWM 功能 |
注意, 基本上 SPI 有 MOSI,MISO, SCLK 與 SS (Slave Select) 這四支腳, SS 腳用來致能 (enable) 特定裝置 (即 Slave 設備) 用的, 但樹莓派不用 SS 這名稱,而是用 CE (chip select).
參考 :
這些 GPIO 腳可用母-公杜邦線接到麵包板, 若杜邦線不夠長, 也可以先用 40P 母-母排線全部接出來, 再用公-公杜邦線接到麵包板上, 或搭配 T 型轉板 (擴展板). 參考 :
# T型GPIO擴展板+樹莓派40P排線 $175
2. RPi.GPIO 模組 :
樹莓派使用 RPi.GPIO 套件控制 GPIO 接腳, 此套件已內建於樹莓派 Raspbian 作業系統的 Python 中毋須安裝, 直接 import 即可使用 :
>>> import RPi.GPIO as GPIO
>>> GPIO.VERSION #檢視 RPi.GPIO 版本 (也可以在終端機下 pip3 list)
'0.6.3'
>>> dir(GPIO) #檢視物件內容
['BCM', 'BOARD', 'BOTH', 'FALLING', 'HARD_PWM', 'HIGH', 'I2C', 'IN', 'LOW', 'OUT', 'PUD_DOWN', 'PUD_OFF', 'PUD_UP', 'PWM', 'RISING', 'RPI_INFO', 'RPI_REVISION', 'SERIAL', 'SPI', 'UNKNOWN', 'VERSION', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'add_event_callback', 'add_event_detect', 'cleanup', 'event_detected', 'getmode', 'gpio_function', 'input', 'output', 'remove_event_detect', 'setmode', 'setup', 'setwarnings', 'wait_for_edge']
目前最新版本為 0.7.0, 可以直接用 pip 附 upgrade 參數升級 RPi.GPIO 版本 :
$ sudo pip install --upgrade RPi.GPIO
pi@raspberrypi:~ $ sudo pip install --upgrade RPi.GPIO
Collecting RPi.GPIO
Downloading https://www.piwheels.org/simple/rpi-gpio/RPi.GPIO-0.7.0-cp35-cp35m-linux_armv7l.whl (67kB)
Installing collected packages: RPi.GPIO
Found existing installation: RPi.GPIO 0.6.3
Not uninstalling rpi.gpio at /usr/lib/python3/dist-packages, outside environment /usr
Successfully installed RPi.GPIO-0.7.0
安裝好後再次進入 Python 環境檢查 :
pi@raspberrypi:~ $ python
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import RPi.GPIO as GPIO
>>> GPIO.VERSION
'0.7.0'
可見確實已升級到最新版本.
參考 :
但要注意的是, 由於 Linux 是多人多工作業系統, 所以 RPi.GPIO 模組不適合用在實時控制 (real time) 的場合, 對 timing 要求很高的話應該改用 RTOS 作業系統.
3. 上拉電阻與下拉電阻 :
GPIO數位輸入腳時應該視功能需要添加一個上拉電阻 (pull-up, 低態動作時) 或下拉電阻 (pull-down, 高態動作時), 如果懸空的話其位準為不確定, 可能造成程式執行結果異常. 此上拉或下拉電阻建議不要
樹莓派的 CPU 本身有內建上拉電阻或下拉電阻, 利用此功能可以不需用外加電阻即可達到避免接腳浮接 (floating) 造成的位準不確定問題. 不過哪支 GPIO 腳具有上拉或下拉電阻是特定的, GPIO 0~8 內建上拉電阻, 而 GPIO 9~27 內建下拉電阻 :
內建電阻 | GPIO 腳 (BCM 編號) |
上拉電阻 | 0 ~ 8 |
下拉電阻 | 9 ~ 27 |
內建上拉與下拉電阻值大約是 50K 歐姆 (接內部的 3.3V 或 GND). 參考 :
4. 類比輸出入 :
樹莓派 GPIO 全部都是數位輸出入腳, 沒有提供類比輸出入腳, 必須透過外接晶片支援類比輸出與讀取, 例如讀取類比輸入可用 MCP 3004/3008 (ADC), 輸出類比信號可用 MCP 4901/4911/4912 (DAC) 等晶片.
參考 :
標籤:
物聯網
,
樹莓派
,
Raspberry Pi
反應: |
2021年1月25日 星期一
ETF 0050 & 0056 報酬率試算
今天在整理 Chrome 書籤時發現之前瀏覽過 MoneyDJ 理財網的 ETF 報酬率試算網站, 只要填入標的代號, 投資起訖日期 (至今), 每月扣款金額, 就會算出投資期間的報酬率與資產總額, 可藉此預估未來投資效益與選擇適合之標的, 網址如下 :
以每月扣款 1 萬元為例, 元大 0056 從 2007 年底成立至今 13 年報酬率如下 :
而元大 0050.tw 自 2003 年中成立至今 17 年, 每月扣款 10000 元報酬率如下 :
如果從 25 歲出社會開始買進持有 0050 到 65 歲退休, 假定年化報酬率固定為 6.97%, 每個月固定扣繳 10000 元, 可用鉅亨網的基金試算網站估算退休時的資產總值大約為 2618 萬元 :
這 2618 萬元的 0050 股票退休後也不用賣掉, 光靠股息就可以過上舒服的退休生活了. 以歷年至今平均值利率 3.4% 計算, 每年領回股息為 2618 萬*3.4%=89 萬, 相當於月薪 7.4 萬元領到天年, 如果不想留太多遺產, 那就每個月賣一張股票, 以現在股價 130 元計, 2618 萬相當於 200 張股票, 一個月賣一張要近 17 年才賣得完, 那時已經 81 歲了. 每個月賣一張變現 13 萬元, 加上配息月入 7.4 萬, 合計 20.4 萬元似乎有點多 (更別說 40 年後股價不只 130 元), 那就兩個月賣一張, 那要 34 年才賣得完, 屆時已經 65+34=99 歲了, 所以不需要那麼累去研究股票, 只要 "趁早" 定期定額投資 0050 就可以輕鬆退休了, 難怪巴菲特要勸人買 ETF 就好.
巴菲特說 : "投資如同滾雪球, 重點是要找到夠濕的雪以及夠長的坡", 這夠濕的雪即年化報酬率要夠好夠穩定 (6% 以上), 而夠長的坡就是要及早投資, 如果到了 45 歲才開始準備自己的退休金, 離 65 歲還有 20 年, 則同樣每月扣款投資 0050 退休時總資產只有 522 萬元, 是 25 歲開始投資的人的 1/5 而已 :
如果要達到 2610 萬資產規模, 則 45 歲開始每個月要扣款的金額是 50000 元 :
所以投資要趁早, 複利的威力主要來自於時間的次方 (指數), 只要週期性地投資指數型資產, 時間的指數魔力就會漸漸發酵. 前陣子看到一篇文章說, 大意是說亞馬遜老闆貝佐夫曾經問巴菲特, 你的投資方法如此簡單有效, 讓你成為世界第二富有的人, 但是為什麼大家不跟你一樣做呢? 巴菲特答說, 因為沒人想要慢慢致富. 現在很多年輕人衝進市場玩起當沖, 為的就是要賺快錢, 但高頻交易就算有收穫, 也被稅費吃掉一大半, 汲汲營營最後肥的是莊家.
0050 平均股息殖利率參考 GoodInfo :
反應: |
2021年1月24日 星期日
2021 年第 4 周記事
今天是 1/24, 忽然又來到月底了, 二哥與菁菁本周開始放寒假, 所以鬧鐘可以調晚一個小時起床了, 相對於學期中趕上學, 生活步調突然放慢覺得好舒坦.
這周因為要還一本母校的樹莓派借書 ("AIOT與OpenCV實戰應用:Python、樹莓派、物聯網與機器視覺"), 所以就認真看了以前從未涉獵的 GPIO 部份, 同時也拿出久已未摸的板子準備進行實作. 其實以前在 Arduino 上面做的實驗在樹莓派做更簡單, 因為它有 Linux 與 Python 的強大支援 (只是類比部分需外加晶片). 樹莓派應用廣泛, 值得深入研究, 開發農業物聯網應用.
今天早上去鎮里買菜, 回途看到路邊有一台貨車改裝的野台布袋戲, 哇, 好久沒看到了 (做這行的可能都轉行了), 我停下來看了一下, 發現人偶都沒在動啊, 看來只是固定在上面放錄音帶而已. 我探頭看貨車裡面, 哈, 老闆在那邊滑手機! 下午要準備晚餐時發現沒買到雞胸肉, 所以又跑一趟鎮上的全聯, 經過那邊時發現這回人偶有在動了, 我又探頭看車裡面, 哈, 老闆上工了!
今天下午婷婷帶孩子來玩, 所以就沒去爬山了, 一邊跟孩子玩, 抽空又到菜園去將上週買的六株茄子與早上買的 20 株玉米以及 20 株大陸妹種下去, 離過年不到一個月, 這些都要元宵後才會收成了.
標籤:
生活
反應: |
高科大還書 2 本 (樹莓派 & 生成深度學習)
因有人預約, 下面兩本書昨天先還了 :
第一本我覺得寫得很不錯, 是實戰書籍, 我已看完前兩篇, 下次回借專看第三篇 OpenCV. 第二本我只是借來翻翻而已, 程度還不到, 等基本的深度學習學完再來看.
反應: |
2021年1月23日 星期六
樹莓派學習筆記 : 首次開機自動連線 WiFi 基地台的方法 (無頭存取)
今天在讀 "AIOT與OpenCV實戰應用:Python、樹莓派、物聯網與機器視覺" 的樹莓派 Raspbian 作業系統安裝部分時有意外發現, 只要在燒錄完映像檔之後在 SD 卡內加上一個 WiFi 連線設定檔指定基地台的連線帳密, 則樹莓派一開機就可以自動連線到 WiFi, 馬上就可以用筆電進行遠端操控 (即無頭存取, headless access).
我之前以無頭存取 (headless access) 方式操作樹莓派都還需要將機器接上螢幕與鍵鼠組, 設定好 WiFi 帳密, 開啟 SSH 與 VNC 後才能透過筆電遠端操作樹莓派, 螢幕與鍵鼠組還好準備, 比較麻煩的是轉接頭, 特別是 Zero 需要 Mini HDMI 接頭與一個 USB 分享器 (鍵鼠組與 WiFi dongle 用), 真的有點傷腦筋, 參考 :
而這本書中介紹的方法是, 將映像檔燒錄到 Micro SD 卡後, 取出卡再重新插入電腦讀卡機, 這時在檔案總管中會看到兩個分割, 其中一個為 boot, 用記事本編輯一個名稱為 wpa_applicant.conf 的純文字檔儲存到 boot 分割區的根目錄下, 內容為 :
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TW
network={
ssid="SSID"
psk="密碼"
}
除了這個之外, 還要在 root 之下建立一個名稱為 ssh 的空白檔案, 然後就可以取出 Micro SD 卡放入樹莓派, 這樣開機後就會自動連線指定的 WiFi 基地台了. 如果用手機上網, 可以在手機的 "設定/連接/行動無線基地台與網路共享/行動無線基地台" 中找到樹莓派連線成功後的 IP, 然後用 PuTTY 就可以進行無頭存取.
此做法也可參考 :
標籤:
物聯網
,
樹莓派
,
Raspberry Pi
反應: |
2021年1月21日 星期四
樹莓派學習筆記 : 用 wget install 安裝 MQTT 套件 mosquitto
因為用編譯原始碼方式安裝 mosquitto 套件在編譯階段出現錯誤而失敗, 所以只好用 wget install 安裝已編譯好的套件檔 mosquitto 與 mosquitto-clients, 參考 :
安裝指令如下 :
wget install mosquitto mosquitto-clients
下面是將安裝過程丟到一個檔案中 :
pi@raspberrypi:~ $ sudo apt-get install mosquitto mosquitto-clients > mosquitto.txt
pi@raspberrypi:~ $ cat mosquitto.txt
正在讀取套件清單...
正在重建相依關係...
正在讀取狀態資料...
下列的額外套件將被安裝:
libmosquitto1
建議套件:
apparmor
下列【新】套件將會被安裝:
libmosquitto1 mosquitto mosquitto-clients
升級 0 個,新安裝 3 個,移除 0 個,有 335 個未被升級。
需要下載 221 kB 的套件檔。
此操作完成之後,會多佔用 500 kB 的磁碟空間。
是否繼續進行 [Y/n]? [Y/n] 下載:1 http://mirror.ossplanet.net/raspbian/raspbian stretch/main armhf libmosquitto1 armhf 1.4.10-3+deb9u4 [47.2 kB]
下載:2 http://mirror.ossplanet.net/raspbian/raspbian stretch/main armhf mosquitto armhf 1.4.10-3+deb9u4 [122 kB]
下載:3 http://mirror.ossplanet.net/raspbian/raspbian stretch/main armhf mosquitto-clients armhf 1.4.10-3+deb9u4 [52.3 kB]
取得 221 kB 用了 2s (75.0 kB/s)
選取了原先未選的套件 libmosquitto1:armhf。
(讀取資料庫 ... 目前共安裝了 148260 個檔案和目錄。)
Preparing to unpack .../libmosquitto1_1.4.10-3+deb9u4_armhf.deb ...
Unpacking libmosquitto1:armhf (1.4.10-3+deb9u4) ...
選取了原先未選的套件 mosquitto。
Preparing to unpack .../mosquitto_1.4.10-3+deb9u4_armhf.deb ...
Unpacking mosquitto (1.4.10-3+deb9u4) ...
選取了原先未選的套件 mosquitto-clients。
Preparing to unpack .../mosquitto-clients_1.4.10-3+deb9u4_armhf.deb ...
Unpacking mosquitto-clients (1.4.10-3+deb9u4) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
設定 mosquitto (1.4.10-3+deb9u4) ...
Processing triggers for systemd (232-25+deb9u11) ...
Processing triggers for man-db (2.7.6.1-2) ...
設定 libmosquitto1:armhf (1.4.10-3+deb9u4) ...
設定 mosquitto-clients (1.4.10-3+deb9u4) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
可見已經順利完成安裝, 這樣就可以來測試看看用 MQTT 協定來訂閱與發送訊息了 :
開啟兩個終端機視窗, 一個用來發布訊息 (publisher); 另一個用來訂閱訊息 (subscriber). 首先在訂閱者終端機以下列指令訂閱主題為 abc 所發布的訊息 :
mosquitto_sub -h 發布者網址 -t 主題
pi@raspberrypi:~ $ mosquitto_sub -h localhost -t abc
訂閱後此終端機視窗會停住, 事實上是進入等待訊息的迴圈. 接著在發布者終端機以下列指令發布訊息 :
mosquitto_pub -h 發布者網址 -t 主題 -m "訊息"
pi@raspberrypi:~ $ mosquitto_pub -h localhost -t abc -m "hello world"
此指令針對 abc 主題發布了 "hello world" 訊息, 這時處於等待訊息迴圈的訂閱者終端機視窗就會顯示所接收到的訊息 :
hello world
發布者連續發布三個訊息 :
pi@raspberrypi:~ $ mosquitto_pub -h localhost -t abc -m "hello world"
pi@raspberrypi:~ $ mosquitto_pub -h localhost -t abc -m "hello tony"
pi@raspberrypi:~ $ mosquitto_pub -h localhost -t abc -m "hello amy"
訂閱者會連續收到三個訊息 :
hello world
hello tony
hello amy
注意, 訂閱者終端機將一直處於等待接收迴圈直到按下 CTRL+C 才會終止迴圈, 我覺得此迴圈似乎還蠻吃資源的, 訂閱指令一下達後, 桌面操作即變得有點卡卡, CPU 使用從 3% 上升到 20%.
標籤:
物聯網
,
樹莓派
,
Raspberry Pi
反應: |
樹莓派學習筆記 : 編譯 MQTT 套件 mosquitto 原始碼問題
今天繼續讀朱克剛寫的 "AIOT與OpenCV實戰應用:Python、樹莓派、物聯網與機器視覺" 的 MQTT 部分, 書中使用的是 mosquitto 套件, 可用 pip 安裝或從 GitHub 下載原始碼自行編譯, 作者建議自行編譯, 因為可以開啟 websockets 功能以便透過網頁介面進行 MQTT 操作.
我照作者建議下載原始碼自行編譯, 但編譯過程發生錯誤, 試圖爬文解決未果, 暫且將過程記錄如下, 等待找到解決方案再來重新編譯, mosquitto 套件原始碼下載網址如下 :
開啟樹莓派的 Chromium 瀏覽器連線上面的 GitHub 網址下載原始碼 zip 壓縮檔 :
pi@raspberrypi:~ $ cd Downloads
pi@raspberrypi:~/Downloads $ unzip mosquitto-master.zip
pi@raspberrypi:~/Downloads $ cd mosquitto-master
1. 編輯 config.mk 檔開啟 websockets 功能 :
用 nano 編輯 config.mk 檔, 將其中的 WITH_WEBSOCKETS 從原先的 no 改成 yes :
pi@raspberrypi:~/Downloads/mosquitto-master $ nano config.mk
這就是自行編譯的好處 : 能在編譯前進行細部功能設定.
2. 更新套件清單 :
此步驟是必要的, 否則後續下載安裝五套件時可能會因為找不到套件而安裝失敗 :
sudo apt-get update
pi@raspberrypi:~/Downloads/mosquitto-master $ sudo apt-get update
下載:1 http://archive.raspberrypi.org/debian stretch InRelease [25.3 kB]
下載:2 http://archive.raspberrypi.org/debian stretch/main armhf Packages [192 kB]
下載:3 http://raspbian.raspberrypi.org/raspbian stretch InRelease [15.0 kB]
下載:4 http://raspbian.raspberrypi.org/raspbian stretch/main armhf Packages [11.7 MB]
下載:5 http://archive.raspberrypi.org/debian stretch/ui armhf Packages [44.6 kB]
下載:6 http://raspbian.raspberrypi.org/raspbian stretch/non-free armhf Packages [98.9 kB]
取得 12.0 MB 用了 20min 48s (9,640 B/s)
正在讀取套件清單... 完成
3. 安裝五套件 :
此五套件是支援 MQTT 協定的函式庫 :
sudo apt-get install libc-ares-dev libwebsockets-dev libssl-dev xsltproc docbook-xsl
pi@raspberrypi:~/Downloads/mosquitto-master $ sudo apt-get install libc-ares-dev libwebsockets-dev libssl-dev xsltproc docbook-xsl
正在讀取套件清單... 完成
正在重建相依關係
正在讀取狀態資料... 完成
下列的額外套件將被安裝:
docbook-xml libev-dev libev4 libssl-doc libssl1.1 libuv1-dev libwebsockets8
sgml-data
建議套件:
docbook docbook-dsssl docbook-defguide dbtoepub docbook-xsl-doc-html
| docbook-xsl-doc-pdf | docbook-xsl-doc-text | docbook-xsl-doc
docbook-xsl-saxon fop libsaxon-java libxalan2-java libxslthl-java xalan
perlsgml w3-recs opensp libxml2-utils
下列【新】套件將會被安裝:
docbook-xml docbook-xsl libc-ares-dev libev-dev libev4 libssl-dev libssl-doc
libuv1-dev libwebsockets-dev libwebsockets8 sgml-data xsltproc
下列套件將會被升級:
libssl1.1
升級 1 個,新安裝 12 個,移除 0 個,有 335 個未被升級。
需要下載 4,105 kB/6,264 kB 的套件檔。
此操作完成之後,會多佔用 30.5 MB 的磁碟空間。
是否繼續進行 [Y/n]? [Y/n] Y
下載:1 http://mirror.ossplanet.net/raspbian/raspbian stretch/main armhf libssl1.1 armhf 1.1.0l-1~deb9u2 [1,119 kB]
下載:2 http://mirror.ossplanet.net/raspbian/raspbian stretch/main armhf libssl-dev armhf 1.1.0l-1~deb9u2 [1,388 kB]
下載:3 http://mirror.ossplanet.net/raspbian/raspbian stretch/main armhf libssl-doc all 1.1.0l-1~deb9u2 [1,478 kB]
下載:4 http://mirror.ossplanet.net/raspbian/raspbian stretch/main armhf xsltproc armhf 1.1.29-2.1+deb9u2 [120 kB]
取得 4,105 kB 用了 14s (284 kB/s)
讀取改變紀錄(changelogs)... 完成
正在預先設定套件 ...
(讀取資料庫 ... 目前共安裝了 143563 個檔案和目錄。)
Preparing to unpack .../00-libssl1.1_1.1.0l-1~deb9u2_armhf.deb ...
Unpacking libssl1.1:armhf (1.1.0l-1~deb9u2) over (1.1.0j-1~deb9u1) ...
選取了原先未選的套件 sgml-data。
Preparing to unpack .../01-sgml-data_2.0.10_all.deb ...
Unpacking sgml-data (2.0.10) ...
選取了原先未選的套件 docbook-xml。
Preparing to unpack .../02-docbook-xml_4.5-8_all.deb ...
Unpacking docbook-xml (4.5-8) ...
選取了原先未選的套件 docbook-xsl。
Preparing to unpack .../03-docbook-xsl_1.79.1+dfsg-2_all.deb ...
Unpacking docbook-xsl (1.79.1+dfsg-2) ...
選取了原先未選的套件 libc-ares-dev:armhf。
Preparing to unpack .../04-libc-ares-dev_1.14.0-1~bpo9+1_armhf.deb ...
Unpacking libc-ares-dev:armhf (1.14.0-1~bpo9+1) ...
選取了原先未選的套件 libev4。
Preparing to unpack .../05-libev4_1%3a4.22-1_armhf.deb ...
Unpacking libev4 (1:4.22-1) ...
選取了原先未選的套件 libssl-dev:armhf。
Preparing to unpack .../06-libssl-dev_1.1.0l-1~deb9u2_armhf.deb ...
Unpacking libssl-dev:armhf (1.1.0l-1~deb9u2) ...
選取了原先未選的套件 libssl-doc。
Preparing to unpack .../07-libssl-doc_1.1.0l-1~deb9u2_all.deb ...
Unpacking libssl-doc (1.1.0l-1~deb9u2) ...
選取了原先未選的套件 libuv1-dev:armhf。
Preparing to unpack .../08-libuv1-dev_1.18.0-3~bpo9+1_armhf.deb ...
Unpacking libuv1-dev:armhf (1.18.0-3~bpo9+1) ...
選取了原先未選的套件 libwebsockets8:armhf。
Preparing to unpack .../09-libwebsockets8_2.0.3-2+b1~rpt1_armhf.deb ...
Unpacking libwebsockets8:armhf (2.0.3-2+b1~rpt1) ...
選取了原先未選的套件 libev-dev。
Preparing to unpack .../10-libev-dev_1%3a4.22-1_armhf.deb ...
Unpacking libev-dev (1:4.22-1) ...
選取了原先未選的套件 libwebsockets-dev:armhf。
Preparing to unpack .../11-libwebsockets-dev_2.0.3-2+b1~rpt1_armhf.deb ...
Unpacking libwebsockets-dev:armhf (2.0.3-2+b1~rpt1) ...
選取了原先未選的套件 xsltproc。
Preparing to unpack .../12-xsltproc_1.1.29-2.1+deb9u2_armhf.deb ...
Unpacking xsltproc (1.1.29-2.1+deb9u2) ...
設定 libev4 (1:4.22-1) ...
設定 docbook-xsl (1.79.1+dfsg-2) ...
設定 xsltproc (1.1.29-2.1+deb9u2) ...
Processing triggers for sgml-base (1.29) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
設定 libssl1.1:armhf (1.1.0l-1~deb9u2) ...
設定 sgml-data (2.0.10) ...
Processing triggers for man-db (2.7.6.1-2) ...
設定 libc-ares-dev:armhf (1.14.0-1~bpo9+1) ...
設定 libssl-doc (1.1.0l-1~deb9u2) ...
設定 libuv1-dev:armhf (1.18.0-3~bpo9+1) ...
設定 libev-dev (1:4.22-1) ...
設定 libwebsockets8:armhf (2.0.3-2+b1~rpt1) ...
設定 libssl-dev:armhf (1.1.0l-1~deb9u2) ...
設定 libwebsockets-dev:armhf (2.0.3-2+b1~rpt1) ...
Processing triggers for sgml-base (1.29) ...
設定 docbook-xml (4.5-8) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Processing triggers for sgml-base (1.29) ...
4. 編譯原始碼與安裝套件 :
用 make 指令編譯原始碼 :
make -j4
pi@raspberrypi:~/Downloads/mosquitto-master $ make -j4
set -e; for d in lib apps client plugins src; do make -C ${d}; done
set -e; for d in man; do make -C ${d}; done
make[1]: Entering directory '/home/pi/Downloads/mosquitto-master/lib'
make[1]: Entering directory '/home/pi/Downloads/mosquitto-master/man'
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c mosquitto.c -o mosquitto.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c actions.c -o actions.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c callbacks.c -o callbacks.o
xsltproc --nonet libmosquitto.3.xml
xsltproc --nonet mosquitto-tls.7.xml
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c connect.c -o connect.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_auth.c -o handle_auth.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_connack.c -o handle_connack.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_disconnect.c -o handle_disconnect.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_ping.c -o handle_ping.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_pubackcomp.c -o handle_pubackcomp.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_publish.c -o handle_publish.o
xsltproc --nonet mosquitto.8.xml
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_pubrec.c -o handle_pubrec.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_pubrel.c -o handle_pubrel.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_suback.c -o handle_suback.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c handle_unsuback.c -o handle_unsuback.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c helpers.c -o helpers.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c logging_mosq.c -o logging_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c loop.c -o loop.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c memory_mosq.c -o memory_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c messages_mosq.c -o messages_mosq.o
xsltproc --nonet mosquitto.conf.5.xml
xsltproc --nonet mosquitto_ctrl.1.xml
xsltproc --nonet mosquitto_ctrl_dynsec.1.xml
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c misc_mosq.c -o misc_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c net_mosq_ocsp.c -o net_mosq_ocsp.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c net_mosq.c -o net_mosq.o
xsltproc --nonet mosquitto_passwd.1.xml
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c options.c -o options.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c packet_datatypes.c -o packet_datatypes.o
xsltproc --nonet mosquitto_pub.1.xml
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c packet_mosq.c -o packet_mosq.o
xsltproc --nonet mosquitto_rr.1.xml
xsltproc --nonet mosquitto_sub.1.xml
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c property_mosq.c -o property_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c read_handle.c -o read_handle.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c send_connect.c -o send_connect.o
xsltproc --nonet mqtt.7.xml
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c send_disconnect.c -o send_disconnect.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c send_mosq.c -o send_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c send_publish.c -o send_publish.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c send_subscribe.c -o send_subscribe.o
make[1]: Leaving directory '/home/pi/Downloads/mosquitto-master/man'
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c send_unsubscribe.c -o send_unsubscribe.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c socks_mosq.c -o socks_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c srv_mosq.c -o srv_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c strings_mosq.c -o strings_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c thread_mosq.c -o thread_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c time_mosq.c -o time_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c tls_mosq.c -o tls_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c utf8_mosq.c -o utf8_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c util_mosq.c -o util_mosq.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c util_topic.c -o util_topic.o
cc -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -Wall -ggdb -O2 -Wconversion -fPIC -c will_mosq.c -o will_mosq.o
cc -shared -Wl,--version-script=linker.version -Wl,-soname,libmosquitto.so.1 mosquitto.o actions.o callbacks.o connect.o handle_auth.o handle_connack.o handle_disconnect.o handle_ping.o handle_pubackcomp.o handle_publish.o handle_pubrec.o handle_pubrel.o handle_suback.o handle_unsuback.o helpers.o logging_mosq.o loop.o memory_mosq.o messages_mosq.o misc_mosq.o net_mosq_ocsp.o net_mosq.o options.o packet_datatypes.o packet_mosq.o property_mosq.o read_handle.o send_connect.o send_disconnect.o send_mosq.o send_publish.o send_subscribe.o send_unsubscribe.o socks_mosq.o srv_mosq.o strings_mosq.o thread_mosq.o time_mosq.o tls_mosq.o utf8_mosq.o util_mosq.o util_topic.o will_mosq.o -o libmosquitto.so.1 -lrt -lssl -lcrypto -lpthread
make -C cpp
make[2]: Entering directory '/home/pi/Downloads/mosquitto-master/lib/cpp'
g++ -I. -I.. -I../include -I../../include -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_UNIX_SOCKETS -I../deps -fPIC -c mosquittopp.cpp -o mosquittopp.o
g++ -shared -Wl,-soname,libmosquittopp.so.1 mosquittopp.o -o libmosquittopp.so.1 ../libmosquitto.so.1
make[2]: Leaving directory '/home/pi/Downloads/mosquitto-master/lib/cpp'
make[1]: Leaving directory '/home/pi/Downloads/mosquitto-master/lib'
make[1]: Entering directory '/home/pi/Downloads/mosquitto-master/apps'
set -e; for d in db_dump mosquitto_ctrl mosquitto_passwd; do make -C ${d}; done
make[2]: Entering directory '/home/pi/Downloads/mosquitto-master/apps/db_dump'
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c db_dump.c -o db_dump.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c print.c -o print.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../lib/memory_mosq.c -o memory_mosq.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../src/memory_public.c -o memory_public.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../lib/packet_datatypes.c -o packet_datatypes.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../lib/packet_mosq.c -o packet_mosq.o
db_dump.c: In function ‘dump__cfg_chunk_process’:
db_dump.c:133:98: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 4 has type ‘unsigned int’ [-Wformat=]
or: Incompatible database configuration (dbid size is %d bytes, expected %ld)",
^
db_dump.c: In function ‘dump__client_msg_chunk_process’:
db_dump.c:210:21: warning: conversion to ‘long unsigned int’ from ‘long int’ may change the sign of the result [-Wsign-conversion]
cc->message_size += length;
^~
db_dump.c:210:24: warning: conversion to ‘long int’ from ‘long unsigned int’ may change the sign of the result [-Wsign-conversion]
cc->message_size += length;
^~~~~~
db_dump.c:214:22: warning: conversion to ‘long unsigned int’ from ‘long int’ may change the sign of the result [-Wsign-conversion]
cc->message_size += msc->length;
^~
db_dump.c:214:25: warning: conversion to ‘long int’ from ‘long unsigned int’ may change the sign of the result [-Wsign-conversion]
cc->message_size += msc->length;
^~~
db_dump.c: In function ‘main’:
db_dump.c:466:19: warning: conversion to ‘long int’ from ‘uint32_t {aka unsigned int}’ may change the sign of the result [-Wsign-conversion]
if(fseek(fd, length, SEEK_CUR) < 0){
^~~~~~
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../src/persist_read.c -o persist_read.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../src/persist_read_v234.c -o persist_read_v234.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../src/persist_read_v5.c -o persist_read_v5.o
../../src/persist_read.c: In function ‘persist__client_chunk_restore’:
../../src/persist_read.c:199:34: warning: conversion to ‘time_t {aka long int}’ from ‘int64_t {aka long long int}’ may alter its value [-Wconversion]
context->session_expiry_time = chunk.F.session_expiry_time;
^~~~~
../../src/persist_read.c: In function ‘persist__restore’:
../../src/persist_read.c:527:18: warning: conversion to ‘long int’ from ‘uint32_t {aka unsigned int}’ may change the sign of the result [-Wsign-conversion]
fseek(fptr, length, SEEK_CUR);
^~~~~~
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../lib/property_mosq.c -o property_mosq.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../lib/send_disconnect.c -o send_disconnect.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c stubs.c -o stubs.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../lib/time_mosq.c -o time_mosq.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../src/topic_tok.c -o topic_tok.o
cc -Wall -ggdb -O2 -Wconversion -I../../include -I../../ -I../../lib -I../../src -I../../deps -DWITH_BROKER -DWITH_PERSISTENCE -c ../../lib/utf8_mosq.c -o utf8_mosq.o
cc db_dump.o print.o memory_mosq.o memory_public.o packet_datatypes.o packet_mosq.o persist_read.o persist_read_v234.o persist_read_v5.o property_mosq.o send_disconnect.o stubs.o time_mosq.o topic_tok.o utf8_mosq.o -o mosquitto_db_dump
make[2]: Leaving directory '/home/pi/Downloads/mosquitto-master/apps/db_dump'
make[2]: Entering directory '/home/pi/Downloads/mosquitto-master/apps/mosquitto_ctrl'
cc -I../mosquitto_passwd -I. -I../../ -I../../include -I../../src -I../../lib -DWITH_TLS -Wall -ggdb -O2 -Wconversion -DVERSION=\""2.0.5\"" -c mosquitto_ctrl.c -o mosquitto_ctrl.o
cc -I../mosquitto_passwd -I. -I../../ -I../../include -I../../src -I../../lib -DWITH_TLS -Wall -ggdb -O2 -Wconversion -DVERSION=\""2.0.5\"" -c client.c -o client.o
cc -I../mosquitto_passwd -I. -I../../ -I../../include -I../../src -I../../lib -DWITH_TLS -Wall -ggdb -O2 -Wconversion -DVERSION=\""2.0.5\"" -c dynsec.c -o dynsec.o
cc -I../mosquitto_passwd -I. -I../../ -I../../include -I../../src -I../../lib -DWITH_TLS -Wall -ggdb -O2 -Wconversion -DVERSION=\""2.0.5\"" -c dynsec_client.c -o dynsec_client.o
dynsec_client.c:18:25: fatal error: cjson/cJSON.h: 沒有此一檔案或目錄
#include <cjson/cJSON.h>
^
compilation terminated.
Makefile:57: recipe for target 'dynsec_client.o' failed
make[2]: *** [dynsec_client.o] Error 1
make[2]: *** Waiting for unfinished jobs....
dynsec.c:20:25: fatal error: cjson/cJSON.h: 沒有此一檔案或目錄
#include <cjson/cJSON.h>
^
compilation terminated.
Makefile:54: recipe for target 'dynsec.o' failed
make[2]: *** [dynsec.o] Error 1
In file included from client.c:31:0:
mosquitto_ctrl.h:21:25: fatal error: cjson/cJSON.h: 沒有此一檔案或目錄
#include <cjson/cJSON.h>
^
compilation terminated.
Makefile:51: recipe for target 'client.o' failed
make[2]: *** [client.o] Error 1
In file included from mosquitto_ctrl.c:29:0:
mosquitto_ctrl.h:21:25: fatal error: cjson/cJSON.h: 沒有此一檔案或目錄
#include <cjson/cJSON.h>
^
compilation terminated.
Makefile:48: recipe for target 'mosquitto_ctrl.o' failed
make[2]: *** [mosquitto_ctrl.o] Error 1
make[2]: Leaving directory '/home/pi/Downloads/mosquitto-master/apps/mosquitto_ctrl'
Makefile:9: recipe for target 'all' failed
make[1]: *** [all] Error 2
make[1]: Leaving directory '/home/pi/Downloads/mosquitto-master/apps'
Makefile:66: recipe for target 'mosquitto' failed
make: *** [mosquitto] Error 2
pi@raspberrypi:~/Downloads/mosquitto-master $
編譯中出現 "Incompatible database configuration" 與 "fatal error: cjson/cJSON.h: 沒有此一檔案或目錄" 等錯誤訊息, 有空再查原因.
如果 make -j4 編譯沒有錯誤, 後續還有兩個安裝指令 :
$ sudo make install (安裝)
$ sudo ldconfig
5. 建立 mosquitto 目錄 :
$ sudo mkdir /var/lib/mosquitto
6. 編輯 mosquitto 設定檔 :
$ sudo nano /etc/mosquitto/mosquitto.conf
輸入如下內容 :
port 1883
listener 9001
protocol websockets
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
7. 建立執行 mosquitto 的帳號 :
一直按 Enter 即可, 密碼可任填 :
$ sudo adduser --shell /usr/sbin/nologin --no-create-home mosquitto
8. 編輯服務檔 :
$ sudo nano /etc/systemd/system/mosquitto.service
輸入內容如下 :
[Unit]
Description=Mosquitto MQTT Broker Deamon
ConditionPathExists=/etc/mosquitto/mosquitto.conf
After=network.target
[Service]
Type=forking
RemainAfterExit=no
StartLimitInterval=0
PIDFile=/var/run/mosquitto.pid
ExecStart=/bin/sh/ -c "/usr/local/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf -d"
ExecReload=/bin/kill -HUB $MAINPID
Restart=on-failure
RestartSec=2
[Install]
WantedBy=multi-user.target
標籤:
物聯網
,
樹莓派
,
Raspberry Pi
反應: |
樹莓派五個重要的系統設定檔
我今天在讀朱克剛寫的 "AIOT與OpenCV實戰應用:Python、樹莓派、物聯網與機器視覺" 時, 在第二章末尾看到樹莓派重要的系統設定檔列表, 我覺得很有參考價值 :
Source : 博客來
參考 :
我實際檢視兩台 Pi 3B 的檔案內容紀錄如下 (作者使用 vi 編輯器, 我改為較好用的 nano) :
1. WiFi 連線設定檔 :
$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
檢視如下 :
pi@raspberrypi:~ $ cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TW
network={
ssid="EDIMAX-tony"
psk="123456789abc"
key_mgmt=WPA-PSK
}
2. 開機自動執行的程式 :
$ sudo nano /etc/rc.local
pi@raspberrypi:~ $ cat /etc/rc.local
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
exit 0
3. 鍵盤設定檔 :
$ sudo nano /etc/default/keyboard
重點是 XKBLAYOUT 要設為 us 美式鍵盤 :
pi@raspberrypi:~ $ cat /etc/default/keyboard
XKBMODEL=pc105
XKBLAYOUT=us
XKBVARIANT=
XKBOPTIONS=
BACKSPACE=guess
4. 系統排程設定檔 (cron table) :
$ sudo nano /etc/crontab
目前鄉下家樹莓派設定 :
pi@raspberrypi:~ $ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
5. 系統紀錄檔 :
$ cd /var/log
$ ls -al
SD 卡記憶體不足時, 可刪除此目錄底下較舊的紀錄檔.
pi@raspberrypi:~ $ ls -al /var/log
總計 169012
drwxr-xr-x 9 root root 4096 1月 21 06:25 .
drwxr-xr-x 12 root root 4096 4月 5 2019 ..
-rw-r--r-- 1 root root 0 12月 19 2019 alternatives.log
-rw-r--r-- 1 root root 1677 12月 18 2019 alternatives.log.1
-rw-r--r-- 1 root root 273 10月 16 2019 alternatives.log.2.gz
-rw-r--r-- 1 root root 258 4月 9 2019 alternatives.log.3.gz
drwxr-x--- 2 root adm 4096 1月 21 06:25 apache2
drwxr-xr-x 2 root root 4096 12月 19 2019 apt
-rw-r----- 1 root adm 10340754 1月 21 06:55 auth.log
-rw-r----- 1 root adm 26758041 1月 17 06:25 auth.log.1
-rw-r----- 1 root adm 2148156 1月 11 06:25 auth.log.2.gz
-rw-r----- 1 root adm 1042196 1月 3 06:25 auth.log.3.gz
-rw-r----- 1 root adm 1134427 12月 28 06:25 auth.log.4.gz
-rw-r--r-- 1 root root 2766 12月 23 11:53 boot.log
-rw-r--r-- 1 root root 0 11月 13 2018 bootstrap.log
-rw-rw---- 1 root utmp 77451648 1月 21 06:55 btmp
-rw------- 1 root utmp 49082880 1月 1 06:23 btmp.1
-rw-r----- 1 root adm 36206 1月 21 06:39 daemon.log
-rw-r----- 1 root adm 54446 1月 17 06:25 daemon.log.1
-rw-r----- 1 root adm 5663 1月 11 06:25 daemon.log.2.gz
-rw-r----- 1 root adm 3774 1月 3 06:25 daemon.log.3.gz
-rw-r----- 1 root adm 9121 12月 28 06:25 daemon.log.4.gz
drwxr-xr-x 2 root root 4096 1月 1 2020 dbconfig-common
-rw-r----- 1 root adm 0 12月 24 06:25 debug
-rw-r----- 1 root adm 1247 12月 23 11:53 debug.1
-rw-r----- 1 root adm 434 11月 2 09:50 debug.2.gz
-rw-r----- 1 root adm 435 8月 16 14:00 debug.3.gz
-rw-r----- 1 root adm 435 8月 2 14:00 debug.4.gz
-rw-r--r-- 1 root root 0 12月 19 2019 dpkg.log
-rw-r--r-- 1 root root 57781 12月 19 2019 dpkg.log.1
-rw-r--r-- 1 root root 2202 10月 16 2019 dpkg.log.2.gz
-rw-r--r-- 1 root root 160 7月 13 2019 dpkg.log.3.gz
-rw-r--r-- 1 root root 3514 4月 9 2019 dpkg.log.4.gz
-rw-r--r-- 1 root root 2688 12月 18 2019 faillog
-rw-r--r-- 1 root root 0 11月 13 2018 fontconfig.log
-rw-r----- 1 root adm 789810 1月 21 06:54 kern.log
-rw-r----- 1 root adm 1185111 1月 17 06:24 kern.log.1
-rw-r----- 1 root adm 183410 1月 11 06:22 kern.log.2.gz
-rw-r----- 1 root adm 132016 1月 3 06:25 kern.log.3.gz
-rw-r----- 1 root adm 190613 12月 28 06:23 kern.log.4.gz
-rw-rw-r-- 1 root utmp 292292 12月 26 22:12 lastlog
drwx--x--x 2 root root 4096 12月 23 11:53 lightdm
-rw-r----- 1 root adm 517547 1月 21 06:54 messages
-rw-r----- 1 root adm 789048 1月 17 06:25 messages.1
-rw-r----- 1 root adm 129457 1月 11 06:25 messages.2.gz
-rw-r----- 1 root adm 92798 1月 3 06:25 messages.3.gz
-rw-r----- 1 root adm 137151 12月 28 06:25 messages.4.gz
drwxr-s--- 2 mysql adm 4096 1月 21 06:25 mysql
drwxr-xr-x 2 root adm 4096 12月 19 2019 nginx
drwxr-x--- 2 root adm 4096 8月 14 2018 samba
-rw-r----- 1 root adm 5046 1月 21 06:54 syslog
-rw-r----- 1 root adm 231289 1月 21 06:25 syslog.1
-rw-r----- 1 root adm 27782 1月 20 06:25 syslog.2.gz
-rw-r----- 1 root adm 27603 1月 19 06:25 syslog.3.gz
-rw-r----- 1 root adm 27370 1月 18 06:25 syslog.4.gz
-rw-r----- 1 root adm 28143 1月 17 06:25 syslog.5.gz
-rw-r----- 1 root adm 28673 1月 16 06:25 syslog.6.gz
-rw-r----- 1 root adm 29553 1月 15 06:25 syslog.7.gz
-rw-r----- 1 root adm 17941 1月 21 06:36 user.log
-rw-r----- 1 root adm 39414 1月 17 00:54 user.log.1
-rw-r----- 1 root adm 4011 1月 11 06:14 user.log.2.gz
-rw-r----- 1 root adm 2489 1月 2 23:10 user.log.3.gz
-rw-r----- 1 root adm 4751 12月 28 03:36 user.log.4.gz
-rw-rw-r-- 1 root utmp 0 1月 1 06:25 wtmp
-rw-rw-r-- 1 root utmp 3072 12月 27 04:25 wtmp.1
-rw-r--r-- 1 root root 13369 12月 23 11:53 Xorg.0.log
-rw-r--r-- 1 root root 13369 11月 2 09:50 Xorg.0.log.old
找檔案最舊最大的先刪, 但現在 SD 卡已較便宜, 樹莓派最大支援 64GB, 買個 32/64 GB 來用比較沒有 SD 撐爆問題.
標籤:
樹莓派
,
Raspberry Pi
反應: |
訂閱:
文章
(
Atom
)