(SKU: TEL0118)Gravity: UART OBLOQ - IoT 物联网模块
[[文件:|thumb|300px|right|Gravity: OBLOQ 物联网模块]]
目录 |
简介
物联网是将嵌入式系统技术、移动技术、网页技术全都融合在一起的,其发展的灵魂是以用户体验为核心,特点是与硬件、网络、平台、服务等完全不同的产业领域的相关者直接合作或者融合。
随着物联网的发展,其热度不断增加,目前国内外已有多个成熟物联网平台,但绝大部分物联网平台都是面向专业开发人员,操作复杂,上手困难。为此我们推出了OBLOQ物联网模块,搭配DFRobot自有的物联网平台,大大降低了物联网的使用门槛。
OBLOQ是一款基于ESP8266设计的IIC接口转WIFI物联网模块,用以接收和发送物联网信息。尺寸紧凑,价格低,接口简单,即插即用,适用于3.3V~5V的控制系统。软件编程简单,无需复杂的基础知识,就能迅速搭建出一套物联网应用。
板载固件升级开关,可方便的进行固件的升级。
技术规格
- 供电电压:3.3~5.0V
- 工作电流:<240mA
- 接口类型:Gravity UART 4PIN
- 接口速率:9600
- 无线模式:IEEE802.11b/g/n
- 加密类型:WPA WPA2/WPA2–PSK
- 无线频率:2.4GHz
- 产品尺寸:35mm * 32mm / 1.38inch * 1.26inch
- 内置协议:TCP/IP 协议栈
引脚说明
|
|
EASY IOT教程
OBLOQ模块具备的两个基础功能:发送数据到物联网和接收物联网数据。下面通过实验演示这两个功能:
- Arduino读取温度传感器LM35数据,通过OBLOQ模块发送温度数据到物联网设备。
- 物联网设备发送数据,OBLOQ接收数据并发送给Arduino,Arduino再通过串口显示接收的数据。
扩展程序,可实现更强大的功能,如:监听多个设备(一个OBLOQ最多监听5个物联网设备),发送多个传感器数据,远程控制继电器,小灯,风扇等等设备。
准备工作
- 硬件准备
- 1 x Arduino UNO控制板
- 1 x 模拟LM35线性温度传感器
- 1 x OBLOQ模块
- 若干 连接线
- 软件
- Arduino IDE (1.0.x或1.8.x), 点击下载Arduino IDE,下载完成后安装!
- makecode库地址:https://github.com/DFRobot/pxt-ObloqV1
- 创建物联网设备
- 点击链接:物联网,注册账号并登陆。
- 登录后,点击菜单栏的工作间,进入工作间后可点击“+”号创建物联网设备,程序中通过绑定设备的Topic来完成对特定设备的消息发送和接收。
- 下面演示创建一个设备Button:
- 1.进入菜单栏工作间
- 2.点击“+”号创建物联网设备,创建成功会出现一个新设备,第一次创建设备名为新设备1
- 3.将鼠标移动至设备名,会出现铅笔状小图标,点击铅笔小图标可修改设备名,修改为Button。
- 4.记录账号相关信息:Iot_id(user),Iot_pwd(password),Client ID和设备Topic,其中Iot_id和Iot_pwd可点击左侧状态栏的小眼睛图标查看。
- 硬件连接
OBLOQ模块的TX,RX,GND和VIN引脚分别连接到Arduino UNO的D10,D11,GND和VCC引脚,温度传感器LM35连接到A0引脚。可通过修改程序来自定义相关引脚,此次测试硬件连接参考下图:
Mind+(基于Scratch3.0)图形化编程
1、下载及安装软件。下载地址:http://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装
2、切换到“上传模式”。 详细教程:Mind+基础wiki教程-上传模式编程流程
3、“扩展”中选择“主控板”中的“Arduino Uno” ,扩展小模块选择“通信模块”中的“OBLOQ物联网模块”。 详细教程:Mind+基础wiki教程-加载扩展库流程
4、进行编程,程序如下图:
5、菜单“连接设备”,“上传到设备”
注意:
1、需点击"OBLOQ初始化"上的齿轮图标设置wifi和easyiot网站参数。
2、绿色引脚只能选择2或者3号引脚。
3、上传完毕点击软件右下方小黑窗(串口监视器),点击打开串口,即可查看从网页上发送的数据。
4、可以使用小程序查看数据了,微信小程序中搜索“easyiot”即可。
Arduino ide代码编程
发送传感器数据
实现功能:Arduino读取温度传感器LM35数据,通过OBLOQ模块发送温度数据到物联网设备。修改代码中以下信息,然后烧录代码到Arduino UNO。
//you need change all these according to your own situations #define WIFISSID "DFRobot-guest" //wifi账号 #define WIFIPWD "dfrobot@2017" //wifi密码 #define SERVER "iot.dfrobot.com.cn" //Iot主机地址,此处不用更改 #define PORT 1883 //Iot连接端口,此处不用更改 #define IOTID "r1qHJFJ4Z" //iot_id,创建设备的时候记录的相关信息 #define IOTPWD "SylqH1Y1VZ" //iot_pwd,创建设备的时候记录的相关信息 ... ... publish("Hy6z0Pb1G",(String)temperature); ; //向Hy6z0Pb1G设备发送温度数据 ... |
- 样例代码
/*代码内容简介:每隔一段时间,向指定DF-IoT物联网设备发送消息,消息内容是此时读取的LM35温度数据*/ #include <Arduino.h> #include <SoftwareSerial.h> #define WIFISSID "DFRobot-guest" #define WIFIPWD "dfrobot@2017" #define SERVER "iot.dfrobot.com.cn" #define PORT 1883 #define IOTID "r1qHJFJ4Z" #define IOTPWD "SylqH1Y1VZ" const String separator = "|"; bool pingOn = true; bool obloqConnectMqtt = false; static unsigned long pingInterval = 2000; static unsigned long sendMessageInterval = 10000; unsigned long previousPingTime = 0; unsigned long previousSendMessageTime = 0; //wifi异常断开检测变量 bool wifiConnect = false; bool wifiAbnormalDisconnect = false; //mqtt因为网络断开后重新连接标志 bool mqttReconnectFlag = false; SoftwareSerial softSerial(10,11); enum state{ WAIT, PINGOK, WIFIOK, MQTTCONNECTOK }obloqState; /******************************************************************************************** Function : sendMessage Description : 通过串口向OBLOQ发送一次消息 Params : 无 Return : 无 ********************************************************************************************/ void sendMessage(String message) { softSerial.print(message+"\r"); } /******************************************************************************************** Function : ping Description : 通过串口向OBLOQ发送一次字符串"|1|1|",尝试与OBLOQ取得连接 Params : 无 Return : 无 ********************************************************************************************/ void ping() { String pingMessage = "|1|1|"; sendMessage(pingMessage); } /******************************************************************************************** Function : connectWifi Description : 连接wifi Params : ssid 连接wifi的ssid;pwd 连接wifi的password Return : 无 ********************************************************************************************/ void connectWifi(String ssid,String pwd) { String wifiMessage = "|2|1|" + ssid + "," + pwd + separator; sendMessage(wifiMessage); } /******************************************************************************************** Function : connectMqtt Description : 连接DF-IoT Params : server 物联网网址;port 端口;iotid 物联网登录后分配的iotid;iotpwd 物联网登录后分配的iotpwd Return : 无 ********************************************************************************************/ void connectMqtt(String server, String port, String iotid, String iotpwd) { String mqttConnectMessage = "|4|1|1|" + server + separator + port + separator + iotid + separator + iotpwd + separator; sendMessage(mqttConnectMessage); } /******************************************************************************************** Function : reconnectMqtt Description : 重新连接DF-IoT Params : 无 Return : 无 ********************************************************************************************/ void reconnectMqtt() { String mqttReconnectMessage = "|4|1|5|"; sendMessage(mqttReconnectMessage); } /******************************************************************************************** Function : publish Description : 向DF-IoT物联网设备发送信息 Params : topic DF-IoT物联网设备编号;message 发送的消息内容 Return : 无 ********************************************************************************************/ void publish(String topic,String message) { String publishMessage = "|4|1|3|" + topic + separator + message + separator; sendMessage(publishMessage); } /******************************************************************************************** Function : handleUart Description : 处理串口传回的数据 Params : 无 Return : 无 ********************************************************************************************/ void handleUart() { while(softSerial.available() > 0) { String receivedata = softSerial.readStringUntil('\r'); const char* obloqMessage = receivedata.c_str(); if (strcmp(obloqMessage, "|1|1|") == 0) { Serial.println("Pong"); pingOn = false; obloqState = PINGOK; } if(strcmp(obloqMessage, "|2|1|") == 0) { if(wifiConnect) { wifiConnect = false; wifiAbnormalDisconnect = true; } } else if (strstr(obloqMessage,"|2|3|") != NULL && strlen(obloqMessage) != 9) { Serial.println("Wifi ready"); wifiConnect = true; if(wifiAbnormalDisconnect) { wifiAbnormalDisconnect = false; return; } obloqState = WIFIOK; } else if (strcmp(obloqMessage, "|4|1|1|1|") == 0) { Serial.println("Mqtt ready"); obloqConnectMqtt = true; if(mqttReconnectFlag) { mqttReconnectFlag = false; return; } obloqState = MQTTCONNECTOK; } } } /******************************************************************************************** Function : sendPing Description : 每隔pingInterval一段时间,通过串口向OBLOQ ping一次 Params : 无 Return : 无 ********************************************************************************************/ void sendPing() { if(pingOn && millis() - previousPingTime > pingInterval) { previousPingTime = millis(); ping(); } } /******************************************************************************************** Function : execute Description : 根据OBLOQ的状态,进行下一步相应操作。 Params : 无 Return : 无 ********************************************************************************************/ void execute() { switch(obloqState) { case PINGOK: connectWifi(WIFISSID,WIFIPWD); obloqState = WAIT; break; case WIFIOK: connectMqtt(SERVER,String(PORT),IOTID,IOTPWD);obloqState = WAIT; break; case MQTTCONNECTOK : obloqState = WAIT; break; default: break; } } /******************************************************************************************** Function : checkWifiState Description : 检查wifi状态,如果检测到wifi热点断开会间隔1分钟去重新连接wifi Params : 无 Return : 无 ********************************************************************************************/ void checkWifiState() { static unsigned long previousTime = 0; static bool reconnectWifi = false; if(wifiAbnormalDisconnect && millis() - previousTime > 60000) { previousTime = millis(); Serial.println("Wifi abnormal disconnect"); reconnectWifi = true; obloqConnectMqtt = false; connectWifi(WIFISSID,WIFIPWD); } if(!wifiAbnormalDisconnect && reconnectWifi) { reconnectWifi = false; mqttReconnectFlag = true; Serial.println("Reconnect mqtt"); reconnectMqtt(); } } /******************************************************************************************** Function : getTemp Description : 获得LM35测得的温度 Params : 无 Return : 无 ********************************************************************************************/ float getTemp() { uint16_t val; float dat; val=analogRead(A0);//Connect LM35 on Analog 0 dat = (float) val * (5/10.24); return dat; } void setup() { Serial.begin(9600); softSerial.begin(9600); } void loop() { sendPing(); execute(); handleUart(); checkWifiState(); if(obloqConnectMqtt && millis() - previousSendMessageTime > 5000) //每隔5s,向Hy6z0Pb1G设备发送消息,消息内容是此时读取的LM35温度数据 { previousSendMessageTime = millis(); //获取温度数据 float temperature = getTemp(); Serial.println(temperature); publish("Hy6z0Pb1G",(String)temperature); } } |
结果演示
程序烧录成功后,复位OBLOQ模块,再复位Arduino。当没有连接wifi的时候,OBLOQ指示灯显示红色,正在连接wifi时显示蓝色,连接到wifi后,OBLOQ指示灯显示绿色。
打开Arduino串口,观察上传到EASY IOT设备的数据。登录EASY IOT打开工作间,点击设备下方的查看详情可查看上传的温度数据。
监听EASY IOT设备
实现功能:物联网设备发送数据,OBLOQ接收数据并发送给Arduino,Arduino再通过串口显示接收的数据。修改代码中以下信息,然后烧录代码到Arduino UNO。
//you need change all these according to your own situations #define WIFISSID "DFRobot-guest" //wifi账号 #define WIFIPWD "dfrobot@2017" //wifi密码 #define SERVER "iot.dfrobot.com.cn" //Iot主机地址,此处不用更改 #define PORT 1883 //Iot连接端口,此处不同更改 #define IOTID "r1qHJFJ4Z" //iot_id,创建设备的时候记录的相关信息 #define IOTPWD "SylqH1Y1VZ" //iot_pwd,创建设备的时候记录的相关信息 ... ... subscribeSingleTopic("Hy6z0Pb1G");; //监控一个设备,设备号为"Hy6z0Pb1G" ... |
- 样例代码
/*代码内容简介:在DF-IoT物联网监听设备号(topic)为Hy6z0Pb1G的物联网设备*/ #include <Arduino.h> #include <SoftwareSerial.h> #define WIFISSID "DFRobot-guest" #define WIFIPWD "dfrobot@2017" #define SERVER "iot.dfrobot.com.cn" #define IOTID "r1qHJFJ4Z" #define IOTPWD "SylqH1Y1VZ" #define PORT 1883 const String separator = "|"; bool pingOn = true; bool obloqConnectMqtt = false; bool subscribeMqttTopic = false; static unsigned long pingInterval = 2000; static unsigned long sendMessageInterval = 10000; unsigned long previousPingTime = 0; bool subscribeSuccess = false; String receiveStringIndex[10] = {}; //wifi异常断开检测变量 bool wifiConnect = false; bool wifiAbnormalDisconnect = false; //mqtt因为网络断开后重新连接标志 bool mqttReconnectFlag = false; SoftwareSerial softSerial(10,11); enum state{ WAIT, PINGOK, WIFIOK, MQTTCONNECTOK }obloqState; /******************************************************************************************** Function : sendMessage Description : 通过串口向OBLOQ发送一次消息 Params : 无 Return : 无 ********************************************************************************************/ void sendMessage(String message) { softSerial.print(message+"\r"); } /******************************************************************************************** Function : ping Description : 通过串口向OBLOQ发送一次字符串"|1|1|",尝试与OBLOQ取得连接 Params : 无 Return : 无 ********************************************************************************************/ void ping() { String pingMessage = "|1|1|"; sendMessage(pingMessage); } /******************************************************************************************** Function : connectWifi Description : 连接wifi Params : ssid 连接wifi的ssid;pwd 连接wifi的password Return : 无 ********************************************************************************************/ void connectWifi(String ssid,String pwd) { String wifiMessage = "|2|1|" + ssid + "," + pwd + separator; sendMessage(wifiMessage); } /******************************************************************************************** Function : connectMqtt Description : 连接DF-IoT Params : server 物联网网址;port 端口;iotid 物联网登录后分配的iotid;iotpwd 物联网登录后分配的iotpwd Return : 无 ********************************************************************************************/ void connectMqtt(String server, String port, String iotid, String iotpwd) { String mqttConnectMessage = "|4|1|1|" + server + separator + port + separator + iotid + separator + iotpwd + separator; sendMessage(mqttConnectMessage); } /******************************************************************************************** Function : reconnectMqtt Description : 重新连接DF-IoT Params : 无 Return : 无 ********************************************************************************************/ void reconnectMqtt() { String mqttReconnectMessage = "|4|1|5|"; sendMessage(mqttReconnectMessage); } /******************************************************************************************** Function : publish Description : 向DF-IoT物联网设备发送信息 Params : topic DF-IoT物联网设备编号;message 发送的消息内容 Return : 无 ********************************************************************************************/ void publish(String topic,String message) { String publishMessage = "|4|1|3|" + topic + separator + message + separator; sendMessage(publishMessage); } /******************************************************************************************** Function : subscribe Description : 订阅DF-IoT物联网设备 Params : topic DF-IoT物联网设备编号 Return : 无 ********************************************************************************************/ void subscribe(String topic) { String subscribeMessage = "|4|1|2|" + topic + separator; sendMessage(subscribeMessage); } /******************************************************************************************** Function : splitString Description : 剔除分隔符,逐一提取字符串 Params : data[] 提取的字符串的目标储存地址;str 源字符串;delimiters 分隔符 Return : 共提取的字符串的个数 ********************************************************************************************/ int splitString(String data[],String str,const char* delimiters) { char *s = (char *)(str.c_str()); int count = 0; data[count] = strtok(s, delimiters); while(data[count]){ data[++count] = strtok(NULL, delimiters); } return count; } /******************************************************************************************** Function : handleUart Description : 处理串口传回的数据 Params : 无 Return : 无 ********************************************************************************************/ void handleUart() { while(softSerial.available() > 0) { String receivedata = softSerial.readStringUntil('\r'); const char* obloqMessage = receivedata.c_str(); // Serial.print("receivedata = "); // Serial.println(receivedata); if (strcmp(obloqMessage, "|1|1|") == 0) { Serial.println("Pong"); pingOn = false; obloqState = PINGOK; } if(strcmp(obloqMessage, "|2|1|") == 0) { if(wifiConnect) { wifiConnect = false; wifiAbnormalDisconnect = true; } } else if (strstr(obloqMessage,"|2|3|") != NULL && strlen(obloqMessage) != 9) { Serial.println("Wifi ready"); wifiConnect = true; if(wifiAbnormalDisconnect) { wifiAbnormalDisconnect = false; return; } obloqState = WIFIOK; } else if (strcmp(obloqMessage, "|4|1|1|1|") == 0) { Serial.println("Mqtt ready"); obloqConnectMqtt = true; if(mqttReconnectFlag) { mqttReconnectFlag = false; return; } obloqState = MQTTCONNECTOK; } else if (strcmp(obloqMessage, "|4|1|2|1|") == 0) { Serial.println("subscribe successed"); //subscribeMqttTopic = false; } //DF-IoT接收到消息,topic和message传入receiveMessageCallbak函数 else if (strstr(obloqMessage, "|4|1|5|") != NULL) { splitString(receiveStringIndex,receivedata,"|"); receiveMessageCallbak(receiveStringIndex[3],receiveStringIndex[4]); } } } /******************************************************************************************** Function : sendPing Description : 每隔pingInterval一段时间,通过串口向OBLOQ ping一次 Params : 无 Return : 无 ********************************************************************************************/ void sendPing() { if(pingOn && millis() - previousPingTime > pingInterval) { previousPingTime = millis(); ping(); } } /******************************************************************************************** Function : execute Description : 根据OBLOQ的状态,进行下一步相应操作。 Params : 无 Return : 无 ********************************************************************************************/ void execute() { switch(obloqState) { case PINGOK: connectWifi(WIFISSID,WIFIPWD); obloqState = WAIT; break; case WIFIOK: connectMqtt(SERVER,String(PORT),IOTID,IOTPWD);obloqState = WAIT; break; case MQTTCONNECTOK : obloqState = WAIT; break; default: break; } } /******************************************************************************************** Function : subscribeSingleTopic Description : 监听单个DF-IoT物联网设备 Params : topic DF-IoT物联网设备编号 Return : 无 ********************************************************************************************/ void subscribeSingleTopic(String topic) { if(!subscribeMqttTopic && obloqConnectMqtt) { subscribeMqttTopic = true; subscribe(topic); } } /******************************************************************************************** Function : checkWifiState Description : 检查wifi状态 Params : 无 Return : 无 ********************************************************************************************/ void checkWifiState() { static unsigned long previousTime = 0; static bool reconnectWifi = false; if(wifiAbnormalDisconnect && millis() - previousTime > 60000) { previousTime = millis(); reconnectWifi = true; obloqConnectMqtt = false; Serial.println("Wifi abnormal disconnect"); connectWifi(WIFISSID,WIFIPWD); } if(!wifiAbnormalDisconnect && reconnectWifi) { reconnectWifi = false; mqttReconnectFlag = true; Serial.println("Reconnect mqtt"); reconnectMqtt(); } } /******************************************************************************************** Function : receiveMessageCallbak Description : 接收消息的回调函数 Params : topic 发出消息的DF-IoT物联网设备编号;message 收到的消息内容 Return : 无 ********************************************************************************************/ void receiveMessageCallbak(String topic,String message) { Serial.println("Message from: " + topic); Serial.println("Message content: " + message); } void setup() { Serial.begin(9600); softSerial.begin(9600); } void loop() { sendPing(); execute(); subscribeSingleTopic("Hy6z0Pb1G"); handleUart(); checkWifiState(); } 结果演示程序烧录成功后,复位OBLOQ模块,再复位Arduino。当没有连接wifi的时候,OBLOQ指示灯显示红色,正在连接wifi时显示蓝色,连接到wifi后,OBLOQ指示灯显示绿色。 |
Azure IOT教程
OBLOQ模块具备的两个基础功能:发送数据到物联网和接收物联网数据。下面通过实验演示向Azure IOT设备发送数据的功能,更多样例见附件:
- Arduino读取温度传感器LM35数据,通过OBLOQ模块发送温度数据到物联网设备。
准备工作
- 硬件准备
- 1 x Arduino UNO控制板
- 1 x 模拟LM35线性温度传感器
- 1 x OBLOQ模块
- 若干 连接线
- 软件
- Arduino IDE (1.0.x或1.8.x), 点击下载Arduino IDE,下载完成后安装!
- 创建Azure IOT设备
- - 创建Azure IOT设备
- - 记录设备连接字符串connectionString
- - Device Explorer工具和使用链接
- 硬件连接
OBLOQ模块的TX,RX,GND和VIN引脚分别连接到Arduino UNO的D10,D11,GND和VCC引脚,温度传感器LM35连接到A0引脚。可通过修改程序来自定义相关引脚,此次测试硬件连接参考下图:
发送传感器数据
实现功能:Arduino读取温度传感器LM35数据,通过OBLOQ模块发送温度数据到Azure IOT设备。修改代码中以下信息,然后烧录代码到Arduino UNO.
//you need change all these according to your own situations #define WIFISSID "DFRobot-guest" #define WIFIPWD "dfrobot@2017" //Azure IOT 设备连接字符串,连接不同的设备需要修改这个字符串 const String connectionString = "HostName=dfrobot.azure-devices.cn;DeviceId=temperature;SharedAccessKey=CR5gUclNaT7skX9WP+e6oIB/BnkZnTIEReKBX870SNY="; |
- 样例代码
#include <Arduino.h> #include <SoftwareSerial.h> #define WIFISSID "DFRobot-guest" #define WIFIPWD "dfrobot@2017" //Azure IOT 设备连接字符串,连接不同的设备需要修改这个字符串 const String connectionString = "HostName=dfrobot.azure-devices.cn;DeviceId=temperature;SharedAccessKey=CR5gUclNaT7skX9WP+e6oIB/BnkZnTIEReKBX870SNY="; const String separator = "|"; bool pingOn = true; bool createIoTClientSuccess = false; static unsigned long previoustGetTempTime = 0; static unsigned long pingInterval = 2000; static unsigned long sendMessageInterval = 10000; unsigned long previousPingTime = 0; String receiveStringIndex[10] = {}; bool wifiConnect = false; bool wifiAbnormalDisconnect = false; SoftwareSerial softSerial(10,11); enum state{ WAIT, PINGOK, WIFIOK, AZURECONNECT }obloqState; /******************************************************************************************** Function : sendMessage Description : 串口发送消息 Params : message 设备连接字符串 Return : 无 ********************************************************************************************/ void sendMessage(String message) { softSerial.print(message+"\r"); } /******************************************************************************************** Function : ping Description : 检查串口是否正常通信,串口接收到敲门命令会返回:|1|1|\r Return : 无 ********************************************************************************************/ void ping() { String pingMessage = F("|1|1|"); sendMessage(pingMessage); } /******************************************************************************************** Function : connectWifi Description : 连接wifi,连接成功串口返回:|2|3|ip|\r Params : ssid wifi账号 Params : pwd wifi密码 Return : 无 ********************************************************************************************/ void connectWifi(String ssid,String pwd) { String wifiMessage = "|2|1|" + ssid + "," + pwd + separator; sendMessage(wifiMessage); } /******************************************************************************************** Function : createIoTClient Description : 创建设备凭据,创建成功串口返回:|4|2|1|1|\r Params : connecttionString 设备连接字符串 Return : 无 ********************************************************************************************/ void createIoTClient(String connecttionString) { String azureConnectMessage = "|4|2|1|" + connecttionString + separator; sendMessage(azureConnectMessage); } /******************************************************************************************** Function : subscribeDevice Description : 监听设备,接收到消息会返回消息内容, Params : 无 Return : 无 ********************************************************************************************/ void subscribeDevice() { String subscribeDeviceMessage = "|4|2|2|"; sendMessage(subscribeDeviceMessage); } /******************************************************************************************** Function : unsubscribeDevice Description : 取消对设备的监听,发送成功串口返回:|4|2|6|1|\r Params : 无 Return : 无 ********************************************************************************************/ void unsubscribeDevice() { String unsubscribeDeviceMessage = "|4|2|6|"; sendMessage(unsubscribeDeviceMessage); } /******************************************************************************************** Function : publish Description : 发送消息 ,必须先创建设备凭据 Params : message 发布的消息内容,发送成功串口返回: |4|2|3|1|\r Return : 无 ********************************************************************************************/ void publish(String message) { String publishMessage = "|4|2|3|" + message + separator; sendMessage(publishMessage); } /******************************************************************************************** Function : disconnect Description : 销毁设备凭据: |4|2|4|1|\r Params : 无 Return : 无 ********************************************************************************************/ void distoryIotClient() { String distoryIotClientMessage = "|4|2|4|"; sendMessage(distoryIotClientMessage); } /******************************************************************************************** Function : recreateIoTClient Description : 重新穿件设备凭据,创建成功返回: |4|2|1|1|\r Params : 无 Return : 无 ********************************************************************************************/ void recreateIoTClient() { String recreateIoTClientMessage = "|4|2|5|"; sendMessage(recreateIoTClientMessage); } /******************************************************************************************** Function : splitString Description : 切割字符串 Params : data 存储切割后的字符数组 Params : str 被切割的字符串 Params : data 切割字符串的标志 Return : 无 ********************************************************************************************/ int splitString(String data[],String str,const char* delimiters) { char *s = (char *)(str.c_str()); int count = 0; data[count] = strtok(s, delimiters); while(data[count]){ data[++count] = strtok(NULL, delimiters); } return count; } /******************************************************************************************** Function : handleUart Description : 处理串口数据 Params : 无 Return : 无 ********************************************************************************************/ void handleUart() { while(softSerial.available() > 0) { String receivedata = softSerial.readStringUntil('\r'); const char* obloqMessage = receivedata.c_str(); if(strcmp(obloqMessage, "|1|1|") == 0) { Serial.println("Pong"); pingOn = false; obloqState = PINGOK; } if(strcmp(obloqMessage, "|2|1|") == 0) { if(wifiConnect) { wifiConnect = false; wifiAbnormalDisconnect = true; } } else if(strstr(obloqMessage, "|2|3|") != 0 && strlen(obloqMessage) != 9) { Serial.println("Wifi ready"); wifiConnect = true; if(wifiAbnormalDisconnect) { wifiAbnormalDisconnect = false; createIoTClientSuccess = true; return; } obloqState = WIFIOK; } else if(strcmp(obloqMessage, "|4|2|1|1|") == 0) { Serial.println("Azure ready"); obloqState = AZURECONNECT; } } } /******************************************************************************************** Function : sendPing Description : 验证串口是否正常通信 Params : 无 Return : 无 ********************************************************************************************/ void sendPing() { if(pingOn && millis() - previousPingTime > pingInterval) { previousPingTime = millis(); ping(); } } /******************************************************************************************** Function : execute Description : 根据不同的状态发送不同的命令 Params : 无 Return : 无 ********************************************************************************************/ void execute() { switch(obloqState) { case PINGOK: connectWifi(WIFISSID,WIFIPWD); obloqState = WAIT; break; case WIFIOK: createIoTClient(connectionString);obloqState = WAIT; break; case AZURECONNECT : obloqState = WAIT; break; default: break; } } /******************************************************************************************** Function : getTemp Description : 获得LM35测得的温度 Params : 无 Return : 无 ********************************************************************************************/ float getTemp() { uint16_t val; float dat; val=analogRead(A0);//Connect LM35 on Analog 0 dat = (float) val * (5/10.24); return dat; } /******************************************************************************************** Function : checkWifiState Description : 接收消息的回调函数: Params : message 接收到的消息字符串 Return : 无 ********************************************************************************************/ void checkWifiState() { static unsigned long previousTime = 0; if(wifiAbnormalDisconnect && millis() - previousTime > 60000) //wifi异常断开后一分钟重连一次 { previousTime = millis(); createIoTClientSuccess = false; connectWifi(WIFISSID,WIFIPWD); } } void setup() { Serial.begin(9600); softSerial.begin(9600); } void loop() { sendPing(); execute(); handleUart(); checkWifiState(); //每隔5秒发送一次数据 if(createIoTClientSuccess && millis() - previoustGetTempTime > 5000) { previoustGetTempTime = millis(); //获取温度传感器数据 float temperature = getTemp(); publish((String)temperature); Serial.println(temperature); } } 结果演示程序烧录成功后,复位OBLOQ模块,再复位Arduino。当没有连接wifi的时候,OBLOQ指示灯显示红色,正在连接wifi时显示蓝色,连接到wifi后,OBLOQ指示灯显示绿色。
拓展OBLOQ除了能连接标志的MQTT协议的物联网,还能连接Microsoft Azure IOT,更多样例代码可参考附件 常见问题
A:
A: 监听设备需要时间,所以在前一个设备监听成功的情况下再去监听另外一个设备,以此内推,具体代码可参考附件,
A: 表示OBLOQ正在连接wifi,需要一定时间,如果超过一分钟依然显示蓝灯,则可能为wifi账号密码设置错误,请检查程序
A: 表示OBLOQ的wifi连接成功但是mqtt异常断开,尝试检查所在wifi是否断网,也有可能easyiot服务器问题,等待一会儿再连接或联系论坛管理员。
A: 表示OBLOQ的wifi连接不成功,尝试检查是否tx和rx接反了(调换一下tx和rx接线顺序),或者是wifi有问题(使用手机开热点,不要用中文WIFI名称),然后就是参数有没有填错(物联网网站里面的参数)。
附件 |