android 蓝牙 发送字符串,Android向TLSR8266蓝牙mesh发送指令
硬件環境:Mac,ArduinoUNO板,JDY-10M模塊(核心為TLSR8266)*2。
軟件環境:arduino-1.8.12-macosx,AndroidStudio。
需求:將兩個TLSR8266組成藍牙mesh網絡,通過安卓app向其發送指令,間接實現遠程控制led燈的開關。
TLSR8266初始化
根據商家提供的資料看,當兩個模塊的NAME和NETID相同且MAC不同時,它們就在同一個mesh網絡內。所以先設置這3個參數。
首先根據JDY-10M的相關引腳和ArduinoUNO板連接,通過串口發送AT指令設置藍牙芯片。如下圖連接,圖示也是本例測試的連接方式,每個芯片控制一個led燈。
分別連接兩個芯片,使用ArduinoIDE的串口
1).發送“AT+NAMEmeshok”將兩個芯片的NAME 都 設置為“meshok”,
2).發送“AT+NETID202001170257”將兩個芯片的NETID 都 設置為“202001170257”,NETID長度為12位,字母數字均可。
3).連接芯片1,發送“AT+MACAA”將其MAC地址的最后一字節設為“AA”,兩個芯片的其它字節如果不相同則可以忽略。
.連接芯片2,發送“AT+MACBB”將其MAC地址的最后一字節設為“BB”,
4).設置完三個參數,須要發送“AT+REST”重啟芯片。
這一步操作可以參考 http://www.gaohaiyan.com/2525.html 。
安卓控制mesh
兩個模塊都通電,此時即在同一mesh網絡內了。連接某個藍牙,既可以發送mesh指令。
注意本例,JDY-10M模塊的6個針腳不足以能驗證mesh功能。須要手動將核心板的OUT口引出接一個LED。參考前面2張圖片。通過其它口測試也是可以的,具體可以參考相關文檔,TLSR8266文檔對專業人士來講很容易閱讀,但新手可能就需要此文這種范例做個引導。文檔在文末提供下載鏈接,也可以到某寶搜關鍵字查看商品詳情頁,很多商家都提供網盤下載。
安卓上藍牙的操作參考 http://www.gaohaiyan.com/2554.html 。這里只貼出部分不同的代碼。
首先,指令為字符串,格式為16進制表示的,須要轉為字節數組發送:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* tlsr8266接收16進制的字符串指令
* args cmd 16進制的字符串指令,如FBFFE7F000
*/
publicstaticbyte[]hexStringToByteArray(Stringcmd){
if(cmd==null||cmd.equals("")){
returnnull;
}
cmd=cmd.toUpperCase();
intlen=cmd.length();
byte[]bytes=newbyte[len/2];
for(inti=0;i
bytes[i/2]=(byte)((Character.digit(cmd.charAt(i),16)<<4)+Character.digit(cmd.charAt(i+1),16));
}
returnbytes;
}
然后,就是各種指令:
Java
1
2
3
4
5
6
7
8
9
10
11
/**
* 向藍牙模塊發消息
*
* @param listener
* @param msg
*/
publicvoidsendMsgToBlueTooth(OnCharacteristicWritedListenerlistener,Stringmsg){
onCharacteristicWritedListener=listener;
bluetoothHandlerCharacteristic.setValue(hexStringToByteArray(msg));
currentBluetoothGatt.writeCharacteristic(bluetoothHandlerCharacteristic);// 回調BluetoothGattCallback的onCharacteristicWrite方法
}
幾個簡單指令說明:
“FBFFE7F000”表示操作mesh中全部的芯片,關閉全部的IO口,此時全部的led燈關閉;
“FBFFE7FFFF”表示操作mesh中全部的芯片,打開全部的IO口,此時全部的led燈點亮。
“FBAAE7F000”表示操作mesh中,MAC最后一字節為AA的芯片,關閉其全部的IO口;
“FBAAE7FFFF”表示操作mesh中,MAC最后一字節為AA的芯片,打開其全部的IO口。
“FBAAE7F101”表示操作mesh中,MAC最后一字節為AA的芯片,打開其OUT1口,這樣操作只有OUT1到OUT4,具體看文檔。
“FBAAE7F100”表示操作mesh中,MAC最后一字節為AA的芯片,關閉其OUT1口,這樣操作只有OUT1到OUT4,具體看文檔。
無論app藍牙連接是芯片1(AA)還是芯片2(BB),已連接芯片會將指令無差別廣播到mesh網絡,每個芯片收到后根據自身屬性匹配;FBFFE7F000和FBFFE7FFFF指令則都響應。
芯片文檔:https://download.csdn.net/download/Vigiles/12332754
app代碼:https://gitee.com/vigiles/BluetoothMesh
Arduino端參考代碼
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
#include
// 10進制數字轉16進制表示的字符
StringtenToHex(intn){
if(n==0){
return"00";//n為0
}
Stringresult="";
char_16[]={
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
};
constintradix=16;
while(n){
inti=n%radix;// 余數
result=_16[i]+result;// 將余數對應的十六進制數字加入結果
n/=radix;// 除以16獲得商,最為下一輪的被除數
}
if(result.length()<2){
result='0'+result;//不足兩位補零
}
returnresult;
}
// (參數pin1-Arduino的RXD,參數pin2-Arduino的TXD)
SoftwareSerialBT(7,6);// 創建藍牙模塊控制對象。第一個pin接模塊的TX腳,第二個接藍牙的RX腳
Stringstring="";
voidsetup(){
Serial.begin(115200);
Serial.println("Arduino好了");
BT.begin(115200);
Serial.println("Bluetooth好了");
}
voidloop(){
string="";
if(Serial.available()){
while(Serial.available()){
chardata=Serial.read();
delay(5);
//BT.write(data); // 如果向esr8266寫AT無反應,注釋此行
string+=data;
}
BT.println(string);// 如果向esr8266寫AT無反應,打開此行
Serial.println("Arduino:"+string);
}
string="";
if(BT.available()){
while(BT.available()){
chardata=BT.read();// 查看Android發來的指令信息,數據類型使用int
delay(5);
//string += tenToHex(data);??// 查看Android發來的指令信息打開此行
string+=data;// 查看Android發來的指令信息注釋此行
}
Serial.println("Bluetooth:"+string);
}
}
-end
承接App定制、企業web站點、辦公系統軟件 設計開發,外包項目,畢設
總結
以上是生活随笔為你收集整理的android 蓝牙 发送字符串,Android向TLSR8266蓝牙mesh发送指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给cad文件加密的软件,CAD文件加密软
- 下一篇: android sina oauth2.