带有SIM7600的MQTT Websocket Arduino Uno
我创建了一个将Arduino Uno连接到MQTT代理的程序。 通过下面可以看到的代码,我可以连接到代理,为了进行测试,我使用带有普通TCP连接的HiveMQ,一切都或多或少顺利。 但是对于最后一个代理,我将使用Websockets安全(wss),我找不到如何做到这一点 我读到“我应该用websocket包装客户端”,就像是made一样,问题是我找到的所有库都使用WiFiClientSecure.h 你知道怎么做吗?有使用GSM板使用websocket连接到MQTT的库或示例吗带有SIM7600的MQTT Websocket Arduino Uno,websocket,arduino,mqtt,gsm,Websocket,Arduino,Mqtt,Gsm,我创建了一个将Arduino Uno连接到MQTT代理的程序。 通过下面可以看到的代码,我可以连接到代理,为了进行测试,我使用带有普通TCP连接的HiveMQ,一切都或多或少顺利。 但是对于最后一个代理,我将使用Websockets安全(wss),我找不到如何做到这一点 我读到“我应该用websocket包装客户端”,就像是made一样,问题是我找到的所有库都使用WiFiClientSecure.h 你知道怎么做吗?有使用GSM板使用websocket连接到MQTT的库或示例吗 //DEFINI
//DEFINITION
#define TINY_GSM_MODEM_SIM7600 //have to be before the include
#define Terminal Serial
#define SIM7600RX_PIN 2
#define SIM7600TX_PIN 3
#define SIM7600PWR_PIN 5
//GPRS credentials
const char apn[] = "";
const char gprsUser[] = "";
const char gprsPass[] = "";
//MQTT
const char* broker = "broker.hivemq.com";
const char* topic = "/testPablo/init";
const char* topiclstWill = "/testPablo/last";
const int mqttPort = 1883;
uint32_t lastReconnectAttempt = 0;
//INCLUDE LIBRARIES
#include <SoftwareSerial.h>
#include <TinyGsmClient.h>
#include <PubSubClient.h>
//VARIABLE
SoftwareSerial SIM7600(SIM7600RX_PIN, SIM7600TX_PIN);
TinyGsm modem(SIM7600);
TinyGsmClient client(modem);
PubSubClient mqtt(client);
//Function
void activateSIM7600(){
Terminal.println("Starting 4G Module...");
pinMode(SIM7600PWR_PIN, OUTPUT);
digitalWrite(SIM7600PWR_PIN,HIGH);
delay(15000); //wait SIM7600 to start
Terminal.println("wait...");
}
bool connectNetwork(){
Terminal.print("Connecting to network...");
modem.gprsConnect(apn, gprsUser, gprsPass);
Terminal.print("Waiting for network...");
if (!modem.waitForNetwork()) {
Terminal.println(" fail");
delay(5000);
return false;
}
Terminal.println(" success");
if (modem.isNetworkConnected()) {
Terminal.println("Network connected");
}
}
void configureSIM7600(){
SIM7600.begin(115200);
modem.init();
String modemInfo = modem.getModemInfo();
Terminal.print("Modem Info: ");
Terminal.println(modemInfo);
connectNetwork();
}
void mqttCallback(char* topic, byte* payload, unsigned int len) {
Terminal.print("Message arrived [");
}
void configureMQTT(){
// MQTT Broker setup
mqtt.setServer(broker, 1883);
mqtt.setCallback(mqttCallback);
}
boolean mqttConnect() {
Terminal.print("Connecting to ");
Terminal.print(broker);
// Connect to MQTT Broker
boolean status = mqtt.connect("GsmClientTest");
//authenticate MQTT:
//boolean status = mqtt.connect("GsmClientName", "mqtt_user", "mqtt_pass");
if (status == false) {
Terminal.println(" fail");
return false;
}
Terminal.println(" success");
mqtt.publish(topic, "GsmClientTest started");
//mqtt.subscribe(topicLed);
return mqtt.connected();
}
void setup() {
Terminal.begin(115200);
delay(10);
activateSIM7600();
configureSIM7600();
configureMQTT();
Terminal.println("Finish configuration");
}
void loop() {
if (!mqtt.connected()) {
Terminal.println("=== MQTT NOT CONNECTED ===");
uint32_t t = millis(); // Reconnect every 10 seconds
if (t - lastReconnectAttempt > 10000L) {
lastReconnectAttempt = t;
if (mqttConnect()) {
lastReconnectAttempt = 0;
}
}
delay(100);
return;
}
mqtt.loop();
}
//定义
#定义微型\u GSM\u调制解调器\u SIM7600//必须在包含之前
#定义终端序列号
#定义SIM7600RX_引脚2
#定义SIM7600TX_引脚3
#定义SIM7600PWR_引脚5
//GPRS凭据
常量字符apn[]=“”;
常量字符gprsUser[]=“”;
常量字符gprsPass[]=“”;
//MQTT
const char*broker=“broker.hivemq.com”;
const char*topic=“/testPablo/init”;
const char*topiclstWill=“/testPablo/last”;
常量int mqttPort=1883;
uint32\u t LastReconnectEntry=0;
//包括图书馆
#包括
#包括
#包括
//变数
软件系列SIM7600(SIM7600RX_引脚、SIM7600TX_引脚);
TinyGsm调制解调器(SIM7600);
TinyGSClient客户端(调制解调器);
PubSubClient mqtt(客户);
//作用
无效激活ESIM7600(){
println(“启动4G模块…”);
引脚模式(SIM7600PWR_引脚,输出);
数字写入(SIM7600PWR_引脚,高);
延迟(15000);//等待SIM7600启动
Terminal.println(“等待…”);
}
布尔连接网络(){
终端打印(“连接到网络…”);
调制解调器.gprsConnect(apn、gprsUser、gprsPass);
终端打印(“等待网络…”);
如果(!modem.waitForNetwork()){
终端。println(“失败”);
延迟(5000);
返回false;
}
Terminal.println(“成功”);
if(modem.isNetworkConnected()){
终端.println(“网络连接”);
}
}
无效配置SIM7600(){
SIM7600.begin(115200);
modem.init();
字符串modemInfo=modem.getModemInfo();
终端打印(“调制解调器信息:”);
终端.println(modemInfo);
连接网络();
}
void mqttCallback(字符*主题,字节*有效负载,无符号整数len){
终端打印(“消息到达[”);
}
void configureMQTT(){
//MQTT代理设置
mqtt.setServer(broker,1883);
setCallback(mqttCallback);
}
布尔mqttConnect(){
终端打印(“连接到”);
终端打印(代理);
//连接到MQTT代理
布尔状态=mqtt.connect(“gsmclientset”);
//验证MQTT:
//布尔状态=mqtt.connect(“GsmClientName”、“mqtt_用户”、“mqtt_传递”);
如果(状态==false){
终端。println(“失败”);
返回false;
}
Terminal.println(“成功”);
publish(主题“gsmclientset已启动”);
//mqtt.subscribe(topicLed);
返回mqtt.connected();
}
无效设置(){
终端。开始(115200);
延迟(10);
激活ESIM7600();
配置sim7600();
configureMQTT();
Terminal.println(“完成配置”);
}
void循环(){
如果(!mqtt.connected()){
Terminal.println(“==MQTT未连接==”);
uint32_t t=millis();//每10秒重新连接一次
如果(t-上次重新连接尝试>10000L){
最后重新连接尝试=t;
if(mqttConnect()){
LastReconnectEntry=0;
}
}
延迟(100);
返回;
}
mqtt.loop();
}
您希望Arduino连接到代理,在大多数情况下,这是通过使用端口1883或8883(安全)实现的
如果您想连接到web客户端(如浏览器),则需要WebSocket,并且在大多数情况下都是通过端口8080、8081或类似端口来完成的。如果我了解了您链接到的库的自述,则需要使用
TinygsClient
实例,而不是WifiClientSecure
比如:
TinyGsmClient client(modem);
WebSocketClient250 wsClient(client, host, port);
WebSocketStreamClient wsStreamClient(wsClient, path);
PubSubClient mqtt(wsStreamClient);
这应该适用于非安全版本谢谢您的回答,但不,Mqtt可以通过websocket建立连接。我已经用Go、Javascript和其他语言为客户端建立了连接。当然,websocket上的Mqtt完全存在,但它与上面显示的项目和代码有什么关系?上面的代码是我的第一次尝试,所以我连接时没有使用websocket或任何安全性,我看到它工作了,现在我想连接到一个已经使用websocket和TLS运行的代理。