硬件环境: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发送指令相关推荐

  1. C#中使用SendMessage进行进程通信,可发送字符串,结构体(不能发送类类型)。

    发送时只能以结构体形式发送,类的话会提示"指定结构必须能直接复制到本机结构中,或是具有布局信息 "的错误提示 以下两种结构体示例都可以被发送 public struct A     ...

  2. android消息发送字符串,android - 从Android客户端通过HTTP在HL7消息中发送base64字符串时遇到错误 - 堆栈内存溢出...

    我正在android客户端(API 17)中使用HL7消息,并使用Hapi库生成和解析HL7消息.当我传输小的字符串值时,该消息工作正常. 但是我必须通过Http将图像发送到HL7服务器,为此,我正在 ...

  3. android 上传字符串,Android中发送Http请求(包括文件上传、servlet接收)的实例代码...

    /** * 通过拼接的方式构造请求内容,实现参数传输以及文件传输 * @param actionUrl * @param params * @param files * @return * @thro ...

  4. android emoji 转字符串,android Emoji的处理

    1.输入监听emoji,然后拦截掉 /** * 将系统表情转化为字符串 * * @param s * @return */ public static boolean havaEmoji(String ...

  5. android 表示空字符串,Android Logcat获取空字符串时非常奇怪的行为

    这是一个有趣的问题.我只是在LogRabbit中尝试过,并且能够看到相同的结果. 我快速浏览了android源代码,看到Log.W(-)最终以本机代码显示并在logd_write.c中得到处理 这基本 ...

  6. android获取未知字符串,android – 未知的URL内容:// downloads / my_dow...

    我正在使用Download Manger下载一些多媒体文件并对其进行分类.我也在使用Crashlytics,这是一个错误,我经常在不同的设备和Android版本上得到它.我正在寻找你的解决方案/建议! ...

  7. android 去空字符串,android – TextUtils.isEmpty()方法为空字符串返回false

    对于空字符串,它应该返回true. 从TextUtils的源代码: public static boolean isEmpty(@Nullable CharSequence str) { if (st ...

  8. android读取xml 字符串,Android 读取本地Xml文件,并转换成String

    问题 不是解析本地 xml 文件, 而是要将 xml 文件中的所有内容(包含格式,标签等),直接转换成 String. 与前端H5页面交互时, iOS 在请求远程 xml 文件耗时太长(有时需要4~5 ...

  9. android开发蓝牙传输图片,如何发送/接收文本和图片通过蓝牙android到另一个android手机...

    我假设你已经在开发Android的蓝牙应用的经验. Android蓝牙API不直接支持OBEX,意味着我无法将任何文件直接推送到任何设备. Android蓝牙API提供诸如发现,连接和使用流的数据传输 ...

  10. Android 中文API (70) —— BluetoothDevice[蓝牙]

    前言 本章内容是 android.bluetooth.BluetoothDevice,为Android蓝牙部分的章节翻译.蓝牙设备类,代表了蓝牙通讯国足中的远端设备.版本为 Android 2.3 r ...

最新文章

  1. 一文图解卡尔曼滤波(Kalman Filter)
  2. AppDynamics赵宇辰:硅谷APM独角兽,打造DevOps领域的智能大脑
  3. docker $PWD路径_使用docker炼丹
  4. .NET开发者提高编程技能的5种方法
  5. jdbc工具类2..0
  6. 1.LeetCode字符编辑距离
  7. python初级爬虫工程师_如何入行爬虫工程师
  8. ArcGIS10.2的详细安装过程和下载方法
  9. 单循环比赛规则-java
  10. java单例设计模式懒汉_java单例设计模式之懒汉模式
  11. 码云的注册与使用,很简单
  12. win10计算机方差,标准差计算工具
  13. ccf-csp历届第一题题解 (一)14-17年 (ง •_•)ง
  14. matlab景深合成算法,关于景深合成,你想知道的都在这儿!
  15. Briarcliff Entertainment 购买了关于开创性的非裔美国 NBA 球员的电视剧“Sweetwater”(独家)
  16. windows常见开机报错码以及解决方法
  17. 小程序弹框wx.showModal、wx.showActionSheet、wx.showToast
  18. 小目标检测的相关挑战与问题
  19. 开启人工智能的大门,引领AI时代
  20. intval()很重要

热门文章

  1. android6.0加内存卡,Android 6.0 TF卡 手机扩容的新选择
  2. 【终终极版】linux(Ubuntu)下wineQQ的安装办法
  3. navicat导入sql语句
  4. VMware Cloud Director 10.3.1 - 云计算调配和管理平台
  5. 防治计算机病毒教案,小学信息技术教案:《防治计算机病毒-计算机病毒》
  6. [转帖]常用项目管理软件介绍
  7. 西门子PLC S7-300紧凑型简介
  8. 重读模电教材一_童诗白、华成英
  9. 3.6-WizNote 常用快捷键
  10. matlab新建文件夹