2023年12月31日 星期日

使用MakeCode來開發micro:bit和WS2812的控制程式




參考資料:Micro:bit Neopixel Introductio

記得選擇Extensions,安裝下列套件。


樍木程式如下:


Python程式如下: 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def on_button_pressed_a():
    global go
    go = 0
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_button_pressed_b():
    global go
    go = 1
input.on_button_pressed(Button.B, on_button_pressed_b)

go = 0
strip = neopixel.create(DigitalPin.P0, 16, NeoPixelMode.RGB)
strip.clear()
strip.show()
basic.show_icon(IconNames.HEART)

def on_every_interval():
    basic.show_string("Happy New Year!")
loops.every_interval(10000, on_every_interval)

def on_forever():
    if go == 1:
        for indeks in range(17):
            strip.clear()
            strip.set_pixel_color(indeks,
                neopixel.rgb(randint(0, 255), randint(0, 255), randint(0, 255)))
            strip.show()
            basic.pause(10)
basic.forever(on_forever)

利用電子名片(vCard)格式使用Python產生QR Code

vCard:https://zh.wikipedia.org/zh-tw/VCard

以下程式是利用ChaGPT產生:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import qrcode
import vobject
import matplotlib.pyplot as plt

def generate_qr_code(vcard_data, output_filename="qrcode.png"):
    # 創建一個vCard對象
    vcard = vobject.readOne(vcard_data)

    # 創建一個QR Code實例
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )

    # 將vCard數據添加到QR Code中
    qr.add_data(vcard.serialize())
    qr.make(fit=True)

    # 從QR Code實例創建一個圖片
    img = qr.make_image(fill_color="black", back_color="white")

    # 將圖片保存為文件
    img.save(output_filename)

    # 顯示QR Code
    plt.imshow(img)
    plt.axis('off')
    plt.show()

if __name__ == "__main__":
    # 範例vCard數據
    sample_vcard = """BEGIN:VCARD
VERSION:3.0
FN:John Doe
ORG:Example Inc.
TEL:123456789
EMAIL:john.doe@example.com
END:VCARD
"""

    # 生成包含範例vCard數據的QR Code並顯示
    generate_qr_code(sample_vcard)
    print("成功生成並顯示QR Code。")

執行結果:

成功生成並顯示QR Code。

2023年12月24日 星期日

使用cryptography套件來進行數位簽章

 

程式設計說明:

利用 Python 程式碼使用 cryptography 函式庫來實現了數位簽章(Digital Signature)的功能。首先,先成金鑰對(generate_key_pair),再依照上圖來簽署訊息(sign_message)和驗證簽章(verify_signature),來實現三個函式,說明如下:

1.生成金鑰對(generate_key_pair):

  • 使用 rsa.generate_private_key 函數生成一對私鑰(private_key)和公鑰(public_key)。
  • 公鑰通常用於驗證數位簽章,私鑰用於創建數位簽章。
2.簽署訊息(sign_message):
  • 使用私鑰對給定的訊息(message)進行數位簽章。
  • 簽章過程使用了 PSS padding 和 SHA-256 hash 函數。
3.驗證簽章(verify_signature):
  • 使用公鑰對簽章進行驗證,確保簽章是由對應的私鑰創建的。
  • 如果驗證成功,返回 True,否則捕捉例外並輸出錯誤訊息,然後返回 False。

程式碼如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding

def generate_key_pair():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )
    public_key = private_key.public_key()
    return private_key, public_key

def sign_message(private_key, message):
    signature = private_key.sign(
        message.encode('utf-8'),
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    return signature

def verify_signature(public_key, message, signature):
    try:
        public_key.verify(
            signature,
            message.encode('utf-8'),
            padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        return True
    except Exception as e:
        print(f"驗證失敗: {e}")
        return False

# Example usage:
private_key, public_key = generate_key_pair()
message_to_sign = "虎尾鎮,舊稱「大崙腳」,位於臺灣雲林縣中心,是一個因糖廠而興起的城鎮。"

signature = sign_message(private_key, message_to_sign)
print(f"數位簽章: {signature.hex()}")

if verify_signature(public_key, message_to_sign, signature):
    print("有效的數位簽章")
else:
    print("無效的數位簽章")

第一次執行結果:
數位簽章: 7006f8b687e8a0b93915822731f5bd74833a1bfc1b4bb610dbee5c6eb5ed5b99059ec9a7a6727b6dfffeb7f772079ada05f9c804abc31b13834429c1b4cc5b82719f08f6665a05211205f5f74365e0eb19f543c02139d09417fe1a7befd248face6ae8e9173d5b6a9ac5347ca0fad9fce0f5df3e7949811c786e0ff1ce389074f2e15bdf44efd46a3e420079312bad276a0322a95a538518828e9c6fa6f2cb392776ad6768524628721f311a4f7f41a8cb6019c6ff7668fe4fc96c2d64a24f43891144a96bf68e9373a26813beea80943b2a9c3bc69f966689e9c8ef93d0dfb5115b93308621b8024c9e591132fcc59cfa2dffbd6090f0f65027ab61a53e6564
有效的數位簽章

第二次執行結果:
數位簽章: 64c1c967c1f3e2866d3e4fb724e0fb74401e623be0c0f14d07ae6569edf09ca509613aa051ef5e467b6548fa6084f61fa067812832f1eabb750a1454e082cb9c03886f4e68958bdba785d3dac4a2405b3bf79e47f769c6d5b1a4dca782a280ec81337ce30b7104230058c7b61f97f2793a6b1ef63b685a59c355f05b1a9dd822094685c8445269540063120ca84356017ef3bdcf74fc4176e7704a794bb508764eb09cea3f491daac4f8adb3b958a10c279c056331147d9d0c712003bdb0a2366c487576e2916fc3fe111086c9630fbcad207a04b4f2773234248cccbbf7b191d2928fcb7db38c82f8611373b5c7843681d955a290e0784e7213ccf580bd6fae
有效的數位簽章

以上兩次執行會發現數位簽章都不同,但執行結果是一樣的,都是有效的數位簽章。

若在第47行插入下列程式:
message_to_sign = "虎尾鎮是一個因糖廠而興起的城鎮。"

修改後的程式碼如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding

def generate_key_pair():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )
    public_key = private_key.public_key()
    return private_key, public_key

def sign_message(private_key, message):
    signature = private_key.sign(
        message.encode('utf-8'),
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    return signature

def verify_signature(public_key, message, signature):
    try:
        public_key.verify(
            signature,
            message.encode('utf-8'),
            padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        return True
    except Exception as e:
        print(f"驗證失敗: {e}")
        return False

# Example usage:
private_key, public_key = generate_key_pair()
message_to_sign = "虎尾鎮,舊稱「大崙腳」,位於臺灣雲林縣中心,是一個因糖廠而興起的城鎮。"

signature = sign_message(private_key, message_to_sign)
print(f"數位簽章: {signature.hex()}")
message_to_sign = "虎尾鎮是一個因糖廠而興起的城鎮。"
if verify_signature(public_key, message_to_sign, signature):
    print("有效的數位簽章")
else:
    print("無效的數位簽章")

執行結果:
數位簽章: 2498811122ad6bd65cfd4fcaee18c30cc75ee3007571ab8c17438cbc8b4ef1c347df20866c0e77ced3d63d19bb5a2dc87362ea76a6050429b19538ec5f416c6ea058ffc5c003e95f0aa06c15a29869190e438a72a216b226470bd5652bdc2a9949a6b51159a574eb9cfcddb77fa11617d11dcc9e55c3711088079da8bb06d80a658dc041bde272e2a1bd96a0eb80561410701aed2f22d93e68ea71a390e391093f43d9a8952005e526c174c406d9b5624298d105854282d9cf116d246075cc0b748b5f75ec7f0d860757ae16cf860c1791cef2ba3fab6a52bf6ec45c171d7cd38f5360dba55c0d23ed3e837ccc639bec923f207cc71ba9f42fbff6905fe714d7
驗證失敗: 
無效的數位簽章

以上範例告訴我們若文件內容被修改,則驗證將失敗。

2023年12月23日 星期六

使用pymysql套件來操作MySQL資料庫

 參考資料如下:

  1. 黃建庭,"Python程式設計從入門到進階應用",全華,第13章,第13-16頁。
  2. [2020鐵人賽Day17]糊裡糊塗Python就上手-MySQL操作探險歷程(上),https://ithelp.ithome.com.tw/articles/10246378
  3. [2020鐵人賽Day18]糊裡糊塗Python就上手-MySQL操作探險歷程(下),https://ithelp.ithome.com.tw/articles/10246379

本篇文章是將參考資料的第一篇文章的範例,用參考資料第二、三篇的套件改寫。

程式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pymysql

# 連接到 MySQL 資料庫
connect_db = pymysql.connect(host='localhost', port=3306, user='root', passwd='', charset='utf8')

# 使用 with 來確保資源的正確釋放
with connect_db.cursor() as cursor:
    # 建立一個名為 'school' 的資料庫
    cursor.execute('CREATE DATABASE school')

    # 選擇 'school' 資料庫
    cursor.execute('USE school')

    # 建立一個名為 'stu' 的表格
    sql = """CREATE TABLE stu (
        stuid INTEGER PRIMARY KEY,
        name VARCHAR(50) NOT NULL,
        pid VARCHAR(20) NOT NULL,
        phone VARCHAR(20) NOT NULL )"""
    cursor.execute(sql)

    # 插入一條記錄到 'stu' 表格
    sql = "INSERT INTO stu VALUES (104001, 'Claire', 'B342222', '1245667')"
    cursor.execute(sql)

    # 查詢 'stu' 表格的所有記錄
    result = cursor.execute("SELECT * FROM stu")
    rows = cursor.fetchall()
    print(rows)

    # 刪除 'stu' 表格
    cursor.execute('DROP TABLE stu')

    # 刪除 'school' 資料庫
    cursor.execute('DROP DATABASE school')

執行結果:
((104001, 'Claire', 'B342222', '1245667'),)

2023年12月3日 星期日

用Python與正規表示式來分析和擷取字串

 文字內容摘自維基百科-國立虎尾科技大學

範例一、搜尋完整中文字詞

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立虎尾科技大學',s)
print(ans)

執行結果:
['國立虎尾科技大學']

範例二、搜尋其中一個符合的中文字詞

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立|虎尾|科技|大學',s)
print(ans)

執行結果:
['國立', '虎尾', '科技', '大學', '虎尾', '國立', '大學', '虎尾', '國立', '科技', '大學', '國立']

範例三、可以用中括號來搜尋其中一個符合的中文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]',s)
print(ans)

執行結果:
['國', '立', '虎', '尾', '科', '技', '大', '學', '虎', '科', '虎', '科', '大', '虎', '尾', '科', '大', '國', '立', '大', '學', '虎', '尾', '國', '立', '科', '技', '大', '學', '大', '科', '學', '立', '科', '學', '立', '國', '立', '科', '學']

範例四、配對零個或多個字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]*',s)
print(ans)

執行結果:
['國立虎尾科技大學', '', '', '', '', '虎科', '', '虎科大', '', '虎尾科大', '', '', '', '國立', '', '', '', '', '大學', '', '', '', '', '', '', '', '', '虎尾', '', '', '', '', '國立科技大學', '', '', '', '', '', '', '', '', '', '', '', '', '', '大', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '科學', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '立', '', '', '', '', '', '科學', '', '', '', '', '', '', '', '', '', '立', '', '', '', '', '', '', '', '', '', '', '', '', '國立', '', '', '', '', '', '科學', '', '', '', '']

範例五、配對零個或多個字,越少越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]*?',s)
print(ans)

執行結果:
['', '國', '', '立', '', '虎', '', '尾', '', '科', '', '技', '', '大', '', '學', '', '', '', '', '', '虎', '', '科', '', '', '虎', '', '科', '', '大', '', '', '虎', '', '尾', '', '科', '', '大', '', '', '', '', '國', '', '立', '', '', '', '', '', '大', '', '學', '', '', '', '', '', '', '', '', '', '虎', '', '尾', '', '', '', '', '', '國', '', '立', '', '科', '', '技', '', '大', '', '學', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '大', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '科', '', '學', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '立', '', '', '', '', '', '', '科', '', '學', '', '', '', '', '', '', '', '', '', '', '立', '', '', '', '', '', '', '', '', '', '', '', '', '', '國', '', '立', '', '', '', '', '', '', '科', '', '學', '', '', '', '']

範例六、配對1個或多個字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]+',s)
print(ans)

執行結果:
['國立虎尾科技大學', '虎科', '虎科大', '虎尾科大', '國立', '大學', '虎尾', '國立科技大學', '大', '科學', '立', '科學', '立', '國立', '科學']

範例七、配對1個或多個字,越少越好
1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]+?',s)
print(ans)

執行結果:
['國', '立', '虎', '尾', '科', '技', '大', '學', '虎', '科', '虎', '科', '大', '虎', '尾', '科', '大', '國', '立', '大', '學', '虎', '尾', '國', '立', '科', '技', '大', '學', '大', '科', '學', '立', '科', '學', '立', '國', '立', '科', '學']

範例八、判斷開頭的文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('^國立虎尾科技大學',s)
print(ans)

執行結果:
['國立虎尾科技大學']

範例九、列出不是要找的字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[^國立虎尾科技大學]',s)
print(ans)

執行結果:
[',', ' ', '簡', '稱', '、', '、', ',', '別', '稱', '福', '爾', '摩', '沙', ',', '位', '於', '台', '灣', '雲', '林', '縣', '鎮', '之', '一', '所', '。', '前', '身', '為', '雲', '林', '工', '專', ',', '為', '昔', '日', '三', '工', '專', '之', '一', '。', '1', '9', '8', '0', '年', '5', '月', '即', '開', '始', '籌', '設', '工', '業', '專', '校', ',', '到', '了', '7', '月', '正', '式', '創', '校', ',', '校', '名', '為', '「', '臺', '灣', '省', '雲', '林', '工', '業', '專', '校', '」', '。', '1', '9', '8', '1', '年', '省', '雲', '林', '工', '專', '改', '名', '配', '合', '更', '名', '為', '「', '雲', '林', '工', '業', '專', '校', '」', '。']

範例十、{n}連續配對n個字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]{4}',s)
print(ans)

執行結果:
['國立虎尾', '科技大學', '虎尾科大', '國立科技']

範例十一、{m,n}連續配對至少m個字到n個字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]{3,8}',s)
print(ans)

執行結果:
['國立虎尾科技大學', '虎科大', '虎尾科大', '國立科技大學']

範例十一、{m,n}連續配對至少m個字到n個字,越少越好
1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]{3,8}?',s)
print(ans)

執行結果:
['國立虎', '尾科技', '虎科大', '虎尾科', '國立科', '技大學']

範例十二、配對左邊且有右邊文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立(?=虎尾)',s)
print(ans)

執行結果:
['國立']

範例十二、配對左邊且有右邊文字並顯示出來

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立(?=虎尾)..',s)
print(ans)

執行結果:
['國立虎尾']

範例十二、配對左邊且沒有右邊文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立(?!虎尾)..',s)
print(ans)

執行結果:
['國立福爾', '國立科技', '國立雲林']

範例十二、配對左邊且有右邊文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('..(?<=雲林)工業',s)
print(ans)

執行結果:
['雲林工業', '雲林工業']

範例十三、配對左邊且沒有右邊文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('..(?<!雲林)工業',s)
print(ans)

執行結果:
['籌設工業']

範例十四、匹配數字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\d',s)
print(ans)

執行結果:
['1', '9', '8', '0', '5', '7', '1', '9', '8', '1']

範例十五、匹配數字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\d+',s)
print(ans)

執行結果:
['1980', '5', '7', '1981']

範例十五、匹配非數字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\D+',s)
print(ans)

執行結果:
['國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,位於台灣雲林縣虎尾鎮之一所國立科技大學。前身為雲林工專,為昔日三大工專之一。', '年', '月即開始籌設工業專科學校,到了', '月正式創校,校名為「臺灣省立雲林工業專科學校」。', '年省立雲林工專改名配合更名為「國立雲林工業專科學校」。']

範例十六、匹配一個空白字,並顯示後面2個字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\s..',s)
print(ans)

執行結果:
[' 簡稱']

範例十六、匹配非空白字,並顯示所有的文字
1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\S+',s)
print(ans)

執行結果:
['國立虎尾科技大學,', '簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,位於台灣雲林縣虎尾鎮之一所國立科技大學。前身為雲林工專,為昔日三大工專之一。1980年5月即開始籌設工業專科學校,到了7月正式創校,校名為「臺灣省立雲林工業專科學校」。1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。']

範例十七、匹配一個中英文、數字或底線字元

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\w',s)
print(ans)

執行結果:
['國', '立', '虎', '尾', '科', '技', '大', '學', '簡', '稱', '虎', '科', '虎', '科', '大', '虎', '尾', '科', '大', '別', '稱', '國', '立', '福', '爾', '摩', '沙', '大', '學', '位', '於', '台', '灣', '雲', '林', '縣', '虎', '尾', '鎮', '之', '一', '所', '國', '立', '科', '技', '大', '學', '前', '身', '為', '雲', '林', '工', '專', '為', '昔', '日', '三', '大', '工', '專', '之', '一', '1', '9', '8', '0', '年', '5', '月', '即', '開', '始', '籌', '設', '工', '業', '專', '科', '學', '校', '到', '了', '7', '月', '正', '式', '創', '校', '校', '名', '為', '臺', '灣', '省', '立', '雲', '林', '工', '業', '專', '科', '學', '校', '1', '9', '8', '1', '年', '省', '立', '雲', '林', '工', '專', '改', '名', '配', '合', '更', '名', '為', '國', '立', '雲', '林', '工', '業', '專', '科', '學', '校']

範例十六、匹配一個中英文、數字或底線字元,可是是標點符號

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\W',s)
print(ans)

執行結果:
[',', ' ', '、', '、', ',', ',', '。', ',', '。', ',', ',', '「', '」', '。', '「', '」', '。']

範例十七、匹配\w和\W的邊界

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall(r'\b國......',s)
print(ans)

執行結果:
['國立虎尾科技大', '國立雲林工業專']

範例十八、匹配不在\w和\W的邊界

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall(r'\B國.{6}',s)
print(ans)

執行結果:
['國立福爾摩沙大', '國立科技大學。']

2023年11月26日 星期日

使用motoBlockly來使用MQTT控制WS2812燈環以ESP32-GYRO為例

 motoBlockly:慧手科技(https://www.motoduino.com/),採用 ver 6.4

樍木程式:




XML輸出檔:



  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
<?xml version="1.0"?>

-<xml xmlns="https://www.motoduino.com/">


-<workspace>

<field name="DEVICE">esp32</field>

<field name="VERSION">6.4.0</field>

</workspace>


-<variables>

<variable id="{_eWbxkOCGs_LFQfcPXP">GetData</variable>

<variable id=")gyC:asr*b5kyqWOURNV">WS2812_Pin</variable>

</variables>


-<block id="Jot:A.T`/vjDDan~o?.:" y="-137" x="-113" type="variables_declare_global">

<field name="VAR" id=")gyC:asr*b5kyqWOURNV">WS2812_Pin</field>

<field name="TYPE">int</field>


+<value name="VALUE">







</block>


-<block id="5-0h[E_!JR-N`:rDpFwc" y="-112" x="-112" type="variables_declare_global">

<field name="VAR" id="{_eWbxkOCGs_LFQfcPXP">GetData</field>

<field name="TYPE">String</field>


-<value name="VALUE">


-<shadow id="/bk#g=cNo{XsJZYg.|sr" type="math_number">

<field name="NUM">0</field>

</shadow>


-<block id="3pbznEn+[yMMoBp-MPd:" type="text">

<field name="TEXT"/>

</block>

</value>

</block>


-<block id="4^uJU$hIIJ;cy5=?{*{t" y="-62" x="-112" type="arduino_setup">


-<statement name="MySetup">


-<block id="po?y{bIL#%_d}rh_Zp]O" type="inout_pinmode_val">

<field name="val" id=")gyC:asr*b5kyqWOURNV">WS2812_Pin</field>

<field name="STAT">OUTPUT</field>


-<next>


-<block id="#+qSn;UG{+-Ai?C2X/Ic" type="serial_setup">

<field name="SERIAL_ID">Serial</field>

<field name="SERIAL_SPEED">115200</field>


-<next>


-<block id="$y@[11LBtR(Tqxz=PC@;" type="esp8266_wifi_begin_v2">

<field name="WIFI_MODE">station</field>


-<value name="ROUTER_SSID">


-<block id="E_-tGG513)]|)6[kEswM" type="text">

<field name="TEXT">請換成您的SSID</field>

</block>

</value>


-<value name="ROUTER_PASSWORD">


-<block id="r^D]]F[tx5xL:F9s@fwj" type="text">

<field name="TEXT">請換成您的密碼</field>

</block>

</value>


-<next>


-<block id="/o#S1%p-}S_aUEGU12,9" type="mqtt_server_connect_4_subscribe">


-<value name="MQTT_SERVER_NAME">


-<block id="HT8.0LY]3W%{X;}be[~!" type="text">

<field name="TEXT">MQTTGO.io</field>

</block>

</value>


-<value name="MQTT_CLIENT_ID">


-<block id=")XhyV,QmYd-5]MK71){N" type="text">

<field name="TEXT"/>

</block>

</value>


-<next>


-<block id="@3~w3~Usq-^`-Bd4UHhZ" type="serial_write">

<field name="SERIAL_ID">Serial</field>


-<value name="CONTENT">


-<block id="DGzt=P-nTwQdNUo}H5ZC" type="text">

<field name="TEXT">connected!</field>

</block>

</value>


-<next>


-<block id="F|N#KUh}5qK]IIx+4(y8" type="mqtt_subscribe_topic">


-<value name="MQTT_SUBSCRIBE_TOPIC">


-<block id="j`h`Fx)fuI`9q7S3#{jz" type="text">

<field name="TEXT">Pin/WS2812</field>

</block>

</value>

</block>

</next>

</block>

</next>

</block>

</next>

</block>

</next>

</block>

</next>

</block>

</statement>


-<statement name="MyLoop">

<block id="IwxxQ00#6N-3A{([c4Ls" type="mqtt_client_loop"/>

</statement>

</block>


-<block id="X{^|{@BSv`0+F6X2+~US" y="-13" x="537" type="mqtt_message_receive_callback">


-<statement name="STATEMENTS">


-<block id="_/#epXh[/Y$;a;*H2XCf" type="variables_set">

<field name="VAR" id="{_eWbxkOCGs_LFQfcPXP">GetData</field>


-<value name="VALUE">


-<block id="y^,Q/|#TkOSI8mJ[gi5o" type="mqtt_subscribe_data_get">


-<value name="SUBSCRIBE_TOPIC">


-<block id="@8HQ,X0Oj.Is@fCKpzR#" type="text">

<field name="TEXT">Pin/WS2812</field>

</block>

</value>

</block>

</value>


-<next>


-<block id="KaBOKdU+tXAb~c$yEz2l" type="serial_print">

<field name="SERIAL_ID">Serial</field>


-<value name="CONTENT">


-<block id="q[]i8G!tneT+3eG,WC=F" type="variables_get">

<field name="VAR" id="{_eWbxkOCGs_LFQfcPXP">GetData</field>

</block>

</value>


-<next>


-<block id="d/7|vo%yh@xdel-L)`qH" type="controls_if">

<mutation else="1"/>


-<value name="IF0">


-<block id="vPt!4/G2=wR[xtiA-PU~" type="logic_compare">

<field name="OP">EQ</field>


-<value name="A">


-<block id="L`gM;UCan5,fI///CM2R" type="variables_get">

<field name="VAR" id="{_eWbxkOCGs_LFQfcPXP">GetData</field>

</block>

</value>


-<value name="B">


-<block id="U3?W#}#:Iz|[m]l4UJGY" type="text">

<field name="TEXT">on</field>

</block>

</value>

</block>

</value>


-<statement name="DO0">


-<block id="Q$0~Gvb}[?LWKg8k,Di-" type="controls_repeat_x">


-<value name="TIMES">


-<shadow id="QxQz5C5#h;!pEpqHQjVU" type="math_number">

<field name="NUM">5</field>

</shadow>

</value>


-<statement name="DO">


-<block id="bDUd,p~//Rg:nW(EI$9l" type="ws2812_close">

<field name="PIN">4</field>


-<next>


-<block id="SvCo01W6z4Ii1~X-:U[R" type="ws2812_ring">

<field name="PIN">4</field>

<field name="RGBLED_COLOR_7">#ffcc33</field>

<field name="RGBLED_COLOR_8">#c0c0c0</field>

<field name="RGBLED_COLOR_9">#cc0000</field>

<field name="RGBLED_COLOR_6">#000000</field>

<field name="RGBLED_COLOR_10">#000000</field>

<field name="RGBLED_COLOR_5">#000000</field>

<field name="RGBLED_COLOR_11">#ffff33</field>

<field name="RGBLED_COLOR_4">#00cccc</field>

<field name="RGBLED_COLOR_12">#000000</field>

<field name="RGBLED_COLOR_3">#000000</field>

<field name="RGBLED_COLOR_2">#3366ff</field>

<field name="RGBLED_COLOR_1">#000000</field>


-<next>


-<block id="Iy;.N|4OR^Vsbh9py_vX" type="ws2812_show">

<field name="PIN">4</field>


-<next>


-<block id="fUcy)rptFnj9EqQKS]k?" type="delay_custom">


-<value name="DELAY_TIME">


-<block id="+a{~MQb7.|oOC:QNl6F/" type="math_number">

<field name="NUM">1000</field>

</block>

</value>


-<next>


-<block id="MCri5QV;^7dM*X5}U@_L" type="ws2812_close">

<field name="PIN">4</field>


-<next>


-<block id="RKd:I_QC*van~b,8+FVx" type="ws2812_ring">

<field name="PIN">4</field>

<field name="RGBLED_COLOR_7">#000000</field>

<field name="RGBLED_COLOR_8">#000000</field>

<field name="RGBLED_COLOR_9">#000000</field>

<field name="RGBLED_COLOR_6">#339999</field>

<field name="RGBLED_COLOR_10">#3333ff</field>

<field name="RGBLED_COLOR_5">#000000</field>

<field name="RGBLED_COLOR_11">#000000</field>

<field name="RGBLED_COLOR_4">#000000</field>

<field name="RGBLED_COLOR_12">#000000</field>

<field name="RGBLED_COLOR_3">#99ffff</field>

<field name="RGBLED_COLOR_2">#000000</field>

<field name="RGBLED_COLOR_1">#ffff00</field>


-<next>


-<block id="UKn/Q0@wJtQxcq+n~jX9" type="ws2812_show">

<field name="PIN">4</field>


-<next>


-<block id="(U7(jXcwk1rwiPUC!-w/" type="delay_custom">


-<value name="DELAY_TIME">


-<block id="J^=HR+[9}a9*wG@$nEi?" type="math_number">

<field name="NUM">1000</field>

</block>

</value>

</block>

</next>

</block>

</next>

</block>

</next>

</block>

</next>

</block>

</next>

</block>

</next>

</block>

</next>

</block>

</statement>

</block>

</statement>


-<statement name="ELSE">


-<block id=";f=mmiiEJ{qb/A)BnG@0" type="ws2812_close">

<field name="PIN">4</field>

</block>

</statement>

</block>

</next>

</block>

</next>

</block>

</statement>

</block>


-<block disabled="true" id="[b+HThOc$OWwyY`OD*t_" y="124" x="871" type="text">

<field name="TEXT">Pin/WS2812</field>

</block>

</xml>

Arduino程式:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
/* Sketch was generated by motoblockly 
 Website: http://www.motoblockly.com 
 Author: www.motoduino.com 
 Date: Sun Nov 26 2023 21:04:28 GMT+0800
 */ 
#include <WiFi.h>
#include "PubSubClient.h"
#include <Adafruit_NeoPixel.h>

int  WS2812_Pin=4;
String  GetData="";
WiFiClient client;
PubSubClient mqtt_client(client);
Adafruit_NeoPixel strip4(12,4, NEO_GRB + NEO_KHZ800);

void setup()
{
  Serial.begin(115200);
  strip4.begin();
  mqtt_client.setCallback(callback);
  pinMode(WS2812_Pin,OUTPUT);
  WiFi.mode(WIFI_STA);
  WiFi.begin(String("換成您的SSID").c_str(),String("換成您的密碼").c_str());
  while(WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
  }
  mqtt_client.setServer("MQTTGO.io",1883);
    while (!mqtt_client.connect("")) {
      Serial.print(".");
      delay(1000);
    }
  Serial.write("connected!");
  mqtt_client.subscribe("Pin/WS2812");

}


void loop()
{
  mqtt_client.loop();

}
String getTopicData(String myTopic, String inTopic, byte* payload ,unsigned int length){
 String TopicData;
 if(inTopic == myTopic){
  for (int i = 0; i < length; i++) {
   TopicData += (char)payload[i];}
     return TopicData;
  }else{
     return "";
  }
}

void colorled4(int number,String c) {
	long rgb_number = strtol(&c[1], NULL, 16);
   int r = rgb_number >> 16;
   int g = rgb_number >> 8 & 0xFF;
   int b = rgb_number & 0xFF;
   strip4.setPixelColor(number,strip4.Color(r,g,b));
}

void callback(char* topic, byte* payload, unsigned int length){
  GetData = getTopicData("Pin/WS2812",topic, payload,length);
  Serial.println(GetData);
  if (GetData == "on") {
    for (int count2 = 0; count2 < 5; count2++) {
      strip4.clear();
      strip4.show();
      colorled4(0,"#000000");
      colorled4(1,"#000000");
      colorled4(2,"#3366ff");
      colorled4(3,"#000000");
      colorled4(4,"#00cccc");
      colorled4(5,"#000000");
      colorled4(6,"#000000");
      colorled4(7,"#ffcc33");
      colorled4(8,"#c0c0c0");
      colorled4(9,"#cc0000");
      colorled4(10,"#000000");
      colorled4(11,"#ffff33");
      strip4.show();
      delay(1000);
      strip4.clear();
      strip4.show();
      colorled4(0,"#ffff00");
      colorled4(1,"#000000");
      colorled4(2,"#000000");
      colorled4(3,"#99ffff");
      colorled4(4,"#000000");
      colorled4(5,"#000000");
      colorled4(6,"#339999");
      colorled4(7,"#000000");
      colorled4(8,"#000000");
      colorled4(9,"#000000");
      colorled4(10,"#3333ff");
      colorled4(11,"#000000");
      strip4.show();
      delay(1000);
    }
  } else {
    strip4.clear();
    strip4.show();
  }

}

測試:
Topic:Pin/WS2812
訊息:off

結果:

訊息改成 on
結果: