原作者:renzo mischianti - 2019年12月3日发布 - 2021年6月21日更新

现在我们将了解如何使用基于流行的SX1276/SX1278无线模块的E32 UART LoRa设备来发送复杂的结构和管理节电。

图 1Sx1278 Sx1276 无线Lora uart模块 串行3000米arduino 433 rf

如果你有像冻结设备的麻烦,你必须把一个上拉的4.7k电阻或更好的连接到设备AUX引脚。

另一个有趣的功能是省电配置,你可以设置M0和M1,在省电模式下从一个设备到另一个设备进行唤醒。

所以我们需要在唤醒模式下连接发送设备(如果你完全连接了设备,库就会为你做所有模式):

图 2LoRa E32 Arduino唤醒连接(发射端)

图 3LoRa E32 Wemos D1唤醒连接(发射端)

同时接收设备处于省电模式(如果你完全连接了设备,库为你做所有模式)。

图 4LoRa E32 Arduino节电连接(接收端)

图 5LoRa E32 Wemos D1省电连接(接收端)

1.唤醒时间

一个重要的配置参数是唤醒时间,对发送方来说很重要,因为它在信息中添加了一个长的前奏(长的唤醒时间),接收方使用唤醒时间作为拉动间隔时间检查。

因此,如果接收方每隔250毫秒(唤醒时间)检查一次是否有消息,如果发送方添加了2秒的唤醒时间,可能接收方就会检查消息前言,等待真正的消息到来,读取它并返回到省电模式。

因此,如果你想最大限度地节省电力,你必须把发送方的唤醒时间降到最低,把接收方的唤醒时间降到最高,如果你想提高效率,你必须做相反的事。

发射端代码 (如果你不做完全连接,请记住,首先你必须在程序/睡眠模式下设置配置,然后再以指定的方式返回)

/** LoRa E32-TTL-100* Send fixed transmission message to a specified point.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0         ----- 3.3v (To config) 3.3v (To send) 7 (To dinamically manage)* M1         ----- 3.3v (To config) GND  (To send) 6 (To dinamically manage)* TX         ----- PIN 2 (PullUP)* RX         ----- PIN 3 (PullUP & Voltage divider)* AUX        ----- Not connected (5 if you connect)* VCC        ----- 3.3v/5v* GND        ----- GND**/
#include "Arduino.h"
#include "LoRa_E32.h"// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6);
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6); // Config without connect AUX and M0 M1
#include <SoftwareSerial.h>
SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
LoRa_E32 e32ttl(&mySerial, D5, D7, D6);//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6);
// -------------------------------------// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(2, 3, 5, 7, 6);
//LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, 5, 7, 6);
// -------------------------------------void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();e32ttl.setMode(MODE_1_WAKE_UP);// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 0x01;configuration.ADDH = 0x00;configuration.CHAN = 0x04;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------
}// The loop function is called in an endless loop
void loop()
{delay(2000);Serial.println("Send message to 00 03 04");ResponseStatus rs = e32ttl.sendFixedMessage(0, 3, 0x04, "Message to 00 03 04 device");Serial.println(rs.getResponseDescription());
}void printParameters(struct Configuration configuration) {Serial.println("----------------------------------------");Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);Serial.println(F(" "));Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, BIN);Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, BIN);Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());Serial.println(F(" "));Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());Serial.println("----------------------------------------");}
void printModuleInformation(struct ModuleInformation moduleInformation) {Serial.println("----------------------------------------");Serial.print(F("HEAD BIN: "));  Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);Serial.println("----------------------------------------");}

接收端代码 (如果你不做完全连接,请记住,首先你必须在程序/睡眠模式下设置配置,然后在指定模式下返回。):

/** LoRa E32-TTL-100* Receive fixed transmission message on channel.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0         ----- 3.3v (To config) GND  (To send) 7 (To dinamically manage)* M1         ----- 3.3v (To config) 3.3v (To send) 6 (To dinamically manage)* TX         ----- PIN 2 (PullUP)* RX         ----- PIN 3 (PullUP & Voltage divider)* AUX        ----- Not connected (5 if you connect)* VCC        ----- 3.3v/5v* GND        ----- GND**/
#include "Arduino.h"
#include "LoRa_E32.h"// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6);
//LoRa_E32 e32ttl(D2, D3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3);  // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6);
// -------------------------------------// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(2, 3, 5, 7, 6);
LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, 5, 7, 6);
// -------------------------------------
void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();e32ttl.setMode(MODE_2_POWER_SAVING);//  e32ttl.resetModule();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 3;configuration.ADDH = 0;configuration.CHAN = 0x04;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------Serial.println();Serial.println("Start listening!");
}// The loop function is called in an endless loop
void loop()
{if (e32ttl.available()  > 1){ResponseContainer rs = e32ttl.receiveMessage();// First of all get the dataString message = rs.data;Serial.println(rs.status.getResponseDescription());Serial.println(message);}
}void printParameters(struct Configuration configuration) {Serial.println("----------------------------------------");Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);Serial.println(F(" "));Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, DEC);Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, DEC);Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());Serial.println(F(" "));Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());Serial.println("----------------------------------------");}
void printModuleInformation(struct ModuleInformation moduleInformation) {Serial.println("----------------------------------------");Serial.print(F("HEAD BIN: "));  Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);Serial.println("----------------------------------------");}

2.发送复杂的结构

我们可以使用我们想要的字符串,我们可以使用JSON格式等等,但是如果你想使用本地模式的结构化信息(字节数组),就可以发送它们。

发送端的示例代码可以是:

struct Message {char type[5] = "TEMP";char message[8] = "Kitchen";byte temperature[4];
} message;*(float*)(message.temperature) = 19.2;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));
Serial.println(rs.getResponseDescription());

接受端的示例代码:

if (e32ttl.available()  > 1){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Message));struct Message message = *(Message*) rsc.data;Serial.println(message.type);Serial.println(*(float*)(message.temperature));Serial.println(message.message);free(rsc.data);
}

完整的发射端代码:

/** LoRa E32-TTL-100* Send fixed transmission structured message to a specified point.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0         ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1         ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX         ----- PIN 2 (PullUP)* RX         ----- PIN 3 (PullUP & Voltage divider)* AUX        ----- Not connected (5 if you connect)* VCC        ----- 3.3v/5v* GND        ----- GND**/
#include "Arduino.h"
#include "LoRa_E32.h"// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6);
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6); // Config without connect AUX and M0 M1
#include <SoftwareSerial.h>
SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
LoRa_E32 e32ttl(&mySerial, D5, D7, D6);//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6);
// -------------------------------------// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(2, 3, 5, 7, 6);
//LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, 5, 7, 6);
// -------------------------------------void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 0x01;configuration.ADDH = 0x00;configuration.CHAN = 0x02;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------
}
struct Message {char type[5];char message[8];int temperature;
} message;int i = 0;
// The loop function is called in an endless loop
void loop()
{delay(2500);i++;struct Message {char type[5] = "TEMP";char message[8] = "Kitchen";byte temperature[4];} message;*(float*)(message.temperature) = 19.2;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));Serial.println(rs.getResponseDescription());
}void printParameters(struct Configuration configuration) {Serial.println("----------------------------------------");Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);Serial.println(F(" "));Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, BIN);Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, BIN);Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());Serial.println(F(" "));Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());Serial.println("----------------------------------------");}
void printModuleInformation(struct ModuleInformation moduleInformation) {Serial.println("----------------------------------------");Serial.print(F("HEAD BIN: "));  Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);Serial.println("----------------------------------------");}

完整的接受端代码:

/** LoRa E32-TTL-100* Receive fixed transmission message on channel.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0         ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1         ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX         ----- PIN 2 (PullUP)* RX         ----- PIN 3 (PullUP & Voltage divider)* AUX        ----- Not connected (5 if you connect)* VCC        ----- 3.3v/5v* GND        ----- GND**/
#include "Arduino.h"
#include "LoRa_E32.h"// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6);
//LoRa_E32 e32ttl(D2, D3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6);
// -------------------------------------// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(2, 3, 5, 7, 6);
LoRa_E32 e32ttl(2, 3, 4); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, 5, 7, 6);
// -------------------------------------
void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();//  e32ttl.resetModule();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 3;configuration.ADDH = 0;configuration.CHAN = 0x04;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------Serial.println();Serial.println("Start listening!");e32ttl.setMode(MODE_2_POWER_SAVING);}
struct Message {char type[5];char message[8];byte temperature[4];
};// The loop function is called in an endless loop
void loop()
{if (e32ttl.available()  > 1){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Message));struct Message message = *(Message*) rsc.data;Serial.println(message.type);Serial.println(*(float*)(message.temperature));Serial.println(message.message);free(rsc.data);}
}void printParameters(struct Configuration configuration) {Serial.println("----------------------------------------");Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);Serial.println(F(" "));Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, DEC);Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, DEC);Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());Serial.println(F(" "));Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());Serial.println("----------------------------------------");}
void printModuleInformation(struct ModuleInformation moduleInformation) {Serial.println("----------------------------------------");Serial.print(F("HEAD BIN: "));  Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);Serial.println("----------------------------------------");}

但现实生活并不那么简单,可能你的home里有多个结构不同的传感器,所以你需要接收多个结构,一个可能的解决方案是读取结构的第一部分,并按你的要求实例化其余部分。

3.读取一段结构

因此,如果你想拥有你要阅读的结构类型:

char type[5]; // first part of structure
ResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type));String typeStr = rs.data;

有了这些信息,我们可以从不同的设备中创建指定的结构,例如:

struct Message {char type[5] = "TEMP";char message[8] = "Kitchen";byte temperature[4];
} message;*(float*)(message.temperature) = 19.2;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));
Serial.println(rs.getResponseDescription());

struct Message {char type[5] = "HUM";char message[8] = "Room";byte humidity;
} message;message.humidity = 65;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));
Serial.println(rs.getResponseDescription());

因此,你可以从接收器中加载指定的结构:

    if (e32ttl.available()  > 1){char type[5]; // first part of structureResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type));
//      Put string in a char array (not needed)
//      memcpy ( type, rs.data.c_str(), sizeof(type) );String typeStr = rs.data;Serial.println(typeStr);if (typeStr=="TEMP"){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Message));struct Message message = *(Message*) rsc.data;Serial.println(*(float*)(message.temperature));Serial.println(message.message);free(rsc.data);}else if (typeStr == "HUM"){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(MessageHumidity));struct MessageHumidity message = *(MessageHumidity*) rsc.data;Serial.println(message.humidity);Serial.println(message.message);free(rsc.data);}else{Serial.println("Something goes wrong!!");}}

因此,我们有2个发射端代码,

1像这样发送浮动的温度:

/** LoRa E32-TTL-100* Send fixed transmission structured message to a specified point.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0         ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1         ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX         ----- PIN 2 (PullUP)* RX         ----- PIN 3 (PullUP & Voltage divider)* AUX        ----- Not connected (5 if you connect)* VCC        ----- 3.3v/5v* GND        ----- GND**/
#include "Arduino.h"
#include "LoRa_E32.h"// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6);
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6); // Config without connect AUX and M0 M1
#include <SoftwareSerial.h>
SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
LoRa_E32 e32ttl(&mySerial, D5, D7, D6);//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6);
// -------------------------------------// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(2, 3, 5, 7, 6);
//LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, 5, 7, 6);
// -------------------------------------void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 0x01;configuration.ADDH = 0x00;configuration.CHAN = 0x02;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------
}
struct Message {char type[5];char message[8];int temperature;
} message;int i = 0;
// The loop function is called in an endless loop
void loop()
{delay(2500);i++;struct Message {char type[5] = "TEMP";char message[8] = "Kitchen";byte temperature[4];} message;*(float*)(message.temperature) = 19.2;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));Serial.println(rs.getResponseDescription());
}void printParameters(struct Configuration configuration) {Serial.println("----------------------------------------");Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);Serial.println(F(" "));Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, BIN);Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, BIN);Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());Serial.println(F(" "));Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());Serial.println("----------------------------------------");}
void printModuleInformation(struct ModuleInformation moduleInformation) {Serial.println("----------------------------------------");Serial.print(F("HEAD BIN: "));  Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);Serial.println("----------------------------------------");}

2并像这样发送湿度值:

/** LoRa E32-TTL-100* Send fixed transmission structured message to a specified point.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0         ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1         ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX         ----- PIN 2 (PullUP)* RX         ----- PIN 3 (PullUP & Voltage divider)* AUX        ----- Not connected (5 if you connect)* VCC        ----- 3.3v/5v* GND        ----- GND**/
#include "Arduino.h"
#include "LoRa_E32.h"// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6);
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6); // Config without connect AUX and M0 M1
#include <SoftwareSerial.h>
SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
LoRa_E32 e32ttl(&mySerial, D5, D7, D6);//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6);
// -------------------------------------// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(2, 3, 5, 7, 6);
//LoRa_E32 e32ttl(2, 3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, 5, 7, 6);
// -------------------------------------void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 0x02;configuration.ADDH = 0x00;configuration.CHAN = 0x02;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------
}
int i = 0;
// The loop function is called in an endless loop
void loop()
{delay(2500);i++;struct Message {char type[5] = "HUM";char message[8] = "Room";byte humidity;} message;message.humidity = 65;ResponseStatus rs = e32ttl.sendFixedMessage(0,3,4,&message, sizeof(Message));Serial.println(rs.getResponseDescription());
}void printParameters(struct Configuration configuration) {Serial.println("----------------------------------------");Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);Serial.println(F(" "));Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, BIN);Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, BIN);Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());Serial.println(F(" "));Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());Serial.println("----------------------------------------");}
void printModuleInformation(struct ModuleInformation moduleInformation) {Serial.println("----------------------------------------");Serial.print(F("HEAD BIN: "));  Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);Serial.println("----------------------------------------");}

还有一个管理这两类信息的接收器:

/** LoRa E32-TTL-100* Receive fixed transmission structure message and read first part and load the rest of structure.* https://www.mischianti.org** E32-TTL-100----- Arduino UNO or esp8266* M0         ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)* M1         ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)* TX         ----- PIN 2 (PullUP)* RX         ----- PIN 3 (PullUP & Voltage divider)* AUX        ----- Not connected (5 if you connect)* VCC        ----- 3.3v/5v* GND        ----- GND**/
#include "Arduino.h"
#include "LoRa_E32.h"// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(D2, D3, D5, D7, D6);
//LoRa_E32 e32ttl(D2, D3); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6);
// -------------------------------------// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(2, 3, 5, 7, 6);
LoRa_E32 e32ttl(2, 3, 4); // Config without connect AUX and M0 M1//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3); // e32 TX e32 RX
//LoRa_E32 e32ttl(&mySerial, 5, 7, 6);
// -------------------------------------
void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{Serial.begin(9600);while (!Serial) {; // wait for serial port to connect. Needed for native USB}delay(100);e32ttl.begin();//  e32ttl.resetModule();// After set configuration comment set M0 and M1 to low// and reboot if you directly set HIGH M0 and M1 to programResponseStructContainer c;c = e32ttl.getConfiguration();Configuration configuration = *(Configuration*) c.data;configuration.ADDL = 3;configuration.ADDH = 0;configuration.CHAN = 0x04;configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);printParameters(configuration);// ---------------------------Serial.println();Serial.println("Start listening!");e32ttl.setMode(MODE_2_POWER_SAVING);}
struct Message {char message[8];byte temperature[4];
};
struct MessageHumidity {char message[8];byte humidity;
};// The loop function is called in an endless loop
void loop()
{if (e32ttl.available()  > 1){char type[5]; // first part of structureResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type));
//      Put string in a char array (not needed)
//      memcpy ( type, rs.data.c_str(), sizeof(type) );String typeStr = rs.data;Serial.println(typeStr);if (typeStr=="TEMP"){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Message));struct Message message = *(Message*) rsc.data;Serial.println(*(float*)(message.temperature));Serial.println(message.message);free(rsc.data);}else if (typeStr == "HUM"){ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(MessageHumidity));struct MessageHumidity message = *(MessageHumidity*) rsc.data;Serial.println(message.humidity);Serial.println(message.message);free(rsc.data);}else{Serial.println("Something goes wrong!!");}}
}void printParameters(struct Configuration configuration) {Serial.println("----------------------------------------");Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);Serial.println(F(" "));Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, DEC);Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, DEC);Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());Serial.println(F(" "));Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());Serial.println("----------------------------------------");}
void printModuleInformation(struct ModuleInformation moduleInformation) {Serial.println("----------------------------------------");Serial.print(F("HEAD BIN: "));  Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);Serial.println("----------------------------------------");}

用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:省电和发送结构化数据 - 第五部分相关推荐

  1. 用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:库 - 第二部分

    原作者:renzo mischianti - 2019年10月21日出版 - 2021年6月21日更新 我创建了一个库来管理基于Semtech系列的LoRa设备的EBYTE E32,该设备非常强大,简 ...

  2. Arduino ESP32深度睡眠触摸唤醒(触摸唤醒)

    Arduino ESP32深度睡眠触摸唤醒(触摸唤醒) 通过D4–GPIO4引脚触摸感应,触发唤醒功能. 睡眠模式下,触摸中断响应流程图 实例代码 /*深度睡眠触摸唤醒(触摸T0唤醒) */#defi ...

  3. Arduino ESP32 获取网络时间并同步本地RTC时钟

    Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...

  4. Arduino ESP32利用PWM实现板载LED呼吸灯效果

    Arduino ESP32利用PWM实现板载LED呼吸灯效果 LEDC简介 LED控制(LEDC)外围设备主要用于控制LED的强度,尽管它也可以用于生成PWM信号用于其他目的.它具有16个通道,可以生 ...

  5. Arduino+esp32+blinker第一课点灯

    Arduino+esp32+blinker第一课点灯 文章目录 Arduino+esp32+blinker第一课点灯 前言 一.开发环境搭建 二.开发第一个点灯程序 1.添加设备 2.载入示例 3.代 ...

  6. arduino UNO R3/ESP8266连接MCP2515 CAN

    arduino UNO R3/ESP8266连接MCP2515 CAN CAN接收: // demo: CAN-BUS Shield, receive data with interrupt mode ...

  7. Arduino ESP32 flash数据存储结构

    Arduino ESP32 flash数据存储结构 分区表官方文档:<分区表> 想了解ESP32 flash数据存储结构需要从分区表开始了解.一点类似一台电脑上挂载的硬盘一样. 分区表保存 ...

  8. 基于USR-WiFi模块的 ESP32,ESP8266 Thonny调试器

    简 介: 本文给出了基于WiFi模块 USR-WiFi232 设置无线调试ESP32,ESP8266 MicroPython开发的环境. 关键词: ESP32,ESP8266,Thonny,Micro ...

  9. 两款带有WiFI的MicroPython模块:ESP32,ESP8266

    文章目录 ▌01 两款WiFi开发板 1.ESP32开发板 (1)焊接模块的接口插针 (2)加电测试 3.刷新ESP32固件 2.ESP8266开发板 (1)接入微机USB (2)连接Thonny ▌ ...

最新文章

  1. 人工智能都沸腾3年了,现在就业情况还乐观吗?
  2. [LeetCode] Combinations
  3. Python爬虫应用实战-如何对爬取的数据进行数据存储?
  4. java 序列化 原理解析
  5. MySQL 数据库常用存储引擎的特点
  6. gcc编译器命令使用详解
  7. mysql INFORMATION_SCHEMA COLUMNS 解释
  8. vue请求封装,http-接口部分(文档笔记)
  9. android 单元测试 多线程,多线程之单元测试(Junit)
  10. centos6 查看SELinux状态 关闭SELinux
  11. sed个人习惯用法总结
  12. 破解sourceInsight4
  13. 系统设计和机器学习算法
  14. 将Sublime打造成超强前端IDE
  15. php电商开发系统shopnc,shopnc二次开发(一),shopnc二次开发(_PHP教程
  16. 鸿蒙阴阳星辰塔,第1298章鸿蒙星辰塔的新能力
  17. (一)、跨服务器自动备份
  18. 利用Python导入股票列表
  19. Linux配置Redis主从
  20. Java实现网页浏览次数

热门文章

  1. js 获取 url 参数 URLSearchParams
  2. 【Vulnhub】搭建Vulnhub靶机
  3. at定时任务,一次性定时计划任务
  4. 茶楼怎么有效管理?试试茶楼软件
  5. jQuery(二)图片轮播与放大显示
  6. 华南虎事件带给我的思考
  7. 文献阅读|找到Science Direct的RSS订阅
  8. js之event事件对象
  9. 百度登录password参数
  10. 实现图片分块格子排列效果