Part 4 - 完善 MQTT 控制设备功能

2021-11-08
3分钟阅读时长

【版本】

当前版本号v20221108

版本修改说明
v20221108初始化版本

【实验名称】 实验4.1 Smart Home 实现 MQTT 客户端功能

【实验目的】

  • 掌握 Android MQTT 客户端的使用

【实验环境】

  • Android Studio
  • Smart Home 项目

【实验说明】

  • 配置 MQTT 客户端参数可以修改 SmartHome.init 方法
public String init(Context context,String client_id) {
    this.context = context;
    //配置连接信息
    mqttConnectOptions = new MqttConnectOptions();
    //TODO:实验3.1 设置MQTT地址,注意要进行地址转换
    mqttConnectOptions.setServerURIs(new String[]{});
    //是否清除缓存
    mqttConnectOptions.setCleanSession(false);
    //是否重连
    mqttConnectOptions.setAutomaticReconnect(true);
    //设置心跳,30s
    mqttConnectOptions.setKeepAliveInterval(30);
    //TODO:实验3.1 登录用户名
    mqttConnectOptions.setUserName("");
    //TODO:实验3.1 登录密码
    ...
}

【实验要求】

  • (1)配置iot.app.smarthome.mqtt.SmartMqtt的 MQTT 地址、用户名和密码。

【实验名称】 实验4.2 Smart Home 实现 LightBulbActivity(智能灯设备控制界面)

【实验目的】

  • 掌握 DeviceAdapter.ViewHolder 的点击事件编写
  • 掌握新的 Activity 的编写

【实验环境】

  • Android Studio
  • Smart Home 项目

【实验说明】

  • iot.app.smarthome.ui.device.DeviceAdapter的 onCreateViewHolder 方法可以增加点击事件代码。
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.device_item, parent, false);
    final ViewHolder holder = new ViewHolder(view);
    holder.devView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
			
		}
    });
}

【实验要求】

  • (1)当用户在设备界面点击智能灯时,跳转到LightBulbActivity(智能灯设备控制界面)。
  • (2)跳转到LightBulbActivity时,请把点击的设备的 IotID 通过 intent 传到LightBulbActivity
  • (3)在智能灯设备控制界面,设置IotID 显示栏,一个开灯按钮,一个关灯按钮。

【实验名称】 实验4.3 通过 LightBulbActivity 发送 MQTT 消息控制智能灯开关状态。

【实验目的】

  • 掌握 MQTT 发送消息和接受消息的代码编写

【实验环境】

  • Android Studio
  • Smart Home 项目

【实验说明】

  • (1)SmartMqtt 客户端初始化示例代码
SmartMqtt mqttClient=SmartMqtt.getInstance();
String mqttClientId=mqttClient.init(LightBulbActivity.this,null);
mqttClient.setMqttCallback(new MqttCallback() {
    @Override
    public void connectionLost(Throwable cause) {
        Log.i("MQTT","Connection Lost");
    }
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        String payload=new String(message.getPayload());//获取监听主题的消息       
    }
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        Log.i("MQTT","delivery Complete");
    }
});
IMqttToken token=mqttClient.connect();
token.setActionCallback(new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken asyncActionToken) {
        //订阅主题的代码可以写在这个方法内
    }
    @Override
    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
        Log.i("MQTT","Subscribe action fail");
    }
});
  • (2)SmartMqtt 订阅主题的示例代码
SmartMqtt mqttClient=SmartMqtt.getInstance();
mqttClient.subscribe("订阅的主题", new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken asyncActionToken) {
        Log.i("MQTT", "Subscribe success with topics:"+StringUtils.join(asyncActionToken.getTopics(),'|'));
    }
    @Override
    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
        if(exception!=null){
            exception.printStackTrace();
        }
        Log.i("MQTT","Subscribe fail");
    }
});
  • (3)SmartMqtt 发送消息的示例代码
SmartMqtt mqttClient=SmartMqtt.getInstance();
Gson gson=new Gson();
mqttClient.sendData("主题", gson.toJson(内容).getBytes(StandardCharsets.UTF_8), new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken asyncActionToken) {
        Log.i("MQTT","send Data success");
    }
    @Override
    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
        Log.e("MQTT","send Data fail");
    }
});
  • (4)模拟智能灯设备可以通过发送以下示例信息到该设备的主题,实现开关灯操作。

eventTime和updateTime 是当前的时间戳 switchState是目标状态,on表示开灯,off表示关灯。

{"eventId":"0759","eventName":"updateDevShadow","eventTime":1667962757651,"params":[{"switchState":"on","updateTime":1667962757651}]}

-(5)发送的主题和返回消息的主题可以在模拟智能灯设备的配置页面查看http://localhost:8101/config

【实验要求】

  • (1)按下LightBulbActivity 的开关按钮,可以通过 MQTT 发送消息到模拟智能灯设备,实现开灯或关灯。
  • (2)开灯或关灯可以接收模拟智能灯设备的回复消息。

【实验步骤】

  1. 启动 Mosquitto 。

  2. 运行脚本0-start-iot-bulb.bat 启动模拟智能灯设备项目

  3. 完善Smart Home 项目代码,实现实验要求。