<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Mikrotik.moscow [тема: Преобразовать пример на C в скрипт KNOT]</title>
		<link>http://mikrotik.moscow</link>
		<description>Новое в теме Преобразовать пример на C в скрипт KNOT форума RouterOS на сайте Mikrotik.moscow [mikrotik.moscow]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Fri, 31 Jul 2026 17:22:29 -0400</pubDate>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393114">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			@Amm0, возможно ли отправлять пакет данных Bluetooth через MQTT? Если да, то это делается через подписку на топик или с помощью скрипта? Я думаю о чем-то вроде этого, но пока не уверен, где именно ошибаюсь. #config &nbsp;<br />:local broker "intellisec" &nbsp;<br />:local topic "intellisec/iot/bluetooth" &nbsp;<br /><br />#gather info &nbsp;<br />:local adids [/iot bluetooth scanners advertisements]  <br />:foreach adid in=$adids do={ &nbsp;<br /> &nbsp;:local pkt [get $adid]  <br /> &nbsp;:local pktdata ($pkt-&gt;"data") &nbsp;<br /> &nbsp;:if ([:len $pktdata]!=36 || [:pick $pktdata 1 2]="\FF") do={:error "плохой пакет: получили $pktdata длиной $[:len $pktdata]"}  <br /><br /> &nbsp;#compose message in JSON - bluetooth sensor &nbsp;<br /> &nbsp;:local message "$pktdata" &nbsp;<br /> &nbsp;:put $message &nbsp;<br /><br /> &nbsp;/iot mqtt publish broker=$broker topic="$topic/pktdata" message=$message retain=no &nbsp;<br /> &nbsp;/log/info message=$message &nbsp;<br />} <br />
			<i>10.06.2024 09:04:00, Jonty.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393114</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393114</guid>
			<pubDate>Mon, 10 Jun 2024 09:04:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393113">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			@Amm0 попробую, и у меня получилась нагрузка с датчиком на газовом баллоне 0dff5900035e41f5c124684e20000302e5fe. f5c1 — это две части нагрузки, отвечающие за объём газа в баллоне. При помощи приложения для датчика показывало, что в баллоне 20,2 см газа. Теперь мне нужно разобраться с математикой этого. <br />
			<i>22.04.2024 05:53:00, Jonty.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393113</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393113</guid>
			<pubDate>Mon, 22 Apr 2024 05:53:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393112">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Ты вставляешь свой код в событие On Event планировщика. Это нужно сделать всего один раз. Планировщик (он же cron) затем будет запускать твой скрипт с заданным интервалом. С помощью winbox ты сможешь просто скопировать и вставить свой код в «On Event», установить «Start Time» как «startup» и интервал в 00:00:10. Или через CLI: /system/scheduler/add name=readBT start-time=startup interval=10s on-event={ your_code }. В любом случае, дальнейшие правки кода нужно делать именно в этом планировщике. Теоретически, ты можешь написать новый код, который добавит планировщик для выполнения какой-то конкретной задачи в будущем (без параметра interval=), а когда этот код сработает, он удалит старый планировщик и добавит новый запланированный элемент (тоже без interval=). Но такой подход сложный и излишний, если хочешь запускать что-то каждые 10 секунд — параметр interval= сам всё сделает за тебя. <br />
			<i>19.04.2024 11:45:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393112</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393112</guid>
			<pubDate>Fri, 19 Apr 2024 11:45:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393111">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			@Amm0 расписание прописывать прямо в код для сенсора, который я уже сделал, или использовать планировщик системы в системном меню? <br />
			<i>19.04.2024 06:01:00, Jonty.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393111</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393111</guid>
			<pubDate>Fri, 19 Apr 2024 06:01:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393110">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Небольшое замечание: в скрипте планировщика лучше использовать «/log info TEXT» вместо «:put». <br />
			<i>18.04.2024 12:22:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393110</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393110</guid>
			<pubDate>Thu, 18 Apr 2024 12:22:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393109">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			@Amm0 теперь, когда я разобрал пакет и получил какой-то читаемый результат, протестирую его на газовом баллоне, чтобы узнать, какой уровень бака получится. <br />
			<i>18.04.2024 12:21:00, Jonty.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393109</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393109</guid>
			<pubDate>Thu, 18 Apr 2024 12:21:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393108">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			@Amm0 спасибо, попробую так сделать. <br />
			<i>18.04.2024 12:16:00, Jonty.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393108</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393108</guid>
			<pubDate>Thu, 18 Apr 2024 12:16:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393107">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Или запустите в командной строке, добавьте ещё один :while (1) do={ … } вокруг кода с :delay 10s перед завершением цикла. Чтобы выйти — нужно нажать ctrl-c. <br />
			<i>18.04.2024 12:10:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393107</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393107</guid>
			<pubDate>Thu, 18 Apr 2024 12:10:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393106">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Вы можете вставить этот код в скрипт /system/schedule с интервалом 10 секунд, который запускается при старте системы. Скорее всего, удобнее в winbox/webfig скопировать и вставить код, чем использовать CLI для добавления задания, чтобы не заморачиваться с экранированием. <br />
			<i>18.04.2024 12:08:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393106</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393106</guid>
			<pubDate>Thu, 18 Apr 2024 12:08:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393105">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			@Amm0, я уже кое-куда продвинулся, теперь нужно просто заставить этот скрипт обновляться каждые 10 секунд, когда новые локальные pktdata обновляются.<br /><br /># Главная функция для декодирования данных Bluetooth-объявлений &nbsp;<br />/iot bluetooth scanners advertisements { &nbsp;<br /> &nbsp; &nbsp;:local adids [find]<br /> &nbsp; &nbsp;:foreach adid in=$adids do={<br /> &nbsp; &nbsp; &nbsp; :local pkt [get $adid]<br /> &nbsp; &nbsp; &nbsp; :local pktdata ($pkt-&gt;"data")<br /> &nbsp; &nbsp; &nbsp; :if ([:len $pktdata]!=36 || [:pick $pktdata 1 2]="\FF") do={:error "плохой пакет: получил $pktdata с длиной $[:len $pktdata]"}<br /><br /> &nbsp; &nbsp; &nbsp; # Извлечение полей из данных объявления<br /> &nbsp; &nbsp; &nbsp; :local batteryVoltage [:pick $pktdata 10 12]<br /> &nbsp; &nbsp; &nbsp; :local decimalbatteryVoltage [:tonum "0x$batteryVoltage"]<br /> &nbsp; &nbsp; &nbsp; # Выполняется расчет с десятичными знаками<br /> &nbsp; &nbsp; &nbsp; # делимое / делитель = частное.дробная часть = результат<br /><br /> &nbsp; &nbsp; &nbsp; :local dividend ($decimalbatteryVoltage)<br /> &nbsp; &nbsp; &nbsp; :local divisor "32"<br /> &nbsp; &nbsp; &nbsp; :local decimalplaces "2"<br /><br /> &nbsp; &nbsp; &nbsp; # Математический расчет<br /> &nbsp; &nbsp; &nbsp; :local quotient 0<br /> &nbsp; &nbsp; &nbsp; :local remainder 0<br /> &nbsp; &nbsp; &nbsp; :local result 0<br /> &nbsp; &nbsp; &nbsp; :local decimal 0<br /><br /> &nbsp; &nbsp; &nbsp; :set quotient ($dividend / $divisor)<br /><br /> &nbsp; &nbsp; &nbsp; :if ($quotient = 0) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set dividend [:tonum ($dividend . "0")]<br /> &nbsp; &nbsp; &nbsp; }<br /><br /> &nbsp; &nbsp; &nbsp; :set remainder ($dividend - ($divisor * $quotient))<br /><br /> &nbsp; &nbsp; &nbsp; :if ($remainder &gt; 0) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :local tmpremainder [:tonum ($remainder . "0")]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :for x from=1 to=$decimalplaces do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :local tmpdecimal [:tonum ($tmpremainder / $divisor)]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set decimal [:tonum ($decimal . $tmpdecimal)]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set tmpremainder [:tonum (($tmpremainder - ($tmpdecimal * $divisor)) . "0")]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set result ($quotient . "." . $decimal)<br /> &nbsp; &nbsp; &nbsp; } else={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set result $quotient<br /> &nbsp; &nbsp; &nbsp; }<br /> &nbsp; &nbsp; &nbsp; :local 2decimalbatteryVoltage ($result)<br /><br /> &nbsp; &nbsp; &nbsp; :local temperature [:pick $pktdata 12 14]<br /> &nbsp; &nbsp; &nbsp; :local decimaltemperature [:tonum "0x$temperature"]<br /> &nbsp; &nbsp; &nbsp; # Выполняется расчет с десятичными знаками<br /> &nbsp; &nbsp; &nbsp; # делимое / делитель = частное.дробная часть = результат<br /><br /> &nbsp; &nbsp; &nbsp; :local dividend ($decimaltemperature)<br /> &nbsp; &nbsp; &nbsp; :local divisor 40<br /> &nbsp; &nbsp; &nbsp; :local decimalplaces 2<br /><br /> &nbsp; &nbsp; &nbsp; # Математический расчет<br /> &nbsp; &nbsp; &nbsp; :local quotient 0<br /> &nbsp; &nbsp; &nbsp; :local remainder 0<br /> &nbsp; &nbsp; &nbsp; :local result 0<br /> &nbsp; &nbsp; &nbsp; :local decimal 0<br /><br /> &nbsp; &nbsp; &nbsp; :set quotient ($dividend - $divisor)<br /><br /> &nbsp; &nbsp; &nbsp; :if ($quotient = 0) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set dividend [:tonum ($dividend . "0")]<br /> &nbsp; &nbsp; &nbsp; }<br /><br /> &nbsp; &nbsp; &nbsp; :set remainder ($dividend - ($divisor * $quotient))<br /><br /> &nbsp; &nbsp; &nbsp; :if ($remainder &gt; 0) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :local tmpremainder [:tonum ($remainder . "0")]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :for x from=1 to=$decimalplaces do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :local tmpdecimal [:tonum ($tmpremainder / $divisor)]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set decimal [:tonum ($decimal . $tmpdecimal)]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set tmpremainder [:tonum (($tmpremainder - ($tmpdecimal * $divisor)) . "0")]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set result ($quotient . "." . $decimal)<br /> &nbsp; &nbsp; &nbsp; } else={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set result $quotient<br /> &nbsp; &nbsp; &nbsp; }<br /> &nbsp; &nbsp; &nbsp; # Конец математического расчёта<br /><br /> &nbsp; &nbsp; &nbsp; :local 2decimaltemperature ($result )<br /> &nbsp; &nbsp; &nbsp; :local tankLevel [:pick $pktdata 14 18]<br /> &nbsp; &nbsp; &nbsp; :local decimaltankLevel [:tonum "0x$tankLevel"]<br /> &nbsp; &nbsp; &nbsp; # Выполняется расчет с десятичными знаками<br /> &nbsp; &nbsp; &nbsp; # делимое / делитель = частное.дробная часть = результат<br /><br /> &nbsp; &nbsp; &nbsp; :local dividend ($decimaltankLevel)<br /> &nbsp; &nbsp; &nbsp; :local divisor 10<br /> &nbsp; &nbsp; &nbsp; :local decimalplaces 2<br /><br /> &nbsp; &nbsp; &nbsp; # Математический расчет<br /> &nbsp; &nbsp; &nbsp; :local quotient 0<br /> &nbsp; &nbsp; &nbsp; :local remainder 0<br /> &nbsp; &nbsp; &nbsp; :local result 0<br /> &nbsp; &nbsp; &nbsp; :local decimal 0<br /><br /> &nbsp; &nbsp; &nbsp; :set quotient ($dividend * $divisor)<br /><br /> &nbsp; &nbsp; &nbsp; :if ($quotient = 0) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set dividend [:tonum ($dividend . "0")]<br /> &nbsp; &nbsp; &nbsp; }<br /><br /> &nbsp; &nbsp; &nbsp; :set remainder ($dividend - ($divisor * $quotient))<br /><br /> &nbsp; &nbsp; &nbsp; :if ($remainder &gt; 0) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :local tmpremainder [:tonum ($remainder . "0")]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :for x from=1 to=$decimalplaces do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :local tmpdecimal [:tonum ($tmpremainder / $divisor)]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set decimal [:tonum ($decimal . $tmpdecimal)]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set tmpremainder [:tonum (($tmpremainder - ($tmpdecimal * $divisor)) . "0")]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set result ($quotient . "." . $decimal)<br /> &nbsp; &nbsp; &nbsp; } else={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :set result $quotient<br /> &nbsp; &nbsp; &nbsp; }<br /> &nbsp; &nbsp; &nbsp; # Конец математического расчёта<br /><br /> &nbsp; &nbsp; &nbsp; :local 2decimaltankLevel ($result)<br /><br /> &nbsp; &nbsp; &nbsp; :put "payload: $pktdata"<br /> &nbsp; &nbsp; &nbsp; :put "batteryVoltage: $2decimalbatteryVoltage &nbsp;V"<br /> &nbsp; &nbsp; &nbsp; :put "temperature: $2decimaltemperature &nbsp;°C"<br /> &nbsp; &nbsp; &nbsp; :put "tankLevel: $2decimaltankLevel &nbsp;MM"<br /> &nbsp; &nbsp;}<br />}<br /><br />[admin@MikroTik] &gt; system script run test10  <br />payload: 0dff5900035f41000024684e2dfd0302e5fe &nbsp;<br />batteryVoltage: 2.96 &nbsp;V &nbsp;<br />temperature: 25 &nbsp; C &nbsp;<br />tankLevel: 0 &nbsp;MM &nbsp;<br />[admin@MikroTik] &gt; <br />
			<i>18.04.2024 12:04:00, Jonty.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393105</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393105</guid>
			<pubDate>Thu, 18 Apr 2024 12:04:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393104">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			В сущности, преобразование из hex-в-строке в int выглядит сегодня так: [:tonum “0x$[:pick $pktdata ( + ) ]”]. В твоём коде это выглядит следующим образом:<br /><br /># Главная функция для декодирования Bluetooth-рекламных данных &nbsp;<br />/iot bluetooth scanners advertisements { &nbsp;<br /> &nbsp; &nbsp;:local adids [find]  <br /> &nbsp; &nbsp;:foreach adid in=$adids do={ &nbsp;<br /> &nbsp; &nbsp; &nbsp; :local pkt [get $adid]  <br /> &nbsp; &nbsp; &nbsp; :local pktdata ($pkt-&gt;"data") &nbsp;<br /> &nbsp; &nbsp; &nbsp; :if ([:len $pktdata]!=36 || [:pick $pktdata 1 2]="\FF") do={:error "плохой пакет: получено $pktdata с длиной $[:len $pktdata]"}  <br /><br /> &nbsp; &nbsp; &nbsp;# Извлечение полей из рекламных данных &nbsp;<br /> &nbsp; &nbsp; &nbsp;:local batteryVoltage [:tonum "0x$[:pick $pktdata 10 (10 + 2) ]"]  <br /> &nbsp; &nbsp; &nbsp;:local temperature [:tonum "0x$[:pick $pktdata 12 (12 + 2) ]"]  <br /> &nbsp; &nbsp; &nbsp;:local tankLevel [:tonum "0x$[:pick $pktdata 14 (10 + 4) ]"]  <br /><br /> &nbsp; &nbsp; &nbsp; :put "payload:$pktdata" &nbsp;<br /> &nbsp; &nbsp; &nbsp; :put "batteryVoltage: $batteryVoltage" &nbsp;<br /> &nbsp; &nbsp; &nbsp; :put "temperature: $temperature" &nbsp;<br /> &nbsp; &nbsp; &nbsp; :put "tankLevel: $tankLevel" &nbsp;<br /> &nbsp; &nbsp; } &nbsp;<br />}<br /><br />Теперь уровень бака имеет более сложный итоговый расчёт согласно C-коду, но, как я предполагаю, он всегда будет относительным. Как отмечалось выше, математика включает числа с плавающей точкой. Вот где всё становится сложнее. Я использую пример строки, в которой значение уровня бака равно 0. Если у тебя будет та же исходная строка с BT с данными бака и какой-нибудь результат из другого инструмента, который делал этот расчёт — это поможет протестировать вычисления «коэффициента» уровня бака в сообщении, которое было немного выше. <br />
			<i>18.04.2024 11:52:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393104</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393104</guid>
			<pubDate>Thu, 18 Apr 2024 11:52:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393103">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			@Ammo, вот этот код:<br /><br /># Основная функция для декодирования данных Bluetooth-объявлений &nbsp;<br />/iot bluetooth scanners advertisements { &nbsp;<br /> &nbsp; &nbsp;:local adids [find]  <br /> &nbsp; &nbsp;:foreach adid in=$adids do={ &nbsp;<br /> &nbsp; &nbsp; &nbsp; :local pkt [get $adid]  <br /> &nbsp; &nbsp; &nbsp;:local pktdata ($pkt-&gt;"data") &nbsp;<br /> &nbsp; &nbsp; &nbsp;:if ([:len $pktdata]!=36 || [:pick $pktdata 1 2]="\FF") do={:error "bad packet: got $pktdata with length $[:len $pktdata]"}  <br /> &nbsp;<br /># Извлечение полей из данных объявления &nbsp;<br /> &nbsp; &nbsp;:local batteryVoltage [:pick $pktdata 10 12]  <br /> &nbsp; &nbsp;:local temperature [:pick $pktdata 12 14]  <br /> &nbsp; &nbsp;:local tankLevel &nbsp;[:pick $pktdata 14 18]  <br /> &nbsp;<br /> &nbsp; &nbsp; &nbsp;:put "payload:$pktdata" &nbsp;<br /> &nbsp; &nbsp; &nbsp;:put "batteryVoltage: $batteryVoltage" &nbsp;<br /> &nbsp; &nbsp; &nbsp;:put "temperature: $temperature" &nbsp;<br /> &nbsp; &nbsp; &nbsp;:put "tankLevel: $tankLevel" &nbsp;<br />} &nbsp;<br />} &nbsp;<br /><br />Когда я запускаю, получаю вот что: &nbsp;<br />[admin@MikroTik] &gt; system script run test7  <br />payload:0dff5900035f42000024684e2d000302e5fe &nbsp;<br />batteryVoltage: 5f &nbsp;<br />temperature: 42 &nbsp;<br />tankLevel: 0000 &nbsp;<br /><br />Можно ли преобразовать каждое значение batteryVoltage, temperature и tankLevel из шестнадцатеричного в десятичное по отдельности или нужно конвертировать весь payload целиком? <br />
			<i>18.04.2024 07:41:00, Jonty.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393103</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393103</guid>
			<pubDate>Thu, 18 Apr 2024 07:41:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Преобразовать пример на C в скрипт KNOT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393102">Преобразовать пример на C в скрипт KNOT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Добрый день! Нужна помощь. У меня есть Bluetooth-датчик, который я подключил и внёс в белый список на роутере MikroTik KNOT LR8, но я не понимаю, где и как писать скрипт. У меня есть информация, которую дала компания. Есть кто-нибудь, кто может помочь?<br /><br />bool parse_packet(bd_addr addr, byte[] scanData)  <br />{ &nbsp;<br /> &nbsp;// Проверка ожидаемой длины &nbsp;<br /> &nbsp;if (scanData.Length != 18) return false; &nbsp;<br /> &nbsp;<br /> &nbsp;// Производитель (manufacturer specific) &nbsp;<br /> &nbsp;if (scanData[1] != 0xFF) return false;  <br /> &nbsp;<br /> &nbsp;// Длина хвостового пакета &nbsp;<br /> &nbsp;if (scanData[0] != 13) return false;  <br /> &nbsp;<br /> &nbsp;// Проверка данных в адресе совпадает с MAC — часть нашего протокола для исправления на iOS &nbsp;<br /> &nbsp;if (scanData[9] != addr.Address[2]) return false;  <br /> &nbsp;if (scanData[10] != addr.Address[1]) return false;  <br /> &nbsp;if (scanData[11] != addr.Address[0]) return false;  <br /> &nbsp;<br /> &nbsp;// Проверка кода производителя &nbsp;<br /> &nbsp;if (scanData[2] != 0x59 || scanData[3] != 0x00) return false;  <br /> &nbsp;<br /> &nbsp;// Чтение версии датчика – выставить по необходимости &nbsp;<br /> &nbsp;prod_version = scanData[4] & 0x7F;  <br /> &nbsp;if (prod_version != 0x03 && prod_version != 0x05) return false; &nbsp;<br /> &nbsp;<br /> &nbsp;// Проверка, что это наш “синхронизированный” датчик &nbsp;<br /> &nbsp;if (addr != synced_mac) return false; &nbsp;<br /> &nbsp;<br /> &nbsp;return true; &nbsp;<br />}<br /><br />bool is_sync_pressed(uint8_t *scanData) &nbsp;<br />{ &nbsp;<br /> &nbsp;if (scanData[6] & 0x80) {  <br /> &nbsp; &nbsp;return true; &nbsp;<br /> &nbsp;} &nbsp;<br /> &nbsp;return false; &nbsp;<br />}<br /><br />getAcceloY(rawByte) { &nbsp;<br /> &nbsp;// Возвращает значение в “G”, которое можно преобразовать в угол &nbsp;<br /> &nbsp;return (char)scanData[12] / 1024;  <br />}<br /><br />getAcceloX(rawByte) { &nbsp;<br /> &nbsp;// Возвращает значение в “G”, которое можно преобразовать в угол &nbsp;<br /> &nbsp;return (char)scanData[13] / 1024;  <br />}<br /><br />// Возвращает измеренную высоту жидкости (или воздуха) в мм &nbsp;<br />// scanData — массив сырых байт с данными производителя &nbsp;<br />uint32_t get_tank_height(const uint8_t* scanData) &nbsp;<br />{ &nbsp;<br /> &nbsp;// Для LPG (сжиженный пропан) используем следующие коэффициенты &nbsp;<br /> &nbsp;const double coef[3] = { 0.573045, -0.002822, -0.00000535 };  <br /> &nbsp;// Получаем сырое значение уровня из данных. Учитываем только младшие 14 бит &nbsp;<br /> &nbsp;uint16_t raw = (scanData[8] * 256) + scanData[7];  <br /> &nbsp;double raw_level = raw & 0x3FFF; &nbsp;<br /> &nbsp;// Добавляем диапазон 16384us до 81916us с разрешением 4us &nbsp;<br /> &nbsp;if (scanData[4] & 0x80) {  <br /> &nbsp; &nbsp;raw_level = 16384.0 + raw_level * 4.0; &nbsp;<br /> &nbsp;} &nbsp;<br /> &nbsp;// Получаем несмасштабированную температуру из рекламного пакета &nbsp;<br /> &nbsp;double raw_t = (scanData[6] & 0x7F);  <br /> &nbsp;// Старший бит — состояние кнопки, игнорируем &nbsp;<br /> &nbsp;// Применяем полином 2-го порядка для компенсации времени полёта (TOF) в мм LPG &nbsp;<br /> &nbsp;return (uint32_t)(raw_level * (coef[0] + coef[1] * raw_t + coef[2] * raw_t * raw_t));  <br />}<br /><br />float get_battery_voltage(uint8_t *scanData) &nbsp;<br />{ &nbsp;<br /> &nbsp;// Возвращает напряжение батареи — старший бит зарезервирован и должен быть 0 &nbsp;<br /> &nbsp;return (float)(scanData[5] & 0x7F) / 32.0f;  <br />}<br /><br />// Произвольное преобразование напряжения батареи в проценты для CR2032 &nbsp;<br />float get_battery_percentage(float voltage) &nbsp;<br />{ &nbsp;<br /> &nbsp;float percent = (voltage - 2.2f) / 0.65f * 100.0f; &nbsp;<br /> &nbsp;if (percent &lt; 0.0f) { &nbsp;<br /> &nbsp; &nbsp;return 0.0f; &nbsp;<br /> &nbsp;} &nbsp;<br /> &nbsp;if (percent &gt; 100.0f) { &nbsp;<br /> &nbsp; &nbsp;return 100.0f; &nbsp;<br /> &nbsp;} &nbsp;<br /> &nbsp;return percent; &nbsp;<br />}<br /><br />int get_temperature_reading(uint8_t *scanData) &nbsp;<br />{ &nbsp;<br /> &nbsp;uint8_t temp = scanData[6] & 0x7F;  <br /> &nbsp;return ((int)temp - 40); &nbsp;<br />} <br />
			<i>27.03.2024 07:23:00, Jonty.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393102</link>
			<guid>http://mikrotik.moscow/forum/forum57/85093-preobrazovat-primer-na-c-v-skript-knot/message393102</guid>
			<pubDate>Wed, 27 Mar 2024 07:23:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
	</channel>
</rss>
