建立接受wifi消息的服务器,尝试使用广播接收器在连接WiFi时连接到MQTT服务器(Paho)...

我有一个广播接收器,它检查WIFI_STATE_CHANGE以查看我是否已连接到某个WiFi网络。例如,如果我回家,我想要发送某个MQTT消息。我遇到的问题是,它仅在第一次运行应用程序时连接并发送MQTT消息。尝试使用广播接收器在连接WiFi时连接到MQTT服务器(Paho)

过程:

如果我构建应用程序和设备上运行它,它认识我的家庭Wi-Fi发送消息。

我关闭设备上的Wifi,然后再次打开。

当MQTT连接到服务器无法建立时,我收到“Failure”消息。

我需要的是,我重新连接到网络后,而不是“失败”获得“连接”,但不知何故它永远不会发生......什么可能是错的?

PS。我认为这与事实有关,当检测到WiFi时,广播接收器运行连接代码,虽然互联网在该时间点不可用(获得IP等)。

这里是广播接收器:

package me.app.comehomedemo;

import ...

public class SynchronizeBroadcastReceiver extends BroadcastReceiver {

MqttAndroidClient client;

static String MQTTHOST = "myhost";

static String USERNAME = "myusername";

static String PASSWORD = "mypassword";

static String topicStr = "/topic/mac/control";

static String payload = "1";

@Override

public void onReceive(final Context context, Intent intent) {

NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

if (info.isConnected()) {

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

WifiInfo wifiInfo = wifiManager.getConnectionInfo();

int ip = wifiInfo.getIpAddress();

Toast.makeText(context, String.valueOf(ip), Toast.LENGTH_SHORT).show();

String ssid = wifiInfo.getSSID();

if (ssid.equals("\"mySSID\"")) {

String clientId = MqttClient.generateClientId();

client = new MqttAndroidClient(context.getApplicationContext(), MQTTHOST, clientId);

MqttConnectOptions options = new MqttConnectOptions();

options.setUserName(USERNAME);

options.setPassword(PASSWORD.toCharArray());

// options.setAutomaticReconnect(true);

try {

IMqttToken token = client.connect(options);

token.setActionCallback(new IMqttActionListener() {

@Override

public void onSuccess(IMqttToken asyncActionToken) {

// We are connected

Toast.makeText(context, "Connected", Toast.LENGTH_SHORT).show();

try {

client.publish(topicStr, payload.getBytes(), 0, false);

} catch (MqttException e) {

e.printStackTrace();

}

}

@Override

public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

// Something went wrong e.g. connection timeout or firewall problems

Toast.makeText(context, "Failure", Toast.LENGTH_SHORT).show();

}

});

} catch (MqttException e) {

e.printStackTrace();

}

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

MediaPlayer mp = MediaPlayer.create(context.getApplicationContext(), notification);

mp.start();

}

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值