Gracias por los comentarios

Este artículo ha sido traducido automáticamente. (Aviso legal)

Listado de códigos para mqtt.lua

La siguiente lista de códigos, mqtt.lua, proporciona el código para implementar el protocolo MQTT en Citrix ADC mediante extensiones de protocolo. El código solo tiene definida la función de devolución de llamada de datos del cliente TCP: Client.on_data (). Para los datos del servidor, no agrega una función de devolución de llamada y el servidor al cliente toma la ruta nativa rápida. Para los datos del cliente, el código analiza el mensaje del protocolo MQTT CONNECT y extrae el ID de cliente. A continuación, utiliza el ID de cliente para el valor user_token, que se utiliza para equilibrar la carga de todo el tráfico de cliente para la conexión basada en el ID de cliente estableciendo el método LB para el servidor de LB como USER_TOKEN. Utiliza el ID de cliente también para el valor user_session, que se puede utilizar para la persistencia de LB estableciendo el tipo de persistencia para el servidor de LB como USERSESSION. El código utiliza ns.send () para hacer LB y enviar los datos iniciales. Utiliza la API ns.pipe () para enviar el resto del tráfico del cliente directamente a la conexión del servidor, evitando las llamadas al controlador de devolución de llamada de extensión.

--[[ MQTT event handler for TCP client data ctxt - TCP client side App processing context. data - TCP Data stream received. - parse the client ID from the connect message - the first message should be connect - send the data to LB with ClientID as user token and session - pipe the subsequent data to LB directly. This way the subsequent MQTT traffic will bypass the tcp client on_data handler - if a parse error is seen, throw an error so the connection is reset --]] function client.on_data(ctxt, payload) local data = payload.data local data_len = data:len() local offset = 1 local byte = nil local utf8_str_len = 0 local msg_type = 0 local multiplier = 1 local max_multiplier = 128 * 128 * 128 local rem_length = 0 local clientID = nil -- check if MQTT fixed header is present (fixed header length is atleast 2 bytes) if (data_len < 2) then goto need_more_data end byte = data:byte(offset) offset = offset + 1 -- check for connect packet - type value 1 msg_type = bit32.rshift(byte, 4) if (msg_type ~= 1) then error("Missing MQTT Connect packet.") end -- parse the remaining length repeat if (multiplier > max_multiplier) then error("MQTT CONNECT packet parse error - invalid Remaining Length.") end if (data_len < offset) then goto need_more_data end byte = data:byte(offset) offset = offset + 1 rem_length = rem_length + (bit32.band(byte, 0x7F) * multiplier) multiplier = multiplier * 128 until (bit32.band(byte, 0x80) == 0) -- protocol name -- check if protocol name length is present if (data_len < offset + 1) then goto need_more_data end -- protocol name length MSB byte = data:byte(offset) offset = offset + 1 utf8_str_len = byte * 256 -- length LSB byte = data:byte(offset) offset = offset + 1 utf8_str_len = utf8_str_len + byte -- skip the variable header for connect message -- the four required fields (protocol name, protocol level, connect flags, keep alive) offset = offset + utf8_str_len + 4 -- parse the client ID -- -- check if client ID len is present if (data_len < offset + 1) then goto need_more_data end -- client ID length MSB byte = data:byte(offset) offset = offset + 1 utf8_str_len = byte * 256 -- length LSB byte = data:byte(offset) offset = offset + 1 utf8_str_len = utf8_str_len + byte if (data_len < (offset + utf8_str_len - 1)) then goto need_more_data end clientID = data:sub(offset, offset + utf8_str_len - 1) -- send the data so far to lb, user_token is set to do LB based on clientID -- user_session is set to clientID as well (it will be used to persist session) ns.send(ctxt.output, "DATA", {data = data, user_token = clientID, user_session = clientID}) -- pipe the subsequent traffic to the lb - to bypass the extension handler ns.pipe(ctxt.input, ctxt.output) goto parse_done ::need_more_data:: ctxt:hold(data) ::parse_done:: return end
La versión oficial de este contenido está en inglés. Para mayor comodidad, parte del contenido de la documentación de Cloud Software Group solo tiene traducción automática. Cloud Software Group no puede controlar el contenido con traducción automática, que puede contener errores, imprecisiones o un lenguaje inadecuado. No se ofrece ninguna garantía, ni implícita ni explícita, en cuanto a la exactitud, la fiabilidad, la idoneidad o la precisión de las traducciones realizadas del original en inglés a cualquier otro idioma, o que su producto o servicio de Cloud Software Group se ajusten a cualquier contenido con traducción automática, y cualquier garantía provista bajo el contrato de licencia del usuario final o las condiciones de servicio, o cualquier otro contrato con Cloud Software Group, de que el producto o el servicio se ajusten a la documentación no se aplicará en cuanto dicha documentación se ha traducido automáticamente. Cloud Software Group no se hace responsable de los daños o los problemas que puedan surgir del uso del contenido traducido automáticamente.
Listado de códigos para mqtt.lua