Доброго времени. Никто не сталкивался с работой по MQTT? Может библиотеки какие? Или исходники есть на примете под BasCom?
Протокол MQTT
Сообщений 1 страница 30 из 33
Поделиться32017-03-12 19:34:04
Точно. Спос, покурю на днях
Поделиться42017-03-20 23:02:29
Курнул я протокол этот. Вопрос такой родился у меня (немного не связан с протоколом, но вытек из него):
Вот такая строка:
Print Chr(134) ; Chr(0) ; Chr(126) - выдает в USART три символа 134, 0, 126
Вот такая строка:
S=Chr(134) + Chr(0) + Chr(126)
Print S - выдаёт два символа 134, 126. Ноль посередине куда то исчезает.
Кто подскажет как это можно исправить, чтобы работать с переменной?
Поделиться52017-03-20 23:10:23
Второй вопрос уже по протоколу. В примере написано:
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.
Если кто в теме, помогите, пож разобраться, я запутался что то.
Поделиться62017-03-21 07:29:59
Вот такая строка:S=Chr(134) + Chr(0) + Chr(126)
Print S - выдаёт два символа 134, 126. Ноль посередине куда то исчезает.
Кто подскажет как это можно исправить, чтобы работать с переменной?
А если попробовать S=Chr(134) & Chr(0) & Chr(126) ? 
Поделиться72017-03-21 19:18:38
Такой оператор разве допустим?
Поделиться82017-03-21 21:30:10
S = Chr(134) + Chr(0)
A = Len(S)
показывает A=1. Получается символа с кодом 0 не существует для баскома?
Поделиться92017-03-21 21:40:59
да, ноль - это конец строки
Поделиться102017-03-21 21:46:22
и как быть если в этом MQTT куча символов 0? Как корректно длину подсчитать строки?
Поделиться112017-03-21 23:02:50
а как определить конец пакета передачи данных?
Поделиться122017-03-21 23:37:59
тоже не знаю, поэтому и спрашиваю
Отредактировано kostr (2017-03-21 23:41:20)
Поделиться132017-03-22 07:11:09
Такой оператор разве допустим?
Пользуюсь, проблем не было... 
Вам в этой ситуации, вероятнее, надо воспользоваться PRINTBIN...
Этому фиолетово, что отправлять... 
Поделиться142017-03-22 07:14:40
а как определить конец пакета передачи данных?
А если первым байтом (командой) указать длину отправляемой посылки ?
Или если посылка фиксированной длины, то просто заканчивать прием по счетчику "прилетевшего"...
Сейчас заморочился одной штучкой, тоже последовательный ввод, "строю" свой протокол... 
Отредактировано Nord (2017-03-22 07:15:05)
Поделиться152017-03-22 07:58:02
В любом случае, не понятно, как длину строки посчитать, например такой S = Chr(134) + Chr(0) + Chr(134) + Chr(134) + Chr(0) + Chr(134), он просто игнорит Chr(0)
Поделиться162017-03-22 08:48:17
И еще. К то нибудь может подсказать всё таки, какую строку надо отправить, чтобы выполнить коннект с брокером? Вот в примере:
'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)
не понятно, где здесь имя пользователя, где пароль?
Поделиться172017-03-22 09:11:59
В любом случае, не понятно, как длину строки посчитать, например такой S = Chr(134) + Chr(0) + Chr(134) + Chr(134) + Chr(0) + Chr(134), он просто игнорит Chr(0)
Тогда перед подсчетом длины строки использовать перекодировку, как при выводе на LCD.
Заменять 0 на Chr(48) при сборе строки.
Поделиться182017-03-22 11:41:00
Вообще все сервера просто так связь не прерывают, ибо невозможно определить конец передачи кроме как по таймауту (что сильно повлияет на асинхронность и скорость передачи).
Все сервера в протоколе имеют информацию о длине передаваемого пакета или как сказали ранее "если посылка фиксированной длины".
На счет проблемы нуля в переменной стринг, тут можно предложить только одно, как только срабатывает прерывания о приёме байта в порте, просто проверять нулевой он или нет и заменять каким-то другим знаком/байтом, потом добавлять его в общую строку. Естественно это всё работать будет только на хардварном порте.
Поделиться192017-03-22 12:00:49
Всем рабочего кода!
Граждане, как у вас с английским языком. Хотя бы чтение со словарем возможно?
Поделиться202017-03-22 12:03:42
Всем рабочего кода!
Граждане, как у вас с английским языком. Хотя бы чтение со словарем возможно?
Что вы этим хотите сказать?
Поделиться212017-03-22 12:10:29
я хочу сказать что топикстартер просмотрев код mqtt клиента пытается непонятным образом прикрутить туда LCD и что-то принимать и показывать.
Внимание - на странице с кодом, а сайте Bascom'а описан КЛИЕНТ. Он может только передавать!!! Принимать не может!!!
Соответственно применять вопросы по раскодировке сообщений брокера к этому коду НЕЛЬЗЯ.
Поделиться222017-03-22 12:11:49
все раскодировки сообщений клиента в указанной топологии возможны только на ноуте, планшете или телефоне!!!
Поделиться232017-03-22 13:33:14
я хочу сказать что топикстартер просмотрев код 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"
всё впринципе описано и понятно, длины строк подсчитаны вручную, как я понял (пока не суть)
но... здесь не имени пользователя не пароля, как таким образом коннек то осуществить?
Поделиться242017-03-22 13:55:09
ответ разжеван в описании протокола mqtt. Там же есть ссылка на описание.
Длину указывает клиент во втором байте. Посмотрите пункт 3.1...
в пунктах 3.1.2.8(3.1.3.4) и 3.1.2.9(3.1.3.5) ответы на вопросы про имя и пароль.
Посмотрите...
Поделиться252017-03-22 14:08:19
я хочу сказать что топикстартер просмотрев код mqtt клиента пытается непонятным образом прикрутить туда LCD и что-то принимать и показывать.
Вы, видимо, мое сравнение с выводом на LCD восприняли, как конечную задачу ТС ? 
Увы, тут это прозвучало только в качестве примера замены символов в строке... 
Тут борьба с нулями...
Отредактировано Nord (2017-03-22 14:08:59)
Поделиться262017-03-22 14:21:08
переменная (x), содержащая длину строки должна интегрироваться от следующего:
число отправляемых байт служебной информации протокола (y)
длина передаваемого текста (z)
x=y+z
Все.
Отредактировано coder (2017-03-22 14:21:38)
Поделиться272017-03-22 14:28:43
или более развернуто:
число байт служебной информации - константа (не будете же вы постоянно менять логин и пароль)
длина передаваемой строки - переменная (например "I am client #1" = 14)
сложили одно с другим и получили длину строки.
Поделиться282017-03-22 14:31:38
если клиент должен передавать N разным брокерам c разными логинами и паролями, то констант служебной информации должно быть N
Поделиться292017-03-22 14:39:50
спасибо... курю дальше
Поделиться302017-03-22 15:22:50
если позволите, я не советую забивать голову этим протоколом и проводными сетями.
Посмотрите в сторону вот такой штуки - esp-12f на базе ESP8266.
Это МК со встроенным wifi. Возможностей самого МК достаточно для реализации простых задач. Если надо что-то посложнее, то можно к нему мегу прикрутить или stm32.
Гораздо интереснее игрушка получится. Мне удалось заставить ее в связке с stm32 отработать на батарейках почти 7 месяцев.