Основные функции EMQX
Основные функции EMQX

Оглавление

1、Dashboard

1.1 Просмотр и настройка информационной панели

1.2 Интерфейс панели управления

1.2.1 ADMIN

1.2.2 MONITORING

1.2.3 RULE ENGINE

1.2.4 MANAGEMENT

1.2.5 TOOLS

2. Сертификация

2.1 Введение

2.1.1 Метод аутентификации

2.1.2 Процесс аутентификации личности EMQX

2.2 Аутентификация имени пользователя

2.2.1 Данные аутентификации по умолчанию

2.2.2 Данные аутентификации управления HTTP API

2.2.3 Проверка клиента MQTTX

2.3 Аутентификация идентификатора клиента

2.3.1 Данные аутентификации по умолчанию

2.3.2 Данные аутентификации управления HTTP API

2.3.3 Проверка клиента MQTTX

2.4 HTTP-аутентификация

2.4.1 Принцип аутентификации

2.4.2 Информация HTTP-запроса

2.4.3 Запрос аутентификации

2.4.4 Разработка службы аутентификации

2.4.5 Проверка клиента MQTTX

3. Клиентский SDK

3.1 Eclipse Paho Java​

3.1.1 Знакомство с Пахо

3.1.2 Пахо осуществляет отправку и получение сообщений

3.2 MQTT.js

3.2.1 Список API​

3.2.2 MQTT.js реализует отправку и получение сообщений

4. Регистрация и отслеживание

4.1 Вывод журнала контроля

4.2 Уровень журнала

4.3 Файлы журналов и смена журналов

4.4 Выходные файлы журнала для уровней журнала

4.5 Формат журнала

4.6 Уровни журналирования и обработчики журналов

4.7 Изменение уровня журнала во время выполнения

4.8 Отслеживание журналов


1、Dashboard

EMQX предоставил Dashboard Облегчить пользователям управление оборудованием и мониторинг соответствующих показателей. проходить Панель мониторинга позволяет просматривать основную информацию о сервере, условия загрузки и статистические данные. Вы можете просматривать такую ​​информацию, как состояние подключения клиента или даже отключать его. Также можно динамически загружать и выгружать определенные плагины. Кроме того, EMQ X Dashboard Он также имеет механизм правил детей и визуальный интерфейс управления, а также интегрирует простой MQTT Клиентские инструменты предоставляются для пользовательского тестирования. EMQX Dashboard Функция обеспечивается emqx-dashboard Реализация плагина, плагин включен по умолчанию, он будет EMQX Начать с динамическая нагрузка. Если вы хотите отключить Dashboard функция, вы можете data/loaded_plugins в {emqx_dashboard, true} Изменить на {emqx_dashboard, false} 。

1.1 Просмотр и настройка информационной панели

EMQ X Dashboard это Web приложения, вы можете получить к нему доступ непосредственно через браузер без установки какого-либо дополнительного программного обеспечения. когда EMQX успешно запускается на вашем локальном компьютере и EMQX Dashboard включен по умолчанию, путем доступа http://localhost:18083 Для просмотра информационной панели имя пользователя по умолчанию: admin , пароль public

Если EMQX развернут на основе докер-контейнера, его можно установить в контейнер. etc/plugins/emqx_dashboard.conf Посмотреть или изменить в EMQ X Dashboard конфигурация. EMQ X Dashboard Конфигурация项МожеткточкадляПользователь по умолчаниюислушатель两индивидуальный部точка:

Пользователь по умолчанию EMQ X Dashboard Вы можете настроить несколько пользователей, но при настройке файлетолькоподдерживать Конфигурация Пользователь по умолчанию。 Важно отметить, что как только вы пройдете Dashboard Измененный пользователь по по умолчанию, пароль, но Пользователь по По умолчаниюиз сопутствующей информации Воляк Вы здесь Dashboard Последние изменения на из точны, файл конфигурации в Пользователь. по умолчанию Конфигурация Воляигнорируется。

слушатель EMQ X Dashboard поддерживать HTTP и HTTPS Два вида Прослушиватель, но по умолчанию включен только порт прослушивания 18083 из HTTP Listener。

1.2 Интерфейс панели управления

для позволяет пользователям быстро находить и переключать текущую позицию во время работы и просмотра, EMQ X Dashboard Принята боковая навигация из режима и по умолчанию установлена ​​на В обычных обстоятельствах Dashboard Содержит следующие элементы навигации первого уровня:

Последняя версия EMQ X Brokerиз Интерфейс панели Расположение органов управления немного другое, добавлена ​​некоторая навигация, но по сути они одинаковы.

1.2.1 ADMIN

Users

Ты можешь Users Просмотр страниц и управление ими могут получить доступ и работать Dashboard изиспользовать Домашнее хозяйство:

Settings

в настоящий момент EMQ X Dashboard Только поддержка меняет тему и язык Два настройки вида:

1.2.2 MONITORING

EMQ X Dashboard Данные очень богаты из проекта мониторинга данных, полностью охватывающего сервер иклиент, вся эта информация находится в разделе МОНИТОРИНГ Следующие страницы разумно отображаются для использования пользователями.

Overview

Overview как Dashboard страница отображения по умолчанию, результаты EMQ X Когда передний узел содержит подробную информацию, а другой узел кластера — ключевую информацию, это помогает пользователям быстро понять состояние каждого узла.

Clients

Clients Страница отображаетсясоединять с обозначением узлов списка клиентов, поддерживаемых Client ID Непосредственный поиск клиента. Помимо просмотра основной информации о клиентизах, вы также можете просмотреть правую часть каждой записи. Kick Out Кнопка, чтобы выгнать клиента. Обратите внимание, что эта операция отключит клиент и завершит его сеанс. Clients На странице используется снимок экрана для отображения списка клиентов. Поэтому при изменении статуса клиента страница не будет обновляться автоматически, чтобы получить последние данные о клиенте.

 Если вы не можете получить нужную вам информацию в списке, вы можете нажать кнопку Client ID Приходите и просмотрите детали клиента.

 Наши данные о Воляклиентах разделены на различные области. соединять,сессия и индекс Третья категория, поясните каждое поле ниже:

соединять

Беседа

 индекс

На странице сведений о клиенте на вкладке «Подписки» вы можете просмотреть информацию о подписке клиента, создать новую или отменить подписку:

Topics

Показать статус всех тем системы

Subscriptions

Subscriptions Страница содержит обозначение узла со всей информацией о подписке и утверждениеиспользовать пароль пользователя. Client ID Проверяйте все подписки в обозначениеклиентиз.

1.2.3 RULE ENGINE

использовать EMQ X Механизм правил может гибко обрабатывать сообщения и события. Например, сообщение можно преобразовать в формат и сохранить в этом формате. таблицы данных или повторно отправляется в очередь сообщений и так далее. для облегчает пользователям использование механизма правил использования, EMQ X Dashboard соответствующие страницы визуальных операций, вы можете Нажмите RULE ENGINE Перемещайтесь по проекту, чтобы получить доступ к этим страницам. Ввиду сложности концепций, связанных с механизмом правил, Соответствующие операции могут занять много места, и я напишу отдельный блог, чтобы представить их позже.

1.2.4 MANAGEMENT

в настоящий момент EMQ X Dashboard из MANAGEMENT Проект навигации в основном включает в себя плагины расширения. из Страница управления мониторингом ииспользовать на HTTP API Сертификацияиз AppID и AppSerect из Менеджмент страницы.

Plugins

Plugins Список страниц EMQ X Возможность обнаружить все плагины, в том числе EMQ X Официальный плагин и вы подписаны EMQ X Официальный стандартный плагин собственной разработки, Ты можно Эта страница позволяет вам просмотреть статус работы плагина, а также запустить или остановить плагин в любое время.

Видно, что помимо emqx-dashboard, EMQ X также по умолчанию запустит четыре плагина, включая emqx-rule-engine.

Applications

Applications Список страницкогда Создано ранееизотвечатьиспользовать,Ты можно На этой странице выполняются такие операции, как создание приложения, временный запрет прав доступа на запуск приложения и т.д. ЭМК X создаст AppID для admin ,AppSecret для publish из Значение по умолчанию должно быть удобным для пользователей, посещающих его впервые:

Вы можете нажать Нажмите Application Правый верхний угол страницы из New App кнопка для создания нового файла, где AppID и AppSecret Это обязательно параметры. После завершения создания Вы можете нажать Нажмите View кнопка для просмотра сведений о приложении, AppSecret Также показано в деталях. Ниже приводится описание соответствующих полей:

1.2.5 TOOLS

в настоящий момент EMQ X Dashboard из TOOLS Элементы навигации в основном включают в себя WebSocket страница клиентских инструментов и HTTP API Быстрая страница.

Websocket

Websocket Страница для ваших детей: простая, но эффективная WebSocket клиентинструмент,Он содержит функции подключения, подписки и публикации.,В то же время вы также можете просмотреть данные отправленных и полученных вами сообщений.,Мы надеемся, что это поможет вам быстро завершить тестовую проверку определенных сценариев:

HTTP API

HTTP API Список страниц EMQ X в настоящий моментподдерживатьизвсе HTTP API и его описание:

2. Сертификация

2.1 Введение

Сертификация личности является важной частью большинства приложений MQTT. Протокол подтвержденияиспользовать имя пользователя и пароль Сертификация, сертификация startuseidentity может эффективно предотвратить незаконное клиентское объединение. EMQ X в Сертификацияобратитесь киздакогдаодинклиентсоединятьприезжать EMQ X из-за конфигурации на стороне сервера для управления клиентсоединением разрешений сервера.

EMQ X из Сертификацияподдержки включает два уровня:

  1. MQTT Само соглашение является CONNECT обозначиниеиспользовать логин и пароль в сообщении, EMQ X плагин формирует поддержку на основе Username、 ClientID、HTTP、JWT、LDAP и различные типы баз данных, такие как MongoDB.、MySQL、PostgreSQL、Redis и многие другие формы сертификации.
  2. На транспортном уровне TLS к гарантирует, что использование клиентского сертификата клиента для аутентификации сервера и гарантирует, что сервер аутентифицирует серверный сертификат клиента. Также поддержка на основе PSK из TLS/DTLS Сертификация。

2.1.1 Метод аутентификации

EMQ X поддерживатьделатьиспользоватьвстроенныйисточник данных(документ、Встроенная база данных)、JWTВнешняя основная база данныхиПользовательский HTTP API какличность Сертификацияисточник данных。 соединятьисточник данных, логика сертификации реализуется через плагины, и каждый плагин соответствует своего рода методу. аутентификации,делатьиспользовать Необходимо включить передиспользовать相отвечатьизплагин。 Когда клиент подключается, плагин проверяет его username/clientid и password Является ли иобозначение источником Данные данных соответствуют требованиям для установления личности клиента. Сертификация.

EMQ X поддерживатьиз Метод аутентификации:

Встроенный источник данных

Username Сертификация Cliend ID Сертификация

Создать профили использования EMQ X Встроенная база данныхпоставлять Сертификацияисточник данных,проходить HTTP API Управление простое и легкое.

внешняя база данных

LDAP Сертификация MySQL Сертификация PostgreSQL Сертификация Redis Сертификация MongoDB Сертификация

Внешняя база данных может хранить большие объемы данных и облегчать интеграцию с внешними системами управления устройствами.

другой

HTTP Сертификация JWT Сертификация

JWT Сертификация может быть выдана массово. Информация о сертификации, HTTP. Сертификация может реализовывать сложную логику аутентификации из Сертификация.

После изменения конфигурации подключаемого модуля необходимо перезапустить его, чтобы изменения вступили в силу. Некоторые подключаемые модули аутентификации Сертификация включают функцию ACL.

Сертификациярезультат

любой вид Метод аутентификации В конце концов это будетвозвращатьсяодинрезультат:

Сертификация успешна: после сравнения Сертификация клиента успешна Сертификация не удалась: после передачи клиенту сертификация не удалась, источник Пароль не соответствует данным и когда прежний пароль игнорировать Сертификация (игнорировать): когда прежний метод В аутентификации не обнаружено данных о сертификации, и невозможно однозначно определить, является ли результат успешным или нет. Это остается на усмотрение следующего метода в цепочке сертификации. аутентификацииилианонимный Сертификация来判断

анонимный Сертификация

EMQ X Анонимная сертификация включена в конфигурации по умолчанию, и любой клиент может получить к ней доступ. EMQ Х. Нет явного разрешения/запрета (игнорирования) при запросе подключения, EMQ X Воля решает, разрешить ли клиентсоединять на основе анонимной ситуации Сертификацияоткрытьиспользовать.

Настройте переключатель анонимной сертификации:

Язык кода:javascript
копировать
# Входить etc/emqx.conf 
## Value: true | false 
allow_anonymous = true

Пожалуйста, запретите использование анонимной сертификации в производственной среде.

Примечание. Нам нужно войти в контейнер, чтобы изменить конфигурацию, а затем перезапустить службу EMQ X.

пароль Правила добавления соли и Хэш-метод

EMQ X большинство Сертификацияплагинсередина Можеткначинатьиспользовать Хэш-метод,источник данныхсерединатолько保存парользашифрованный текст,Храните данные в безопасности.

При открытии использовать Хэш-метод, каждый клиент обозначается одним соль и настройка правил соли, база данных Среднее хранилищеизпарольда按照。Правила добавления соли и Хэш-метод После обработкииззашифрованный текст。

к MySQL Сертификациядляпример:

Правила засолки и конфигурация Хэш-метода:

Язык кода:javascript
копировать
# Входитьetc/plugins/emqx_auth_mysql.conf 

## Никакой соли, просто перемешивание 
auth.mysql.password_hash = sha256 

## salt префикс:делатьиспользовать sha256 шифрование salt + пароль Сращивание струн auth.mysql.password_hash = salt,sha256 

## salt суффикс:делатьиспользовать sha256 шифрование пароль + salt Сращивание струн auth.mysql.password_hash = sha256,salt 

## pbkdf2 with macfun iterations dklen 
## macfun: md4, md5, ripemd160, sha, sha224, sha256, sha384, sha512 
## auth.mysql.password_hash = pbkdf2,sha256,1000,20

Как создать информацию о сертификации

  1. длякаждыйклиентточкаиспользовать Имя учетной записи、Client ID、парольки соль (соль) и другая информация
  2. делатьиспользоватьи MySQL Сертификация то же самое правило соли. Хэш-метод обрабатывает информацию клиента для получения зашифрованного текста.
  3. Воляклиентнаписание информациибаза данных,клиентизпарольотвечатькогдадлязашифрованный текстинформация

2.1.2 Процесс аутентификации личности EMQX

  1. Согласно конфигурации из Сертификация SQL объединитьклиентвходящийизинформация,Запроситьпароль(зашифрованный текст)и salt (соль) и другие данные Сертификации, при отсутствии результата запроса Сертификация Воля завершается и начинается ignore результат 。
  2. Вычислите зашифрованный текст в соответствии с настроенным правилом добавления Хэш-метода. Если использовать Хэш-метод не включен, пропустите этот шаг. 。
  3. Волябаза Сохраните зашифрованный текст и время в данных перед расчетом из зашифрованного текста для сравнения. Если сравнение прошло успешно, Сертификация пройдет, в противном случае Сертификация завершится неудачно. 。

Запись данных из правил засолки и соответствующий Хэш-метод из конфигураций могут работать только нормально. Изменение Хэш-метода приведет к аннулированию существующих данных Сертификации.

Сертификацияцепь

когда同часначинатьиспользовать Несколько Метод аутентификациичас,EMQ X Сертификация цепочки воли в порядке плагинов включает:

  • После успешного завершения сертификации завершите цепочку сертификации и разрешите доступ клиенту.
  • В случае сбоя сертификации завершите цепочку сертификации и отключите доступ клиента.
  • До последнего метода аутентификации все еще не переданы, исходя из конфигурации анонимной сертификации.
    • Разрешить доступ клиенту в анонимном режиме
    • Если анонимная Сертификация отключена, доступ клиента запрещен.

В то же время включение только одного плагина сертификации может повысить эффективность сертификации идентификации клиента.

2.2 Аутентификация имени пользователя

Username Сертификацияделатьиспользовать Конфигурациядокумент预设клиентиспользовать Имя учетной записиипароль,поддерживатьпроходить HTTP API Управление данными сертификации.

Username Сертификация не зависит от внешнего источника данных, что делает использование простым и достаточно легким. Используйте этот метод аутентификациитребуется довключатьплагин,мы можемксуществоватьDashboard里找приезжать这индивидуальныйплагин并включать。

Плагин:

emqx_auth_username

Хэш-метод

Username Сертификацияпо умолчаниюделатьиспользовать sha256 Шифрование хэша пароля можно выполнить по адресу etc/plugins/emqx_auth_username.conf Средние изменения:

После настройки Хэш-метода,Новыйиз Предустановленные данные сертификацииипроходить HTTP API Добавить данные из Сертификации. Зашифрованный хеш-текст Воляка, хранящийся в EMQ X Встроенная база данных.

2.2.1 Данные аутентификации по умолчанию

Можеткпроходить Конфигурациядокумент Предустановленные данные сертификации,Отредактируйте файл конфигурации: etc/plugins/emqx_auth_username.conf.

плагинначинать动час Волячитать Предустановленные данные сертификации并加载приезжать EMQ X Встроенная база данныхсередина, на этом этапе данные на узле будут синхронизированы с кластером.

Предустановленные данные сертификациисуществовать Конфигурацияв файледелатьиспользоватьчистый текстпароль,для безопасностии Можетподдерживать性考虑отвечатькогда避免делатьиспользовать Должен Функция

2.2.2 Данные аутентификации управления HTTP API

EMQ X предоставил соответствует изHTTP APIиспользоватькподдерживать Встроенный источник Данные о сертификации, мы можем добавить/просмотреть/отменить/изменить данные сертификации. 。

我们проходитьVSCodeприйти в гостиEMQ XизAPI /auth_username Полные данные сертификации связанных операций

Открыть плагин загрузки VSCode

Далее мы можем сохранить VSCode для написания кода.

Создать HTML-файл

 1. Проверьте существующую Сертификацию. Используйте данные пользователя: GET api/v4/auth_username

Язык кода:javascript
копировать
@hostname = 192.168.200.129 
@port=18083 
@contentType=application/json 
@userName=admin 
@password=public 
############Просмотр существующих данных сертификации использования домохозяйства############## 
GET http://{{hostname}}:{{port}}/api/v4/auth_username HTTP/1.1 Content-Type: {{contentType}} 
Authorization: Basic {{userName}}:{{password}}

возвращаться

 2. Добавьте API данных сертификации. определение: POST api/v4/auth_username{ "username": "emqx_u", "password": "emqx_p"}

Язык кода:javascript
копировать
########добавить виспользоватьсемья Сертификацияданные############## 
POST http://{{hostname}}:{{port}}/api/v4/auth_username HTTP/1.1
Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}

 { "username": "user", "password": "123456" }

возвращаться

3、Изменятьобозначениеиспользовать Имя учетной записиизпарольAPI определение: PUT api/v4/auth_username/${username}{ "password": "emqx_new_p"}

обозначениеиспользовать Имя учетной записи,传递новыйпарольруководить Изменять,сновасоединятьчас需要делатьиспользоватьновыйпарольруководитьсоединять:

Язык кода:javascript
копировать
###########Изменятьобозначениеиспользовать Имя учетной записиизпароль############# 
PUT http://{{hostname}}:{{port}}/api/v4/auth_username/user HTTP/1.1 
Content-Type: {{contentType}} 
Authorization: Basic {{userName}}:{{password}} 
 
{ "password": "user" }

возвращаться

4、Проверятьобозначениеиспользовать Имя учетной записиинформацияAPI определение: GET api/v4/auth_username/${username}

обозначениеиспользовать Имя учетной записи,Проверять相关использовать Имя учетной записи、парольинформация,Обратите внимание здесьвозвращатьсяизпарольдаделатьиспользовать Конфигурациядокументобозначение Хэш-методшифрованиеназадизпароль:

Язык кода:javascript
копировать
###########Проверятьобозначениеиспользовать Имя учетной записиинформация############# 
GET http://{{hostname}}:{{port}}/api/v4/auth_username/user HTTP/1.1 
Content-Type: {{contentType}} 
Authorization: Basic {{userName}}:{{password}}

возвращаться

5:удалить СертификацияданныеAPI определение: DELETE api/v4/auth_username/${username}

использоватькудалитьобозначение Сертификацияданные

Язык кода:javascript
копировать
###########удалитьобозначениеизиспользоватьсемьяинформация############# 
DELETE http://{{hostname}}:{{port}}/api/v4/auth_username/user HTTP/1.1 
Content-Type: {{contentType}} 
Authorization: Basic {{userName}}:{{password}}

возвращаться

2.2.3 Проверка клиента MQTTX

Инструмент Makeusemqttклиент проверяет имя пользователя makeuse и единый вход в систему из функции. от MQTT X: Cross-platform MQTT 5.0 Desktop Client Этот инструмент загрузки адресов соответствует операционной системе изmqttклиент.

1. Создайте новое соединение и настройте параметры следующим образом:

Введите имя пользователя и пароль в соответствующее поле ввода.,clientId здесь в настоящий момент можно ввести случайно (поскольку для основано на функции clientIdizСертификация и еще не запущено),之назад点соединять,соединятьуспех。использовать Имя учетной записиипароль Если вы допустили ошибкуиз话дасоединять不успехиз。

2. Снова создайте клиентсоединять,Можно как сообщение от подписчика,Предыдущий Сообщение от соединятькак,следующее

3. Подписчики добавляют подписки

После завершения подписки

4. Для публикации сообщения используйте издателя предыдущего клиентсоединятькак.

5. Проверьте, получил ли абонент сообщение

2.3 Аутентификация идентификатора клиента

Client ID Сертификация предустановок профиля makeuse клиент Клиент ID ипароль,поддерживатьпроходить HTTP API Управление данными сертификации.

Client ID Сертификация не зависит от внешнего источника данных, makeuse достаточно простой и легкий, makeuse такого рода метод аутентификациичас需要включать emqx_auth_clientid Плагин можно открыть прямо в DashBoard.

Хэш-метод

Client ID Сертификацияпо умолчаниюделатьиспользовать sha256 Шифрование хэша пароля можно выполнить по адресуetc/plugins/emqx_auth_clientid.conf Средние изменения:

После настройки Хэш-метода,Новыйиз Предустановленные данные сертификацииипроходить HTTP API Добавить данные из Сертификации. Зашифрованный хеш-текст Воляка, хранящийся в EMQ X Встроенная база данных.

2.3.1 Предустановленные данные сертификации

Можеткпроходить Конфигурациядокумент Предустановленные данные сертификации,编辑Конфигурациядокумент: etc/plugins/emqx_auth_clientid.conf

плагинначинать动час Волячитать Предустановленные данные сертификации并加载приезжать EMQ X Встроенная база данныхсередина, на этом этапе данные на узле будут синхронизированы с кластером.

Предустановленные данные сертификациисуществовать Конфигурацияв файледелатьиспользоватьчистый текстпароль,Из соображений безопасности и удобства обслуживания избегайте использования этой функции.

2.3.2 Данные аутентификации управления HTTP API

Мы используем VSCode для передачи EMQ XизAPI для добавления и просмотра клиента Данные IDиз Сертификации.

1. Добавьте API данных сертификации. определение: POST api/v4/auth_clientid{ "clientid": "emqx_c", "password": "emqx_p"}

Язык кода:javascript
копировать
####добавить вclientIdипароль##### 
POST http://{{hostname}}:{{port}}/api/v4/auth_clientid HTTP/1.1 
Content-Type: {{contentType}} 
Authorization: Basic {{userName}}:{{password}} 

{ "clientid": "emq-client1", "password": "123456" }

возвращаться

 2. Просмотр добавленного API данных из Сертификация. определение: GET api/v4/auth_clientid

Язык кода:javascript
копировать
#############Узнайте все подробности########
ПОЛУЧИТЕ http://{{имя хоста}}:{{порт}}/api/v4/auth_clientid HTTP/1.1
Тип контента: {{contentType}}
Авторизация: базовая {{userName}}:{{пароль}}

возвращаться

 3: Изменить обозначение Client ID изпарольAPI определение: PUT api/v4/auth_clientid/${clientid}{ "password": "emqx_new_p"} обозначение Client ID,传递новыйпарольруководить Изменять,сновасоединятьчас需要делатьиспользоватьновыйпарольруководитьсоединять:

Язык кода:javascript
копировать
#############Изменятьобозначение Client ID изпароль######## 
PUT http://{{hostname}}:{{port}}/api/v4/auth_clientid/emq-client1 HTTP/1.1 
Content-Type: {{contentType}} 
Authorization: Basic {{userName}}:{{password}} 

{ "password": "654321" }

возвращаться

2.3.3 Проверка клиента MQTTX

Инструмент Makeusemqttклиент проверяет makeuseClient IDсоединять логиниз Функция

На данный момент вам необходимо ввести его в поле имени пользователя, но вы можете заполнить его случайно!

2.4 HTTP-аутентификация

HTTP Сертификацияделатьиспользоватьснаружи部自建 HTTP отвечатьиспользовать Сертификацияисточник данных,в соответствии с HTTP API Сертификациярезультат определения данных, способный реализовать сложную логику аутентификации из Сертификации. Kaiuse Для функции нужна Воля emqx_auth_http Запустите плагин и измените файл конфигурации плагина, в котором есть URL-адрес интерфейса HTTP-сертификации. emqx_auth_http плагин同часвозвращаться包含了ACLиз Функция,Мы пока недоступны,Судя по аннотации Воля, его запрещено использовать.

1: Открыть на панели управления emqx_auth_http плагин, в то же время, во избежание ошибок, мы можем прекратить передачу имени пользователя, clientID Создать плагин Сертификации emqx_auth_clientid , emqx_auth_username

2.4.1 Сертификация原理

EMQ X Используйте параметр «Когда использовать информацию, связанную с бывшим клиентом» в событии подключения устройства, чтобы инициировать запрос разрешения на запрос службы использования пользователя «Настройка сертификации». проходитьвозвращатьсяиз HTTP Код статуса ответа (HTTP statusCode) для обработки запросов на сертификацию.

  1. Сертификациянеудача:API возвращаться 4xx код состояния
  2. Сертификацияуспех:API возвращаться 200 код состояния
  3. пренебрегать Сертификация:API возвращаться 200 код состояния且消息体 ignore

2.4.2 HTTP запросить информацию

HTTP API 基础запросить информацию, настроить Сертификат, заголовки запросов и правила повтора.

Правила добавления соли и Хэш-метод

HTTP существоватьпроситьсередина传递明文пароль,Правила добавления соли и Хэш-метод зависит HTTP отвечатьиспользовать。

2.4.3 Сертификацияпросить

EMQ при проведении Сертификации личности X Воля заполняет информацию об использовании когда бывший клиент и инициирует запрос конфигурации пользователя из Сертификации для запроса клиента в HTTP Серверная часть из данных сертификации.

Откройте файл конфигурации etc/plugins/emqx_auth_http.conf и измените следующее содержимое: После завершения изменения необходимо перезапустить службу EMQX.

HTTP Метод запросадля GET Когда запросить параметр Воляк URL Строка запроса передается в виде POST, PUT. Запросите затем Воля параметры запроса для отправки общей формы (content-type для x-www-form-urlencoded)。

Вы можете использовать заполнители в запросах на сертификацию при запросе EMQ X Воля автозаполнение информации для клиента:

  • %u:использовать Имя учетной записи
  • %c:Client ID
  • %a:клиент IP адрес
  • %r: протокол клиентского доступа
  • %P: простой текстовый пароль
  • %p:клиент端口
  • %C:TLS Сертификатмужскойиспользоватьимя(Сертификатиз域имяили子域имя),толькокогда TLS Действует при подключении
  • %d:TLS Сертификат subject,толькокогда TLS Действует при подключении

Для использования метода GET рекомендуется использовать методы POST и PUT, пароль в виде открытого текста может быть URL-адресом. Процесс передачи фиксируется в журнале сервера.

2.4.4 Сертификация Сервис Разработка

Создадим программу на основе Springboot из следует использовать: emqx-demo

1. POM-файл

Язык кода:javascript
копировать
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.jie</groupId>
    <artifactId>emqx-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>emqx-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2. Создайте файл конфигурации application.yml и настройте его.

Язык кода:javascript
копировать
server:
  port: 8991
spring:
  application:
    name: emqx-demo

3. Создайте контроллер: com.jie.emqxdemo.mqtt.AuthController напишите следующее;

Язык кода:javascript
копировать
package com.jie.emqxdemo.controller.mqtt;


import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

/**
 * @description:Принять запрос на сертификацию
 * @author: jie
 * @time: 2022/3/29 20:57
 */
@RestController
@RequestMapping("/mqtt")
@Slf4j
public class AuthController {
    /**
     * использовать для хранения данных   Фактическая разработка должна храниться в базе данныхсередина     */
    private Map<String, String> users;

    @PostConstruct
    public void init() {
        //действительныйизпарольотвечать Должендазашифрованный текст,mqttизhttpСертификация Компоненты передаютсяизпарольда明文,我们需要自己руководитьшифрованиепроверять
        users = new HashMap<>();
        users.put("user", "123456");
        users.put("emq-client2", "123456");
        users.put("emq-client3", "123456");
    }

    /**
     * @description: принять сообщение Если имя атрибута не соответствует, вы можете использовать аннотацию @RequestParam для сопоставления.
     * @author: jie
     * @time: 2022/3/29 21:03
     */
    @PostMapping("/auth")
    public ResponseEntity<?> auth(@RequestParam("clientid") String clientid,
                                  @RequestParam("username") String username,
                                  @RequestParam("password") String password) {
        log.info("emqxСертификация Настройка компонентовиспользовать Настроитьиз Сертификация服务открыть始Сертификация,clientid={},username={},password= {}", clientid, username, password);
        //Здесь можно реализовать сложную логику, но мы демонстрируем ее только для облегчения фиксированной операции.
        String value = users.get(username);
        if (StringUtils.isEmpty(value)) {
            return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
        }
        if (!value.equals(password)) {
            return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
        }
        return new ResponseEntity<Object>(HttpStatus.OK);
    }

}

2.4.5 Проверка клиента MQTTX

делатьиспользоватьMQTTXклиентинструментсоединятьEMQXServiceустройство,следующее

Я не знаю, почему всегда отсутствует знак. Может кто-нибудь дать мне совет в комментариях? Спасибо!

Введите это место изClient-ID случайно,Потому что для не проверил это поле в коде подтверждения,之назад点соединять,Discovery объединит успех,Затем вы можете перейти в службу Настроитьиз Сертификация, чтобы просмотреть вывод консоли.,Доказывает, что внешний интерфейс проверки HTTP эффективен. В реальном процессе разработки проекта код проверки HTTP-интерфейса будет не таким простым.,счетипарольи тому подобноеизданные肯定会存существоватьназад端база данныхсередина, код перейдет в издатаибазу данныхвданные做校验,Проверка будет успешной только в том случае, если она пройдет успешно.,В противном случае проверка не удастся.

когда РанEMQ XПомимо поддержки, мы уже говорили о нескольких видах методов. аутентификацииснаружи,возвращатьсяподдерживатьдругойиз Метод аутентификации,например:MySQLСертификация、PostgreSQLСертификация、RedisСертификация、MongoDBСертификация,длядругой Эти Метод только включение аутентификации соответствует изEMQ X и настройте соответствующий файл конфигурации, соответствующие данные сохраняются в соответствующем источнике. данных即Может。

3. Клиентский SDK

В реальных проектах нам необходимо завершить разработку собственной бизнес-логики, подключившись к серверу брокера сообщений MQTT, чтобы публиковать на нем сообщения, подписываться на сообщения и т. д. ЭМК Для разных языков существуют разные наборы инструментов SDK, которые можно посмотреть на официальном сайте и скачать: MQTT клиент SDK | EMQ (emqx.com)

3.1 Eclipse Paho Java

3.1.1 Знакомство с Пахо

Paho Javaклиент — это библиотека, написанная на Java и предназначенная для работы на платформах, совместимых с JVM (например, Android).

Пахо умеет не только подключаться к EMQ X Брокер также может быть подключен к серверу брокера сообщений, соответствующему спецификации протокола MQTT. настоящий моментPaho может перейти к следующей версии MQTT5.0к. Версия протокола MQTT3.3.1 в основном может удовлетворить более чем 90% сценариев доступа.

Paho Javaклиент предоставил два API:

  1. MqttAsyncClient изменения Полностью асинхронный API, в котором о завершении активности сообщается посредством зарегистрированного обратного вызова.
  2. MqttClient — это оболочка синхронизации вокруг MqttAsyncClient, в которой используется функция синхронизации программ.

3.1.2 Пахо осуществляет отправку и получение сообщений

1. Найдите проект: emqx-demo и добавьте зависимости maven.

Язык кода:javascript
копировать
<dependency>
            <groupId>org.eclipse.paho</groupId>
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
            <version>1.2.2</version>
        </dependency>

2. Writeuse для загрузки ymlНастроить конфигурацию из класса конфигурации из кода: com.jie.emqxdemo.properties.Mqttproperties

Язык кода:javascript
копировать
package com.jie.emqxdemo.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @description:использовать для загрузки yml Настроить конфигурацию из класса конфигурации
 * @author: jie
 * @time: 2022/3/31 21:12
 */
@Configuration
@ConfigurationProperties(prefix = "mqtt")
@Data
public class Mqttproperties {

    private String brokerUrl;

    private String clientId;

    private String username;

    private String password;

    @Override
    public String toString() {
        return "Mqttproperties{" +
                "brokerUrl='" + brokerUrl + '\'' +
                ", clientId='" + clientId + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

3. Напишите код обратного вызова сообщения: com.jie.emqxdemo.client.MessageCallback.

Язык кода:javascript
копировать
package com.jie.emqxdemo.client;

import jdk.nashorn.internal.parser.Token;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.stereotype.Component;

/**
 * @description:Обратный вызов сообщения
 * @author: jie
 * @time: 2022/3/31 22:12
 */
@Slf4j
@Component
public class MessageCallback implements MqttCallback {


    /**
     * @description: Обратный вызов этого метода запускается после потери соединения с сервером. Здесь можно выполнить некоторую специальную обработку, например повторное подключение.
     * @author: jie 
     * @time: 2022/3/31 22:14
     */
    @Override
    public void connectionLost(Throwable throwable) {
        log.info("Потерян доступ к сервису изоединять");
    }
    /**
     * @description: обратный вызов должен быть инициирован после получения сообщения.
     * Этот метод синхронизируется с помощью mqttклиентиспользовать. До того, как этот метод станет правильным, сообщение подтверждения подтверждения не будет отправлено брокеру.
     * Как только метод Клиент Воля выдает исключение и закрывается ненормально, при возврате к соединению все QoS1, QoS2 и клиент не подтверждаются ACK, и все сообщения отправляются; Сервер брокера снова отправляет его клиенту.
     * @author: jie
     * @time: 2022/3/31 22:15
     */
    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        log.info("Подписался на сообщение; theme={},messageid={},qos={},msg={}",
                s,
                mqttMessage.getId(),
                mqttMessage.getQos(),
                new String(mqttMessage.getPayload()));
    }
    /**
     * @description: обратный вызов генерируется после завершения публикации сообщения.
     * @author: jie
     * @time: 2022/3/31 22:18
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        int messageId = iMqttDeliveryToken.getMessageId();
        String[] topics = iMqttDeliveryToken.getTopics();
        log.info("Отправка сообщения завершена,messageId={},topics={}",messageId,topics);
    }
}

4. Напишите класс перечисления QOS: com.jie.emqxdemo.enums.QosEnum.

Язык кода:javascript
копировать
package com.jie.emqxdemo.enums;
/**
 * @description:Столбец перечисления Qos
 * @author: jie
 * @time: 2022/3/31 21:54
 */
public enum QosEnum {

    QOS0(0),QOS1(1),QOS2(2);

    private final int value;

    QosEnum(int value){
        this.value = value;
    }
    /**
     * @description: получить значение перечисления.
     * @author: jie
     * @time: 2022/3/31 21:56
     */
    public int value(){
        return this.value;
    }
}

5. Добавьте конфигурацию Настроить в файл application.yml:

Язык кода:javascript
копировать
mqtt:
  broker-url: tcp://192.168.58.149:1883
  client-id: emq-client
  username: user
  password: 123456

6. Класс клиентского пакета: com.jie.emqxdemo.client.

Язык кода:javascript
копировать
package com.jie.emqxdemo.client;

import com.jie.emqxdemo.enums.QosEnum;
import com.jie.emqxdemo.properties.Mqttproperties;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.nio.charset.StandardCharsets;

/**
 * @description:класс инкапсуляции клиента
 * @author: jie
 * @time: 2022/3/31 21:02
 */
@Component
@Slf4j
public class EmqClient {

    private IMqttClient iMqttClient;

    /**
     * @description:Класс конфигурации Воли внедряется
     */
    @Autowired
    private Mqttproperties mqttproperties;
    @Autowired
    private MqttCallback mqttCallback;

    /**
     * @description: инициализация
     * @author: jie
     * @time: 2022/3/31 21:22
     */
    @PostConstruct
    public void init(){
        //Механизм сохранения  сохраняться в памяти  MqttDefaultFilePersistence (постоянный для локальной файловой системы)
        MqttClientPersistence mqttClientPersistence = new MemoryPersistence();
        try {
            iMqttClient = new MqttClient(mqttproperties.getBrokerUrl(),mqttproperties.getClientId(),mqttClientPersistence);
        } catch (MqttException e) {
           log.error("Инициализация объекта clientmqttClient не удалась, errormsg={} brokerurl={},clientId= {}",e.getMessage(), mqttproperties.getBrokerUrl(),mqttproperties.getClientId());
        }
    }
    /**
     * @description:соединять метод на стороне сервера
     * @author: jie
     * @time: 2022/3/31 21:33
     */
    public void connect(String username,String password){
        //соединять объект опции
        MqttConnectOptions options = new MqttConnectOptions();
        //Автоматически переподключаемся
        options.setAutomaticReconnect(true);
        options.setUserName(username);
        options.setPassword(password.toCharArray());
        //временная изсессия
        options.setCleanSession(true);
        //Обратный вызов метода
        iMqttClient.setCallback(mqttCallback);
        try {
            iMqttClient.connect(options);
        } catch (MqttException e) {
           log.error("соединятьmqtt Ошибка брокера, причина ошибки: {}",e.getMessage());
        }
    }
    /**
     * @description:断открытьсоединять     * @author: jie
     * @time: 2022/3/31 21:48
     */
    @PreDestroy
    public void disConnect(){
        try {
            iMqttClient.disconnect();
        } catch (MqttException e) {
            log.error("Отключение соединения приводит к возникновению исключения, сообщения об исключении {}", e.getMessage());
        }
    }
    /**
     * @description:重новыйсоединять     * @author: jie
     * @time: 2022/3/31 21:51
     */
    public void reConnect(){
        try {
            iMqttClient.reconnect();
        } catch (MqttException e) {
            log.error("Не удалось перезапустить, причина: {}",e.getMessage());
        }
    }

    /**
     * @description:Опубликовать сообщение  тема: тема  сообщение: сообщение  qos:qos  сохранить: сохранять ли сообщение
     * @author: jie
      */
    public void publish(String topic, String msg, QosEnum qos,boolean retain){
        MqttMessage mqttMessage = new MqttMessage();
        //Устанавливаем тело сообщения
        mqttMessage.setPayload(msg.getBytes(StandardCharsets.UTF_8));
        //qos
        mqttMessage.setQos(qos.value());
        try {
            iMqttClient.publish(topic,mqttMessage);
        } catch (MqttException e) {
           log.error("Не удалось опубликовать сообщение, причина ошибки: {}, Topic={},msg={},qos={},retain={}",e.getMessage(),topic,msg,qos,retain ) ;
        }
    }
    /**
     * @description: Подписаться на сообщения themeFilter:Подписаться на тему qos :qos
     * @author: jie
     * @time: 2022/3/31 22:04
     */
    public void subscribe(String topicFilter,QosEnum qos){
        //подписаться на тему
        try {
            iMqttClient.subscribe(topicFilter,qos.value());
        } catch (MqttException e) {
            log.error("Не удалось подписаться на тему, errormsg={},topicFilter:{},qos:{}",e.getMessage(),topicFilter,qos);
        }
    }
    /**
     * @description:Отменить подписку
     * @author: jie
     * @time: 2022/3/31 22:08
     */
    public void unSubscribe(String topicFilter){
        try {
            iMqttClient.unsubscribe(topicFilter);
        } catch (MqttException e) {
            log.error("Ошибка отказа от подписки,errormsg={},topicFilter={}",e.getMessage(),topicFilter);
        }
    }

}

7. Напишите сообщение о публикации и подписке и тесте.,существоватьначинать动类серединадобавить вследующеекод(Просто ленюсьдля)

Язык кода:javascript
копировать
package com.jie.emqxdemo;

import com.jie.emqxdemo.client.EmqClient;
import com.jie.emqxdemo.enums.QosEnum;
import com.jie.emqxdemo.properties.Mqttproperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.PostConstruct;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit;

@SpringBootApplication
public class EmqxDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(EmqxDemoApplication.class,аргументы);
    }
    @Autowired
    частный EmqClient emqClient;
    @Autowired
    частные Mqttproperties mqttproperties;

    @PostConstruct
    публичная недействительная инициализация () {
        //соединять Сервер         emqClient.connect(mqttproperties.getUsername(),mqttproperties.getPassword());
        //подписаться на тему
        emqClient.subscribe("testtopic/#", QosEnum.QOS2);
        //включаем новую ветку каждые пять секунд testtopic/123
        new Thread(()->{
            while (true){
                emqClient.publish("testtopic/123","mqtt msg:"+ LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME),QosEnum.QOS2,false);
                try {
                    TimeUnit.SECONDS.sleep(5);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

тест: На панели мониторинга используйте имя пользователя для выполнения компонента Сертификацияиз, остановите другой компонент, а затем запустите проект для просмотра. Просто выведите консоль

3.2 MQTT.js

MQTT.js — это клиентская библиотека JS протокола MQTT, использующая JavaScript для браузера Node.jsi, написанного на ней.

Адрес проекта на GitHub: GitHub - mqttjs/MQTT.js: The MQTT client for Node.js and the browser

3.2.1 Список API

Перейдем непосредственно к официальной документации, Адрес проекта на GitHub: GitHub - mqttjs/MQTT.js: The MQTT client for Node.js and the browser , а затем прокрутите вниз.

3.2.2 MQTT.js реализует отправку и получение сообщений

Давайте напишем HTML

Язык кода:javascript
копировать
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>mqtt.jsтест</title>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js" ></script>
    <script src="https://unpkg.com/mqtt/dist/mqtt.min.js" ></script>
    <style type="text/css">
        div{
            width: 300px;
            height: 300px;
            float: left;
            border: red solid 1px;
        }
    </style>
    <script type="text/javascript">
        $(function (){
            // соединять Параметры            const options = { clean: true, // продолжать отвечать
            connectTimeout: 4000, // тайм-аут
            // Сертификацияинформация            clientId: 'emqx_client_h5', username: 'user', password: '123456',
            }
            const connectUrl = "ws://192.168.58.149:8083/mqtt";
            const client = mqtt.connect(connectUrl,options);
            /**
             * События, связанные с mqtt.Client
             */
            //когда перезапустить соединение, чтобы вызвать обратный вызов
            client.on('reconnect', () => {
                $("#div1").text("Повторное подключение....");
            });
            //соединять триггеры обратного вызова после отключения
            client.on("close",function () {
                $("#div1").text("клиент已断открытьсоединять.....");            });
            //Отправляется после получения от брокера пакета данных об отключении соединения. MQTT 5.0 Особенности
            client.on("disconnect",function (packet) {
                $("#div1").text("Получен пакет данных об отключении соединения от брокера...."+packet);
            });
            //клиент оффлайн запускает обратный вызов
            client.on("offline",function () {
                $("#div1").text("клиент оффлайн...");
            });
            //когдаклиент не может вызвать обратный вызов при возникновении ошибки при подключении
            client.on("error",(error) =>{
                $("#div1").text("Произошла ошибка клиента.."+error);
            });
            //к Следующие два события отслеживаются с высокой степенью детализации //когдаклиент Генерируется при отправке любого пакета. Сюда входит пакетPublished() киMQTTиспользовать для управления подписками исоединятьиз пакета.
            client.on("packetsend",(packet)=>{
                $("#div1").text("клиент отправил пакет данных...."+packet);
            });
            //когдаклиент генерируется при получении любого пакета. Сюда входят информационные пакеты из тем подписок, используемых MQTT, для управляемых подписок исоединять. из информационного пакета
            client.on("packetreceive",(packet)=>{
                $("#div1").text("клиент получил пакет данных...."+packet);
            });
            //Запуск обратного вызова после успешного подключения
            client.on("connect",function (connack) {
                $("#div1").text("Обращение к серверу успешно"+new Date());
                //подписаться на тему
                /**
                 *  client.subscribe(topic/topic array/topic object, [options], [callback])
                 *  theme: строковый тип изtopic или массив тем, или это объект
                 *  options */
                client.subscribe("testtopic/#",{qos:2});
                //Публикуем данные каждые 2 секунды
                setInterval(publish,2000)
            });

            function publish() {
                //Публикуем данные
                /**
                 * client.publish(topic,message,[options], [callback])
                 *  message: Buffer or String
                 *  options:{
                 *  qos:0, //По умолчанию 0
                 *  retain:false, //по умолчанию ложь
                 *  dup:false, //по умолчанию ложь
                 *  properties:{}
                 *  }
                 *  callback:function (err){}
                 */
                const message = "h5 message "+Math.random()+new Date();
                client.publish("testtopic/123",message,{qos:2});
                $("#div2").text("клиент опубликовал данные:"+message);
            }
            //когдаклиент запускает обратный вызов, когда получает сообщение о публикации
            /**
             *  тема:Получен пакет данных из темы
             *  сообщение: Получено из пакета данных из полезной нагрузки
             *  пакет: полученный пакет данных */
            client.on('message', (topic, message,packet) => {
                $("#div3").text("клиент получил сообщение о подписке, Topic="+topic+"; данные сообщения: "+message+"; data Пакет:"+пакет);
            });
            //Автоматически отключаемся при выходе со страницы подключаться
            $(window).bind("beforeunload",()=>{
                $("#div1").text("Окно клиента закрыть, отключить соединение");
                client.disconnect();
            })
        })
    </script>
</head>
<body>
    <div id="div1"></div>
    <div id="div2"></div>
    <div id="div3"></div>
</body>
</html>

тест:Элемент запускав настоящий момент Воля Стартап-класс EmqxDemoApplication серединаinitметодиз Комментировать,начинать动назад访问следующееадрес Проверять网页端извыход。

http://localhost:8991/

4. Ведение журнала и отслеживание

4.1 Вывод журнала управления

EMQ X поддерживает Воля вывода журнала на консоль или в файл журнала, или делаетиспользовать и то, и другое одновременно. Доступно на emqx.conf Средняя конфигурация :

Язык кода:javascript
копировать
log.to = both

log.to Значение по умолчанию: оба, необязательно из значения для:

  1. offff: Полностью закрыть функцию журнала
  2. fifile: Вывод журнала в файл только Воля
  3. console: На стандартный вывод выводятся только логи Воля (emqx консоль)
  4. both: При этом лог Воля выводится в файл и стандартный вывод (emqx консоль)

4.2 Уровень журнала

EMQ X из точек журнала 8 уровень, От низкого к высокому:

debug < info < notice < warning < error < critical < alert < emergency

EMQ X изпо умолчанию Уровень журналадля предупреждение, доступно по адресу emqx.conf Средняя модификация:

Язык кода:javascript
копировать
log.level = warning

Эта конфигурация будет все log handler из Настройки конфигурациидля warning。

4.3 Файлы журналов и прокатка журналов

EMQ X из Файл журнала по умолчанию «Оглавление» находится в ./log (Разархивируйте zip-архив и установите его) или /var/log/emqx (Установка бинарного пакета). Доступно в emqx.conf Средняя конфигурация:

Язык кода:javascript
копировать
log.dir = log

В случае файла журнала startuseiz (log.to = fifile или оба), в журнале Оглавление будут следующие файлы:

  1. emqx.log.N: к emqx.log префикс для файла для файла журнала, содержит EMQ X из Все сообщения журнала. например emqx.log.1 , emqx.log.2 ...
  2. emqx.log.siz и emqx.log.idx: использовать для записи информации о журнале из системных файлов.
  3. run_erl.log: к emqx start Начните в фоновом режиме EMQ X В это время use используется для записи информации о запуске из системных файлов.
  4. erlang.log.N: к erlang.log префикс для файла для файла журнала: к emqx start Начните в фоновом режиме EMQ X время, контроль Системный журнал и файл копирования. например erlang.log.1 , erlang.log.2 ...

Доступно на emqx.conf Измените префикс файла журнала, по умолчанию — для. emqx.log :

Язык кода:javascript
копировать
log.file = emqx.log

EMQ X По умолчанию размер одного файла журнала превышает 10MB В этом случае прокручиваемые файлы журналов могут иметь до 5 Лог-файлы: Нет. 1 Файл журнала дляemqx.log.1, нет. 2 индивидуальныйдля emqx.log.2 и т. д.

Когда последний файл журнала также заполнен 10MB В это время Воля начинает перезаписывать лог-файл с наименьшим серийным номером. Ограничение размера файла и максимальное количество файлов журналов Доступно на emqx.conf Средняя модификация:

Язык кода:javascript
копировать
log.rotation.size = 10MB 
log.rotation.count = 5

4.4 Для уровня файл журнала вывода журнала

Если вы хотите записывать журналы, превышающие или равные определенному уровню, в отдельный файл, вы можете emqx.conf Средняя конфигурация log..file : Воля info и информация кначальствоиз журналы выводятся отдельно в info.log.N В файле:

Язык кода:javascript
копировать
log.info.file = info.log

 Воля error и error кначальствоиз журналы выводятся отдельно в error.log.N в файле

Язык кода:javascript
копировать
log.error.file = error.log

4.5 Формат журнала

Доступно на emqx.conf Измените максимальную длину символов одного сообщения журнала. Если длина превышает ограничение, сообщение журнала будет усечено и заменено. ... наполнение. По умолчанию ограничения длины нет:

Воля Отдельное сообщение журнала из Настройка максимальной длины символовдля 8192:

Язык кода:javascript
копировать
log.chars_limit = 8192

Сообщение журнала в формате для (разделенные пробелами между каждым полем)

  • date time level client_info module_info msg
  • date: когда местное время из даты. Формат: ГГГГ-ММ-ДД
  • time: местное время с точностью до миллисекунд. Формат: чч:мм:сс.мс
  • level: Уровень журнал, makeuse заключен в скобки. Формат: [Уровень]
  • client_info: Необязательное поле, присутствует только в том случае, если это сообщение журнала относится к определенному клиенту. Его формат: ClientId@Peername. илиClientId или Peername
  • module_info: Необязательное поле, присутствует только в том случае, если это сообщение журнала относится к определенному модулю. Его формат: [Модуль Info]
  • msg: Записать содержимое сообщения. Формат произвольный и может содержать пробелы.

Пример сообщения журнала

2022-04-1 16:10:03.872 [debug] <<"mqttjs_9e49354bb3">>@127.0.0.1:57105 [MQTT/WS] SEND CONNACK(Q0, R0, D0, AckFlags=0, ReasonCode=0)

Каждое поле в этом сообщении журнала:

  • date: 2022-04-1
  • time: 16:10:03.872
  • level: [debug]
  • client_info: <<"mqttjs_9e49354bb3">>@127.0.0.1:57105
  • module_info: [MQTT/WS]
  • msg: SEND CONNACK(Q0, R0, D0, AckFlags=0, ReasonCode=0)

 2022-04-1 16:10:08.474 [warning] [Alarm Handler] New Alarm: system_memory_high_watermark, Alarm Info: []

Каждое поле в этом сообщении журнала:

  • date: 2020-02-18
  • time: 16:10:08.474
  • level: [warning]
  • module_info: [Alarm Handler]
  • msg: New Alarm: system_memory_high_watermark, Alarm Info: [ ]

Обратите внимание, что в этом сообщении журнала поле client_info не существует.

4.6 Уровень журналаиlog handlers

EMQ X Реализация многоуровневой системы журналирования в Уровень журнал, в том числе глобальный Уровень журнала (primary log level)、что каждый log hanlderиз Уровень журнала。

Язык кода:javascript
копировать
[Primary Level]		 		-- global log level and filters 
	/ \ 
[Handler 1] [Handler 2]		-- log levels and filters at each handler

log handler Является ли рабочий процесс ответственным за обработку и вывод журнала, который состоит из log handler id Уникально идентифицированный и ответственный за следующие задачи:

  • Логи какого уровня получены?
  • Как фильтровать сообщения журнала
  • Куда идет вывод журнала Воля?

давайте посмотрим emqx Установка по умолчанию из log handlers:

Язык кода:javascript
копировать
emqx_ctl log handlers list 

  1. fifile: Отвечает за вывод в лог-файл из log обработчик. Он не устанавливает специальных условий фильтрации, то есть все сообщения журнала будут выводиться до тех пор, пока уровень соответствует требованиям. Выведите место назначения для файла журнала.
  2. default: Отвечает за вывод на консоль из log обработчик. Он не устанавливает специальных условий фильтрации, то есть все сообщения журнала будут выводиться до тех пор, пока уровень соответствует требованиям. Выведите консоль назначения.
  3. ssl_handler: ssl из log обработчик. Это из настроек фильтра для когда Журнал из ssl выход модуля. Выведите консоль назначения.

Прежде чем выводить сообщение журнала, сначала проверьте, превышает ли сообщение значение primary log уровень, сообщения журнала текут на каждый log обработчик, затем проверьте каждый handler из Уровень журнала, если сообщение журнала также выше, чем handler уровень, то соответствующий handler Выполните соответствующие условия фильтрации и выведите результат, если условия фильтрации пройдены.

Представьте себе сценарий, предположим primary log level Настройки info,log handler default (Отвечает за вывод на консоль) изуровень Настройкиdebug,log handler file (отвечает за вывод в файл) изуровень Настройки warning

Хотя console Журнал debug уровне, но в это время console Журнал может быть выведен только info ки info киз новости, потому что для прошли праймериз level После фильтрации переходят в default и fifile из журнала осталось только info икначальствоизуровень;

emqx.log.N Файл содержит warning ки warning кначальствоизсообщение журнала。

существовать Уровень из упоминается в подразделе журнал log.level изменить глобальную ситуацию из Уровень журнал. Это включает в себя primary log level èКаждый handlersиз Уровень журнала,Все Настройки了同один值。

Первичный уровень бревна аналогичен главному выключателю водопроводной системы. После закрытия поток воды через каждый патрубок больше не будет. Этот механизм обеспечивает высокопроизводительную работу системы журналирования.

4.7 Рантаймовая модификация Уровень журнала

Можеткделатьиспользовать EMQ X из инструмента командной строки emqx_ctl изменено во время выполнения emqx из Уровень журнала:

Измените глобальный Уровень журнала:

Например, Воля primary log level ки Все log handlers изуровень Настройки debug:

Язык кода:javascript
копировать
emqx_ctl log set-level debug

Изменить основной Уровень журнала:

Например, Воля primary log level Настройки debug:

Язык кода:javascript
копировать
emqx_ctl log primary-level debug

Изменить журнал handlerиз Уровень журнала:

Например, Воля log handler file Настройки debug:

Язык кода:javascript
копировать
emqx_ctl log handlers set-level file debug

4.8 Отслеживание журналов

EMQ X поддерживатьпротив ClientID или Topic Фильтрация журналов и вывод в файл. При изготовлениииспользовать Отслеживание журналов Функция До,Должен Воля primary log level Настройки debug:

Язык кода:javascript
копировать
emqx_ctl log primary-level debug 1111

включать ClientID Отслеживание журналов,Волявсе ClientID для emq-demo из Журналы выводятся в log/my_client.log:

Язык кода:javascript
копировать
emqx_ctl log primary-level debug debug
Язык кода:javascript
копировать
emqx_ctl trace start client emq-demo log/emq-demo.log

включать Topic Отслеживание журналов, тема Воля может соответствовать 'testtopic/#' из Вывод журнала выпуска сообщений в log/topic_testtopic.log:

Язык кода:javascript
копировать
emqx_ctl log primary-level debug debug
Язык кода:javascript
копировать
emqx_ctl trace start topic 'testtopic/#' log/topic_testtopic.log trace topic testtopic/# successfully 1234512345

Совет: даже если emqx.conf середина, log.level Настройки ошибка, так что функция отслеживания сообщений все равно может распечатать определенное client или topic из debug Уровень информации. Это очень полезно в производственной среде.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose