Bt特征碼
private static final UUID SERVICE_UUID = UUID.fromString("0000a601-0000-1000-8000-00805f9b34fb");
private static final UUID WRITE_UUID = UUID.fromString("0000a611-0000-1000-8000-00805f9b34fb");
private static final UUID READ_UUID = UUID.fromString("0000a621-0000-1000-8000-00805f9b34fb");
消息協(xié)議
通信協(xié)議消息格式分為起始標(biāo)志位、消息頭、消息體、校驗(yàn)位、結(jié)束標(biāo)志位五部分。
| header 1 | header 2 | header3 |
|---|---|---|
| row 1 col 1 | row 1 col 2 | |
| row 2 col 1 | row 2 col 2 |
1) 起始標(biāo)志位:標(biāo)志整個(gè)協(xié)議數(shù)據(jù)的開始。本協(xié)議規(guī)定使用0xFD作為協(xié)議起始標(biāo)志位;
2) 消息頭:消息頭固定4個(gè)字節(jié),包括應(yīng)答碼、消息類型、消息體長度;
3) 消息體:實(shí)際傳輸?shù)挠行?nèi)容;
4) 校驗(yàn)位:為了校驗(yàn)數(shù)據(jù)完整性和有效性,校驗(yàn)單元不包括起始標(biāo)志位,僅校驗(yàn)消息頭和消息體,本協(xié)議規(guī)定校驗(yàn)單元使用CRC16;(代碼見附錄)
5) 結(jié)束標(biāo)志位:標(biāo)志整個(gè)協(xié)議數(shù)據(jù)的結(jié)束。本協(xié)議規(guī)定使用0xFD作為協(xié)議結(jié)束標(biāo)志位。
6) 控制數(shù)據(jù)包中除了起始標(biāo)志位和結(jié)束標(biāo)志位外,凡是出現(xiàn)0xFD必須進(jìn)行轉(zhuǎn)義,0xFD轉(zhuǎn)義為0x5DF7,0x5D轉(zhuǎn)義為0x5DE7。
備注:使用起始標(biāo)志位和結(jié)束標(biāo)志位的原因。
網(wǎng)絡(luò)傳輸過程中,可能因?yàn)槟承┮蛩氐挠绊懀瑓f(xié)議數(shù)據(jù)間可能會(huì)出現(xiàn),連包,分包。為了方便處理連包或者分包數(shù)據(jù),本協(xié)議使用起始標(biāo)志和結(jié)束標(biāo)志來處理這些異?,F(xiàn)象,確保每一幀(每一包)數(shù)據(jù)均能正常發(fā)送到服務(wù)器并且被正確解析,同時(shí)保證數(shù)據(jù)的完整性。
轉(zhuǎn)義:從起始標(biāo)志位到結(jié)束標(biāo)識(shí)位之間的所有數(shù)據(jù)均需要做轉(zhuǎn)義處理,以保證任何有效數(shù)據(jù)包僅起始標(biāo)志位和結(jié)束標(biāo)識(shí)位為0XFD。具體轉(zhuǎn)義方法:
所有0XFD -> 0x5D 0XF7;
所有0X5D -> 0x5D 0XE7;
轉(zhuǎn)義順序:發(fā)送:先校驗(yàn)后轉(zhuǎn)義。(向外發(fā))
接收:先轉(zhuǎn)義后校驗(yàn)。(接收數(shù)據(jù))