相較于WiFi技術(shù),低功耗藍(lán)牙BLE技術(shù)具有搜索連接速度快、超低功耗等特點(diǎn),BLE搭配mesh技術(shù)所延伸的藍(lán)牙m(xù)esh技術(shù)因其支持多點(diǎn)對(duì)多點(diǎn)連接、物理覆蓋區(qū)域廣闊,也被廣泛用于智能家居中控、智能安防、智慧樓宇等物聯(lián)網(wǎng)設(shè)備上。
XR806是一款支持BLE 5.0、支持完整低功耗藍(lán)牙服務(wù)GATT、支持SIG mesh完整協(xié)議棧的無(wú)線芯片,同樣適配物聯(lián)網(wǎng)設(shè)備的使用場(chǎng)景需求,在通過(guò)官方文檔的指引下配置好XR806的RTOS環(huán)境后,可按文章介紹步驟進(jìn)行后續(xù)的藍(lán)牙m(xù)esh互傳及藍(lán)牙單向穿透的功能測(cè)試。
藍(lán)牙m(xù)esh互傳
最新的藍(lán)牙m(xù)esh1.1引入了定向轉(zhuǎn)發(fā)路由功能,擴(kuò)大射頻覆蓋范圍,使信號(hào)一級(jí)級(jí)中繼下去,手頭有nRF52840開(kāi)發(fā)板,不妨和全志XR806進(jìn)行組網(wǎng),測(cè)試兼容性和互操作性,也驗(yàn)證XR806 mesh協(xié)議棧的完成度。先看效果:
nRF52840用Segger Embedded Studio打開(kāi)工程:
nrf5SDKforMeshv320srcexampleslight_switchserver
同時(shí)燒錄協(xié)議棧和APP;XR806為觀察到現(xiàn)象,將mesh例程的收到mesh opcode的回調(diào)接口加個(gè)指示信號(hào),具體為:
static void gpio_output_init(void) { GPIO_InitParam param; param.driving = GPIO_DRIVING_LEVEL_1; param.mode = GPIOx_Pn_F1_OUTPUT; param.pull = GPIO_PULL_NONE; HAL_GPIO_Init(GPIO_OUTPUT_PORT, GPIO_OUTPUT_PIN, ¶m);//PA21 } /***************Onoff Configuration Declaration*******************/ static void app_onoff_srv_set_cb(const struct bt_mesh_model *model, uint8_t onoff, uint8_t target_onoff, const struct bt_mesh_transition_status *opt) { g_onoff_value = onoff; HAL_GPIO_WritePin(GPIO_OUTPUT_PORT, GPIO_OUTPUT_PIN, onoff ? GPIO_PIN_HIGH : GPIO_PIN_LOW); printf("[app] onoff set(%d)", onoff); if (opt) { printf("target onoff(%d), total_steps(%d), steps(%d)", target_onoff, opt->total_steps, opt->present_steps); } printf(" "); }
編譯完后將mesh_demo燒錄進(jìn)XR806中,將XR806的GenericOnOff Server訂閱到publisher的發(fā)布地址,就能實(shí)現(xiàn)同一網(wǎng)絡(luò)(具備同一網(wǎng)絡(luò)密鑰可以正確解析出mesh消息)內(nèi)的消息傳遞。
此時(shí)用nRF Mesh去給nRF52840和XR806分別入網(wǎng)和設(shè)置訂閱地址,本次將他們訂閱到0xC000。
由于入網(wǎng)過(guò)程沒(méi)有錄制下來(lái),且XR806無(wú)法退網(wǎng),且入網(wǎng)信息暫時(shí)沒(méi)找到擦除方法,這樣重新燒錄還是保持入網(wǎng)狀態(tài)而無(wú)法回到unprovisioned狀態(tài)。
nRF52840接到JlinkRTT Viewer,XR806接到putty,可以看到XR806的Controller/host協(xié)議棧的版本信息,手機(jī)發(fā)布一條開(kāi)關(guān)(由GernericOnOff元素統(tǒng)屬)消息,泛洪給兩臺(tái)射頻設(shè)備,可以在各自控制臺(tái)看到都有收到set opcode網(wǎng)絡(luò)消息。
藍(lán)牙穿透(單向)
有時(shí)無(wú)線透?jìng)髟跓o(wú)法布線時(shí)有很方便的效用,不妨試試藍(lán)牙透?jìng)?,效果如下?/p>
具體是無(wú)線數(shù)據(jù)->串口數(shù)據(jù),串口數(shù)據(jù)->無(wú)線數(shù)據(jù),目前前者實(shí)現(xiàn)了,后者還有些問(wèn)題未解決,
實(shí)現(xiàn)過(guò)程如下,基于工程:
demo/Bluetooth/peripheral_demo改成peripheral_uart_demo
同時(shí)目錄下文件里工程名也進(jìn)行修改:
peripheral_uart_demo/gcc/defconfig改成peripheral_uart_demo
然后引入串口讀寫(xiě)?yīng)毩⒔涌诩窗裠emo/at_demo下的serial.c、serial.h、serial_debug.h復(fù)制到剛才peripheral_uart_demo工程下,由于要無(wú)線寫(xiě)以及串口寫(xiě)轉(zhuǎn)無(wú)線,所以profile涉及到write_without_rsp和notify,具體配置為:
static struct bt_gatt_attr vnd_attrs[] = { /* Vendor Primary Service Declaration */ BT_GATT_PRIMARY_SERVICE(&vnd_uuid), BT_GATT_CHARACTERISTIC(&vnd_enc_uuid.uuid, BT_GATT_CHRC_WRITE_WITHOUT_RESP | BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_WRITE, NULL, write_without_rsp_vnd, &vnd_value), BT_GATT_CCC(vnd_ccc_notify_changed, BT_GATT_PERM_READ|BT_GATT_PERM_WRITE), };
寫(xiě)回調(diào)接口為:
/**********************vnd_write_cmd_uuid*****************************/ static ssize_t write_without_rsp_vnd(struct bt_conn *conn, const struct bt_gatt_attr *attr, const void *buf, uint16_t len, uint16_t offset, uint8_t flags) { uint8_t *value = attr->user_data; /* Write request received. Reject it since this char only accepts * Write Commands. */ if (!(flags & BT_GATT_WRITE_FLAG_CMD)) { return BT_GATT_ERR(BT_ATT_ERR_WRITE_REQ_REJECTED); } if (offset + len > sizeof(vnd_value)) { return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET); } memset(value, 0, sizeof(vnd_value)); memcpy(value + offset, buf, len); serial_write(value + offset, len); *(value + offset + len) = '?'; printf(" write_without_rsp_vnd"); return len; }
串口轉(zhuǎn)無(wú)線回調(diào)(有問(wèn)題):
static void vnd_notify(void) { static uint8_t vnd[MAX_LONG_DATA]; uint16_t len=0; if (!vnd_notif_enabled) return; printf(" notify "); serial_read(vnd_notify_value,len); if(len>MAX_LONG_DATA || len==0) return; memcpy(vnd, vnd_notify_value, len); printf(" vnd_notify "); bt_gatt_notify(NULL, &vnd_svc.attrs[1], vnd, sizeof(vnd)); }
然后在bt_app_init函數(shù)里加入透?jìng)骺赨ART1的初始化代碼即可:
serial_init(SERIAL_UART_ID, 115200, UART_DATA_BITS_8, UART_PARITY_NONE, UART_STOP_BITS_1, 0); serial_start();
審核編輯:湯梓紅
-
藍(lán)牙
+關(guān)注
關(guān)注
114文章
5751瀏覽量
169595 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2900文章
44062瀏覽量
370236 -
WIFI
+關(guān)注
關(guān)注
81文章
5280瀏覽量
203085 -
Mesh
+關(guān)注
關(guān)注
5文章
194瀏覽量
29745 -
無(wú)線芯片
+關(guān)注
關(guān)注
1文章
78瀏覽量
23874
原文標(biāo)題:物聯(lián)網(wǎng)設(shè)備人柱力,XR806藍(lán)牙m(xù)esh互傳及單向穿透功能測(cè)試
文章出處:【微信號(hào):gh_79acfa3aa3e3,微信公眾號(hào):全志在線】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論