日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【RW007系列综合实战3】柿饼派上怎样更新RW007固件和驱动?

發(fā)布時間:2024/3/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【RW007系列综合实战3】柿饼派上怎样更新RW007固件和驱动? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前面已經(jīng)分享過部分關于 RW007 模塊如何更新的帶 BLE 功能的方法,這里也再次分享一下在柿餅派上怎樣更新 RW007 固件和更新 RW007 的驅(qū)動,并且測試 RW007 的 BLE 功能。

步驟一:柿餅派更新 RW007 的固件

在柿餅派上更新 RW007 的固件,可以參考官方提供的 RW007 通過 UDP_OTA 工具升級 RW007 固件的文檔,進行操作。

1. RW007 模塊需要和 PC 電腦連在同一個局域網(wǎng)

2. 打開升級工具配置升級

(1)雙擊運行 udp_ota.exe軟件

3. 升級完成

等待進度條完成,然后重啟板子。

步驟二:柿餅派修改 SDK 更新 RW007 的驅(qū)動

由于需要使用新版本的 RW007 模塊的 BLE 功能,所以需要對應更新主機端柿餅派的 RW007 驅(qū)動,主要是替換SDK中project\firmware\packages目錄下的rw007-latest目錄先刪除,然后拷貝提供的rw007-v2.0.1文件夾,即可完成替換更新RW007 的驅(qū)動。

替換驅(qū)動文件后,通過 env 編譯柿餅派的固件,然后通過persimmon mod工具更新柿餅派的固件,即可。

步驟三:柿餅派測試 RW007 的 BLE 功能

當按照前面的步驟進行操作后,可以通過調(diào)試串口的 msh命令行進行調(diào)試。因為在RW007驅(qū)動包里面默認開啟了相關的功能測試示例,可以在MSH命令行中通過rw007_ble查詢。下面的內(nèi)容來自于官方提供的 RW007 BLE 功能使用說明操作。

1msh?/>rw007_ble2[rw007_ble?command]34rw007_ble?help5rw007_ble?init?central/peripheral??????????????Note:?init?ble?mode6rw007_ble?get_addr?????????????????????????????Note:?get?ble?address7rw007_ble?update_params????????????????????????Note:?update?connect?parameters(no?support)8rw007_ble?scan?????????????????????????????????Note:?scan?ble?slave9rw007_ble?stop_scan????????????????????????????Note:?stop?scan 10rw007_ble?connect?xx:xx:xx:xx:xx:xx????????????Note:?use?slave?addr?to?connect 11rw007_ble?disconnect?[conn_handle]?????????????Note:?disconnect?slave 12rw007_ble?get_server???????????????????????????Note:?discover?all?server(no?support) 13rw007_ble?get_char?????????????????????????????Note:?discover?all?description(no?support) 14rw007_ble?get_disc?????????????????????????????Note:?discover?all?characteristic(no?support) 15rw007_ble?mtu_exch?????????????????????????????Note:?ble?mtu?exchange(no?support) 16rw007_ble?notify???????????????????????????????Note:?enable?ble?notify(no?support) 17rw007_ble?write????????????????????????????????Note:?ble?write?data(no?support) 18rw007_ble?read?????????????????????????????????Note:?ble?read?data(no?support) 19rw007_ble?notify_change?[conn_handle]?[char_value]?[UUID]???Note:?ble?notify?configure?by?uuid 20rw007_ble?write_uuid?[conn_handle]?[UUID]?[data]?Note:?ble?write?data?by?uuid 21rw007_ble?read_uuid??????????????????????????????Note:?ble?read?data?by?uuid(no?support)

BLE 功能初始化

BLE功能初始化函數(shù),使用 BLE功能必須調(diào)用。

1.RW007BLE 設備初始化為主機設備。

1rw007_ble?init?central

測試示例

1msh?/>rw007_ble?init?central 2122?-?ble_cmd_init 3start?ble?central 4msh?/>

2. RW007BLE 設備初始化為從機設備
注意:目前不支持使用從機模式。

1rw007_ble?init?peripheral

BLE 功能獲取本機的BLE設備地址

由于BLE設備的地址分為public公共地址和random隨機地址。

1rw007_ble?get_addr

測試示例

1msh?/>rw007_ble?get_addr 2273?-?ble_cmd_get_addr 3msh?/>resp_type:?0,?len:?12 4RW007_BLE_RSP_TYPE_ADDR_GET 5public_id_addr?=?48:00:42:8c:47:c9 6random_id_addr?=?00:04:5c:43:00:00

BLE 功能掃描設備

目前RW007BLE 功能支持通過 scan命令,掃描周圍的BLE設備。

1.執(zhí)行掃描周圍BLE設備

1rw007_ble?scan

測試示例:

1msh?/>rw007_ble?scan 2176?-?ble_cmd_scan 3msh?/>resp_type:?1,?len:?65 4RW007_BLE_NTF_TYPE_DISCOVER 5received?advertisement;?event_type=0?rssi=-60?addr_type=0?addr=4c:ed:fb:00:04:b1 6resp_type:?1,?len:?56

這里的 addr地址內(nèi)容可以為后面連接設備使用,由于目前沒有直接顯示對應 BLE 設備的名稱,需要先人工確定 BLE 設備的地址。

2.停止掃描周圍BLE設備
該指令用于 RW007模塊正在執(zhí)行scan掃描操作過程中,馬上停止掃描的動作,可以執(zhí)行此命令。

1rw007_ble?stop_scan

BLE 功能設備連接

目前 RW007 BLE 功能設備支持通過 BLE設備的類mac地址來連接設備,該命令僅支持主機模式去連接從機設備的類mac地址,連接成功后會有對應的conn_handle值,這個conn_handle值在其他功能沿用。

1rw007_ble?connect?xx:xx:xx:xx:xx:xx

測試示例

1msh?/>rw007_ble?connect?4c:ed:fb:00:04:b12198?-?ble_cmd_connect3str_addr:?4c:ed:fb:00:04:b14mac?addr:?b1:?4:?0:fb:ed:4c5msh?/>resp_type:?1,?len:?526RW007_BLE_NTF_TYPE_CONNECT7type:?0,?status:?0,?conn_handle:?189resp_type:?1,?len:?44 10RW007_BLE_NTF_TYPE_CONNECT_DESC 11our_id_addr:?c9:47:8c:42:00:48 12peer_id_addr:?b1:04:00:fb:ed:4c

BLE 功能設備斷開連接

目前RW007BLE 功能設備支持主動斷開從設備的連接。

1rw007_ble?disconnect?[conn_handle]

其中 conn_handle與 connect連接時的需要一致。

1msh?/>rw007_ble?disconnect?1 2341?-?ble_cmd_disconnect 3msh?/>resp_type:?1,?len:?52 4RW007_BLE_NTF_TYPE_DISCONN

BLE 功能寫數(shù)據(jù)

目前RW007BLE 功能寫數(shù)據(jù),支持通過指定UUID來寫對應的數(shù)據(jù)。

1rw007_ble?write_uuid?[conn_handle]?[UUID]?[data]

指令說明:[conn_handle]為 RW007連接設備時生成的對應值,[UUID]為對應 BLE設備的特征參數(shù),[data]為需要發(fā)送的數(shù)據(jù)。

測試示例:

1msh?/>rw007_ble?write_uuid?1?ffe1?Hello,RT-Thread.... 2402?-?ble_cmd_gattc_write_by_uuid 3write?conn_hanle:1?uuid:ffe1?data:Hello,RT-Thread.... 4write?rc:0 5msh?/>

注意:目前已經(jīng)支持通過 128 位的 UUID 進行寫數(shù)據(jù)操作

測試示例:

1msh?/>rw007_ble?write_uuid?1?ebe0ccbe7a0a4b0c8a1a6ff2997da3a6?00 2data:?00 3write?conn_hanle:1?uuid:ebe0ccbe7a0a4b0c8a1a6ff2997da3a6 4write?rc:0

說明:

測試示例中的 [conn_handle]為 1,[UUID]為ebe0ccbe7a0a4b0c8a1a6ff2997da3a6,[data]為 0x00(這里是使用 hex 值)

BLE 功能更新notify 參數(shù)

目前 RW007 BLE 功能支持修改接收 notify參數(shù)。

1rw007_ble?notify_change?[conn_handle]?[char_value]?[UUID]

參數(shù)說明:

[conn_handle]為 RW007連接設備時生成的對應值

[char_value] 為配置參數(shù),具體如下

10:disable?indication&notification 21:enable?notification,disable?indication 32:enable?indication,?disable?notification 43:enable?indication?&notification

[UUID]為對應 BLE設備的特征參數(shù)值。

BLE 功能關于廣播包類型的說明

目前 RW007 ?BLE 功能中可以關于廣播包 event的類型可以分為下面幾種。

1/*?Advertising?report?*/ 2#define?BLE_HCI_ADV_RPT_EVTYPE_ADV_IND??????(0) 3#define?BLE_HCI_ADV_RPT_EVTYPE_DIR_IND??????(1) 4#define?BLE_HCI_ADV_RPT_EVTYPE_SCAN_IND?????(2) 5#define?BLE_HCI_ADV_RPT_EVTYPE_NONCONN_IND??(3) 6#define?BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP?????(4)

廣播包結(jié)構如下:

1廣播包結(jié)構描述:2struct?ble_gap_disc_desc?{3????uint8_t?event_type;4????uint8_t?length_data;5????ble_addr_t?addr;6????int8_t?rssi;7????uint8_t?*data;89????/*** 10?????*?LE?direct?advertising?report?fields;?direct_addr?is?BLE_ADDR_ANY?if 11?????*?direct?address?fields?are?not?present. 12?????*/ 13????ble_addr_t?direct_addr; 14}; 15 16通過event_type區(qū)分出不同的廣播包類型,所有類型分為如下幾種: 17/*?Advertising?report?*/ 180?:?普通廣播數(shù)據(jù)包 191?:?直接廣播包? 202?:?掃描請求包? 213?:?不可連接廣播指示 224?:?掃描響應數(shù)據(jù)包

因此,在設備的scan掃描回應中可以通過對應的event_type來判定是哪種廣播包的類型。

在 RW007的驅(qū)動代碼中,可以通過下面的event_type來判斷是哪種類型的廣播包,可以讓用戶自行實現(xiàn)對應功能。

1case?RW007_BLE_NTF_TYPE_DISC:2????????{3????????????rt_kprintf("RW007_BLE_NTF_TYPE_DISCOVER\n");4????????????....5????????????switch(event_type)6????????????{7????????????????case?BLE_HCI_ADV_RPT_EVTYPE_ADV_IND:89????????????????????break; 10????????????????case?BLE_HCI_ADV_RPT_EVTYPE_DIR_IND: 11 12????????????????????break; 13????????????????case?BLE_HCI_ADV_RPT_EVTYPE_SCAN_IND: 14 15????????????????????break; 16????????????????case?BLE_HCI_ADV_RPT_EVTYPE_NONCONN_IND: 17 18????????????????????break; 19????????????????case?BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP: 20 21????????????????????break; 22????????????} 23????????????.... 24????????}

測試示例:

1.初始化 RW007BLE 功能為主機模式。

1msh?/>?rw007_ble?init?central 2263?-?ble_cmd_init 3start?ble?central 4msh?/>

2.執(zhí)行BLE掃描指令

1msh?/>rw007_ble?scan?2318?-?ble_cmd_scan3msh?/>resp_type:?1,?len:?834RW007_BLE_NTF_TYPE_DISCOVER5received?advertisement;?event_type=3?rssi=-56?addr_type=1?addr=41:ef:77:50:2b:296mfg_data?=?1e?ff?06?00?01?09?20?02?5b?5d?cd?33?a4?8c?c7?c5?36?ac?de?12?ab?17?87?89?e1?84?e9?19?ec?c4?ad?78resp_type:?1,?len:?839RW007_BLE_NTF_TYPE_DISCOVER 10received?advertisement;?event_type=3?rssi=-65?addr_type=1?addr=3c:2e:33:ea:8d:aa 11mfg_data?=?1e?ff?06?00?01?09?20?02?28?4c?cf?9b?a7?f2?7d?f6?c7?7e?d9?54?ac?dd?91?a6?ee?0d?22?43?e1?8f?e3? 12 13resp_type:?1,?len:?83 14RW007_BLE_NTF_TYPE_DISCOVER 15received?advertisement;?event_type=3?rssi=-59?addr_type=1?addr=42:18:ab:80:5c:11 16mfg_data?=?1e?ff?06?00?01?09?20?02?eb?bf?cf?15?97?aa?50?7f?a4?57?25?d9?21?35?71?eb?6f?aa?a1?56?5c?d5?e2?

3.觀察event_type=可以確定是哪種廣播包類型。

1RW007_BLE_NTF_TYPE_DISCOVER2received?advertisement;?event_type=0?rssi=-64?addr_type=1?addr=61:63:46:c3:49:993mfg_data?=?02?01?1a?02?0a?0c?0b?ff?4c?00?10?06?00?19?1d?6d?63?18?45resp_type:?1,?len:?526RW007_BLE_NTF_TYPE_DISCOVER7received?advertisement;?event_type=4?rssi=-64?addr_type=1?addr=61:63:46:c3:49:998mfg_data?=?9 10resp_type:?1,?len:?73 11RW007_BLE_NTF_TYPE_DISCOVER 12received?advertisement;?event_type=0?rssi=-73?addr_type=0?addr=91:21:52:00:4e:b8 13mfg_data?=?14?ff?4c?00?07?0f?00?02?20?91?21?52?00?4e?b8?f5?58?58?3c?39?00?

BLE 功能讀數(shù)據(jù)

目前 RW007支持通過 UUID 讀取數(shù)據(jù)的功能

1rw007_ble?read_uuid?[conn_handle]?[UUID]

參數(shù)說明:

[conn_handle]為 RW007連接設備時生成的對應值

[UUID]為對應 BLE設備的特征參數(shù)。

測試示例:

1msh?/>rw007_ble?read_uuid?1?2a24 2read?conn_hanle:1?uuid:2a24 3read?rc:0 4msh?/>ble?data?input?packet?resp_type:?0,?len:?18 5RW007_BLE_RSP_TYPE_READ 6connect:1?attr_handle:14?uuid:?24?2a??read?data: 700000000:?4C?59?57?53?44?30?33?4D?4D?43?00?????????????????LYWSD03MMC.

說明:這里的 [conn_handle]為 1,[UUID] 為 2a24,讀取到的數(shù)據(jù)為 BLE 設備的名稱。

目前 RW007 模塊已經(jīng)支持讀取 128 位的 UUID 的功能。

測試示例:

1msh?/>rw007_ble?read_uuid?1?ebe0ccbe7a0a4b0c8a1a6ff2997da3a6 2read?conn_hanle:1?uuid:ebe0ccbe7a0a4b0c8a1a6ff2997da3a6 3read?rc:0 4msh?/>ble?data?input?packet?resp_type:?0,?len:?22 5RW007_BLE_RSP_TYPE_READ 6connect:1?attr_handle:51?uuid:?a6?a3?7d?99?f2?6f?1a?8a?0c?4b?0a?7a?be?cc?e0?eb??read?data: 700000000:?00?????????????????????

說明:這里的 [conn_handle]為 1,[UUID] 為128位的 ebe0ccbe7a0a4b0c8a1a6ff2997da3a6,讀取到的數(shù)據(jù)值為 00

步驟四:柿餅派讀取米家藍牙溫濕度計數(shù)據(jù)顯示在界面上

感謝能堅持看到這里的每一個你,下面將會通過添加編寫部分功能代碼和創(chuàng)建 UI 工程,實現(xiàn)柿餅派讀取米家溫濕度計數(shù)據(jù)顯示在界面上的功能。接下來會貼一部分實現(xiàn)代碼和代碼說明,可能會有點乏味,但是盡可能把實現(xiàn)步驟描述得具體些,避免采坑。

1. 添加測試文件,參考代碼

2. 編譯固件,驗證功能

3. 創(chuàng)建 UI 工程,簡單布局

4. c-js 之間互通說明

5. UI 工程修改,驗證功能

1.添加測試代碼

在官方提供的 SDK中的project\firmware\applications目錄下添加ble_example.c文件,然后參考project\firmware\packages\rw007-v2.0.1\src\ble_cmd_rw007.c文件,主要拷貝幾個對應的函數(shù)。通過前面的可以了解到,需要(1)RW007 初始化為 BLE 主機模式 (2)RW007 連接米家藍牙溫濕度計2代設備 (3)RW007 通過 UUID 讀取米家藍牙溫濕度計2代設備的數(shù)據(jù) ,所以需要參考 BLE功能初始化、連接、通過 UUID 讀取數(shù)據(jù)的功能實現(xiàn)函數(shù)。

(1)在ble_example.c中添加 RW007 初始化為BLE主機模式的函數(shù)

1static?int?ble_example_init(void)2{3????rt_kprintf("ble_example_init\n");4????rt_uint8_t?roles?=?0;5????roles?=?RW007_BLE_INIT_ROLE_CENTRAL;67????rw007_ble_init(roles);89????rw007_ble_resp_handle_cb_reg(rw007_ble_resp_handle); 10????rw007_ble_ntf_handle_cb_reg(rw007_ble_ntf_handle); 11????return?0; 12 13}

由于在初始化函數(shù)中,需要注冊兩個回調(diào)函數(shù)rw007_ble_resp_handle 和 rw007_ble_ntf_handle,所以也要從project\firmware\packages\rw007-v2.0.1\src\ble_cmd_rw007.c文件中對應拷貝過來。

1static?void?rw007_ble_resp_handle(rt_uint16_t?resp_type,?void?*data,?rt_uint16_t?size)2{3????switch(resp_type)4????{5????????case?RW007_BLE_RSP_TYPE_INIT:6????????????rt_kprintf("RW007_BLE_RSP_TYPE_INIT\n");7????????????break;8????????case?RW007_BLE_RSP_TYPE_ADDR_GET:9????????????rt_kprintf("RW007_BLE_RSP_TYPE_ADDR_GET\n");10????????????ble_get_addr?*get_addr?=?(ble_get_addr?*)data;11????????????rt_kprintf("public_id_addr?=?%02x:%02x:%02x:%02x:%02x:%02x\n",?get_addr->public_id_addr[5],?get_addr->public_id_addr[4],12???????????????????????????????????????????????????????????????????????????get_addr->public_id_addr[3],?get_addr->public_id_addr[2],13???????????????????????????????????????????????????????????????????????????get_addr->public_id_addr[1],?get_addr->public_id_addr[0]);14????????????rt_kprintf("random_id_addr?=?%02x:%02x:%02x:%02x:%02x:%02x\n",?get_addr->random_id_addr[5],?get_addr->random_id_addr[4],15???????????????????????????????????????????????????????????????????????????get_addr->random_id_addr[3],?get_addr->random_id_addr[2],16???????????????????????????????????????????????????????????????????????????get_addr->random_id_addr[1],?get_addr->random_id_addr[0]);17????????????break;18????????case?RW007_BLE_RSP_TYPE_CONN_INFO_GET:19????????????rt_kprintf("RW007_BLE_RSP_TYPE_CONN_INFO_GET\n");20????????????break;21????????case?RW007_BLE_RSP_TYPE_CONN_UPD_PARAMS:22????????????rt_kprintf("RW007_BLE_RSP_TYPE_CONN_UPD_PARAMS\n");23????????????break;24????????case?RW007_BLE_RSP_TYPE_SCAN:25????????????rt_kprintf("RW007_BLE_RSP_TYPE_SCAN\n");26????????????break;27????????case?RW007_BLE_RSP_TYPE_CONNECT:28????????????rt_kprintf("RW007_BLE_RSP_TYPE_CONNECT\n");29????????????break;30????????case?RW007_BLE_RSP_TYPE_DISCONN:31????????????rt_kprintf("RW007_BLE_RSP_TYPE_DISCONN\n");32????????????break;33????????case?RW007_BLE_RSP_TYPE_GATT_DIS_FULL:34????????????rt_kprintf("RW007_BLE_RSP_TYPE_GATT_DIS_FULL\n");35????????????break;36????????case?RW007_BLE_RSP_TYPE_GATTC_SRV:37????????????rt_kprintf("RW007_BLE_RSP_TYPE_GATTC_SRV\n");38????????????break;39????????case?RW007_BLE_RSP_TYPE_GATTC_CHR:40????????????rt_kprintf("RW007_BLE_RSP_TYPE_GATTC_CHR\n");41????????????break;42????????case?RW007_BLE_RSP_TYPE_GATTC_DSC:43????????????rt_kprintf("RW007_BLE_RSP_TYPE_GATTC_DSC\n");44????????????break;45????????case?RW007_BLE_RSP_TYPE_MTU_EXCHANGE:46????????????rt_kprintf("RW007_BLE_RSP_TYPE_MTU_EXCHANGE\n");47????????????break;48????????case?RW007_BLE_RSP_TYPE_NOTIFY:49????????????rt_kprintf("RW007_BLE_RSP_TYPE_NOTIFY\n");50????????????break;51????????case?RW007_BLE_RSP_TYPE_WRITE:52????????????rt_kprintf("RW007_BLE_RSP_TYPE_WRITE\n");53????????????break;54????????case?RW007_BLE_RSP_TYPE_READ:55????????????rt_kprintf("RW007_BLE_RSP_TYPE_READ\n");56????????????break;57????????default:58????????????rt_kprintf("error?response\n");59????????????break;60????}61}62//?recv?slave?notity?handle63static?void?rw007_ble_ntf_handle(rt_uint16_t?ntf_type,?void?*data,?rt_uint16_t?size)64{65????switch(ntf_type)66????{67????????case?RW007_BLE_NTF_TYPE_CONN_UPD:68????????????rt_kprintf("RW007_BLE_NTF_TYPE_CONN_UPD\n");69????????????break;70????????case?RW007_BLE_NTF_TYPE_CONN_UPD_PARAMS:71????????????rt_kprintf("RW007_BLE_NTF_TYPE_CONN_UPD_PARAMS\n");72????????????break;73????????case?RW007_BLE_NTF_TYPE_DISC:74????????{75????????????struct?rw007_ble_gap_event_discov?*disc_desc?=?RT_NULL;76????????????char?*dicover_data?=?RT_NULL;7778????????????rt_kprintf("RW007_BLE_NTF_TYPE_DISCOVER\n");7980????????????disc_desc?=?(struct?rw007_ble_gap_event_discov?*)data;81????????????dicover_data?=?(char*)(disc_desc?+?1);8283????????????switch(disc_desc->discov_type)84????????????{85????????????????case?BLE_HCI_ADV_RPT_EVTYPE_ADV_IND:8687????????????????????break;88????????????????case?BLE_HCI_ADV_RPT_EVTYPE_DIR_IND:8990????????????????????break;91????????????????case?BLE_HCI_ADV_RPT_EVTYPE_SCAN_IND:9293????????????????????break;94????????????????case?BLE_HCI_ADV_RPT_EVTYPE_NONCONN_IND:9596????????????????????break;97????????????????case?BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP:9899????????????????????break; 100????????????} 101 102?????????????rt_kprintf("received?advertisement;?event_type=%d?rssi=%d?addr_type=%d?addr=", 103????????????????????????????????????????????????????????????????????disc_desc->discov_type, 104????????????????????????????????????????????????????????????????????disc_desc->rssi, 105????????????????????????????????????????????????????????????????????disc_desc->addr_type); 106????????????rt_kprintf("%02x:%02x:%02x:%02x:%02x:%02x\n",?disc_desc->addr[5],?disc_desc->addr[4], 107??????????????????????????????????????????????????????????disc_desc->addr[3],?disc_desc->addr[2], 108??????????????????????????????????????????????????????????disc_desc->addr[1],?disc_desc->addr[0]); 109????????????rt_kprintf("mfg_data?=?"); 110????????????for?(int?i?=?0;?i?<?disc_desc->length_data;?i++) 111????????????{ 112????????????????rt_kprintf("%02x?",?dicover_data[i]); 113????????????} 114????????????rt_kprintf("\n\n"); 115????????????break; 116????????} 117????????case?RW007_BLE_NTF_TYPE_CONNECT: 118????????{ 119????????????struct?rw007_ble_gap_event_connect?*connect_event; 120????????????struct?rw007_ble_conn_desc?*conn_desc; 121 122????????????rt_kprintf("RW007_BLE_NTF_TYPE_CONNECT\n"); 123 124????????????connect_event?=?(struct?rw007_ble_gap_event_connect?*)data; 125????????????conn_desc?=?(struct?rw007_ble_conn_desc*)(connect_event?+?1); 126 127????????????rt_kprintf("connect?event?status:?%d,?conn_handle:?%d\n",?connect_event->status,?connect_event->conn_handle); 128????????????rt_kprintf("our_id_type:%d?our_id_addr:?",?conn_desc->our_id_type); 129????????????_print_addr(conn_desc->our_id_addr); 130????????????rt_kprintf("\npeer_id_type:%d?peer_id_addr:?",?conn_desc->peer_id_type); 131????????????_print_addr(conn_desc->peer_id_addr); 132????????????rt_kprintf("\nconn_itv:%d,?conn_latency:%d,?conn_suptout:%d,?role:%d\n",?conn_desc->conn_itvl, 133????????????????????????????????conn_desc->conn_latency,?conn_desc->supervision_timeout,?conn_desc->role); 134????????????break; 135????????} 136????????case?RW007_BLE_NTF_TYPE_DISCONN: 137????????????rt_kprintf("RW007_BLE_NTF_TYPE_DISCONN\n"); 138????????????break; 139????????case?RW007_BLE_NTF_TYPE_MTU_EXCHANGE: 140????????????rt_kprintf("RW007_BLE_NTF_TYPE_MTU_EXCHANGE\n"); 141????????????break; 142????????case?RW007_BLE_NTF_TYPE_DISC_COMPLETE: 143????????????rt_kprintf("RW007_BLE_NTF_TYPE_DISC_COMPLETE\n"); 144????????????break; 145????????case?RW007_BLE_NTF_TYPE_ADV_COMPLETE: 146????????????rt_kprintf("RW007_BLE_NTF_TYPE_ADV_COMPLETE\n"); 147????????????break; 148????????case?RW007_BLE_NTF_TYPE_SUBSCRIBE: 149????????????rt_kprintf("RW007_BLE_NTF_TYPE_SUBSCRIBE\n"); 150????????????break; 151????????case?RW007_BLE_NTF_TYPE_NOTIFY_RX: 152????????????{ 153?????????????struct?rw007_ble_gap_event_notify_rx?*notify_rx; 154 155?????????????rt_kprintf("RW007_BLE_NTF_TYPE_NOTIFY_RX\n"); 156 157?????????????notify_rx?=?(struct?rw007_ble_gap_event_notify_rx?*)data; 158?????????????rt_kprintf("conn_handle:%d,?attr_handle:%d,?rcv?(%s)?length:%d,?data:\n", 159????????????????????????notify_rx->conn_handle,?notify_rx->attr_handle, 160????????????????????????notify_rx->indication???"indication"?:?"notification",?notify_rx->length_data); 161?????????????hex_dump((const?rt_uint8_t?*)(notify_rx?+?1),?notify_rx->length_data); 162????????????break; 163????????} 164????????default: 165????????????rt_kprintf("error?notify\n"); 166????????????break; 167????} 168}

(2) 添加 RW007連接米家藍牙溫濕度計2代設備的實現(xiàn)函數(shù)

1tatic?int?ble_example_connect(void)2{3????rt_kprintf("ble_example_connect\n");4????ble_addr_t?addr;5????addr.type?=?RW007_BLE_ADDR_PUBLIC;67????rt_kprintf("str_addr:?%s\n",?"A4:C1:38:35:52:94");89????_hexstrtoaddr("A4:C1:38:35:52:94",?addr.val); 10 11????rt_kprintf("mac?addr:?%2x:%2x:%2x:%2x:%2x:%2x\n",?addr.val[0],?addr.val[1], 12??????????????????????????????????????????????????????????addr.val[2],?addr.val[3], 13??????????????????????????????????????????????????????????addr.val[4],?addr.val[5]); 14 15????rw007_ble_connect(&addr); 16????return?0; 17}

說明:前面已經(jīng)通過 BLE 測試和手機的 BLE 調(diào)試助手可以知道米家藍牙溫濕度計2代設備的 mac 地址為A4:C1:38:35:52:94,所以這里直接固定設備的mac地址用于連接。

(3)RW007 通過 UUID 讀取米家藍牙溫濕度計2代設備的數(shù)據(jù)
?由于前面通過 BLE 測試連接上米家藍牙溫濕度計2代設備后,會主動收到來自米家藍牙溫濕度計2代設備的溫濕度數(shù)據(jù)的notify,并在rw007_ble_ntf_handle函數(shù)中打印輸出,現(xiàn)在需要解析接收到的溫濕度數(shù)據(jù),在rw007_ble_ntf_handle的函數(shù)中添加解析數(shù)據(jù)的功能。

c case RW007_BLE_NTF_TYPE_NOTIFY_RX: { struct rw007_ble_gap_event_notify_rx *notify_rx; char cRes[50] = {0}; ¨K60K

(4) 添加通過命令啟動函數(shù),測試功能

1static?int?ble_example_start(void)2{3????ble_example_init();4????rt_thread_delay(1000);5????ble_example_connect();6????rt_thread_delay(5000);7????return?0;89} 10MSH_CMD_EXPORT(ble_example_start,ble_example_start)

說明:這里加了一些延時是考慮到連接設備需要一些時間。

(5)編譯固件,燒錄驗證功能
編譯固件,給柿餅派升級固件后,通過在調(diào)試串口 msh中輸入ble_example_start命令進行啟動,啟動后便會連接米家藍牙溫濕度計2代設備,并把獲取到溫濕度數(shù)據(jù)進行解析,打印出來。

1msh?/>ble_example_start2ble_example_init3ble_example_connect4str_addr:?A4:C1:38:35:52:945mac?addr:?94:52:35:38:c1:a46ble?data?input?packet?resp_type:?1,?len:?467RW007_BLE_NTF_TYPE_CONNECT8connect?event?status:?0,?conn_handle:?19our_id_type:0?our_id_addr:?48:00:42:8c:47:c9 10peer_id_type:0?peer_id_addr:?a4:c1:38:35:52:94 11conn_itv:80,?conn_latency:0,?conn_suptout:256,?role:0 12ble?data?input?packet?resp_type:?1,?len:?13 13RW007_BLE_NTF_TYPE_NOTIFY_RX 14conn_handle:1,?attr_handle:54,?rcv?(notification)?length:5,?data: 1500000000:?47?0B?3B?B9?0A???????????????????????????????????G.;.. 16temp=2887?mC,hum=59%,v_bat=2745mV 17cres=temp=2887mC,hum=59%,v_bat=2745mV?

添加把數(shù)據(jù)傳遞到界面的實現(xiàn)函數(shù)(C-To-JS)

通過前面的步驟,已經(jīng)成功解析到了米家藍牙溫濕度計2代設備的溫濕度數(shù)據(jù),現(xiàn)在需要把這些數(shù)據(jù)顯示到 LCD 屏上,需要在 SDK 中參考示例代碼中的docs\src\PersimM3_JS_GUI_C_TransData\js_message_test.c進行數(shù)據(jù)的封裝傳到GUI 中。

(1)創(chuàng)建 module并初始化

需要創(chuàng)建添加module初始化便于 JS 中導入該模塊。

1static?js_object_t?js_message_obj?=?JS_ECMA_VALUE_UNDEFINED;2static?void?js_message_info_free(void?*native)3{4????js_message_obj?=?JS_ECMA_VALUE_UNDEFINED;5????rt_kprintf("==>?js_message_obj?=?JS_ECMA_VALUE_UNDEFINED;\n");6}78static?const?js_object_native_info_t?js_message_info?=9{ 10????.free_cb?=?js_message_info_free 11}; 12 13 14js_object_t?example_module_init(void) 15{ 16????js_object_t?obj?=?js_create_object(); 17 18????if?(js_resolve_error(obj)) 19????????return?js_create_null(); 20????rt_kprintf("==>?module_init\n"); 21 22????js_message_obj?=?obj; 23????js_emitter(js_message_obj,?js_create_undefined()); 24????js_set_property_native_pointer(js_message_obj,?"_free_cb",?NULL,?&js_message_info); 25 26????return?obj; 27} 28JS_MODULE(example_module,example_module_init)

注意:這里的example_module在 js 中

(2)封裝數(shù)據(jù)傳輸函數(shù)
在 C代碼層到JS腳本層主要是通過事件監(jiān)聽機制異步上報數(shù)據(jù)或觸發(fā)JS邏輯主動到C層取數(shù)據(jù);當前異步機制是通過GUI的消息隊列實現(xiàn),先往GUI的消息隊列發(fā)送消息,然后GUI收到對應消息后觸發(fā)監(jiān)聽回調(diào),所以需要js_message_send_data和js_callback_message函數(shù),可以直接從示例代碼中拷貝過來使用。

1static?rt_bool_t?js_message_send_data(const?char?*name,?js_object_t?data)2{3????rt_bool_t?ret?=?RT_FALSE;45????if?(js_context_lock()?!=?RT_EOK)6????????return?ret;7????rt_kprintf("==>?js_message_send_data?start\n");8?????if?(js_object_is_object(js_message_obj))9?????{ 10????????js_object_t?msg?=?js_create_object(); 11????????if?(!js_resolve_error(msg)) 12????????{ 13????????????js_set_string_property_value(msg,?"name",?name); 14????????????js_set_property_value(msg,?"data",?data); 15 16????????????ret?=?js_send_callback_func(js_callback_message,?msg); 17????????????js_release_object(msg); 18????????} 19????} 20????rt_kprintf("==>?js_message_send_data?end\n"); 21????js_context_unlock(); 22 23????return?ret; 24} 1static?rt_bool_t?js_callback_message(js_object_t?args)2{3????if?(js_context_lock()?!=?RT_EOK)4????????return?RT_FALSE;56????rt_kprintf("==>?js_callback_message?start\n");7????if?(js_object_is_object(js_message_obj))8????{9????????js_object_t?msg_name?=?js_get_property_value(args,?"name"); 10????????js_object_t?msg_data?=?js_get_property_value(args,?"data"); 11????????char?str_buf[JS_STRING_BUFFER_SIZE]; 12????????char?*name?=?js_object_to_string(msg_name,?str_buf,?JS_STRING_BUFFER_SIZE); 13????????if?(name) 14????????{ 15????????????js_event_emit(js_message_obj,?name,?&msg_data,?1); 16????????????if?(name?!=?str_buf) 17????????????????JS_FREE(name); 18????????} 19????????js_release_object(msg_data); 20????????js_release_object(msg_name); 21????} 22????js_release_object(args); 23????rt_kprintf("==>?js_callback_message?end\n"); 24????js_context_unlock(); 25 26????return?RT_TRUE; 27}

(3)在解析數(shù)據(jù)后把數(shù)據(jù)傳到界面顯示
在rw007_ble_ntf_handle的函數(shù)中添加把解析數(shù)據(jù)后把數(shù)據(jù)傳到界面顯示的功能,只需要使用js_message_send_data函數(shù)進行傳輸數(shù)據(jù)即可。

1????????case?RW007_BLE_NTF_TYPE_NOTIFY_RX:2????????????{3?????????????struct?rw007_ble_gap_event_notify_rx?*notify_rx;4?????????????char?cRes[50]?=?{0};56?????????????rt_kprintf("RW007_BLE_NTF_TYPE_NOTIFY_RX\n");78?????????????notify_rx?=?(struct?rw007_ble_gap_event_notify_rx?*)data;9?????????????rt_kprintf("conn_handle:%d,?attr_handle:%d,?rcv?(%s)?length:%d,?data:\n", 10????????????????????????notify_rx->conn_handle,?notify_rx->attr_handle, 11????????????????????????notify_rx->indication???"indication"?:?"notification",?notify_rx->length_data); 12?????????????hex_dump((const?rt_uint8_t?*)(notify_rx?+?1),?notify_rx->length_data); 13 14?????????????int32_t?temp?=?0xffff; 15?????????????int?hum?=?0xff; 16?????????????int32_t?v_bat?=?0xffff; 17 18?????????????rt_uint8_t?*ptr?=?(const?rt_uint8_t?*)(notify_rx?+?1); 19 20?????????????//Here?to?get?mi?tempture?data 21?????????????temp?=?0xffff?&?ptr[1]; 22?????????????temp?=?temp?<<?8; 23?????????????temp?=?temp?|?ptr[0]; 24?????????????hum?=?ptr[2]; 25?????????????v_bat?=?0xffff?&?ptr[4]; 26?????????????v_bat?=?v_bat?<<?8; 27?????????????v_bat?=?v_bat?|?ptr[3]; 28?????????????rt_kprintf("temp=%d?mC,hum=%d%,v_bat=%dmV\n",?temp,?hum,?v_bat); 29?????????????memset(cRes,0,sizeof(cRes)); 30?????????????sprintf(cRes,"temp=%dmC,hum=%d%%,v_bat=%dmV",?temp,?hum,?v_bat); 31?????????????rt_kprintf("cres=%s?\n",cRes); 32 33????????????if?(js_context_lock()?==?RT_EOK) 34????????????{ 35????????????????js_object_t?value?=string_to_js_object(cRes); 36????????????????js_message_send_data("mi_data",?value); 37????????????????rt_kprintf("value:%s\n",?value); 38????????????????js_release_object(value); 39????????????????js_context_unlock(); 40????????????} 41 42????????????break; 43????????}

說明:

需要注意js_message_send_data("mi_data", value);這里的mi_data,后面UI界面中將通過這個屬性來接收數(shù)據(jù)。

(4)編譯固件,燒錄程序。
根據(jù)前面的步驟操作,這里柿餅派的固件已經(jīng)準備好了,下面需要創(chuàng)建 UI 工程進行界面顯示米家藍牙溫濕度計2代設備的溫濕度數(shù)據(jù)。

創(chuàng)建 UI 工程顯示米家藍牙溫濕度計2代設備的溫濕度數(shù)據(jù)

關于UI界面工程的創(chuàng)建,這里不做具體說明,可以參考 SDK 目錄下docs\2-PersimM3_UI_Quick_Start.pdf文檔的操作,這里只說明核心部分的操作。

(1) UI 工程界面控件布局
由于這里只做數(shù)據(jù)顯示,所以僅需要放置幾個 Label控件,為了美觀些這里也特意放置了一些圖標和設置背景圖片。

(2) JS 代碼的編寫

主要通過require導入example_module,這里的example_module是前面C代碼中初始化過的,然后通過this.example_module.on("mi_data",function(data){});進行數(shù)據(jù)解析,并把數(shù)據(jù)更新到UI界面中。這里的mi_data也是需要與C代碼中配對使用的。

1var?page?=?{23????/*?此方法在第一次顯示窗體前發(fā)生?*/4????onLoad:?function?(event)?{5????????this.example_module?=?require("example_module");6????????console.dir(this.example_module);7????????var?that?=?this;8????????function?insertStr(soure,?start,?newStr)?{9????????????return?soure.slice(0,?start)?+?newStr?+?soure.slice(start); 10????????} 11 12????????this.example_module.on("mi_data",function(data){ 13 14????????????//temp=3205mC,hum=54%,v_bat=2766mV 15????????????//data_length:32 16????????????s_l1?=?data.indexOf(',') 17????????????temp_data?=data.substring(0,s_l1) 18????????????temp_value_l?=?temp_data.indexOf('=') 19????????????temp_value1?=?temp_data.substring(temp_value_l+1,temp_data.length?-2?) 20????????????temp_value=insertStr(temp_value1,2,"."); 21????????????s_l2?=?data.lastIndexOf(',') 22????????????hum_value?=?data.substring(s_l1+5,s_l2) 23????????????vbat_data?=??data.substring(s_l2+7,data.length?-2) 24????????????vbat_value=insertStr(vbat_data,1,"."); 25????????????that.setData({temp_value?:?temp_value+'℃'}); 26????????????that.setData({hum_value?:?hum_value}); 27????????????that.setData({bat_value?:?vbat_value+'V'}); 28????????}); 29????}, 30 31????/*?此方法展示窗體后發(fā)生?*/ 32????onResume:?function?(event)?{ 33 34????}, 35 36????/*?當前頁狀態(tài)變化為顯示時觸發(fā)?*/ 37????onShow:?function?(event)?{ 38 39????}, 40 41????/*?當前頁狀態(tài)變化為隱藏時觸發(fā)?*/ 42????onHide:?function?(event)?{ 43 44????}, 45 46????/*?此方法關閉窗體前發(fā)生?*/ 47????onExit:?function?(event)?{ 48 49????}, 50}; 51 52Page(page); 53 54page?=?0;

(3) 下載 UI 工程到柿餅派,體驗效果

UI 工程下載完成后,在 調(diào)試串口的msh命令行中輸入ble_example_start,然后觀察UI界面的效果。

1msh?/>ble_example_start2ble_example_init3ble_example_connect4str_addr:?A4:C1:38:35:52:945mac?addr:?94:52:35:38:c1:a46ble?data?input?packet?resp_type:?1,?len:?467RW007_BLE_NTF_TYPE_CONNECT8connect?event?status:?0,?conn_handle:?19our_id_type:0?our_id_addr:?48:00:42:8c:47:c9 10peer_id_type:0?peer_id_addr:?a4:c1:38:35:52:94 11conn_itv:80,?conn_latency:0,?conn_suptout:256,?role:0 12msh?/>ble?data?input?packet?resp_type:?1,?len:?13 13RW007_BLE_NTF_TYPE_NOTIFY_RX 14conn_handle:1,?attr_handle:54,?rcv?(notification)?length:5,?data: 1500000000:?28?0B?42?A9?0A???????????????????????????????????(.B.. 16temp=2856?mC,hum=66%,v_bat=2729mV 17cres=temp=2856mC,hum=66%,v_bat=2729mV? 18==>?js_message_send_data?start 19==>?js_message_send_data?end 20value: 21==>?js_callback_message?start 22==>?js_callback_message?end

此時,柿餅派的界面就顯示米家藍牙溫濕度計2代設備的溫濕度和電量的數(shù)據(jù)。

總結(jié)

經(jīng)過這次使用柿餅派上的 RW007 WIFI 模塊學習 BLE 功能的使用和讀取米家溫濕度計數(shù)據(jù)顯示在界面上的過程中,學會 RW007 上如何使用 BLE 功能和鞏固了柿餅派JS與C 之間的數(shù)據(jù)交互的操作,在這次僅是使用了BLE 的初始化和連接功能,希望在后面使用更多的功能制作更多有趣的作品與大家分享。

????RW007資料鏈接:

奶牛網(wǎng)盤 https://realthread.cowtransfer.com/s/274a38fde4b543

????RW007購買鏈接:

https://item.taobao.com/item.htm?&id=587364858221

口令(復制至X寶打開):5嘻6bLxXVYVZEv嘻 https://m.tb.cn/h.4rai8N8?sm=35e672 ?RW007 高速WIFI模塊 SPI ?物聯(lián)網(wǎng) 透傳模塊 無線模塊

你可以添加微信17775982065為好友,注明:公司+姓名,拉進 RT-Thread 官方微信交流群!

???????????? 點擊閱讀原文進入官網(wǎng)

總結(jié)

以上是生活随笔為你收集整理的【RW007系列综合实战3】柿饼派上怎样更新RW007固件和驱动?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。