1、WebSocket API 概念
WebSocket API由一个或多个路由组成。路由选择表达式用于确定特定请求应使用的路由,该选择将在请求中提供。根据请求对表达式进行求值,以产生与您的路线的routeKey值之一相对应的值。例如:如果您的JSON消息看起来像 {“action” : “onMessage” , “message” : “Hello everyone”},那么将为此请求选择onMessage路由。
默认情况下,WebSocket API中已经定义了三种路由。除了以下提到的路线外,我们还可以根据需要添加自定义路线。
$ default —当路由选择表达式产生的值与API路由中的任何其他路由键都不匹配时使用。例如,这可用于实现通用错误处理机制。
$ connect —客户端第一次连接到WebSocket API时使用关联的路由。
$ disconnect —当客户端从您的API断开连接时,将使用关联的路由。
通过WebSocket API成功连接设备后,将为该设备分配唯一的连接ID。如果建立连接,则该连接ID将在整个生命周期中保持不变。
2、实装用例
serverless中创建4个lambda处理函数
WebsocketConnectHandler:websocket连接建立后处理
WebsocketDisconnectHandler:websocket连接断开后处理
WebsocketSetNotifyListHandler:从websocket处接受监听参数的处理
RcvNotifyParameter:监听IoT参数更新消息并通过websocket通知mApp端参数变化
functions:
WebsocketConnectHandler:
handler: subscribers/websocket-event-handler.connect
events:
- websocket: $connect
WebsocketDisconnectHandler:
handler: websocket-event-handler.disconnect
events:
- websocket: $disconnect
WebsocketSetNotifyListHandler:
handler: websocket-event-handler.setNotifyList
events:
- websocket: set_notify_list
NotifyParameter:
handler: websocket-event-handler.notifyParameter
timeout: 300
events:
- iot:
sql: "SELECT xxxx AS device_id FROM 'topic'"
const AWS = require('aws-sdk');
const ApiGateMngApi = new AWS.ApiGatewayManagementApi({
apiVersion: "2018-11-29",
endpoint: xxxx,
});
function connect(event, context, callback) {
Logger.info("Websocket Connect");
const connectionId = get(event, "requestContext.connectionId", null);
Logger.info(`Websocket Connect connectionId: ${connectionId}`);
callback(null, {statusCode: 200});
}
function disconnect(event, context, callback) {
Logger.info("Websocket Disconnect start");
const connectionId = get(event, "requestContext.connectionId", "");
Logger.info(`connectionId: ${connectionId}`);
xxx
}
function setNotifyList(event, context, callback) {
Logger.info("Set notify List start");
const connectionId = get(event, "requestContext.connectionId", null);
const createParams = {
xxx
}
xxx
}
function notifyParameter(event, context, callback) {
Logger.info("Notify parameter start");
const deviceId = event.device_id;
const rcvParams = get(event, 'payload.value', {});
xxxxApiGateMngApi.postToConnection(params).promise()
}
module.exports = {
connect,
disconnect,
setNotifyList,
notifyParameter
}
3、测试
建立参数监听连接:
发起iot更新消息
websocket监听到参数变化