06、阿里云微消息队列MQTT对接
一、打开链接:https://www.aliyun.com/product/mq4iot,根据提示开通微消息队列 MQTT,点击“管理控制台”会进入如下界面:
有关阿里云计费说明,请参考:https://help.aliyun.com/document_detail/52819.html?spm=a2c4g.11186623.6.554.28987cb
二、在管理控制台创建并记录以下信息,其中 devicename 是自己定义的,不需要在阿里云后台获取。
JavaScript 全选
{
DeviceName: "B002TTSTESTDEVICE001",
type: "4",
instanceID: "mqtt-cn-n6w1ulyua01",
AccessKeyID: "LTAI4GKyPad1FMQR1oWCjN8t",
AccessKeySecret: "ucjNqveEbZxaMghdjybRgu6RQ29Or4",
GroupID: "GID_BOX",
topic: "data"
}
三、服务器对接,P2P 消息推送。请参考阿里云官方文档
注意:服务器下发消息,QOS 需要使用 0 或者 2,不能使用 1。
示例代码如下:
C# 全选
public void SendP2PMessage(String deviceId, String msg, String encrypt) throws Exception
{
/**
* MQ4IOT clientId,由业务系统分配,需要保证每个 tcp 连接都不一样,保证全局唯一,如果不同的客户端对象(tcp 连接)使用了相同的 clientId 会导致连接异常断开。 clientId 由两部分组成,格式为 GroupID@@@DeviceId,其中 groupId 在 MQ4IOT 控制台申请,DeviceId 由业务方自己设置,clientId 总长度不得超过64个字符。 */
String clientId = ""GID_PVP@@@ "" + deviceId;
/*
* 发送端ClientID,请勿与TOPIC中ClientID重复,
* String masterClientId = ""GID_PVP@@@bm_master"";
*/
String masterClientId = ""bm_master@@@ "" + System.currentTimeMillis();
/**
* MQ4IOT 消息的一级 topic,需要在控制台申请才能使用。 如果使用了没有申请或者没有被授权的 topic 会导致鉴权失败,服务端会断开客户端连接。
*/
final String parentTopic = ""TID_VP "";
/**
* QoS参数代表传输质量,可选0,1,2,根据实际需求合理设置,具体参考 https://help.aliyun.com/document_detail/42420.html?spm=a2c4g.11186623.6.544.1ea529cfAO5zV3
*/
final int qosLevel = 1;
ConnectionOptionWrapper connectionOptionWrapper = new ConnectionOptionWrapper(instanceId, accessKey, secretKey, masterClientId);
final MemoryPersistence memoryPersistence = new MemoryPersistence();
/** 客户端使用的协议和端口必须匹配,具体参考文档 https://help.aliyun.com/document_detail/44866.html?spm=a2c4g.11186623.6.552.25302386RcuYFB 如果是 SSL 加密则设置ssl://endpoint:8883 */
MqttClient mqttClient = new MqttClient(""tcp: /* "" + endPoint + "":1883"", masterClientId, memoryPersistence); */
/** * 客户端设置好发送超时时间,防止无限阻塞 */
mqttClient.setTimeToWait(5000);
mqttClient.setCallback( new MqttCallbackExtended()
{
public void connectComplete(boolean reconnect, String serverURI)
{
/** * 客户端连接成功后就需要尽快订阅需要的 topic */
System.out.println(""connect success "");
}
public void connectionLost(Throwable throwable)
{
throwable.printStackTrace();
}
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
/*** 消费消息的回调接口,需要确保该接口不抛异常,该接口运行返回即代表消息消费成功。 消费消息需要保证在规定时间内完成,如果消费耗时超过服务端约定的超时时间,对于可靠传输的模式,服务端可能会重试推送,业务需要做好幂等去重处理。超时时间约定参考限制 https://help.aliyun.com/document_detail/63620.html?spm=a2c4g.11186623.6.546.229f1f6ago55Fj */
System.out.println(""receive msg from topic "" + s + "", body is "" + new String(mqttMessage.getPayload()));
}
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken)
{
System.out.println(""send msg succeed topic is : "" + iMqttDeliveryToken.getTopics()[0] );
}
} );
mqttClient.connect(connectionOptionWrapper.getMqttConnectOptions() );
/** * MQ4IoT支持点对点消息,即如果发送方明确知道该消息只需要给特定的一个设备接收,且知道对端的 clientId,则可以直接发送点对点消息。 点对点消息不需要经过订阅关系匹配,可以简化订阅方的逻辑。点对点消息的 topic 格式规范是 {{parentTopic}}/p2p/{{targetClientId}} */
final String p2pSendTopic = parentTopic + "" / p2p / "" + clientId;
System.out.println(msg );
MqttMessage message = new MqttMessage(msg.getBytes());
if ( !"" "".equals(encrypt ) )
{
message = new MqttMessage(msg.getBytes(encrypt ) );
}
message.setQos(qosLevel);
mqttClient.publish(p2pSendTopic, message);
}
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
QRcodeVoice 管理员