You should separate concerns whenever possible. Since BLE & HTTP requests are quite different, you could write the following protocols:
And since Swift Enums allow associated values, you can always pass in additional parameters, whenever needed (you could have another case case getAuthToken(byUserID: String), which are then available to you in your implementation)
Now, since you have this all neatly separated, I would go further and pass your Request instances to each specific Provider directly. In effect, you are not the one executing a request, a provider is. That means your requests are agnostic to whatever Provider executes them, which will allow you to set up unit testing easier (because then you can write Mock Providers, and still pass them your requests like usual).
So you should probably extend each provider like such:
extend BLEProvider {
func execute(request: BLERequest) {
writeValue(code: request.code,
characteristic: request.characteristic,
service: request.service)
}
}