Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Протокол MQTT


Протокол MQTT

Сообщений 1 страница 30 из 33

1

Доброго времени. Никто не сталкивался с работой по MQTT? Может библиотеки какие? Или исходники есть на примете под BasCom?

0

2

http://www.mcselec.com/index2.php?optio … light=mqtt

0

3

Точно. Спос, покурю на днях

0

4

Курнул я протокол этот. Вопрос такой родился у меня (немного не связан с протоколом, но вытек из него):
Вот такая строка:
Print Chr(134) ; Chr(0) ; Chr(126) - выдает в USART три символа 134, 0, 126
Вот такая строка:
S=Chr(134) + Chr(0) + Chr(126)
Print  S - выдаёт два символа 134, 126. Ноль посередине куда то исчезает.
Кто подскажет как это можно исправить, чтобы работать с переменной?

0

5

Второй вопрос уже по протоколу. В примере написано:
Const Connect = "{016}{025}{000}{004}MQTT{004}{002}{000}{070}{000}{013}Bascom-Client"
'Connect is   {016}(&H10) MQTT Control Packet type
'             {025}       Length message
'             {000}       Length protocol name MSB
'             {004}       Length protocol name LSB
'             MQTT        Protocol name
'             {004}       Protocol level
'             {002}       Connect flags (002 = Clean Session)
'             {000}       Keep alive MSB
'             {070}       Keep alive LSB (70 seconds)
'             {000}
'             {013}       Length client-ID
'             Bascom-client (Client-ID)
обращаем внимание на флаг  Connect flags (002 = Clean Session) и на  Bascom-client (Client-ID).
Но в описании протокола написано, если флаги Client-ID и Пароль не установлены (а они в этом примере не установлены, т.к. установлен лишь флаг Clean Session), то ни имя клиента ни пароль идти в посылке Connect не могут. В примере же идет client-ID  - Bascom-client.
Если кто в теме, помогите, пож разобраться, я запутался что то.

0

6

kostr написал(а):

Вот такая строка:S=Chr(134) + Chr(0) + Chr(126)
Print  S - выдаёт два символа 134, 126. Ноль посередине куда то исчезает.
Кто подскажет как это можно исправить, чтобы работать с переменной?

А если попробовать S=Chr(134) & Chr(0) & Chr(126) ? ;)

0

7

Такой оператор разве допустим?

0

8

S = Chr(134) + Chr(0)
A = Len(S)
показывает A=1. Получается символа с кодом 0 не существует для баскома?

0

9

да, ноль - это конец строки

0

10

и как быть если в этом MQTT куча символов 0? Как корректно длину подсчитать строки?

0

11

а как определить конец пакета передачи данных?

0

12

тоже не знаю, поэтому и спрашиваю

Отредактировано kostr (2017-03-21 23:41:20)

0

13

kostr написал(а):

Такой оператор разве допустим?

Пользуюсь, проблем не было... ;)

Вам в этой ситуации, вероятнее, надо воспользоваться PRINTBIN...
Этому фиолетово, что отправлять... ;)

0

14

RDW написал(а):

а как определить конец пакета передачи данных?

А если первым байтом (командой) указать длину отправляемой посылки ?
Или если посылка фиксированной длины, то просто заканчивать прием по счетчику "прилетевшего"...

Сейчас заморочился одной штучкой, тоже последовательный ввод, "строю" свой протокол... ;)

Отредактировано Nord (2017-03-22 07:15:05)

0

15

В любом случае, не понятно, как длину строки посчитать, например такой S = Chr(134) + Chr(0) + Chr(134) + Chr(134) +  Chr(0) + Chr(134), он просто игнорит Chr(0)

0

16

И еще. К то нибудь может подсказать всё таки, какую строку надо отправить, чтобы выполнить коннект с брокером? Вот в примере:
'Connect is   {016}(&H10) MQTT Control Packet type
'             {025}       Length message
'             {000}       Length protocol name MSB
'             {004}       Length protocol name LSB
'             MQTT        Protocol name
'             {004}       Protocol level
'             {002}       Connect flags (002 = Clean Session)
'             {000}       Keep alive MSB
'             {070}       Keep alive LSB (70 seconds)
'             {000}
'             {013}       Length client-ID
'             Bascom-client (Client-ID)
не понятно, где здесь имя пользователя, где пароль?

0

17

kostr написал(а):

В любом случае, не понятно, как длину строки посчитать, например такой S = Chr(134) + Chr(0) + Chr(134) + Chr(134) +  Chr(0) + Chr(134), он просто игнорит Chr(0)

Тогда перед подсчетом длины строки использовать перекодировку, как при выводе на LCD.
Заменять 0 на Chr(48) при сборе строки.

0

18

Вообще все сервера просто так связь не прерывают, ибо невозможно определить конец передачи кроме как по таймауту (что сильно повлияет на асинхронность и скорость передачи).
Все сервера в протоколе имеют информацию о длине передаваемого пакета или как сказали ранее "если посылка фиксированной длины".

На счет проблемы нуля в переменной стринг, тут можно предложить только одно, как только срабатывает прерывания о приёме байта в порте, просто проверять нулевой он или нет и заменять каким-то другим знаком/байтом, потом добавлять его в общую строку. Естественно это всё работать будет только на хардварном порте.

0

19

Всем рабочего кода!
Граждане, как у вас с английским языком. Хотя бы чтение со словарем возможно?

0

20

coder написал(а):

Всем рабочего кода!
Граждане, как у вас с английским языком. Хотя бы чтение со словарем возможно?

Что вы этим хотите сказать?

0

21

я хочу сказать что топикстартер просмотрев код mqtt клиента пытается непонятным образом прикрутить туда LCD и что-то принимать и показывать.
Внимание - на странице с кодом, а сайте Bascom'а описан КЛИЕНТ. Он может только передавать!!! Принимать не может!!!
Соответственно применять вопросы по раскодировке сообщений брокера к этому коду НЕЛЬЗЯ.

0

22

все раскодировки сообщений клиента в указанной топологии возможны только на ноуте, планшете или телефоне!!!

0

23

coder написал(а):

я хочу сказать что топикстартер просмотрев код mqtt клиента пытается непонятным образом прикрутить туда LCD и что-то принимать и показывать

С чего это? Никто не пытается ничего принимать, тем более вывести на LCD. Я пытаюсь всего лишь сконнектиться с брокером, как это показано в примере.
'Connect is   {016}(&H10) MQTT Control Packet type
'             {025}       Length message
'             {000}       Length protocol name MSB
'             {004}       Length protocol name LSB
'             MQTT        Protocol name
'             {004}       Protocol level
'             {002}       Connect flags (002 = Clean Session)
'             {000}       Keep alive MSB
'             {070}       Keep alive LSB (70 seconds)
'             {000}
'             {013}       Length client-ID
'             Bascom-client (Client-ID)

Const Connect = "{016}{025}{000}{004}MQTT{004}{002}{000}{070}{000}{013}Bascom-Client"
всё впринципе описано и понятно, длины строк подсчитаны вручную, как я понял (пока не суть)
но... здесь не имени пользователя не пароля, как таким образом коннек то осуществить?

0

24

ответ разжеван в описании протокола mqtt. Там же есть ссылка на описание.
Длину указывает клиент во втором байте. Посмотрите пункт 3.1...
в пунктах 3.1.2.8(3.1.3.4) и 3.1.2.9(3.1.3.5) ответы на вопросы про имя и пароль.

Посмотрите...

0

25

coder написал(а):

я хочу сказать что топикстартер просмотрев код mqtt клиента пытается непонятным образом прикрутить туда LCD и что-то принимать и показывать.

Вы, видимо, мое сравнение с выводом на LCD восприняли, как конечную задачу ТС ? ;)
Увы, тут это прозвучало только в качестве примера замены символов в строке... ;)
Тут борьба с нулями...

Отредактировано Nord (2017-03-22 14:08:59)

0

26

переменная (x), содержащая длину строки должна интегрироваться от следующего:
число отправляемых байт служебной информации протокола (y)
длина передаваемого текста (z)

x=y+z

Все.

Отредактировано coder (2017-03-22 14:21:38)

0

27

или более развернуто:
число байт служебной информации - константа (не будете же вы постоянно менять логин и пароль)
длина передаваемой строки - переменная (например "I am client #1" = 14)
сложили одно с другим и получили длину строки.

0

28

если клиент должен передавать N разным брокерам c разными логинами и паролями, то констант служебной информации должно быть N

0

29

спасибо... курю дальше

0

30

если позволите, я не советую забивать голову этим протоколом и проводными сетями.
Посмотрите в сторону вот такой штуки - esp-12f на базе ESP8266.
Это МК со встроенным wifi. Возможностей самого МК достаточно для реализации простых задач. Если надо что-то посложнее, то можно к нему мегу прикрутить или stm32.
Гораздо интереснее игрушка получится. Мне удалось заставить ее в связке с stm32 отработать на батарейках почти 7 месяцев.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Протокол MQTT