{"id":13651921,"url":"https://github.com/ArduPilot/ArduRemoteID","last_synced_at":"2025-04-23T02:31:52.774Z","repository":{"id":53751823,"uuid":"521439461","full_name":"ArduPilot/ArduRemoteID","owner":"ArduPilot","description":"RemoteID support using OpenDroneID","archived":false,"fork":false,"pushed_at":"2024-01-11T08:40:20.000Z","size":2380,"stargazers_count":68,"open_issues_count":24,"forks_count":35,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-01-25T03:03:23.796Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ArduPilot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-08-04T23:05:41.000Z","updated_at":"2024-04-15T00:40:35.222Z","dependencies_parsed_at":"2023-02-18T09:01:21.571Z","dependency_job_id":"36096818-49cb-4934-bf76-6229e8d32b00","html_url":"https://github.com/ArduPilot/ArduRemoteID","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArduPilot%2FArduRemoteID","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArduPilot%2FArduRemoteID/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArduPilot%2FArduRemoteID/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArduPilot%2FArduRemoteID/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ArduPilot","download_url":"https://codeload.github.com/ArduPilot/ArduRemoteID/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223909843,"owners_count":17223575,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T02:00:53.466Z","updated_at":"2024-11-10T03:30:18.838Z","avatar_url":"https://github.com/ArduPilot.png","language":"C++","funding_links":[],"categories":["Security \u0026 Safety 🪂"],"sub_categories":["ID Systems 🛂"],"readme":"# ArduPilot RemoteID Transmitter\n\nThis is an implementation of a MAVLink and DroneCAN OpenDroneID\ntransmitter. It aims to provide a transmitter solution for the FAA\nstandard RemoteID requrement, meeting the transmitter component of the\nASTM F3586-22 Means of Compliance. It also aims to be compliant with the \nRemoteID regulation in the EU. \n\nIt is the responsibility of the user/manufacturer to configure the \nArduRemoteID firmware in a way that it is compliant with the local \nRemoteID regulation. For instance, in the USA it is mandatory that UAV \nmanufacturers submit a [DoC (Declaration of Conformance) to the FAA](https://uasdoc.faa.gov/login)\nwhere they state that their product is compliant with the RemoteID regulation. \n\n## Hardware Supported\n\nThe firmware currently supports the ESP32-S3 and ESP32-C3 chips. There\nare 7 boards supported so far with more to come:\n\n - the ESP32-S3 dev board: https://au.mouser.com/ProductDetail/356-ESP32S3DEVKTM1N8\n - the ESP32-C3 dev board: https://au.mouser.com/ProductDetail/Espressif-Systems/ESP32-C3-DevKitM-1\n - a Bluemark DB110 (legacy) from https://bluemark.io/ ([product page](https://dronescout.co/dronebeacon-mavlink-remote-id-transponder/))\n - a Bluemark DB200 from https://bluemark.io/ ([product page](https://dronescout.co/dronebeacon-mavlink-remote-id-transponder/) | replaced by the db201))\n - a Bluemark DB201 from https://bluemark.io/ ([product page](https://dronescout.co/dronebeacon-mavlink-remote-id-transponder/) | [buy](https://dronescout.co/product/dronebeacon-mavlink-db201-transponder/))\n - a Bluemark DB202mav from https://bluemark.io/ ([product page](https://dronescout.co/dronebeacon-mavlink-remote-id-transponder/) | [buy](https://dronescout.co/product/dronebeacon-mavlink-db202mav-transponder/))\n - a Bluemark DB210pro from https://bluemark.io/ ([product page](https://dronescout.co/dronebeacon-mavlink-remote-id-transponder/) | [buy](https://dronescout.co/product/dronebeacon-mavlink-dronecan-db210pro-transponder/))\n - Holybro Remote ID Module ([product page](https://holybro.com/products/remote-id/))\n\nHardware from https://wurzbachelectronics.com/ is expected to be added soon.\n\nFor the ESP32-S3 dev board the pins assumed in this firmware are:\n\n - UART TX on pin 18\n - UART RX on pin 17\n - CAN TX on pin 47\n - CAN RX on pin 38\n\nFor the ESP32-C3 dev board the pins assumed in this firmware are:\n\n - UART TX on pin 3\n - UART RX on pin 2\n - CAN TX on pin 5\n - CAN RX on pin 4\n\nFor CAN a suitable 1MBit bxCAN transceiver needs to be connected to\nthe CAN TX/RX pins.\n\nYou can also do MAVLink on the USB UART port (the one marked \"UART\" on\nthe silkscreen). That allows for easy simulation testing by plugging\nin a micro USB cable.\n\nSee board_config.h and Makefile for information on porting to new boards.\n\n## Transmission Modes\n\nThis firmware supports the following transmission modes:\n\n - WiFi Broadcast\n - WiFi NAN (Neighbour Awareness Networking)\n - Bluetooth 4 Legacy Advertising\n - Bluetooth 5 Long Range + Extended Advertising\n\n## Protocols\n\nThis firmware supports communication with an ArduPilot flight\ncontroller either using MAVLink or DroneCAN.\n\nFor MAVLink the following service is used:\nhttps://mavlink.io/en/services/opendroneid.html\n\nFor DroneCAN the following messages are used:\nhttps://github.com/dronecan/DSDL/tree/master/dronecan/remoteid\n\nThe DroneCAN messages are an exact mirror of the MAVLink messages to\nmake a dual-transport implementation easy.\n\n## Releases\n\nPre-built releases are in the releases list folder on github.\n\nhttps://github.com/ArduPilot/ArduRemoteID/releases\n\n## Flashing\n\nFor initial firmload load, to flash to an ESP32-S3 board use the espressif FlashTool from\n\nhttps://www.espressif.com/en/support/download/other-tools\n\nIf this is the first time flashing the board, you may need to hold the \"boot\" button down while attaching the USB cable to the USB connector marked \"USB\"\n\nand then use the pre-built binary in the releases folder to flash using\nthe following options, after selecting the COMM port that the board is attached:\n\n![Board setup dialog](images/flash-tool-setup.jpg \"Board Setup\")\n\n![Flashing with FlashTool](images/FlashTool.jpg \"Flashing\")\n\nsubsequent re-flashing of newer releases should not require holding the \"boot\" button during power-up of the board as the USB cable is attached.\n\nIf the board already runs ArduRemoteID, the preferred firmware upgrade method is to upload a new firmware file via the webinterface.\n\n## Parameters\n\nThe firmware comes with a set of parameters which are accessible from\nDroneCAN or MAVLink. The parameters allow for a lot of flexibility in\ncontrolling the behaviour of the board.\n\nDroneCAN allows control of any parameter. Using MAVLink only\nnon-string parameters are accessible.\n\n![DroneCan Parameters](images/DroneCAN-parameters.jpg)\n\nKey parameters are:\n\n - LOCK_LEVEL: this controls the lockdown of the board. If this is set\n   to a non-zero value then all parameters updates via DroneCAN will\n   be prevented. To change parameters (including the LOCK_LEVEL) once\n   this is set you need to use a DroneCAN SecureCommand. There is an\n   example script in scripts/secure_command.py which can change any\n   parameter if you know a private key corresponding to one of the\n   public keys. \n\n - UAS_TYPE, UAS_ID_TYPE and UAS_ID: these override the IDs in the\n   RemoteID BasicID packet when they have all been set. These should\n   be set by the vendor before shipping the vehicle.\n\n - WEBSERVER_ENABLE: this enables the building WiFi access point and\n   webserver for status monitoring and secure firmware update.\n\n - PUBLIC_KEY1 to PUBLIC_KEY5: these are the public keys that will be\n   used to verify firmware updates and secure update of parameters\n\n## Web Server\n\nThe firmware comes with a builtin web server if the parameters\nWEBSERVER_ENABLE is set. The WiFi access point will use a SSID from\nWIFI_SSID and password from WIFI_PASSWORD which you can set with\nDroneCAN parameter tools such as the DroneCAN GUI tool or\nMissionPlanner CAN tool.\n\nThe default SSID is RID_xxxxxxxx where xxxxxxxx is the factory WiFi\nMAC address of the board. The default password is ArduRemoteID.\n\nThe web server has a secure firmware update mechanism which will only\nallow a properly signed firmware with a signature corresponding to one\nof the 5 public keys in the parameters. If no public keys are set then\nany firmware can be loaded.\n\nThe web server defaults to URL http://192.168.4.1 once you connect to\nthe WiFi access point.\n\n## Firmware Signing\n\nTo generate public/private key pairs please use:\n\n```\n  scripts/generate_keys.py\n```\n\nthe keys are compatible with the ArduPilot secure boot system. By\ndefault the 3 ArduPilot release public keys are included.\n\nOnce you have generated a public key you can add it to the RemoteID\nnode using a DroneCAN parameter editor. Make sure you keep the private\nkey in a secure location.\n\nTo upload a firmware via the web server you need to use an \"OTA\" (Over\nThe Air) firmware, which is generated as OTA files in the build. You\nthen need to sign it with a private key corresponding to one of the\npublic keys on the RemoteID node.\n\nTo sign an OTA firmware you should use a command such as this one:\n\n```\n scripts/sign_fw.py ArduRemoteID_ESP32S3_DEV_OTA.bin MyName_private_key.dat 1\n```\n\nThe '1' on the end is the BOARD_ID. See board_config.h for the board\nIDs for your board.\n\nOnce signed you can upload the firmware via the web server.\n\nSet LOCK_LEVEL to -1 to skip any checks for the OTA upgrade like board ID \ncheck, signed firmware with a valid key. For LOCK_LEVEL 0 or higher, only\nfirmware files are accepted that match the board ID and are signed with a \nvalid key. (OTA firmware files in the ArduRemoteID github page are always\nsigned with a valid key.)\n\n## LOCK_LEVEL Parameter\n\nThe LOCK_LEVEL parameter is the way a vendor can lock down the\nRemoteID board so that it is tamper resistant. if any valid public\nkeys have been set then setting LOCK_LEVEL=1 will prevent any\nparameter changes using the DroneCAN or MAVLink interfaces. All\nparameter changes will need to be made via the SecureCommand\nsigned interface.\n\nSetting LOCK_LEVEL=2 will also cause the ESP32 eFuses to be set to\nprevent firmware updates except via the signed web interface. This is\na permanent change and cannot be undone even if the LOCK_LEVEL is\nchanged back to 0 or 1 via SecureCommand.\n\nSetting LOCK_LEVEL=-1 will skip any checks for upgrading the firmware \nvia the web server like board ID check, signed firmware with a valid key.\n\nThe default LOCK_LEVEL=0 allows to change parameters and only allows \nfirmware upgrades via the web server that have been signed with a valid key.\nAlso the board ID of the firmware file needs to match the board ID of the \ndevice.\n\n## Secure Parameter Update\n\nOnce LOCK_LEVEL is 1 or 2 you cannot use normal parameter commands to\nset parameters. Instead you need to use the DroneCAN SecureCommand\ninterface or the MAVLink SECURE_COMMAND interface.\n\nFor DroneCAN see the script in scripts/secure_command.py, for example\nthis command would change the UAS_TYPE to 3:\n\n```\nscripts/secure_command.py mavcan::14550 --private-key my_private_key.dat --target-node=125 UAS_TYPE=3\n```\n\nFor MAVLink you can use the SecureCommand module in MAVProxy. For\nexample:\n\n```\nmodule load SecureCommand\nsecurecommand set private_keyfile my_private_key.dat\nsecurecommand getsessionkey\nsecurecommand setconfig UAS_TYPE=3\n```\n\nYou can also use secure commands to set LOCK_LEVEL back to zero, but\nnote that if you have set LOCK_LEVEL=2 then the setting of the eFuse\nbits is not undone. You will be able to change parameters but you will\nnot be able to flash firmware via the USB port. You can still flash a\nsigned firmware using the web interface.\n\n## Secure Command over support.ardupilot.org\n\nIf using secure_command.py remotely via a link forwarded over\nsupport.ardupilot.org then you would run the following:\n\n```\nscripts/secure_command.py mavcan:udpout:support.ardupilot.org:AAAAA --signing-passphrase=XXXXXXX --target-node=NNN --private-key=my_private_key.dat UAS_TYPE=3\n```\n\nwhere\n\n - AAAAA is your support.ardupilot.org remote support ID (the support engineer ID, not the customers ID)\n - NNN is the target CAN node ID on the remote flight controller\n - add --bus-num=2 if the node is on the 2nd CAN bus\n\nAs the link may be slow you may also need a higher value for the\n--timeout option.\n\n## Secure Command using DroneCAN GUI Tool\n\nFor a CAN attached ArduRemoteID module you can use DroneCAN GUI tool\nto update parameters securely.\n\nGet the latest DroneCAN GUI tool here:\n\n  https://firmware.ardupilot.org/Tools/CAN_GUI/\n\nYou will need version 1.2.23 or later.\n\nAfter connecting, select the RemoteID panel:\n\n![RemoteID Panel1](images/RemoteID_panel1.jpg \"RemoteID Panel1\")\n\nthen use like this:\n\n![RemoteID Panel2](images/RemoteID_panel2.jpg \"RemoteID Panel2\")\n\nThe command is of the form \"PARAMETERNAME=VALUE\".\n\nWhen you are using DroneCAN GUI tool over a support.ardupilot.org\nsigned link you will need to enter the URI like this:\n\n![GUI Signed](images/GUI_signed.jpg \"GUI Signed\")\n\nwhere 999999 is replaced with your support engineer ID.\n\n\n## ArduPilot Support\n\nSupport for OpenDroneID is in ArduPilot master and is also in the\n4.2.3 stable releases and 4.3.x releases. You need to enable it on a\nboard by setting \"define AP_OPENDRONEID_ENABLED 1\" in the hwdef.dat\nfor your board or by using --enable-opendroneid when doing waf configure.\n\n## Credit\n\nMany thanks to the great work by:\n\n - OpenDroneID: https://github.com/opendroneid/\n - Steve Jack: https://github.com/sxjack/uav_electronic_ids\n - Roel Schiphorst: https://bluemark.io/\n - David Buzz: ESP32 CAN and bluetooth drivers\n\nThis firmware builds on their work.\n\n## License\n\nThis firmware is licensed under the GNU GPLv2 or later\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FArduPilot%2FArduRemoteID","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FArduPilot%2FArduRemoteID","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FArduPilot%2FArduRemoteID/lists"}