【RW007系列综合实战3】柿饼派上怎样更新RW007固件和驱动?
前面已經(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 設備初始化為從機設備
注意:目前不支持使用從機模式。
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:00BLE 功能掃描設備
目前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í)行此命令。
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:4cBLE 功能設備斷開連接
目前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_DISCONNBLE 功能寫數(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¬ification 21:enable?notification,disable?indication 32:enable?indication,?disable?notification 43:enable?indication?¬ification[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ù)進行解析,打印出來。
添加把數(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ù),可以直接從示例代碼中拷貝過來使用。
(3)在解析數(shù)據(jù)后把數(shù)據(jù)傳到界面顯示
在rw007_ble_ntf_handle的函數(shù)中添加把解析數(shù)據(jù)后把數(shù)據(jù)傳到界面顯示的功能,只需要使用js_message_send_data函數(shù)進行傳輸數(shù)據(jù)即可。
說明:
需要注意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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 组件测试 软件,测试AUTOSAR软件组
- 下一篇: 原创超简单代码(1.19.80)