硬件环境: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进制表示的,须要转为字节数组发送:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * tlsr8266接收16进制的字符串指令 * args cmd 16进制的字符串指令,如FBFFE7F000 */ public static byte[] hexStringToByteArray(String cmd) { if (cmd == null || cmd.equals("")) { return null; } cmd = cmd.toUpperCase(); int len = cmd.length(); byte[] bytes = new byte[len / 2]; for (int i = 0; i < len; i += 2) { bytes[i / 2] = (byte) ((Character.digit(cmd.charAt(i), 16) << 4) + Character.digit(cmd.charAt(i + 1), 16)); } return bytes; } |
然后,就是各种指令:
1 2 3 4 5 6 7 8 9 10 11 |
/** * 向蓝牙模块发消息 * * @param listener * @param msg */ public void sendMsgToBlueTooth(OnCharacteristicWritedListener listener, String msg) { 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端参考代码
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 <SoftwareSerial.h> // 10进制数字转16进制表示的字符 String tenToHex(int n) { if (n == 0) { return "00"; //n为0 } String result = ""; char _16[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; const int radix = 16; while (n) { int i = n % radix; // 余数 result = _16[i] + result; // 将余数对应的十六进制数字加入结果 n /= radix; // 除以16获得商,最为下一轮的被除数 } if (result.length() < 2) { result = '0' + result; //不足两位补零 } return result; } // (参数pin1-Arduino的RXD,参数pin2-Arduino的TXD) SoftwareSerial BT(7, 6); // 创建蓝牙模块控制对象。第一个pin接模块的TX脚,第二个接蓝牙的RX脚 String string = ""; void setup() { Serial.begin(115200); Serial.println("Arduino好了"); BT.begin(115200); Serial.println("Bluetooth好了"); } void loop() { string = ""; if (Serial.available()) { while (Serial.available()) { char data = 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()) { char data = BT.read(); // 查看Android发来的指令信息,数据类型使用int delay(5); //string += tenToHex(data); // 查看Android发来的指令信息打开此行 string += data; // 查看Android发来的指令信息注释此行 } Serial.println("Bluetooth:" + string); } } |
-end
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/2607.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设