之前有几篇教大家搭建自己的私有mqtt服务器。但是,考虑到推送需要使用长连接,很消耗服务器的带宽资源。自己的服务器如果配置不够高,就很容易掉线。因此,类似这样的大流量服务器,我们公司建议您使用专业的第三方的服务。云巴就是这样对的一个第三方服务平台。
云巴的互联网通信服务基于mqtt协议实现,申请玩云巴账号后。记下AppKey与SecretKey这两个参数。
开始是需要用到。
下载云巴的api,然后包入自己的web页面中。(注意:yunba-js-sdk.js依赖socket.io-1.3.5.min.js这个文件,因此需要先引入socket.io-1.3.5.min.js这个文件。)
一、新建连接对象
云巴的新建连接对象有两种,一种是支持ssl的,一种是不支持ssl的类型。
支持ssl的
yunba = new Yunba({server: 'https://sock.yunba.io', port: 443, appkey: appkey});
不支持ssl的
yunba = new Yunba({server: 'http://sock.yunba.io', port: 3000, appkey: appkey});
建议使用ssl方式,更加的安全。
二、初始化云巴的连接服务
我们所使用的函数是yunba.init(function(success));这个函数只有一个参数,那就是执行后的回调函数。function是一个回调函数,参数只有一个,成功与不成功
三、连接云巴的服务器
这里我们通常使用yunba.connect_by_customid(clientid, function(success, msg, sessionid))函数,虽然云巴也提供yunba.connect(function(success, msg, sessionid))函数,但是由于云巴是依靠日活计费的,yunba.connect任意一次连接都会记录成为一个日活,这样就会造成不必要的资源浪费。回掉函数的参数有三个,第一个是返回是否成功,第二个是返回失败的原因,第三个没用过,我也不知道。
四、订阅topic服务
云巴提供的函数为yunba.subscribe(arg1, function(success, msg));这里第一个参数是一个js的arr类型,参数只有一个topic。function也是一个回调函数,第一个参数是指是否执行成功,第二个参数是告诉我们如果失败了,原因何在。
五、设置接收消息后的处理函数
云巴提供的函数为yunba.set_message_cb(function (data));data是一个js的对象,包含收到的消息的大部分信息。
六、调用顺序
云巴中大量用到了回调函数,因此大家也一定注意到了,这些调用全部都是异步操作。每次执行下一步时都必须在上一步的回调函数中去做。否则会调用失败。
七:云巴发送消息
云巴的发送消息比较简单,直接用任意方式访问
http://rest.yunba.io:8080?method=<method>&appkey=<app-key>&seckey=<secret-key>&topic=<topic>&msg="your message"
即可。
八、代码演示
<?php
if(isset($_POST['act']) && $_POST['act'] == 'sendyunba') {
$url = "http://rest.yunba.io:8080?method=publish&appkey=".$_POST["sendappkey"]."&seckey=".$_POST["sendsecretkey"]."&topic=".$_POST["sendtopic"]."&msg=".urlencode($_POST["sendmsg"]);
file_get_contents($url);
echo "发送成功";
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>云巴测试环境</title>
<script type="text/javascript" src="socket.io-1.3.5.min.js"></script>
<script type="text/javascript" src="yunba-js-sdk.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
var yunba;
function yunbaconnect() {
var appkey = $("#yunbaappkey").val();
var clientid = $("#yunbaclientid").val();
var topic = $("#yunbatopic").val();
if($("#yunbaisssl").is(":checked"))
yunba = new Yunba({server: 'https://sock.yunba.io', port: 443, appkey: appkey});
else
yunba = new Yunba({server: 'http://sock.yunba.io', port: 3000, appkey: appkey});
yunba.init(function (success) {//初始化云巴服务
if (success) {//初始化云巴服务成功
yunba.connect_by_customid(clientid, function (success, msg, sessionid) {//初始化云巴服务并且通过指定clientid连接服务器
if (success) {//连接服务器成功
yunba.subscribe({'topic': topic}, function (success, msg) {//订阅topic
if (success) {
$('#msg').append("连接成功<br />");
} else {
$('#msg').append(msg + "<br />");
}
});
yunba.set_message_cb(function (data) {//设置接收消息的函数
$('#msg').append("Topic:" + data.topic + ",Msg:" + data.msg + "<br />");
});
} else {
$('#msg').append(msg + "<br />");
}
});
}
});
}
function yunbadisconnect() {
yunba.disconnect(function (success, msg) {
if (success) {
$('#msg').append("连接断开<br />");
} else {
$('#msg').append("断开连接失败<br />");
}
});
}
function send() {
$.ajax({
url: '<?php echo $_SERVER['REQUEST_URI'];?>',
method: 'post',
data: {
act: 'sendyunba',
sendappkey: $('#sendappkey').val(),
sendsecretkey: $('#sendsecretkey').val(),
sendtopic: $('#sendtopic').val(),
sendmsg: $('#sendmsg').val()
},
success: function(data) {
if(data == '发送成功') {
$('#msg').append("发送成功<br />");
} else {
console.log(data);
$('#msg').append("发送失败<br />");
}
}
});
}
</script>
</head>
<body>
<div style="float:left;width:40%">
<div>
<h2>连接云巴</h2>
<label for="yunbaappkey">云巴appkey</label><input id="yunbaappkey" type="text" value=""/><br />
<label for="yunbaclientid">云巴用户id</label><input id="yunbaclientid" type="text"/><br />
<label for="yunbatopic">云巴topic</label><input id="yunbatopic" type="text" /><br />
<label for="yunbaisssl">是否使用ssl</label><input id="yunbaisssl" type="checkbox" /><br />
<button type="button" onclick="yunbaconnect();" />连接</button>
<button type="button" onclick="yunbadisconnect();" />断开</button>
</div>
<div>
<h2>发送消息</h2>
<label for="sendappkey">云巴appkey</label><input id="sendappkey" value=""/><br />
<label for="sendsecretkey">云巴secretkey</label><input id="sendsecretkey" value=""/><br />
<label for="sendtopic">云巴topic</label><input id="sendtopic" /><br />
<label for="sendmsg">云巴消息</label><input id="sendmsg"/><br />
<button type="button" onclick="send();" />发送</button>
</div>
</div>
<div id="msg" style="float:left;width:40%">
</body>
</html>