Вопрос или проблема
У меня есть часы Polar M430, и я уже могу загружать данные с часов. К сожалению, мне не удается расшифровать данные Protocol Buffer. Я нашел источники для необходимых файлов *.proto, но они, похоже, устарели. У кого-нибудь есть актуальные файлы *.proto для Polar M430? Или кто-то может помочь мне адаптировать файлы *.proto так, чтобы они работали.
Вот содержимое файла GPS proto:
package polar_data;
import "types.proto";
message PbExerciseRouteSamples {
repeated uint32 duration = 1 [packed=true];
repeated double latitude = 2 [packed=true];
repeated double longitude = 3 [packed=true];
repeated sint32 gps_altitude = 4 [packed=true];
repeated uint32 satellite_amount = 5 [packed=true];
repeated bool OBSOLETE_fix = 6 [packed=true];
repeated .PbSensorOffline OBSOLETE_gps_offline = 7 ;
repeated .PbSystemDateTime OBSOLETE_gps_date_time = 8 ;
optional .PbSystemDateTime first_location_time = 9 ;
}
Содержимое бинарного файла GPS:
1F8B0800000000000203F212E562E778C12FC021212CC4C12128A028A1A1C020C1A8C5C822C4213B3DAEE39083978314C7D9FD0507759E6B3928003172703132E091647AC10E963DB72B721A4436E8AEA7A12E4CF6023F4E59362EA61DE260D9FA7B214B20B2D77F292D84EB5D200F96D5670AD804917D00607AB5410F2CCBC3C5D4A18E5356868BE947284E59292EA607B160D907AADE0720B26BFE170334431FA6F7442A5876D116F31F10D98A93421B0CC0B2002A5C4C1B72C1B2C1378CD80E8365AD22FE3F87C86A7031CD2805CB6E91D75482C87E5E6DE90091D5E1626AA805CBDEF8CA5D0691CDEB4BB800B1D780008BF9450B2358DAD2966912447AF191833B208E36E162BED003915EF3FEE57588F4F55F4A0B75C1D2165CCC3BA640A4CF1F3DA37D042C7D767FC1411D00B0B41517F38239106903DEC300B943A419BF5D5CA90D96B6E162EE5802919E14B23319226DA6633C490B2C6DC7C5FC613544FAF3ECF5F510699D8F0D009B34C1D24E5CCC373643A4D3FCA61F85484B56CB7C56074BBB70311FD80D91D6B8DBFC1722CDC6BAC3580D26BDE23044BA53A54AF22858BA628DCE13001598F484D310E9D9FDD9CE10E954B3132ACA6069372EE61F9720D26B7FC5E442A4CF2EEAFAAA00937E700B22CDE704507027447A978E9A993C58DA83008BF9C42388F4FE54A0D3C1D22BB61D2C9385496F7805916EFC62751E223DD52176BB3458DA8B8B79C62788F4E4789D9F1069B61717D3A560D20DBFD00075FF5D23DF210996F6E1627ED1C80496CEEFF45C0A91DE6FCD73002E7DA19309A76E3F2EE61D1321D2CECDEAECC7C0D2DB18A21E48C0A417CC84482F003D25AB0C91AEE8779380EBEE58089196A865CD449706DAFD01A01510E9CA23BF5B8E613AEDC606887497FEDB75C7D0FC0D943EB00322BD8EF502D37100B0B4EF94E9FCD230E9150720D2070A0EEA40A4A73AC46E874B4F3801916EFABF3605223DAF9A7FBA0C4CFAC77988F463B7250D10E9F749ED727230E90007D721D253B2E6F741A4377E2C0E83487B71319FB80F9176ED9B350722BD4B47CD4C1E26BDE139BA34D3CDD77721D21E5CCC33DEA31BCE2D326FAF02004CBAE13BBAD3000A3A909CAA08937EF10F226DACBCB208223D33479357092CEDC6C57CA18D192CADB863BB0744FA81C4FB2D70E91D7D10E9030507750020D26B1EF59E51064BBB70312F9806918ED73C2D0091366448B751814977CC8348FF7D78E5CB31B074C51A9D271069272EE60F4B21D2BEFB6E3E834800B3B1EE30568349DF580B917E53F6F814447A4AAC73B33A4CFAC056887497FEDB7510E9A72EBBB93461D200ADD80B91D67CF16D12447A235F9492164C007AC25188F489050CE51069FBF4A785DA30E91F6720D2DB4CF97D21D267F7171CD481493FB802910E7D27610891BEFE4B69A12E4CFAC41D8834D0B5EC0010E9D4E0751FF460D21B9E40A41BBF589D3F0A96AE3829B4C100263DE30D447A7FAADF7488F4C90D5DE64630E9862F10E93FD712E321D2923398F61B00C3A45FFC86485B7994AA43A49F262EBC660293BED00C100B583A0D68F611B074567D959B294C7A473744DAA9624B2144FADD9CE06D1069172EE605930021D2E78F9ED1C622DD311B22FDFBF4BB9387C1D2BBD23E9D3583497F580491B6B4659A04913EB270C95A7398F48D5510E9635D523E10E909D9CE472D0060D2073641A4B7C86B2A41A4672EFBBAC41226BD6217443AF886111B445AFD7FC3172BB0B41B17F38443E8D279ABDDE658C3A47F9C84482FDA62FEE300104060E96DE13C2E3630E90717F14A6F7888577AC64B88F4B95D91D320D253A6F34BDBC3A41B3E42A4F7F867E440A46F3B5F3D04977EF10322CDA393001B07915ECE5B72CB01267DA181154DFADD4ECB264798F48E0EBCD20B26A04B6FF450DB0597EE98C18AE63414E90FF321D2F5F742966031FCC6725634007FA3481F588F577AC27EDCD21E5CCC1BEEE1D53DE31944FADAAB190F0E82A54DD3FE6B3AC17437BC83488BC4AC590118445A47DBD70BAEFBC55774E900AC39094270E90B7F21D2C9161B6741A49FD6B52F728049EF6865034B6F16D9D6039156FE302B0B2EBDA0970D4DF772DE925B0E30A7754C45D75D7C5D00E813DCDF1FE6E0953EB0860D0049B0C1526C0B0000
Данные были записаны 2020-08-19 около GPS координат lat=“52.50594” и lon=“13.45152”.
Для моего проекта я использую Python google.protobuf. Поскольку я думаю, что проблема связана с существующими файлами *.proto, команда “protoc –decode PbExerciseRouteSamples exercise_route.proto < ROUTE.GZB” мне не помогла.
Я буду признателен за любые решения, подходы или вдохновение.
Ответ или решение
К сожалению, описанный вами процесс декодирования данных из устройства Polar M430 может быть довольно сложным, особенно если у вас есть устаревшие файлы .proto. Ниже приведен общий подход, который поможет вам декодировать бинарные данные Google Protocol Buffers (protobuf) из вашего устройства с использованием Python.
Шаги для декодирования данных:
-
Обновите файлы .proto: Вам необходимо найти актуальные версии .proto файлов для Polar M430, так как устаревшие файлы могут не соответствовать вашей версии данных. Если обновленные файлы недоступны, вам, возможно, придется вручную адаптировать существующие файлы, основываясь на текущем содержимом и структуре данных.
-
Установка необходимых библиотек: Убедитесь, что у вас установлены нужные библиотеки в Python. Вам понадобятся библиотеки для работы с protobuf:
pip install protobuf pip install gzip # если вам нужно разжать gz файл
-
Декомпрессия файла (если необходимо): Прежде чем декодировать данные, возможно, вам потребуется распаковать файл, так как кажется, что он сжат с помощью gzip. Используйте код для разжатия данных:
import gzip with gzip.open('ROUTE.GZB', 'rb') as f: binary_data = f.read()
-
Декодирование данных: Используйте protobuf для декодирования. Предположим, что у вас обновленный и правильный файл
exercise_route.proto
, вы можете скомпилировать его с помощьюprotoc
. После компиляции вы получите Python файлы, которые можно использовать для декодирования.Пример декодирования:
from google.protobuf import json_format from polar_data_pb2 import PbExerciseRouteSamples # Импортируйте сгенерированный класс # Декодирование exercise_data = PbExerciseRouteSamples() exercise_data.ParseFromString(binary_data) # Преобразование в JSON для удобного вывода json_data = json_format.MessageToJson(exercise_data) print(json_data)
-
Отладка: Если данные все еще не декодируются правильно, проверьте:
- Правильность структуры .proto файлов.
- Формат бинарных данных.
- Соответствие типов данных (например, double, sint32 и т.д.).
-
Работа с GPS-данными: Вы упомянули GPS-координаты (lat=“52.50594”, lon=“13.45152”). После успешного декодирования вы сможете получить доступ к полям
latitude
иlongitude
в объектеexercise_data
, что позволит вам получить записанные координаты. -
Запись данных: Если вам нужно будет сохранить обработанные данные, вы можете сохранить JSON или XML файл, следующим образом:
with open('decoded_data.json', 'w') as json_file: json.dump(json_data, json_file, indent=4)
Заключение
Если вышеописанные шаги не решили вашу проблему, возможно, стоит обратиться на специализированные форумы или ресурсы разработчиков, где обсуждаются подобные устройства и форматы данных. Команда сообщества Polar также может предоставить актуальные .proto файлы или другие полезные ресурсы.