Register device The Things Stack v3 API

Turns out endpoints where wrong, so remember to use the ["/ns/", “/as/”, “/js/”] in the url when registering the device with the different servers. Not using these gives you a "getting a “Forbidden path” for error in the responses.

import requests
import json

app_name = "my_app_name"
app_key = "my_app_key"

dev_eui = "my_dev_eui"
join_eui = "my_join_eui"
device_id = "my_device_id"

auth_token = "NNSXS.XXXXXXXX......"

headers = {
    "Accept" : "application/json",
    "Authorization" : f"Bearer {auth_token}",
    "Accept" : "application/json"
    }

create_device = {
   "end_device":{
      "name":"bbb_device_name",
      "description":"device-description",
      "ids":{
         "device_id":f"{device_id}",
         "dev_eui":f"{dev_eui}",
         "join_eui":f"{join_eui}",
         "application_ids":{
            "application_id":"{app_name}"
         }
      },
      "join_server_address":"eu1.cloud.thethings.network",
      "network_server_address":"eu1.cloud.thethings.network",
      "application_server_address":"eu1.cloud.thethings.network",
      "version_ids":{
         "brand_id":"dragino",
         "model_id":"lht65",
         "hardware_version":"_unknown_hw_version_",
         "firmware_version":"1.8",
         "band_id":"EU_863_870"
      }
   },
   "field_mask":{
      "paths":[
         "join_server_address",
         "network_server_address",
         "application_server_address",
         "version_ids.brand_id",
         "version_ids.model_id",
         "version_ids.hardware_version",
         "version_ids.firmware_version",
         "version_ids.band_id"
      ]
   }
}

register_name_server = {
   "end_device":{
      "supports_join":True,
      "lorawan_version":"MAC_V1_0_3",
      "ids":{
         "device_id":f"{device_id}",
         "dev_eui":f"{dev_eui}",
         "join_eui": f"{join_eui}",
         "application_ids":{
            "application_id": f"{app_name}"
         }
      },
      "frequency_plan_id":"EU_863_870_TTN",
      "version_ids":{
         "brand_id":"dragino",
         "model_id":"lht65",
         "hardware_version":"_unknown_hw_version_",
         "firmware_version":"1.8",
         "band_id":"EU_863_870"
      },
      "lorawan_phy_version":"PHY_V1_0_3_REV_A",
      "mac_settings":{
         "class_c_timeout":"60s",
         "supports_32_bit_f_cnt":True
      }
   },
   "field_mask":{
      "paths":[
         "supports_join",
         "lorawan_version",
         "ids.device_id",
         "ids.dev_eui",
         "ids.join_eui",
         "ids.application_ids.application_id",
         "frequency_plan_id",
         "version_ids.brand_id",
         "version_ids.model_id",
         "version_ids.hardware_version",
         "version_ids.firmware_version",
         "version_ids.band_id",
         "lorawan_phy_version",
         "mac_settings.class_c_timeout",
         "mac_settings.supports_32_bit_f_cnt"
      ]
   }
}

register_application_server = {
   "end_device":{
      "ids":{
         "device_id": f"{device_id}",
         "dev_eui": f"{dev_eui}",
         "join_eui": f"{join_eui}",
         "application_ids":{
            "application_id": f"{app_name}"
         }
      },
      "version_ids":{
         "brand_id":"dragino",
         "model_id":"lht65",
         "hardware_version":"_unknown_hw_version_",
         "firmware_version":"1.8",
         "band_id":"EU_863_870"
      },
      "formatters":{
         "up_formatter":"FORMATTER_REPOSITORY",
         "down_formatter":"FORMATTER_REPOSITORY"
      }
   },
   "field_mask":{
      "paths":[
         "ids.device_id",
         "ids.dev_eui",
         "ids.join_eui",
         "ids.application_ids.application_id",
         "version_ids.brand_id",
         "version_ids.model_id",
         "version_ids.hardware_version",
         "version_ids.firmware_version",
         "version_ids.band_id",
         "formatters.up_formatter",
         "formatters.down_formatter"
      ]
   }
}

register_join_server = {
   "end_device":{
      "ids":{
         "device_id": f"{device_id}",
         "dev_eui": f"{dev_eui}",
         "join_eui": f"{join_eui}",
         "application_ids":{
            "application_id": f"{app_name}"
         }
      },
      "network_server_address":"eu1.cloud.thethings.network",
      "application_server_address":"eu1.cloud.thethings.network",
      "root_keys":{
         "app_key":{
            "key": f"{app_key}"
         }
      }
   },
   "field_mask":{
      "paths":[
         "network_server_address",
         "application_server_address",
         "root_keys.app_key.key",
         "ids.device_id",
         "ids.dev_eui",
         "ids.join_eui",
         "ids.application_ids.application_id"
      ]
   }
}

response = requests.post(f"https://eu1.cloud.thethings.network/api/v3/applications/{app_name}/devices", data=json.dumps(create_device), headers=headers)
print("RESPONSE DEVICE CREATE")
print(response.text)

response = requests.put(f"https://eu1.cloud.thethings.network/api/v3/ns/applications/{app_name}/devices/{device_id}", data=json.dumps(register_name_server), headers=headers)
print("REGISTER NAME SERVER")
print(response.text)

response = requests.put(f"https://eu1.cloud.thethings.network/api/v3/as/applications/{app_name}/devices/{device_id}", data=json.dumps(register_application_server), headers=headers)
print("REGISTER APPLICATION SERVER")
print(response.text)

response = requests.put(f"https://eu1.cloud.thethings.network/api/v3/js/applications/{app_name}/devices/{device_id}", data=json.dumps(register_join_server), headers=headers)
print("REGISTER JOIN SERVER")
print(response.text)

1 Like