Yunba 的 SDK 按照实现的方式,可以分为两种,一种是所谓原生 SDK,一种是基于 Socket.IO 的 SDK。
例如像 Android, iOS, C 等这些原生 SDK,实现了完整的二进制协议栈,在运算能力有限、带宽有限的平台上,可以很好的工作。
另外一类像 JavaScript SDK(非 node.js),就是基于 Socket.IO API 实现的。
相对于原生 SDK,基于 Socket.io API 的 SDK 代码体积小,开发周期短,适合为小众语言快速开发 SDK。
Socket.IO 是在 WebSocket 基础上开发的一种基于 HTTP 协议的长连接通讯方式,使用起来跟原生的 Socket 一样方便, 特别是在 Web App 开发中,使用得越来越多。
这里以 Python 为例子,演示通过调用 Yunba Socket.IO API 快速集成。
pip install -U socketIO-client==0.5.5与 socket.io 服务器建立连接。
socketIO = SocketIO('sock.yunba.io', 3000)| 名称 | 类型 | 说明 |
|---|---|---|
| host | String | socket.io API server,默认值 'sock.yunba.io' |
| port | number | socket.io API 端口,默认值 3000 |
init 建立连接成功后的回调。
{"name":"socketconnectack","args":[{"msg":"你已经通过websocket与服务器链接上。"}]}触发 connect 命令,与 socket.io 服务器确认身份。以下2方式任选其一即可,推荐使用appkey+customid方式进行连接,可保证每次连接都能使用相同的session。
socketIO.emit('connect', {'appkey': '52fcc04c4dc903d66d6f8f92'}) # 使用appkey连接
socketIO.emit('connect', {'appkey': '52fcc04c4dc903d66d6f8f92', 'customid': 'userid'}) # 直接使用自定义的会话ID进行连接connect 成功后的回调。
{"name":"connack","args":[{"success":true}, {"sessionid": "123456789XXXX"}]}订阅一个频道。
socketIO.emit('subscribe', {'topic': 'testtopic1'})subscribe 订阅成功回调。
{"name":"suback","args":[{"success":true}]}发布一个消息。
socketIO.emit('publish', {'topic': 'channel1', 'msg': 'hello, Yunba', 'qos': 1})发布 publish, publish_to_alias, publish2, publish2_to_alias 成功回调。
{"name":"puback","args":[{"success":true, "messageId": "11842355493944946011"}]}App 可以调用此函数来绑定账号,用户名,每个用户只能指定一个别名。
socketIO.emit('set_alias', {'alias': 'mytestalias1'})| 名称 | 类型 | 说明 |
|---|---|---|
| alias | String | 用户设置的别名信息,只支持英文数字下划线,长度不超过50个字符 |
设置别名成功回调。
回调参数:
{"success": true}| 名称 | 类型 | 说明 |
|---|---|---|
| success | boolen | 设置成功返回 true,否则返回 false |
App 可以调用此函数来获取当前用户的别名。
socketIO.emit('get_alias')读取别名回调。
{'alias': 'mytestalias1'}| 名称 | 类型 | 说明 |
|---|---|---|
| alias | string | 用户当前别名 |
向用户别名发送消息, 用于实现点对点的消息发送。
socketIO.emit('publish_to_alias', {'alias': 'mytestalias1', 'msg': "hello to alias"})| 名称 | 类型 | 说明 |
|---|---|---|
| alias | String | 用户设置的别名信息,只支持英文数字下划线,长度不超过50个字符 |
| msg | String | 向目标别名的订阅者发布的消息 |
App 可以调用此函数来获取订阅输入 Topic 下面所有的用户的别名。
socketIO.emit('get_alias_list', {'topic': 'testtopic1'})| 名称 | 类型 | 说明 |
|---|---|---|
| topic | String | app 订阅的的频道,topic 只支持英文数字下划线,长度不超过50个字符,数组的长度不超过100 |
get_alias_list 结果回调。
'''succ'''
{'data': {'alias': ['mytestalias1'], 'occupancy': 1}, 'success': True}
'''failed'''
{success: false, error_msg: 'Broker Error'}| 名称 | 类型 | 说明 |
|---|---|---|
| success | boolean | 成功返回 true, 否则返回 false |
| data.alias | List | 订阅的 alias 列表,success 为 true 时有效 |
| error_msg | String | 错误信息,success 为 false 时有效 |
App 可以查询用户订阅的频道列表,如果不传入参数 alias, 则是获取当前用户的频道列表,如果输入参数 alias,则是获取目标 alias 的频道列表。
socketIO.emit('get_topic_list', {'alias': 'mytestalias1'})| 名称 | 类型 | 说明 |
|---|---|---|
| alias | String | 用户设置的别名信息,只支持英文数字下划线,长度不超过50个字符 |
get_topic_list 结果回调。
'''succ'''
{'data': {'topics': ['testtopic2']}, 'success': True}
'''failed'''
{'success': False, error_msg: 'Broker Error'}| 名称 | 类型 | 说明 |
|---|---|---|
| success | boolean | 成功返回 true, 否则返回 false |
| data.topics | List | 订阅的 topic 列表,success 为 true 时有效 |
| error_msg | String | 错误信息,success 为 false 时有效 |
publish 升级版本,支持更多参数。目前支持的参数。
socketIO.emit('publish2', {
'topic': 'topic1',
'msg': 'from publish2',
"opts": {
'qos': 1,
'apn_json': {"aps":{"sound":"bingbong.aiff","badge": 3, "alert":"douban"}}
'messageId': '11833652203486491113'
}
})| 名称 | 类型 | 说明 |
|---|---|---|
| topic | String | app 订阅的的频道,topic 只支持英文数字下划线,长度不超过50个字符,数组的长度不超过100 |
| msg | String | 向订阅者发布的消息 |
| opts | Dict | 可选项。publish2 扩展参数。 |
目前支持的 publish2 扩展参数
publish2 扩展参数都是可选项,如果不填写参数,publish2 的行为与 publish 一样。
| 名称 | 类型 | 说明 |
|---|---|---|
| qos | number | 如果不填,默认为 1 |
| apn_json | dict | 如果不填,则不会发送APN。 APN 参考:Apple 官方文档 |
| messageId | String | 消息 ID,64 位整型数转化成 string。如果不填,由系统自动生成 |
| time_to_live | number | 离线消息保留时间值,单位是秒(例如2天 2*24*3600),当前默认值为5天 |
publish2 的 alias 版本。
socketIO.emit('publish2_to_alias', {'alias': 'alias_mqttc_sub', 'msg': "hello to alias from publish2_to_alias"});- 参考
publish_to_alias - 支持
publish2扩展参数
发布 publish, publish_to_alias, publish2, publish2_to_alias 成功回调。
{"name":"puback","args":[{"success":true, "messageId": "11842355493944946011"}]}App 可以查询用户的在线状态。
socketIO.emit('get_state', {'alias': 'mytestalias1'})| 名称 | 类型 | 说明 |
|---|---|---|
| alias | String | 用户设置的别名信息,只支持英文数字下划线,长度不超过50个字符 |
get_state 结果回调。
'''succ'''
{'data': 'online', 'success': True}
'''failed'''
{'success': False, error_msg: 'Broker Error'}| 名称 | 类型 | 说明 |
|---|---|---|
| success | boolean | 成功返回 true, 否则返回 false |
| data | String | 在线状态 |
| error_msg | String | 错误信息,success 为 false 时有效 |
recvack 是付费服务,免费用户可能不能正常使用。
第一个目标用户(且不是消息发布者)收到消息给服务器回复 puback 后,给消息发布者发送 recvack,消息发布者通过这个通知,可以了解第一个收到消息的用户的 alias 和 时间戳。
recvack {u'data': u'{"timestamp":1411374510357,"alias":"alias_mqttc_sub"}', u'success': True, u'messageId': u'11839467508410466019'}| 名称 | 类型 | 说明 |
|---|---|---|
| success | boolean | 成功返回 true, 否则返回 false |
| data.timestamp | number | recvack 收到的时间戳,时区为 GMT |
| data.alias | String | recvack 用户的 alias |
| messageId | String | 消息 ID,与 publish 时的 ID 对应 |
Python 例子 (socketIO-client==0.5.5)
from socketIO_client import SocketIO
import logging
logging.basicConfig(level=logging.INFO)
def on_socket_connect_ack(args):
print 'on_socket_connect_ack', args
socketIO.emit('connect', {'appkey': '52fcc04c4dc903d66d6f8f92', 'customid': 'python_demo'})
def on_connack(args):
print 'on_connack', args
socketIO.emit('subscribe', {'topic': 'testtopic2'})
print "publish2_to_alias"
socketIO.emit('publish2_to_alias', {'alias': 'alias_mqttc_sub', 'msg': "hello to alias from publish2_to_alias"});
def on_puback(args):
print 'on_puback', args
if args['messageId'] == '11833652203486491112':
print ' [OK] publish with given messageId'
def on_suback(args):
print 'on_suback', args
socketIO.emit('publish', {'topic': 'testtopic2', 'msg': 'from python', 'qos': 1})
socketIO.emit('publish', {
'topic': 'testtopic2',
'msg': 'from python with given messageId',
'qos': 1,
'messageId': '11833652203486491112'
})
socketIO.emit('publish2', {
'topic': 't2thi',
'msg': 'from publish2',
"opts": {
'qos': 1,
'apn_json': {"aps":{"sound":"bingbong.aiff","badge": 3, "alert":"douban"}},
'messageId': '11833652203486491113'
}
})
socketIO.emit('set_alias', {'alias': 'mytestalias1'})
def on_message(args):
print 'on_message', args
def on_set_alias(args):
print 'on_set_alias', args
socketIO.emit('publish2', {
'topic': 'testtopic2',
'msg': 'from publish2',
"opts": {
'qos': 1,
'apn_json': {"aps":{"sound":"bingbong.aiff","badge": 3, "alert":"douban"}}
}
})
socketIO.emit('get_alias')
socketIO.emit('publish_to_alias', {'alias': 'mytestalias1', 'msg': "hello to alias"})
socketIO.emit('get_topic_list', {'alias': 'mytestalias1'})
socketIO.emit('get_state', {'alias': 'mytestalias1'})
def on_get_alias(args):
print 'on_get_alias', args
def on_alias(args):
socketIO.emit('get_alias_list', {'topic': 'testtopic2'})
print 'on_alias', args
def on_get_topic_list_ack(args):
print 'on_get_topic_list_ack', args
def on_get_alias_list_ack(args):
print 'on_get_alias_list_ack', args
def on_publish2_ack(args):
print 'on_publish2_ack', args
if args['messageId'] == '11833652203486491113':
print ' [OK] publish2 with given messageId'
def on_publish2_recvack(args):
print 'on_publish2_recvack', args
def on_get_state_ack(args):
print 'on_get_state_ack', args
socketIO = SocketIO('sock.yunba.io', 3000)
socketIO.on('socketconnectack', on_socket_connect_ack)
socketIO.on('connack', on_connack)
socketIO.on('puback', on_puback)
socketIO.on('suback', on_suback)
socketIO.on('message', on_message)
socketIO.on('set_alias_ack', on_set_alias)
socketIO.on('get_topic_list_ack', on_get_topic_list_ack)
socketIO.on('get_alias_list_ack', on_get_alias_list_ack)
socketIO.on('puback', on_publish2_ack)
socketIO.on('recvack', on_publish2_recvack)
socketIO.on('get_state_ack', on_get_state_ack)
socketIO.on('alias', on_alias) # get alias callback
socketIO.wait()